sumcli 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +7 -0
  5. data/CODE_OF_CONDUCT.md +74 -0
  6. data/Gemfile +6 -0
  7. data/Gemfile.lock +144 -0
  8. data/LICENSE.txt +20 -0
  9. data/README.md +43 -0
  10. data/Rakefile +6 -0
  11. data/bin/console +14 -0
  12. data/bin/setup +8 -0
  13. data/docker-compose.yml +2 -0
  14. data/exe/sumcli +18 -0
  15. data/lib/sumcli/cli.rb +37 -0
  16. data/lib/sumcli/command.rb +121 -0
  17. data/lib/sumcli/commands/.gitkeep +1 -0
  18. data/lib/sumcli/commands/add/service.rb +30 -0
  19. data/lib/sumcli/commands/add.rb +24 -0
  20. data/lib/sumcli/commands/g/endpoint.rb +69 -0
  21. data/lib/sumcli/commands/g.rb +24 -0
  22. data/lib/sumcli/commands/new.rb +25 -0
  23. data/lib/sumcli/templates/.gitkeep +1 -0
  24. data/lib/sumcli/templates/add/service/.gitkeep +1 -0
  25. data/lib/sumcli/templates/g/endpoint/.gitkeep +1 -0
  26. data/lib/sumcli/templates/g/endpoint/entity.rb.erb +7 -0
  27. data/lib/sumcli/templates/g/endpoint/new.rb.erb +8 -0
  28. data/lib/sumcli/templates/g/endpoint/test.rb.erb +19 -0
  29. data/lib/sumcli/templates/new/.gitkeep +1 -0
  30. data/lib/sumcli/templates/new/app/.editorconfig +12 -0
  31. data/lib/sumcli/templates/new/app/.gitignore +9 -0
  32. data/lib/sumcli/templates/new/app/.rspec +2 -0
  33. data/lib/sumcli/templates/new/app/.ruby-version +1 -0
  34. data/lib/sumcli/templates/new/app/Dockerfile +14 -0
  35. data/lib/sumcli/templates/new/app/Gemfile +35 -0
  36. data/lib/sumcli/templates/new/app/Guardfile +33 -0
  37. data/lib/sumcli/templates/new/app/Procfile +5 -0
  38. data/lib/sumcli/templates/new/app/README.md +103 -0
  39. data/lib/sumcli/templates/new/app/Rakefile +38 -0
  40. data/lib/sumcli/templates/new/app/api/base.rb +6 -0
  41. data/lib/sumcli/templates/new/app/api/endpoints/base.rb +15 -0
  42. data/lib/sumcli/templates/new/app/app/exceptions/not_found_error.rb +1 -0
  43. data/lib/sumcli/templates/new/app/bin/console +13 -0
  44. data/lib/sumcli/templates/new/app/config/application.rb +15 -0
  45. data/lib/sumcli/templates/new/app/config/environment.rb +4 -0
  46. data/lib/sumcli/templates/new/app/config.ru +5 -0
  47. data/lib/sumcli/templates/new/app/docker-compose.yml +2 -0
  48. data/lib/sumcli/templates/new/app/spec/spec_helper.rb +39 -0
  49. data/lib/sumcli/version.rb +3 -0
  50. data/lib/sumcli.rb +6 -0
  51. data/sumcli.gemspec +53 -0
  52. metadata +445 -0
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'thor'
4
+
5
+ module Sumcli
6
+ module Commands
7
+ class G < Thor
8
+
9
+ namespace :g
10
+
11
+ desc 'endpoint NAME METHOD ROUTE', 'Generate a new endpoint using METHOD verb and matching url ROUTE'
12
+ method_option :help, aliases: '-h', type: :boolean,
13
+ desc: 'Display usage information'
14
+ def endpoint(name, method = nil, route = nil)
15
+ if options[:help]
16
+ invoke :help, ['endpoint']
17
+ else
18
+ require_relative 'g/endpoint'
19
+ Sumcli::Commands::G::Endpoint.new(name, method, route, options).execute
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../command'
4
+
5
+ module Sumcli
6
+ module Commands
7
+ class New < Sumcli::Command
8
+ def initialize(name, options)
9
+ @name = name
10
+ @options = options
11
+ end
12
+
13
+ def execute(input: $stdin, output: $stdout)
14
+ output.puts "OK"
15
+
16
+ unless @name.nil? or File.directory?(@name)
17
+ directory = File.expand_path('../../templates/new/app', __FILE__)
18
+ return generator.copy_directory(directory, @name)
19
+ end
20
+
21
+ output.puts "Directory #{@name} already exists."
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1 @@
1
+ #
@@ -0,0 +1 @@
1
+ #
@@ -0,0 +1,7 @@
1
+ module API
2
+ module Entities
3
+ class <%= name.capitalize %> < Grape::Entity
4
+ expose :id
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,8 @@
1
+ module API
2
+ class <%= name.capitalize %> < Grape::API
3
+ resource :<%= name.downcase %> do
4
+ # AUTO-GENERATED (DO NOT ERASE THIS COMMENT)
5
+ # ENDPOINTS
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe API::<%= name.capitalize %> do
4
+ include Rack::Test::Methods
5
+
6
+ def app
7
+ API::<%= name.capitalize %>
8
+ end
9
+
10
+ describe 'GET /api/<%= name.downcase %>' do
11
+ let(:expected_response) { <%= name.downcase %> }
12
+
13
+ it 'returns all <%= name.downcase %>' do
14
+ get '/api/v1/<%= name.downcase %>'
15
+
16
+ expect(last_response.status).to eq(200)
17
+ expect(last_response.body).to eq(expected_response)
18
+ end
19
+ end
@@ -0,0 +1 @@
1
+ #
@@ -0,0 +1,12 @@
1
+ root = true
2
+
3
+ [*]
4
+ indent_style = space
5
+ indent_size = 2
6
+ end_of_line = lf
7
+ charset = utf-8
8
+ trim_trailing_whitespace = true
9
+ insert_final_newline = true
10
+
11
+ [*.{sh,markdown}]
12
+ indent_size = 4
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+ *.swp
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
@@ -0,0 +1 @@
1
+ 2.6.2
@@ -0,0 +1,14 @@
1
+ FROM ruby:2.6.2
2
+
3
+ # Installing application dependencies
4
+ RUN apt-get update
5
+ RUN apt-get install nodejs -y
6
+
7
+ ENV APP_HOME /usr/src/app/
8
+ RUN mkdir $APP_HOME
9
+ WORKDIR $APP_HOME
10
+
11
+ COPY Gemfile* $APP_HOME
12
+ RUN bundle install
13
+
14
+ COPY . $APP_HOME
@@ -0,0 +1,35 @@
1
+ # source 'https://maven.internal.sumup.com/content/repositories/gems/'
2
+ source 'https://rubygems.org'
3
+
4
+
5
+ ruby '2.6.2'
6
+
7
+ gem 'rack', '~> 2.0'
8
+ gem 'grape', '~> 1.2'
9
+ gem 'grape-entity', '~> 0.7'
10
+ gem 'global', '~> 1.1.0'
11
+ gem 'require_all', '~> 1.3', '>= 1.3.3'
12
+ gem 'faraday', '~> 0.15.4'
13
+
14
+ group :development, :test do
15
+ gem 'pry-byebug'
16
+ end
17
+
18
+ group :development do
19
+ gem 'rake'
20
+ gem 'thin'
21
+ gem 'guard', require: false
22
+ gem 'guard-rack', require: false
23
+ gem 'guard-bundler', require: false
24
+ end
25
+
26
+ group :test do
27
+ gem 'rspec'
28
+ gem 'rack-test'
29
+ gem 'factory_girl'
30
+ gem 'shoulda-matchers'
31
+ gem 'database_cleaner'
32
+ gem 'simplecov', require: false
33
+ gem 'codecov', :require => false
34
+ end
35
+
@@ -0,0 +1,33 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ ## Uncomment and set this to only include directories you want to watch
5
+ # directories %w(app lib config test spec features) \
6
+ # .select{|d| Dir.exist?(d) ? d : UI.warning("Directory #{d} does not exist")}
7
+
8
+ ## Note: if you are using the `directories` clause above and you are not
9
+ ## watching the project directory ('.'), then you will want to move
10
+ ## the Guardfile to a watched dir and symlink it back, e.g.
11
+ #
12
+ # $ mkdir config
13
+ # $ mv Guardfile config/
14
+ # $ ln -s config/Guardfile .
15
+ #
16
+ # and, you'll have to watch "config/Guardfile" instead of "Guardfile"
17
+
18
+ guard 'rack', port: 3000 do
19
+ watch('Gemfile.lock')
20
+ watch(%r{^(config|lib|app|api)/.*})
21
+ end
22
+
23
+ guard :bundler do
24
+ require 'guard/bundler'
25
+ require 'guard/bundler/verify'
26
+ helper = Guard::Bundler::Verify.new
27
+
28
+ files = ['Gemfile']
29
+ files += Dir['*.gemspec'] if files.any? { |f| helper.uses_gemspec?(f) }
30
+
31
+ # Assume files are symlinked from somewhere
32
+ files.each { |file| watch(helper.real_path(file)) }
33
+ end
@@ -0,0 +1,5 @@
1
+ web: rackup -p 3000
2
+ worker: bundle exec sidekiq -r ./config/environment.rb
3
+ docker: docker-compose up -d redis db server rabbitmq
4
+ migration: docker-compose run web rake db:create db:migrate
5
+ develop: bundle exec guard
@@ -0,0 +1,103 @@
1
+ # Grape Bootstrap
2
+
3
+ ## Introduction
4
+
5
+ Bootstrap Grape application for REST APIs. Refer to [Wiki](https://github.com/rasouza/API_boilerplate/wiki) to know more about how features are implemented
6
+
7
+ ## Features
8
+
9
+ - Live Reload Development ([Guard](https://github.com/guard/guard))
10
+ - RabbitMQ ([Sneakers](http://sneakers.io/))
11
+ - Cron Jobs ([Sidekiq](https://sidekiq.org/))
12
+ - Audit Logs ([PaperTrail](https://github.com/paper-trail-gem/paper_trail))
13
+ - [Codecov.io](https://codecov.io/)
14
+ - [Sentry.io](https://sentry.io/)
15
+
16
+ ## Dependencies
17
+
18
+ - Ruby 2.6.2
19
+ - PostgreSQL
20
+ - Redis 5
21
+
22
+ ## Installation
23
+
24
+ - Clone poject
25
+
26
+ - Run bundler:
27
+
28
+ ```shell
29
+ $ bundle install
30
+ ```
31
+
32
+ - Create database and run migrations:
33
+
34
+ ```shell
35
+ $ bundle exec rake db:create db:migrate
36
+ ```
37
+
38
+ - Run application:
39
+
40
+ ```shell
41
+ $ rackup -p 3000
42
+ ```
43
+
44
+ - For development:
45
+ ```shell
46
+ $ bundle exec guard
47
+ ```
48
+
49
+ ## Docker
50
+
51
+ To run application on docker:
52
+
53
+ - Install Docker and Docker-Compose
54
+ - Clone the project
55
+ - Run these commands on project root:
56
+
57
+ ```shell
58
+ $ docker-compose build
59
+ $ docker-compose up
60
+
61
+ # Open another terminal and run:
62
+ $ docker-compose run web bundle exec rake db:create db:migrate
63
+ ```
64
+
65
+ ## Console
66
+
67
+ To use console, run the following command:
68
+
69
+ ```shell
70
+ $ bin/console
71
+ ```
72
+
73
+ ## Background Jobs
74
+
75
+ To run Cron Jobs:
76
+ ```shell
77
+ $ bin/sidekiq
78
+ ```
79
+
80
+ To run RabbitMQ Workers:
81
+ ```shell
82
+ $ bin/sneakers
83
+ ```
84
+
85
+ ## Tests
86
+
87
+ To execute tests, run the following command:
88
+
89
+ ```shell
90
+ $ bundle exec rspec
91
+ ```
92
+
93
+ ## Routes
94
+
95
+ To show the application routes, run the following command:
96
+
97
+ ```shell
98
+ $ bundle exec rake routes
99
+ ```
100
+
101
+ ## License
102
+
103
+ The software is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
@@ -0,0 +1,38 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ require "bundler/setup"
4
+
5
+ begin
6
+ Bundler.setup(:default, :development)
7
+ rescue Bundler::BundlerError => e
8
+ $stderr.puts e.message
9
+ $stderr.puts 'Run `bundle install` to install missing gems'
10
+ exit e.status_code
11
+ end
12
+
13
+ task :environment do
14
+ ENV['RACK_ENV'] ||= 'development'
15
+ require File.expand_path('../config/environment', __FILE__)
16
+ end
17
+
18
+ desc "API Routes"
19
+ task routes: :environment do
20
+ API::Base.routes.each do |api|
21
+ method = api.request_method.ljust(10)
22
+ path = api.path
23
+ puts " #{method} #{path}"
24
+ end
25
+ end
26
+
27
+ # load "tasks/otr-activerecord.rake"
28
+
29
+ namespace :db do
30
+ task :environment do
31
+ require_relative 'config/environment'
32
+ end
33
+ end
34
+
35
+
36
+ #Load tasks
37
+ Dir.glob('lib/tasks/*.rake').each { |task| load task }
38
+
@@ -0,0 +1,6 @@
1
+ module API
2
+ class Base < Grape::API
3
+ mount API::Endpoints
4
+ end
5
+ end
6
+
@@ -0,0 +1,15 @@
1
+ module API
2
+ class Endpoints < Grape::API
3
+ format :json
4
+ prefix :api
5
+
6
+ helpers do
7
+ def return_no_content_status
8
+ status :no_content
9
+ ''
10
+ end
11
+ end
12
+
13
+ end
14
+ end
15
+
@@ -0,0 +1 @@
1
+ class NotFoundError < StandardError; end
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.expand_path('../../config/environment', __FILE__)
4
+
5
+ # You can add fixtures and/or initialization code here to make experimenting
6
+ # with your gem easier. You can also use a different console, if you like.
7
+
8
+ # (If you use this, don't forget to add pry to your Gemfile!)
9
+ # require "pry"
10
+ # Pry.start
11
+
12
+ require "irb"
13
+ IRB.start
@@ -0,0 +1,15 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'api'))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'app'))
3
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
4
+
5
+ require 'bundler/setup'
6
+
7
+ Bundler.require :default, ENV['RACK_ENV']
8
+
9
+ Global.configure do |config|
10
+ config.environment = ENV['RACK_ENV']
11
+ config.config_directory = File.dirname(__FILE__)
12
+ end
13
+
14
+ require_rel '../app'
15
+ require_rel '../api'
@@ -0,0 +1,4 @@
1
+ ENV['RACK_ENV'] ||= 'development'
2
+ ENV['TZ'] = 'UTC'
3
+
4
+ require File.expand_path('../application', __FILE__)
@@ -0,0 +1,5 @@
1
+ require File.expand_path('../config/environment', __FILE__)
2
+ use Rack::ConditionalGet
3
+ use Rack::ETag
4
+
5
+ run API::Base
@@ -0,0 +1,2 @@
1
+ version: '3'
2
+ services:
@@ -0,0 +1,39 @@
1
+ ENV['RACK_ENV'] = 'test'
2
+
3
+ require 'simplecov'
4
+ require 'codecov'
5
+ SimpleCov.start
6
+ SimpleCov.formatter = SimpleCov::Formatter::Codecov
7
+ require File.expand_path('../../config/environment', __FILE__)
8
+ require 'rspec'
9
+ require 'shoulda-matchers'
10
+ require 'factory_girl'
11
+ require 'database_cleaner'
12
+
13
+ Shoulda::Matchers.configure do |config|
14
+ config.integrate do |with|
15
+ with.library :active_record
16
+ with.test_framework :rspec
17
+ end
18
+ end
19
+
20
+ RSpec.configure do |config|
21
+ #Shoulda-Matchers
22
+ config.include(Shoulda::Matchers::ActiveModel, type: :model)
23
+ config.include(Shoulda::Matchers::ActiveRecord, type: :model)
24
+
25
+ #Factory Girl
26
+ config.include(FactoryGirl::Syntax::Methods)
27
+ config.before(:suite) do
28
+ FactoryGirl.find_definitions
29
+ DatabaseCleaner.strategy = :transaction
30
+ DatabaseCleaner.clean_with(:truncation)
31
+ end
32
+
33
+ config.around(:each) do |example|
34
+ DatabaseCleaner.cleaning do
35
+ example.run
36
+ end
37
+ end
38
+ end
39
+
@@ -0,0 +1,3 @@
1
+ module Sumcli
2
+ VERSION = "0.1.0"
3
+ end
data/lib/sumcli.rb ADDED
@@ -0,0 +1,6 @@
1
+ require "sumcli/version"
2
+
3
+ module Sumcli
4
+ class Error < StandardError; end
5
+ # Your code goes here...
6
+ end
data/sumcli.gemspec ADDED
@@ -0,0 +1,53 @@
1
+
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "sumcli/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "sumcli"
8
+ spec.license = "MIT"
9
+ spec.version = Sumcli::VERSION
10
+ spec.authors = ["Rodrigo Alves"]
11
+ spec.email = ["rodrigo.souza@sumup.com"]
12
+
13
+ spec.summary = %q{Scaffolds SumUp microservices code.}
14
+ spec.description = %q{Scaffolds SumUp microservices code.}
15
+ spec.homepage = "https://rubygems.org/gems/sumcli"
16
+
17
+
18
+ # Specify which files should be added to the gem when it is released.
19
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
20
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
21
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
22
+ end
23
+ spec.bindir = "exe"
24
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
25
+ spec.require_paths = ["lib"]
26
+
27
+ spec.add_dependency "tty-box", "~> 0.3.0"
28
+ spec.add_dependency "tty-color", "~> 0.4"
29
+ spec.add_dependency "tty-command", "~> 0.8.0"
30
+ spec.add_dependency "tty-config", "~> 0.3.0"
31
+ spec.add_dependency "tty-cursor", "~> 0.6"
32
+ spec.add_dependency "tty-editor", "~> 0.5.0"
33
+ spec.add_dependency "tty-file", "~> 0.7.0"
34
+ spec.add_dependency "tty-font", "~> 0.2.0"
35
+ spec.add_dependency "tty-markdown", "~> 0.5.0"
36
+ spec.add_dependency "tty-pager", "~> 0.12.0"
37
+ spec.add_dependency "tty-pie", "~> 0.1.0"
38
+ spec.add_dependency "tty-platform", "~> 0.2.0"
39
+ spec.add_dependency "tty-progressbar", "~> 0.16.0"
40
+ spec.add_dependency "tty-prompt", "~> 0.18.0"
41
+ spec.add_dependency "tty-screen", "~> 0.6"
42
+ spec.add_dependency "tty-spinner", "~> 0.9.0"
43
+ spec.add_dependency "tty-table", "~> 0.10.0"
44
+ spec.add_dependency "tty-tree", "~> 0.2.0"
45
+ spec.add_dependency "tty-which", "~> 0.4"
46
+ spec.add_dependency "pastel", "~> 0.7.2"
47
+ spec.add_dependency "thor", "~> 0.20.0"
48
+ spec.add_dependency 'activesupport', '~> 5.0'
49
+
50
+ spec.add_development_dependency "bundler", "~> 1.17"
51
+ spec.add_development_dependency "rake", "~> 10.0"
52
+ spec.add_development_dependency "rspec", "~> 3.0"
53
+ end