Giter Site home page Giter Site logo

vinyldns-cli's Introduction

Docker Automated build Build and Release Go Report Card GitHub

vinyldns-cli

A Golang-based CLI for the vinyldns DNS as a service API.

Installation

Download the latest pre-compiled executable release version for your operating system.

For example, to install version 0.10.0 on Linux

Download:

wget https://github.com/vinyldns/vinyldns-cli/releases/download/v0.10.0/vinyldns_0.10.0_linux_amd64.tar.gz

Extract the executable:

tar zxf vinyldns_0.10.0_linux_amd64.tar.gz

This will extract a file named vinyldns. To get started:

./vinyldns --help

And, of course, you can also move it to your path. For example...

Move it somewhere in your $PATH:

sudo mv vinyldns /usr/local/bin

Use the vinyldns command:

vinyldns --help

Compiling from Golang source

Alternatively, if you choose to compile from Golang source code:

  • install Golang
  • set up your $GOPATH
  • go get github.com/vinyldns/vinyldns-cli
  • cd $GOPATH/src/github.com/vinyldns/vinyldns-cli && make

Usage

vinyldns --help

Supported commands:

COMMANDS:
   groups               groups
   group                group --group-id <groupID>
   group-create         group-create --json <groupJSON>
   group-update         group-update --json <groupJSON>
   group-delete         group-delete --group-id <groupID>
   group-admins         group-admins --group-id <groupID>
   group-members        group-members --group-id <groupID>
   group-activity       group-activity --group-id <groupID>
   zones                zones
   zone                 zone --zone-id <zoneID>
   zone-create          zone-create --name <name> --email <email> --admin-group-id <adminGroupID> --transfer-connection-name <transferConnectionName> --transfer-connection-key <transferConnectionKey> --transfer-connection-key-name <transferConnectionKeyName> --transfer-connection-primary-server <transferConnectionPrimaryServer> --zone-connection-name <zoneConnectionName> --zone-connection-key <zoneConnectionKey> --zone-connection-key-name <zoneConnectionKeyName> --zone-connection-primary-server <zoneConnectionPrimaryServer>
   zone-update          zone-update --json <zoneJSON>
   zone-delete          zone-delete --zone-id <zoneID>
   zone-connection      zone-connection --zone-id <zoneID>
   zone-changes         zone-changes --zone-changes <zoneID>
   zone-sync            zone-sync --zone-sync <zoneID>
   record-set-changes   record-set-changes --zone-id <zoneID>
   record-set           record-set --zone-id <zoneID> --record-set-id <recordSetID>
   record-set-change    record-set-change --zone-id <zoneID> --record-set-id <recordSetID> --change-id <changeID>
   record-set-create    record-set-create --zone-id <zoneID> --record-set-name <recordSetName> --record-set-type <type> --record-set-ttl <TTL> --record-set-data <rdata>
   record-set-delete    record-set-delete --zone-id <zoneID> --record-set-id <recordSetID>
   record-sets          record-sets --zone-id <zoneID>
   search-record-sets   search-record-sets
   batch-changes        batch-changes
   batch-change         batch-change --batch-change-id <batchChangeID>
   batch-change-create  batch-change-create --json <batchChangeJSON>
   help, h              Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --host value                    vinyldns API Hostname [$VINYLDNS_HOST]
   --access-key value, --ak value  vinyldns access key [$VINYLDNS_ACCESS_KEY]
   --secret-key value, --sk value  vinyldns secret key [$VINYLDNS_SECRET_KEY]
   --output value, --op value      vinyldns output format ('table' (default), 'json') [$VINYLDNS_FORMAT]
   --help, -h                      show help
   --version, -v                   print the version

Example usage:

vinyldns \
  --host https://my-vinyldns.com \
  --access-key 123 \
  --secret-key 456 \
  zones

+--------------------+--------------------------------------+
|        NAME        |                  ID                  |
+--------------------+--------------------------------------+
| foo.bar.net.       | 1fe5c74b-e478-43a7-9ee6-5413ae080086 |
+--------------------+--------------------------------------+
| foo.sys.bar.net.   | 19e21b0a-682c-425c-a016-9cb1c5bbee32 |
+--------------------+--------------------------------------+

Alternatively, in place of the --host, --access-key, and --secret-key options, vinyldns will use the following environment variables:

VINYLDNS_HOST=
VINYLDNS_ACCESS_KEY=
VINYLDNS_SECRET_KEY=

Docker

There is also a vinyldns-cli Docker image.

Usage...

docker pull vinyldns/vinyldns-cli
docker run vinyldns/vinyldns-cli:latest --help
NAME:
   vinyldns - A CLI to the vinyldns DNS-as-a-service API

USAGE:
   vinyldns [global options] command [command options] [arguments...]

...

License

Source code for vinyldns-cli is licensed under Apache-2.0; view license information for the vinyldns-cli software contained in the vinyldns/vinyldns-cli Docker image.

Its docker build makes use of a "builder" stage based on golang:alpine and builds a final, lightweight vinyldns/vinyldns-cli image based in scratch.

Development

To compile, lint, run acceptance tests, etc.:

make

Testing

The tests directory contains a suite of bats acceptance tests verifying vinyldns commands. Tests should accompany new features.

vinyldns-cli's People

Contributors

britneywright avatar carlism avatar davidaah avatar f3real avatar harrythehat1975 avatar iamjarvo avatar jagadeesh545 avatar jwakemen avatar kristakhare avatar mdb avatar olimpias avatar remerle avatar sbcd90 avatar tenpaiyomi avatar u5surf avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

vinyldns-cli's Issues

Create Docker image

Some users may find it beneficial to have the vinyldns CLI packaged as a Docker image. I'm imagining interaction like so:

docker run vinyldns/vinyldns-cli \
  --host="https://some-vinyldns.com" \
  --access-key="123" \
  --secret-key="456" \
  zones

Improve how `--output` works

Currently, many of the command functions have logic like this to determine the correct output. It might be good to re-imagine how this could work in a more elegant way that wouldn't require repetitive if checks in each function.

Display record data for non-A, AAAA, CNAME record types

The vinyldns api supports all of the record types listed at https://www.vinyldns.io/api/recordset-model.html#record-data. Right now, the record-set --zone-id <zoneID> --record-set-id <recordSetID> command is only able to display the Records info for an A, AAAA, or CNAME type record. The info is empty for all other types, for example, this get on an NS gave me:

|------------------------------------------------|
| Account | system                               |
|------------------------------------------------|
| Created | 2018-10-01T14:31:24Z                 |
|------------------------------------------------|
| Status  | Active                               |
|------------------------------------------------|
| TTL     | 38400                                |
|------------------------------------------------|
| Zone    | d825a806-49ee-4c97-b010-daaed19b92c3 |
|------------------------------------------------|
| ID      | 6a367bd2-5dfe-42c3-a5aa-b5c424c1a6fe |
|------------------------------------------------|
| Type    | NS                                   |
|------------------------------------------------|
| Records |                                      |
|------------------------------------------------|
| Updated |                                      |
|------------------------------------------------|
| Name    | test.ok.                       |
|------------------------------------------------|

See the code at https://github.com/vinyldns/vinyldns-cli/blob/master/vinyldns.go#L713. This should be expanded to handle the fields for the following types:

  • MX
  • TXT
  • PTR
  • NS
  • SOA
  • SPF
  • SSHFP

Note that each of these can be a separate PR, no need to pick up the whole thing at once :)

Update release to compress Windows binary with zip instead of tar/gzip

On Windows, tar and gzip are not native. I would expect most folks to be using Windows Subsystem for Linux (WSL) on windows, in which case the Linux version will work fine (and tar/gzip are readily available).

For folks not using WSL, the release should include a zipped binary to make it easier to extract.

rename zone-create and zone-delete commands

The zone-create and zone-delete commands are misleading. VinylDNS does not currently support creating zones, it only connects to existing zones. And zone-delete could be misunderstood as deleting the zone itself when it is only removing (abandoning) the zone from VinylDNS. zone-create should become zone-connect and zone-delete should become zone-abandon.

Run `bin/docker-up-vinyldns.sh` from a specific VinylDNS release branch

When running the make acceptance tests, currently vinyldns-cli starts a Dockerized VinylDNS API version via VinylDNS's bin/docker-up-vinyldns.sh script. It would be good to run this script from a specific VinylDNS branch version. While this is not the most elegant implementation, I'm imagining something like the following may still be an improvement, for example:

  if [ ! -d "$(GOPATH)/src/$(VINYLDNS_REPO)" ]; then \
    echo "$(VINYLDNS_REPO) not found in your GOPATH (necessary for acceptance tests), getting..."; \
    git clone \
      --branch v0.9.1 \
      https://$(VINYLDNS_REPO) \
      $(GOPATH)/src/$(VINYLDNS_REPO); \
  fi
  if [[ $(shell git --git-dir $(GOPATH)/src/$(VINYLDNS_REPO)/.git rev-parse HEAD)" != "12c6d4e67cf92d5be9801630155d640f55a38f51" ]]; then
    rm -rf $(GOPATH)/src/$(VINYLDNS_REPO);
    git clone \
      --branch v0.9.1 \
      https://$(VINYLDNS_REPO) \
      $(GOPATH)/src/$(VINYLDNS_REPO); \
  fi
  $(GOPATH)/src/$(VINYLDNS_REPO)/bin/docker-up-vinyldns.sh \
  --api-only \
  --version 0.9.1

Group call returning 404 for valid group

When I do vinyldns groups, i see a list of group names and IDs. If I take one of those IDs and do: vinyldns group --group-id 13b388fc-5b92-4701-ac9e-5c37e710221c, I'm getting:

Request URL:
<removed>
Request Method:
GET
Request body:

Response code: 
404
Response body:
The requested resource could not be found.

Support groups search functionality

go-vinyldns and the VinylDNS API support ListFilter parameters on the GET groups API request. It would be good to expose such options to users such that users can filter groups results based on their interests.

Allow CNAME creates

The following command should work to create a CNAME (if that zone id existed):
vinyldns record-set-create --zone-id d825a806-49ee-4c97-b010-daaed19b92c3 --record-set-name some-cname --record-set-type CNAME --record-set-ttl 123 --record-set-data test.com

Right now, I get the following response:

Request URL:
<omitted>
Request Method:
POST
Request body:
{"zoneId":"d825a806-49ee-4c97-b010-daaed19b92c3","name":"testingCLIcname","type":"CNAME","ttl":123,"account":"","records":[{"address":"test.com"}]}
Response code: 
400
Response body:
{"errors":["Missing CNAME.cname"]}```

This should be a small fix. per https://www.vinyldns.io/api/recordset-model#record-data, the record data for a CNAME is cname, but it looks as though the CLI is sending address, which is the data for an A or AAAA. Should just need to update https://github.com/vinyldns/vinyldns-cli/blob/master/vinyldns.go#L659 to not hardcode Address as that field name.

cli doesn't start with MacOS Catalina

Prerequisites

  • [x ] Put an X between the brackets on this line if you have done all of the following:
    • Checked that your issue isn't already filed.

Description

In MacOS Catalina, when you download the cli from releases, it is unable to run with a warning (screen shots below)

image

Steps to Reproduce

  1. Go to Releases in Github
  2. Download the darwin release (for example in 0.9.0)
  3. give execute permissions on the download
  4. Attempt to run it

Expected behavior:

The cli would start up

Actual behavior:

The error message pops up

Reproduces how often:

Every time

Versions

0.9.0. but this appears to be a Catalina issue where the cli needs to be signed

Additional Information

Support zone search functionality

go-vinyldns and the VinylDNS API support ListFilter parameters on the GET zones API request. It would be good to expose such options to users such that users can filter zones results based on their interests.

Expose filter controls to record-sets command

go-vinyldns and the VinylDNS API support ListFilter parameters on the GET /zones/ZONE/recordsets API request. It would be good to expose such options to users such that users can filter record sets results based on their interests.

Ensure against interface conversion problems

Description

panic: interface conversion: interface {} is int, not string error.

Steps to Reproduce

  1. compile from master
  2. attempt to view a CNAME such via commands like the following: vinyldns record-set --zone-id 89e21e9a-581c-424c-a006-7cb1c4bbcd32 --record-set-id 5862d275-79b8-4689-97ab-4bf16327baeb

Expected behavior: [What you expect to happen]

I expect to view the record set data.

Actual behavior: [What actually happens]

$ vinyldns record-set --zone-id 89e21e9a-581c-424c-a006-7cb1c4bbcd32 --record-set-id 5862d275-79b8-4689-97ab-4bf16327baeb
panic: interface conversion: interface {} is int, not string

goroutine 1 [running]:
main.getRecordValue(...)
        /Users/mball0001/dev/go/src/github.com/vinyldns/vinyldns-cli/vinyldns.go:745
main.getRecord(0xc420012900, 0x1, 0x4, 0x7ffeefbff1cb, 0x24)
        /Users/mball0001/dev/go/src/github.com/vinyldns/vinyldns-cli/vinyldns.go:721 +0x19b2
main.recordSet(0xc4200cc840, 0x100, 0xc4200cc840)
        /Users/mball0001/dev/go/src/github.com/vinyldns/vinyldns-cli/vinyldns.go:590 +0x19e
github.com/vinyldns/vinyldns-cli/vendor/github.com/urfave/cli.HandleAction(0x131eea0, 0x13a6da8, 0xc4200cc840, 0xc420010400, 0x0)
        /Users/mball0001/dev/go/src/github.com/vinyldns/vinyldns-cli/vendor/github.com/urfave/cli/app.go:490 +0xc8
github.com/vinyldns/vinyldns-cli/vendor/github.com/urfave/cli.Command.Run(0x1391d87, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13a0f67, 0x3b, 0x0, ...)
        /Users/mball0001/dev/go/src/github.com/vinyldns/vinyldns-cli/vendor/github.com/urfave/cli/command.go:210 +0xa36
github.com/vinyldns/vinyldns-cli/vendor/github.com/urfave/cli.(*App).Run(0xc42009a9c0, 0xc4200100c0, 0x6, 0x6, 0x0, 0x0)
        /Users/mball0001/dev/go/src/github.com/vinyldns/vinyldns-cli/vendor/github.com/urfave/cli/app.go:255 +0x6a0
github.com/vinyldns/vinyldns-cli/vendor/github.com/urfave/cli.(*App).RunAndExitOnError(0xc42009a9c0)
        /Users/mball0001/dev/go/src/github.com/vinyldns/vinyldns-cli/vendor/github.com/urfave/cli/app.go:276 +0x53
main.main()
        /Users/mball0001/dev/go/src/github.com/vinyldns/vinyldns-cli/vinyldns.go:284 +0x19d6

Versions

Only master at this time; no releases.

`CONTRIBUTING.md` should mention tests

While the README mentions tests are required for new features, the CONTRIBUTING file fails to mention that new features should have corresponding tests, but should.

Standardize command descriptions

Many of the command descriptions have inconsistent language and casing. Ideally, the descriptions would conform to a more consistent standard.

Consider using bats-core

The vinyldns-cli tests currently leverage bats. However, the project has not been updated for a number of years. Alternatively, it appears bats-core is more actively maintained.

Standardize on "recordset" (vs record-set)

Currently, vinyldns-cli features various record-set commands, which is arguably unfortunate, as "recordset" is one word & not hyphenated. It would be good to standardize on "recordset" and perhaps alias record-set commands to their recordset equivalents to preserve functionality for existing users. If this issue is pursued, a stretch goal is to offer users of record-set* commands some messaging about its deprecation and eventual removal in favor of the recordset equivalents.

Support multiple records when creating a recordset

Prerequisites

  • Put an X between the brackets on this line if you have done all of the following:
    • Checked that your issue isn't already filed.

Description

When creating a new recordset it looks like you're supposed to be able to sortof supply a comma-separated list as rdata. This is slightly problematic if you need to put a comma into a record, such as a TXT text field. Regardless however, the code doing the rrset creation throws away all records but the first.

Steps to Reproduce

  1. vinyldns --op json record-set-create --zone-id <zone-id> --record-set-name <record_name> --record-set-type TXT --record-set-ttl 30 --record-set-data "somedata,foo"

Expected behavior: [What you expect to happen]
I expect one recordset to be returned with 2 records for somedata and foo

Actual behavior: [What actually happens]
I get back one recordset with only one record for somedata

Reproduces how often: [What percentage of the time does it reproduce?]
100%

Versions

vinyldns version 0.9.2

Additional Information

Instead of assuming a csv is safe for splitting rdata, it would be better if multiple uses of --record-set-data were supported so I can split it outside the CLI code.

Use RecordSetsListAll and ZonesListAll

In current implementation, vinyldns-cli uses RecordSets and Zones, which fail to handle pagination, name filters, and max items. This means vinyldns-cli will always fetch the first 100 zones or record sets, but fail to fetch additional zones or record sets in instances when there are more than 100.

Set custom user agent

As a maintainer of vinyldns-cli, I'd like vinyldns-cli send a custom User-Agent on requests such that usage can be tracked in aggregated logs and operational visibility metrics. I'm imagining a UserAgent string such as vinyldns-cli/<version>.

Standardize go formatting

Currently, it appears there's a mix of tabs and spaces in some of the .go files. There may be other issues as well. Ideally, such things are vetted during CI.

Upgrade go-vinyldns

Currently, vinyldns-cli uses an old go-vinyldns but should probably updated to the latest version.

Support `record-set-update`

In current implementation, the CLI does not currently support record set updating, part because I've historically been wary of encouraging folks to use a CLI for CRUD lifecycle actions (vs a tool like terraform-provider-vinyldns that takes a more-developed philosophy on how to manage CRUD lifecycle on an ongoing basis). That said, I can see the need.

There is a regression that no longer allows CNAME record creates

Prerequisites

  • [ x] Put an X between the brackets on this line if you have done all of the following:
    • Checked that your issue isn't already filed.

Description

[Description of the issue]
See: #16, using 0.8.7
I haven't pinned the exact commit, but at some point #20 was undone, as this change is not present in the current master.

Steps to Reproduce

See #16

vinyldns record-set-create --zone-id <zone_id> --record-set-name some-cname --record-set-type CNAME --record-set-ttl 123 --record-set-data test.com

Expected behavior:

Create a CNAME

Actual behavior:

Response code:
400
Response body:
{"errors":["Missing CNAME.cname"]}

Reproduces how often:

100%

Versions

Tried on 0.8.4, 0.8.7

Additional Information

I downloaded 0.8.1 and I'm able to create a CNAME. At some point, a regression was introduced.

Add zone-update command

vinyldns-cli should offer a zone-update --json-style command, similar to zone-create, but used to update an existing zone.

Add documentation for batchChangeJSON

Prerequisites

  • Put an X between the brackets on this line if you have done all of the following:
    • Checked that your issue isn't already filed.

Description

The cli help tool and readme have no actual documentation as to what batch creation json should look like or references to a VinylDNS api document.

Versions

Found in 0.10.1

Make --output formatting apply to error responses

Prerequisites

  • Put an X between the brackets on this line if you have done all of the following:
    • Checked that your issue isn't already filed.

Description

When using the --output json formatting option on a request I received an http 400 error on from the vinyldns api, I discovered that it no longer prints using json formatting. Instead it prints a standard multiline, indented error message.

Steps to Reproduce

  1. Submit a change which will return an error to the vinyldns api
  2. Observe the output formatting not being respected

Expected behavior: I expect to get a json formatted error response when using the json output format, but it would apply equally to all output formats.

Actual behavior: Instead it prints a standard multiline, indented error message.

Reproduces how often: 100

Versions

Found in 0.10.1

Add info to the zones call

In the list zones call, right now, only the zone ID and zone name are displayed. The vinyldns api returns a lot more information though that is currently dropped: https://www.vinyldns.io/api/list-zones.html

For this card, include the email, adminGroupId, adminGroupName, created, status, and updated fields. Note updated may be blank, in which case that can display empty for the zone.

Consider re-writing tests in Go

Currently, the tests are authored in bats. However, it may be preferable -- and more expected by contributors -- to write the tests in Go. Arguable advantages include...

  • this would require less Go/bash context switching of contributors
  • this would allow the tests to be a bit more precise and granular in their assertions, given the relative ease of using a full programming language over bash

Add record-set-update

vinyldns-cli should offer a record-set-update --json-style command, similar to record-set-create, but used to update an existing recordset.

Display zone ACL rules on `zone` command

Description

Currently, the zone command fails to display zone ACL rules

Steps to Reproduce

  1. vinyldns zone --zone-id 123
  2. Observe that there are no ACL rules listed

Expected behavior: [What you expect to happen]

It would be great to render ACL rules data.

Versions

master

Provide the ability to output JSON

It would be useful to provide users the ability to specify a --json flag to get the VinylDNS data as json. This may be a bit tricky, as we will need to decide whether the feature should either:

a) return the raw, unformatted JSON from the VinylDNS API
b) return the vinyldns/go-vinyldns-marshal'd-and-unmarshal'd representation

Add info to the single zone call

for the command: zone --zone-id <zoneID>:

Right now, only the zone ID and zone name are displayed. The vinyldns api returns a lot more information though that is currently dropped: https://www.vinyldns.io/api/get-zone.html

For this card, include the email, adminGroupId, adminGroupName, created, status, and updated fields. Note updated may be blank, in which case that can display empty for the zone.

Add group-update command

vinyldns-cli should offer a group-update --json-style command, similar to group-create, but used to update an existing group.

Add a get batch change endpoint

See https://www.vinyldns.io/api/get-batchchange.html

This endpoint should look like batch-change <batch change ID>.

Note that there could be a lot of information in the response, as each change has an array of single changes returned, so display could be tricky. For the single change info, see https://www.vinyldns.io/api/batchchange-model.html#singlechange-attributes. In this, we would want to see, at a minimum:

  • changeType
  • inputName
  • type
  • ttl
  • record
  • status
  • systemMessage (this will only exist if there was an error processing the change)

Allow group name to be used instead of UUID on zone connect

Prerequisites

  • add a parameter for zone-create that accepts admin-group-name as a parameter
  • lookup the admin group id for the admin group name and build the zone request appropriately

Description

It is inconvenient to have to know the group UUID when doing a zone connect. Using the admin group name is more convenient for users.

Create integration tests

It would be useful to create some flavor of functional/integration tests to run in CI. I'm imagining something akin to the following order of events...

  1. start a local Dockerized VinylDNS API similar to how the terraform-provider-vinyldns does here
  2. either populate the local VinylDNS DB with some fixture data, or assume some exists
  3. run various vinyldns commands and compare the output to some expected output. It may be useful to keep a set of plaintext "fixtures" of the output to expect and leverage a tool like bats here. seaweed-cli offers an example similar to what I'm imagining.

Add test for batch change create response

Wer're only validating the status currently because the output and fixture formatting are not matching.

Intended test was:

@test "batch-change-create" {
  run $ew batch-change-create \
    --json "$(cat tests/fixtures/batch_change_create_json)"

  fixture="$(cat tests/fixtures/batch_change_create)"

  [ "$status" -eq 0 ]
  [ "${output}" = "${fixture}" ]
}

The most recent iteration of the the batch_change_create fixture I made was:

+--------------------+-------------------------------+
| ID                 |
+--------------------+-------------------------------+
| UserName           |
+--------------------+-------------------------------+
| UserID             |
+--------------------+-------------------------------+
| Status             | PendingProcessing             |
+--------------------+-------------------------------+
| Comments           | request on behalf of someone. |
+--------------------+-------------------------------+
| Changes            |
|                    |
|                    |
|                    |
|                    |
|                    |
|                    |
|                    |
|                    |
|                    |
+--------------------+-------------------------------+
| CreatedTimestamp   |
+--------------------+-------------------------------+
| OwnerGroupID       |
+--------------------+-------------------------------+
| ApprovalStatus     | AutoApproved                  |
+--------------------+-------------------------------+
| ReviewerID         |                               |
+--------------------+-------------------------------+
| ReviewerUserName   |                               |
+--------------------+-------------------------------+
| ReviewerTimestamp  |                               |
+--------------------+-------------------------------+
| ReviewComment      |                               |
+--------------------+-------------------------------+
| ScheduledTime      |                               |
+--------------------+-------------------------------+
| CancelledTimestamp |                               |
+--------------------+-------------------------------+

Update 'groups (when none exist)' integration tests

As discovered in code review for PR #85, it appears that the containerized VinylDNS API used in integration tests ships with a pre-established globalACLGroup group. I haven't investigated, but it's possible this is unique to 0.9.7 (previously, prior to PR #85, VinylDNS API 0.9.3 was used in the integration tests).

We should probably clean this up. Perhaps via one of the following options...

a) remove the groups (when none exist) tests
b) find some way to more accurately test the groups (when none exist) tests
c) modify the groups (when none exist) tests to be contextualized as groups (when only the pre-established group exists)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.