Skip to content

Sample workflow

Rafal Wrzochol edited this page Jan 15, 2020 · 2 revisions

1. Create application skeleton

$ grapethor new MyGrapeApp -x mygrapeapp

Creating new application...
arguments: {"name"=>"MyGrapeApp"}
options: {"path"=>".", "prefix"=>"mygrapeapp", "db"=>"sqlite", "orm"=>"activerecord", "server"=>"thin", "test"=>"minitest", "docker"=>true, "license"=>"mit", "ruby"=>"2.5.3", "swagger"=>true}

      create  MyGrapeApp
      create  MyGrapeApp/.gitignore
      create  MyGrapeApp/.grapethor.yml
      create  MyGrapeApp/Gemfile
      create  MyGrapeApp/README.md
      create  MyGrapeApp/Rakefile
      create  MyGrapeApp/api/base.rb
      create  MyGrapeApp/app/exceptions/not_found_error.rb
      create  MyGrapeApp/bin/console
      create  MyGrapeApp/bin/server
      create  MyGrapeApp/bin/setup
      create  MyGrapeApp/config.ru
      create  MyGrapeApp/config/application.rb
      create  MyGrapeApp/config/boot.rb
      create  MyGrapeApp/config/environment.rb
      create  MyGrapeApp/db/seeds.rb
      create  MyGrapeApp/lib/tasks/routes.rake
       chmod  MyGrapeApp/bin/console
       chmod  MyGrapeApp/bin/setup
       chmod  MyGrapeApp/bin/server
       exist  MyGrapeApp
      create  MyGrapeApp/config/database.yml
       exist  MyGrapeApp
      create  MyGrapeApp/lib/tasks/test.rake
      create  MyGrapeApp/test/support/reporters.rb
      create  MyGrapeApp/test/support/test_case.rb
      create  MyGrapeApp/test/test_helper.rb
       exist  MyGrapeApp
      create  MyGrapeApp/Dockerfile
      create  MyGrapeApp/docker-compose.yml
       exist  MyGrapeApp
      create  MyGrapeApp/LICENSE
       exist  MyGrapeApp
      create  MyGrapeApp/swagger-ui/favicon-16x16.png
      create  MyGrapeApp/swagger-ui/favicon-32x32.png
      create  MyGrapeApp/swagger-ui/index.html
      create  MyGrapeApp/swagger-ui/oauth2-redirect.html
      create  MyGrapeApp/swagger-ui/swagger-ui-bundle.js
      create  MyGrapeApp/swagger-ui/swagger-ui-bundle.js.map
      create  MyGrapeApp/swagger-ui/swagger-ui-standalone-preset.js
      create  MyGrapeApp/swagger-ui/swagger-ui-standalone-preset.js.map
      create  MyGrapeApp/swagger-ui/swagger-ui.css
      create  MyGrapeApp/swagger-ui/swagger-ui.css.map
      create  MyGrapeApp/swagger-ui/swagger-ui.js
      create  MyGrapeApp/swagger-ui/swagger-ui.js.map

Well done!

Note '-x' is for URL prefix (default: 'api')

2. Go to application directory

cd MyGrapeApp

Otherwise you would need using --path option for any further commands.

3. Create API (with a version tag)

$ grapethor api ver1

Creating new API...
arguments: {"version"=>"ver1"}
options: {"path"=>"."}

       exist  
      create  api/ver1/base.rb
       exist  
      create  test/support/api_ver1_test_case.rb
      insert  api/base.rb

Well done!

4. Create resource

$ grapethor resource item -v ver1 -a name:string available:boolean price:integer

Creating new resource...
arguments: {"name"=>"item"}
options: {"path"=>".", "version"=>"ver1", "attrs"=>{"name"=>"string", "available"=>"boolean", "price"=>"integer"}}

       exist  
      create  api/ver1/items.rb
      create  api/entities/item.rb
      create  app/models/item.rb
      create  db/migrations/20190409120038_create_items.rb
       exist  
      create  test/api/ver1/items_test.rb
      create  test/fixtures/items.yml
      create  test/models/item_test.rb
      insert  api/ver1/base.rb

Well done!

5. Create (extra) endpoint

$ grapethor endpoint item search -v ver1 -m GET -a name:string -d "Get item by :name"

Creating new endpoint...
arguments: {"resource"=>"item", "name"=>"search"}
options: {"path"=>".", "version"=>"ver1", "method"=>"GET", "desc"=>"Get item by :name", "params"=>{"name"=>"string"}, "query"=>{}}

      insert  api/ver1/items.rb
      insert  api/ver1/base.rb
      insert  test/api/ver1/items_test.rb

Well done!

6. Create sample (standalone) endpoint:

$ grapethor endpoint user register -v ver1 -m POST -a id:integer -q name:string email:string -d "Register user"

Creating new endpoint...
arguments: {"resource"=>"user", "name"=>"register"}
options: {"path"=>".", "version"=>"ver1", "method"=>"POST", "desc"=>"Register user", "params"=>{"id"=>"integer"}, "query"=>{"name"=>"string", "email"=>"string"}}

       exist  api/ver1
      create  api/ver1/users.rb
      insert  api/ver1/users.rb
      insert  api/ver1/base.rb
       exist  
      create  test/api/ver1/users_test.rb
      insert  test/api/ver1/users_test.rb

Well done!

7. Setup the application

$ bin/setup

bundle install
Fetching gem metadata from https://rubygems.org/........
Resolving dependencies...
Using rake 12.3.2
Using concurrent-ruby 1.1.5
Using i18n 1.6.0
Using minitest 5.11.3
Using thread_safe 0.3.6
Using tzinfo 1.2.5
Using activesupport 5.2.3
Using activemodel 5.2.3
Using arel 9.0.0
Using activerecord 5.2.3
Using ansi 1.5.0
Using descendants_tracker 0.0.4
Using ice_nine 0.11.2
Using axiom-types 0.1.1
Using builder 3.2.3
Using bundler 2.0.1
Using coercible 1.0.0
Using daemons 1.3.1
Using database_cleaner 1.7.0
Using equalizer 0.0.11
Using eventmachine 1.2.7
Using mustermann 1.0.3
Using mustermann-grape 1.0.0
Using rack 2.0.7
Using rack-accept 0.4.5
Using virtus 1.0.5
Using grape 1.2.3
Using multi_json 1.13.1
Using grape-entity 0.7.1
Using grape-swagger 0.32.1
Using hashie 3.6.0
Using hashie-forbidden_attributes 0.1.1
Using ruby-progressbar 1.10.0
Using minitest-reporters 1.3.6
Fetching otr-activerecord 1.3.0
Installing otr-activerecord 1.3.0
Using rack-cors 1.0.3
Using rack-test 1.1.0
Using require_all 2.0.0
Using sqlite3 1.3.13
Using thin 1.7.2
Bundle complete! 15 Gemfile dependencies, 40 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.

# Do any other automated setup that you need to do here
$ rake db:migrate
== 20190409120038 CreateItems: migrating ======================================
-- create_table(:items)
   -> 0.0005s
== 20190409120038 CreateItems: migrated (0.0006s) =============================

8. Run tests

$ rake db:setup
Database 'db/development.sqlite3' already exists
Database 'db/test.sqlite3' already exists
-- create_table("items", {:force=>:cascade})
   -> 0.0208s
-- create_table("items", {:force=>:cascade})
   -> 0.0079s
$ rake test

# Running tests with run options --seed 60023:

........

Finished tests in 0.103873s, 77.0171 tests/s, 163.6613 assertions/s.


8 tests, 17 assertions, 0 failures, 0 errors, 0 skips

8. Check the routes available

$ rake routes
     GET        /mygrapeapp/:version/items/:name/search(.json)
     GET        /mygrapeapp/:version/items(.json)
     GET        /mygrapeapp/:version/items/:id(.json)
     POST       /mygrapeapp/:version/items(.json)
     PUT        /mygrapeapp/:version/items/:id(.json)
     DELETE     /mygrapeapp/:version/items/:id(.json)
     POST       /mygrapeapp/:version/users/:id/register(.json)
     GET        /mygrapeapp/:version/swagger_doc(.:format)
     GET        /mygrapeapp/:version/swagger_doc/:name(.:format)

Note the grape-swagger documentation endpoints available.

9. Check rake tasks available

$ rake -T
rake db:create                  # Creates the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:create:all to create all databases in the config). With...
rake db:create_migration[name]  # Create a migration
rake db:drop                    # Drops the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:drop:all to drop all databases in the config). Without RA...
rake db:environment:set         # Set the environment value for the database
rake db:fixtures:load           # Loads fixtures into the current environment's database
rake db:migrate                 # Migrate the database (options: VERSION=x, VERBOSE=false, SCOPE=blog)
rake db:migrate:status          # Display status of migrations
rake db:rollback                # Rolls the schema back to the previous version (specify steps w/ STEP=n)
rake db:schema:cache:clear      # Clears a db/schema_cache.yml file
rake db:schema:cache:dump       # Creates a db/schema_cache.yml file
rake db:schema:dump             # Creates a db/schema.rb file that is portable against any DB supported by Active Record
rake db:schema:load             # Loads a schema.rb file into the database
rake db:seed                    # Loads the seed data from db/seeds.rb
rake db:setup                   # Creates the database, loads the schema, and initializes with the seed data (use db:reset to also drop the database first)
rake db:structure:dump          # Dumps the database structure to db/structure.sql
rake db:structure:load          # Recreates the databases from the structure.sql file
rake db:version                 # Retrieves the current schema version number
rake routes                     # API Routes
rake test                       # Run tests

10. Start the application

$ bin/server

Accesss sample endpoint

http://localhost:9292/mygrapeapp/ver1/items

Access swagger documentation

http://localhost:9292