GithubHelp home page GithubHelp logo

ahoy-cli / ahoy Goto Github PK

View Code? Open in Web Editor NEW
258.0 13.0 36.0 1016 KB

Create self-documenting cli programs from YAML files. Easily wrap bash, grunt, npm, docker, (anything) to standardize your processes and make the lives of the people working on your project better.

Home Page: http://ahoycli.com/

License: MIT License

Go 73.92% Makefile 5.76% Shell 20.02% Dockerfile 0.30%
cli yaml devops cli-app bash

ahoy's People

Contributors

aashil avatar acouch avatar alexskrypnyk avatar arafalov avatar dependabot[bot] avatar dkinzer avatar elijahlynn avatar frankcarey avatar marji avatar mlncn avatar msound avatar ocean avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ahoy's Issues

Master branch is behind 1.1.0 tag

The 1.1.0 tag is basically the hash d674c31... I searched in your entire master branch commits, the HEAD is at a7fcfb8e and I cannot find the tag anywhere.

Support more detailed help per command

Right now, each command can specify a description of the command with usage that shows up in the command listing, but sometimes you might want to get even more detail for a command when getting help with just that command vs the command listing.

bats tests fail with no changes

With the latest version of bats, the tests provided are failing.
go test, go vet and golint are all passing though.

Perhaps the documentation or CI process can choose a version by number?

Even so, reverting to a tested version (8 months ago) is also failing (bats v0.4.2).

The obvious reason is the additional line which is being outputted as a result of the output from bats, because the check is checking equality of the last outputted line.

 ✗ run ahoy without a command and without a .ahoy.yml file
   (in test file tests/no-ahoy-file.bats, line 14)
     `[ "${lines[-2]}" == "[error] No .ahoy.yml found. You can use 'ahoy init' to download an example." ]' failed
   /var/folders/jl/wqclrysd4qs4wtsqjgxfc_l40000gq/T/bats.84521.src: line 14: lines: bad array subscript
✗ run ahoy init without a .ahoy.yml file
   (in test file tests/no-ahoy-file.bats, line 25)
     `[ "${lines[-1]}" == "example.ahoy.yml downloaded to the current directory. You can customize it to suit your needs!" ]' failed
   /var/folders/jl/wqclrysd4qs4wtsqjgxfc_l40000gq/T/bats.84521.src: line 25: lines: bad array subscript
 ✗ display help text and fatal error when no arguments are passed.
   (in test file tests/simple.bats, line 9)
     `[ "${lines[-1]}" == "[fatal] Missing flag or argument." ]' failed
   NAME:
      ahoy - Creates a configurable cli app for running commands.
   USAGE:
      ./ahoy [global options] command [command options] [arguments...]
      
   COMMANDS:
      echo      
      init      Initialize a new .ahoy.yml config file in the current directory.
   
   GLOBAL OPTIONS:
      --verbose, -v             Output extra details like the commands to be run. [$AHOY_VERBOSE]
      --file, -f                        Use a specific ahoy file.
      --help, -h                        show help
      --version                 print the version
      --generate-bash-completion        
      
   VERSION:
      2.0.0-3-g86bf337
      
   [fatal] Missing flag or argument.
   /var/folders/jl/wqclrysd4qs4wtsqjgxfc_l40000gq/T/bats.84556.src: line 9: lines: bad array subscript

Add a LICENSE

@frankcarey Before I start using this for my work related projects, I need to know under what license you are releasing this.

Deprecated method in ahoy.rb

$ brew info --json=v1 --installed
Error: Calling <<-EOS.undent is disabled!
Use <<~EOS instead.
/usr/local/Homebrew/Library/Taps/ahoy-cli/homebrew-tap/ahoy.rb:25:in `caveats'
Please report this to the ahoy-cli/tap tap!
Or, even better, submit a PR to fix it!

which is suddenly breaking digitalpulp/ballast#20

Allow for args and flags to be set

Allow people to create args and flags in the yaml file so that:

  • Args would be required (don't run commands without them, and display a reason)
  • Help text will show the argument in the details
  • Allow for more than just {{args}} or {{arg1}}.. {{argN}} to allow more complex commands
  • Allow for optional flags
  • Provide templates for flags, like {{flag:Name}} ?

zsh: segmentation fault | on MacBook Pro 13 with Apple M1 chip

Hi team,
Just wanted to get some help in sorting Ahoy installation on new MacBook Pro 13 with Apple M1 chip.
I ran "brew install ahoy" but got a message saying "bottle not available"
I have been able to build it from source and as per log below, it seems to have installed.
But when I run any commands, I am getting a "zsh: segmentation fault ahoy help" error and unable to run any ahoy commands.
I ran reinstall to be able to reproduce the log.

++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++
Last login: Thu Feb 11 17:52:25 on console
atamdhillon@ADPro ~ % git --version
git version 2.24.3 (Apple Git-128)
atamdhillon@ADPro ~ % brew --version
Homebrew 3.0.0
Homebrew/homebrew-core (git revision cb315; last commit 2021-02-11)
atamdhillon@ADPro ~ % brew install ahoy
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
==> New Formulae
rtl_433
==> Updated Formulae
Updated 37 formulae.

Warning: ahoy 2.0.0 is already installed and up-to-date.
To reinstall 2.0.0, run:
brew reinstall ahoy
atamdhillon@ADPro ~ % brew reinstall ahoy
==> Downloading https://github.com/ahoy-cli/ahoy/releases/download/2.0.0/ahoy-bi
Already downloaded: /Users/atamdhillon/Library/Caches/Homebrew/downloads/88e6f29cf7a638e58d73824b73be6ce0f907d40d349b16cb8e9a099980e1810e--ahoy-bin-darwin-amd64
==> Reinstalling ahoy-cli/tap/ahoy
==> Caveats

===== UPGRADING FROM 1.x TO 2.x =====

If you are upgrading from ahoy 1.x, note that you'll
need to upgrade your ahoyapi settings in your .ahoy.yml
files to 'v2' instead of 'v1'.

See other changes at:

https://github.com/ahoy-cli/ahoy

==> Summary
🍺 /opt/homebrew/Cellar/ahoy/2.0.0: 3 files, 3.7MB, built in 1 second
atamdhillon@ADPro ~ % ahoy help
zsh: segmentation fault ahoy help
atamdhillon@ADPro ~ % ahoy --help
zsh: segmentation fault ahoy --help
atamdhillon@ADPro ~ % clear

atamdhillon@ADPro ~ % brew install ahoy
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
==> Updated Formulae
Updated 1 formula.

Warning: ahoy 2.0.0 is already installed and up-to-date.
To reinstall 2.0.0, run:
brew reinstall ahoy
atamdhillon@ADPro ~ % brew reinstall ahoy
==> Downloading https://github.com/ahoy-cli/ahoy/releases/download/2.0.0/ahoy-bi
Already downloaded: /Users/atamdhillon/Library/Caches/Homebrew/downloads/88e6f29cf7a638e58d73824b73be6ce0f907d40d349b16cb8e9a099980e1810e--ahoy-bin-darwin-amd64
==> Reinstalling ahoy-cli/tap/ahoy
==> Caveats

===== UPGRADING FROM 1.x TO 2.x =====

If you are upgrading from ahoy 1.x, note that you'll
need to upgrade your ahoyapi settings in your .ahoy.yml
files to 'v2' instead of 'v1'.

See other changes at:

https://github.com/ahoy-cli/ahoy

==> Summary
🍺 /opt/homebrew/Cellar/ahoy/2.0.0: 3 files, 3.7MB, built in 1 second
atamdhillon@ADPro ~ % ahoy --help
zsh: segmentation fault ahoy --help
atamdhillon@ADPro ~ % ahoy help
zsh: segmentation fault ahoy help
atamdhillon@ADPro ~ % ahoy h
zsh: segmentation fault ahoy h
atamdhillon@ADPro ~ %

++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++

brew install is not working

I ran the command:

brew tap devinci-code/tap

and it ran successfully.

The next command gives me an error:

--- ~ » brew install ahoy
Error: undefined method `desc' for Formulary::Formulae::Ahoy:Class
Please report this bug:
    https://git.io/brew-troubleshooting
/usr/local/Library/Taps/devinci-code/homebrew-tap/ahoy.rb:2:in `<class:Ahoy>'
/usr/local/Library/Taps/devinci-code/homebrew-tap/ahoy.rb:1:in `load_file'
/usr/local/Library/Homebrew/formulary.rb:92:in `module_eval'
/usr/local/Library/Homebrew/formulary.rb:92:in `load_file'
/usr/local/Library/Homebrew/formulary.rb:82:in `klass'
/usr/local/Library/Homebrew/formulary.rb:71:in `get_formula'
/usr/local/Library/Homebrew/formulary.rb:200:in `factory'
/usr/local/Library/Homebrew/extend/ARGV.rb:16:in `block in formulae'
/usr/local/Library/Homebrew/extend/ARGV.rb:16:in `map'
/usr/local/Library/Homebrew/extend/ARGV.rb:16:in `formulae'
/usr/local/Library/Homebrew/cmd/install.rb:41:in `install'
/usr/local/Library/brew.rb:140:in `<main>'

Quotes are lost when running ahoy commands from other ahoy commands

It's pretty handy to call other ahoy commands (almost like reusable functions). This works pretty well most of the time, but if your "sub-command" uses quotes, they can get lost on the second call it seems.

Issue seems to be how Yaml handles the quotes. If you want to use quotes, then you have to not wrap the whole thing in the same quote.

Example

...
  commands:
    echo-success:
      cmd: echo "{{args}}"
    echo-fail:
      cmd: "echo {{args}}"
    echo-test:
      cmd: ahoy echo-success "'quotes'" && ahoy echo-fail "'quotes'"
$ ahoy echo-test test
2015/12/01 19:18:13 run command:  ahoy echo-success "'quotes'" && ahoy echo-fail "'quotes'"
2015/12/01 19:18:13 run command:  echo "'quotes'"
'quotes'
2015/12/01 19:18:13 run command:  echo 'quotes'
quotes

How to handle multiple commands.

Running multiple bash commands per ahoy command can be implemented easily using the following:

a && b
if a returns zero exit code, then b is executed.

a || b
if a returns non-zero exit code, then b is executed.

a ; b
a is executed and then b is executed.

ahoy init is not working

--- Projects/foo » ahoy
2016/07/02 12:31:59 AHOY! [fatal] ==>An ahoy config file couldn't be found in your path. You can create an example one by using 'ahoy init'
--- Projects/foo » ahoy init
2016/07/02 12:32:02 AHOY! [fatal] ==>An ahoy config file couldn't be found in your path. You can create an example one by using 'ahoy init'.

This was seen when using v1.1.0 (ahoy-darwin-amd64)

Install v2 on OSX using brew is failing showing `No names found`

After following instructions from readme
Executed commands:

brew tap ahoy-cli/tap
brew install ahoy --HEAD

Error message:

==> Installing ahoy from ahoy-cli/tap
==> Cloning https://github.com/ahoy-cli/ahoy.git
Updating /Users/jmolivas/Library/Caches/Homebrew/ahoy--git
==> Checking out branch master
==> bash build.sh
Last 15 lines from /Users/jmolivas/Library/Logs/Homebrew/ahoy/01.bash:
2018-03-23 17:05:54 -0700

bash
build.sh

fatal: No names found, cannot describe anything.

If reporting this issue please do so at (not Homebrew/brew or Homebrew/core):
https://github.com/ahoy-cli/homebrew-tap/issues

Better help text for `import`

from @FatherShawn:
Started building with ahoy. I have this in my base file:

commands:
  import: ./scripts/ahoy/robo.ahoy.yml

and I get this:

[fatal] yaml: unmarshal errors:
  line 4: cannot unmarshal !!str `./scrip...` into main.Command`
(Me)

We should help people moving from V1 to V2 out by providing a more clear error here than the default one.. unmarshaling, !!sr and the like are way too cryptic overall. In the case of known v1 patterns or common patterns, we might even suggest where to find the new spec or suggest corrections.

Add a verbose flag for debugging

It's super handy to know what command is actually being run, especially when debugging commands. I'm using it locally and it looks like this. Especially useful when calling ahoy commands from another command like is shown here.

I think it would be good to implement with a -v flag. One thing I would add is the command that's actually called behind the scenes.

$ ahoy echo-test test
2015/12/01 19:23:22 run command:  ahoy echo-success "'quotes'" && ahoy echo-fail "'quotes'" && ahoy echo-maybe "'quotes'"
2015/12/01 19:23:22 run command:  echo "'quotes'"
'quotes'
2015/12/01 19:23:22 run command:  echo 'quotes'
quotes
2015/12/01 19:23:22 run command:  echo "'quotes'"
'quotes'

Update to CircleCI 2

This is to track update progress to CircleCI 2.0 config.

The work has been done here:
#75

Note, that all tests are passing and none of them were changed in any way.

Influence imports

Hi! It's really nice, when you have an idea about a tool and actually find, that somebody already created it 😄 Thank you!

I'm not sure if this is the right place to ask (so I don't expect an answer and you can just close this issue).

I currently work with a structure like this:

  • some_software
    • environment1
      • task1 (like ssh)
      • task2 (merge some url params)
      • task3 (open database)
      • ...
    • environment2
      • task1 (same as above)
        ..
    • ....

I use some_software in different environments. They all have the same (or mostly the same) tasks, where only basics like urls need replacement. So it makes most sense (to me ;) to use the same tasks.yml for all environments, and pass different environment-variables to them.

So i tried the following:

#.ahoy.yml
commands:
  some_software:
    usage: List the commands from the imported config files.
    imports:
    - ./environment1.yml #<-- this imports tasks.yml
    - ./environment2.yml #<-- this also imports tasks.yml
#.environment1.yml
commands:
  environment1:
    usage: List tasks
    imports:
    - ./tasks.yml
#.tasks.yml
commands:
  task1:
    usage: Use env defined in parent
    cmd: echo "$SOME_ENVIRONMENT_VARIABLE followed by parameters $1"

I learned, that entrypoint is only executed, when there is actual commands (not for imports) and there can not be a cmd and import at the same time. So I don't know how to "define something" in environment1.yml. This might be related to #21.
Do you have any idea, how I could achieve this? Did I miss something?

A solution could be executing ahoy from subfolders (that contain files with environment-variables) and referencing the task.yml in a parent folder. As root stays the same (ls -la always shows the folder where you started ahoy), including the environment-variables in entrypoint in tasks.yml whould include the environment-variables from the subfolders. This takes away some of the "simplicity" though.

Fix the `init` command for v2

Right now, ahoy init downloads a v1 ahoy file to start with. It should also contain much better examples, code comments, etc.. so that it's even easier to get started.

Support Multi-line Commands

It would be useful and a better UX to run multiple commands using multiple lines for the commands. We could then support joining them all together on behalf with && (which would preserve the environment) or running as separate bash shells.

Redirect completion to sub-process

It would be awesome if bash-completion could be redirected down into the subprocess.

Example command:

commands:
  complete:
    cmd: git

When I type ahoy complete <TAB>, I get nothing (process hangs because the current setup is actually calling the 'git' command instead of forwarding the to it.

Related issue about causing commands to actually run! urfave/cli#272

It looks like we might be able to simulate keypresses using echo -e "\t" | git
See : http://stackoverflow.com/questions/6264596/simulating-enter-keypress-in-bash-script

Global .ahoy.yml

It might be nice to be able to have a globally defined .ahoy.yml that can be project-wide or for personal use not to be added to the per project file.

Help text doesn't wrap nicely with long command command help descriptions (usage)

Instead of wrapping smartly (in a table like fashion), lines wrap to the beginning of the next line. Not a biggie, but it can be hard to read. I've seen other commands do this where lines wrap within the column, but it probably requires knowing the terminal width. Need to look around and see if go templates support something like this.

We might get around this by having a long and short version of the help text?

Commands aren't alphabetized or even consistent order

if you run ahoy help or just ahoy multiple times, you'll notice the order of the commands changes each time. I'm guessing it's the way the .ahoy.yml file is read in (currently?).

Best solution would probably be to list them alphabetically.

Support for .env files

Maybe Ahoy already supports this, but it would be very helpful to automatically load environment variables from .env files. Or even better - implement what Makefile allows - including script from multiple files using include command.

Ahoy only supports API version ‘v1’, but ‘v2’ given in... unable to uninstall via Linuxbrew

Hi All,

I'm on Windows 10 WSL running Ubuntu from the app store.
Accessing terminal via Hyper.
Linuxbrew is installed and working. Kinda.

I was originally able to install Ahoy using:

brew install ahoy-cli/tap/ahoy

But have seen getting the error "Ahoy only supports API version ‘v1’, but ‘v2’ given in" when trying to AHOY UP on a docker image.

I found this issue and tried:

I have the same issue and this is how I fixed:
Remove ahoy

$ brew prune ahoy
$ brew uninstall ahoy

After this reinstall ahoy specifying the brew tap

$ brew install ahoy-cli/tap/ahoy

I don't know if the repo change his name on GitHub and something broke's

and got...

/mnt/c/Users/elaw/projects$ brew prune
/mnt/c/Users/elaw/projects$
/mnt/c/Users/elaw/projects$ brew uninstall ahoy
Error: No such keg: /home/linuxbrew/.linuxbrew/Cellar/ahoy

And when i try reinstalling:

:/mnt/c/Users/elaw/projects$ brew reinstall ahoy-cli/tap/ahoy
==> Reinstalling ahoy-cli/tap/ahoy
nice: cannot set niceness: Permission denied
==> Downloading https://github.com/ahoy-cli/ahoy/releases/download/2.0.0/ahoy-bin-darwin-amd6Already downloaded: /home/elaw/.cache/Homebrew/downloads/88e6f29cf7a638e58d73824b73be6ce0f907d40d349b16cb8e9a099980e1810e--ahoy-bin-darwin-amd64
Error: An exception occurred within a child process:
ArgumentError: parent directory is world writable but not sticky
:/mnt/c/Users/elaw/projects$

Upgrade doesn't see the install:

:/mnt/c/Users/elaw/projects$ brew upgrade ahoy
Error: ahoy-cli/tap/ahoy not installed
:/mnt/c/Users/elaw/projects$

How can I remove the existing AHOY and upgrade to v2?

Passing arguments/flags?

Is there a way to pass arguments and flags?

I was trying to make this command:

  gulp:
    cmd: |
      echo "Running gulp $@"
      docker-compose run --rm node sh -c "./node_modules/gulp-cli/bin/gulp.js $@"
    usage: Runs a gulp task.

This is so I can run a command like:

ahoy gulp build --flag1 --option value

But the flags seem to be ignored.

Add ability to define subcommands in the same file

Right now, you have to import another file to have subcommands, but it would be nice to:

  1. Declare subcommands in the parent file itself, making it easier to have full control over the cli app.

  2. Override subcommands from the parent, so you can override a subset of commands in another file without copying the entire file. (also useful if you have a standard set of commands across projects, but you only need to override one of them)

Defining a command without cmd or valid imports defined causes panic

This should fail more gracefully with a helpful error message.

Example files:

version: v2
commands:
  example:
    usage: This doesn't have a command defined.
version: v2
commands:
  example:
    usage: 'cmd' is misspelled as 'dmc'
    dmc: echo "test"
version: v2
commands:
  example:
    usage: This doesn't have an import where the file actually exists.
    imports:
      - file-not-exists.yml
version: v2
commands:
  example:
    usage: This has 'imports' misspelled as 'import'
    import:
      - import-exists.yml

Panic Error

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x74918]

goroutine 1 [running]:
panic(0x17d220, 0xc4200120b0)
	/usr/local/Cellar/go/1.7.3/libexec/src/runtime/panic.go:500 +0x1a1
github.com/ahoy-cli/ahoy/vendor/github.com/codegangsta/cli.Command.Run(0xc4200705a0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc4200705c0, 0xf, 0x0, ...)
	/private/tmp/ahoy-20161121-46993-73ob16/src/github.com/ahoy-cli/ahoy/vendor/github.com/codegangsta/cli/command.go:131 +0x798
github.com/ahoy-cli/ahoy/vendor/github.com/codegangsta/cli.(*App).Run(0xc42009e120, 0xc420084060, 0x2, 0x2, 0x0, 0x0)
	/private/tmp/ahoy-20161121-46993-73ob16/src/github.com/ahoy-cli/ahoy/vendor/github.com/codegangsta/cli/app.go:175 +0xa35
main.main()
	/private/tmp/ahoy-20161121-46993-73ob16/src/github.com/ahoy-cli/ahoy/ahoy.go:379 +0xea

hide: true only works for first tier commands

When defining an api it would be useful to be able to hide detail commands for more than just the first tier of the command tree. If I try to hide say ahoy docker helper-function by making hide: true in the helper-function definition object, It is not hidden when I run ahoy docker.

This is affecting v1 and v2-alpha.

Add more support for Windows

Right now, Windows should work but there are some things about it that are a pain.

To install for windows:

  • Download the windows-x64 build of ahoy.
  • Move the file to someplace like C:/Program Files/Ahoy/ and also rename it to ahoy.exe
  • Update your Path environment variable to include that directory e.g. C:\Program Files\Ahoy\
  • open a new cmd shell
  • Since you currently need bash, you have to install that on Windows 10 anniversary edition or greater OR install cygwin which seems to work well.

Instead, some might find it useful to use powershell or something else. If we allow the init script to be changed, then we should be able to allow people to customize it to use powershell instead... something like this?

echo {{cmd}} | powershell- Command -

So the tasks would be:

  • Support custom "entry/init" command
  • Add a Windows installer that does all the tasks above for you.

Add a complete sub-command example for v2

I copied the example .ahoy.yml from the home page, ending with this:

  subcommands:
      usage: List the commands from the imported config files.
      # These commands will be aggregated together with later files overriding earlier ones if they exist.
      imports:
        - ./some-file1.ahoy.yml
        - ./some-file2.ahoy.yml
        - ./some-file3.ahoy.yml

I then created some-file1.ahoy.yml:

ahoyapi: v2
commands:
  foo:
    cmd: echo "file1 foo"
    usage: Test command for file1.

and two similar files. I must be doing something wrong:

$ ahoy
[fatal] Command [subcommands] has 'imports' set, but no commands were found. Check your yaml file.

I think a more complete example would help.

Add a {{dir}} placeholder for relative commands

I want to reference something on the local file system in a docker exec command. If I was in the root folder (where .ahoy.yml file is) then I should be ok, but it would be nice to be able to do the same thing in a subdirectory. Ahoy could easily be smart enough to know the relative path of the directory ahoy is being called from and place that into {{dir}}

This is really useful for docker commands being run outside the container since you could know what the root is inside the container.

Allow for plugins and config using an init hook

Right now, bash -c <my cmd script> is run for each command. It would be useful to have either a more complex or at least alternative to using bash.

Examples:

  • Allow for a "config" file where all the environment variables are loaded into your environment before any commands are run.
  • Add the ability to add in plugins/middleware, say for docker.
  • Be able to run commands where the bash shell is not available.

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.