grape-starter 1.5.1 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,117 +1,119 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Starter
4
- module Templates
5
- # defining the endpoints -> http methods of a resource
6
- module Endpoints
7
- def crud
8
- %i[
9
- post
10
- get_all
11
- get_specific
12
- put_specific
13
- patch_specific
14
- delete_specific
15
- ]
16
- end
17
-
18
- def singular_one
19
- %i[
20
- post
21
- get_one
22
- put_one
23
- patch_one
24
- delete_one
25
- ]
26
- end
27
-
28
- # available API/HTTP methods
29
- # POST
30
- def post
31
- "
32
- desc 'create #{resource.singularize}' do
33
- tags %w[#{resource.singularize}]
4
+ module Builder
5
+ module Templates
6
+ # defining the endpoints -> http methods of a resource
7
+ module Endpoints
8
+ def crud
9
+ %i[
10
+ post
11
+ get_all
12
+ get_specific
13
+ put_specific
14
+ patch_specific
15
+ delete_specific
16
+ ]
34
17
  end
35
- params do
36
- # TODO: specify the parameters
37
- end
38
- post do
39
- # your code goes here
40
- end"
41
- end
42
18
 
43
- # GET
44
- def get_all
45
- "
46
- desc 'get all of #{resource.pluralize}' do
47
- is_array true
48
- tags %w[#{resource.singularize}]
19
+ def singular_one
20
+ %i[
21
+ post
22
+ get_one
23
+ put_one
24
+ patch_one
25
+ delete_one
26
+ ]
49
27
  end
50
- get do
51
- # your code goes here
52
- end"
53
- end
54
28
 
55
- # rubocop:disable Style/CombinableLoops
56
- %w[get put patch delete].each do |verb|
57
- define_method(:"#{verb}_one") do
29
+ # available API/HTTP methods
30
+ # POST
31
+ def post
58
32
  "
59
- desc '#{verb} #{resource.singularize}' do
33
+ desc 'create #{resource.singularize}' do
60
34
  tags %w[#{resource.singularize}]
61
35
  end
62
- #{verb} do
36
+ params do
37
+ # TODO: specify the parameters
38
+ end
39
+ post do
63
40
  # your code goes here
64
41
  end"
65
42
  end
66
- end
67
43
 
68
- %w[get put patch delete].each do |verb|
69
- define_method(:"#{verb}_specific") do
44
+ # GET
45
+ def get_all
70
46
  "
71
- desc '#{verb} specific #{resource.singularize}' do
47
+ desc 'get all of #{resource.pluralize}' do
48
+ is_array true
72
49
  tags %w[#{resource.singularize}]
73
50
  end
74
- params do
75
- requires :id
76
- end
77
- #{verb} ':id' do
51
+ get do
78
52
  # your code goes here
79
53
  end"
80
54
  end
81
- end
82
- # rubocop:enable Style/CombinableLoops
83
55
 
84
- # request specs shared examples
85
- #
86
- def post_spec
87
- "it_behaves_like 'POST', params: {}"
88
- end
56
+ # rubocop:disable Style/CombinableLoops
57
+ %w[get put patch delete].each do |verb|
58
+ define_method(:"#{verb}_one") do
59
+ "
60
+ desc '#{verb} #{resource.singularize}' do
61
+ tags %w[#{resource.singularize}]
62
+ end
63
+ #{verb} do
64
+ # your code goes here
65
+ end"
66
+ end
67
+ end
89
68
 
90
- def get_all_spec
91
- "it_behaves_like 'GET all'"
92
- end
69
+ %w[get put patch delete].each do |verb|
70
+ define_method(:"#{verb}_specific") do
71
+ "
72
+ desc '#{verb} specific #{resource.singularize}' do
73
+ tags %w[#{resource.singularize}]
74
+ end
75
+ params do
76
+ requires :id
77
+ end
78
+ #{verb} ':id' do
79
+ # your code goes here
80
+ end"
81
+ end
82
+ end
83
+ # rubocop:enable Style/CombinableLoops
93
84
 
94
- %w[get delete].each do |verb|
95
- define_method(:"#{verb}_one_spec") do
96
- "it_behaves_like '#{verb.upcase} one'"
85
+ # request specs shared examples
86
+ #
87
+ def post_spec
88
+ "it_behaves_like 'POST', params: {}"
97
89
  end
98
- end
99
90
 
100
- %w[put patch].each do |verb|
101
- define_method(:"#{verb}_one_spec") do
102
- "it_behaves_like '#{verb.upcase} one', params: {}"
91
+ def get_all_spec
92
+ "it_behaves_like 'GET all'"
103
93
  end
104
- end
105
94
 
106
- %w[get delete].each do |verb|
107
- define_method(:"#{verb}_specific_spec") do
108
- "it_behaves_like '#{verb.upcase} specific', key: 1"
95
+ %w[get delete].each do |verb|
96
+ define_method(:"#{verb}_one_spec") do
97
+ "it_behaves_like '#{verb.upcase} one'"
98
+ end
109
99
  end
110
- end
111
100
 
112
- %w[put patch].each do |verb|
113
- define_method(:"#{verb}_specific_spec") do
114
- "it_behaves_like '#{verb.upcase} specific', key: 1, params: {}"
101
+ %w[put patch].each do |verb|
102
+ define_method(:"#{verb}_one_spec") do
103
+ "it_behaves_like '#{verb.upcase} one', params: {}"
104
+ end
105
+ end
106
+
107
+ %w[get delete].each do |verb|
108
+ define_method(:"#{verb}_specific_spec") do
109
+ "it_behaves_like '#{verb.upcase} specific', key: 1"
110
+ end
111
+ end
112
+
113
+ %w[put patch].each do |verb|
114
+ define_method(:"#{verb}_specific_spec") do
115
+ "it_behaves_like '#{verb.upcase} specific', key: 1, params: {}"
116
+ end
115
117
  end
116
118
  end
117
119
  end
@@ -1,83 +1,85 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Starter
4
- module Templates
5
- module Files
6
- # API template for resource
7
- def api_file
8
- <<-FILE.strip_heredoc
9
- # frozen_string_literal: true
4
+ module Builder
5
+ module Templates
6
+ module Files
7
+ # API template for resource
8
+ def api_file
9
+ <<-FILE.strip_heredoc
10
+ # frozen_string_literal: true
10
11
 
11
- module Api
12
- module Endpoints
13
- class #{klass_name} < Grape::API
14
- namespace :#{resource.downcase} do
15
- #{endpoints}
12
+ module Api
13
+ module Endpoints
14
+ class #{klass_name} < Grape::API
15
+ namespace :#{resource.downcase} do
16
+ #{endpoints}
17
+ end
16
18
  end
17
19
  end
18
20
  end
21
+ FILE
19
22
  end
20
- FILE
21
- end
22
23
 
23
- def entity_file
24
- <<-FILE.strip_heredoc
25
- # frozen_string_literal: true
24
+ def entity_file
25
+ <<-FILE.strip_heredoc
26
+ # frozen_string_literal: true
26
27
 
27
- module Api
28
- module Entities
29
- class #{klass_name} < Grape::Entity
28
+ module Api
29
+ module Entities
30
+ class #{klass_name} < Grape::Entity
31
+ end
30
32
  end
31
33
  end
34
+ FILE
32
35
  end
33
- FILE
34
- end
35
36
 
36
- # LIB template for resource
37
- def base_namespace_file
38
- <<-FILE.strip_heredoc
39
- # frozen_string_literal: true
37
+ # LIB template for resource
38
+ def base_namespace_file
39
+ <<-FILE.strip_heredoc
40
+ # frozen_string_literal: true
40
41
 
41
- module #{klass_name}
42
- VERSION = '0.1.0'
42
+ module #{klass_name}
43
+ VERSION = '0.1.0'
44
+ end
45
+ FILE
43
46
  end
44
- FILE
45
- end
46
47
 
47
- def lib_file
48
- <<-FILE.strip_heredoc
49
- # frozen_string_literal: true
48
+ def lib_file
49
+ <<-FILE.strip_heredoc
50
+ # frozen_string_literal: true
50
51
 
51
- module Models
52
- class #{lib_klass_name}
52
+ module Models
53
+ class #{lib_klass_name}
54
+ end
53
55
  end
56
+ FILE
54
57
  end
55
- FILE
56
- end
57
58
 
58
- def api_spec
59
- prefix = base_prefix ? "/#{base_prefix}" : ''
60
- <<-FILE.strip_heredoc
61
- # frozen_string_literal: true
59
+ def api_spec
60
+ prefix = base_prefix ? "/#{base_prefix}" : ''
61
+ <<-FILE.strip_heredoc
62
+ # frozen_string_literal: true
62
63
 
63
- require 'spec_helper'
64
+ require 'spec_helper'
64
65
 
65
- RSpec.describe '#{prefix}/#{base_version}/#{resource.downcase}' do
66
- #{endpoint_specs}
66
+ RSpec.describe '#{prefix}/#{base_version}/#{resource.downcase}' do
67
+ #{endpoint_specs}
68
+ end
69
+ FILE
67
70
  end
68
- FILE
69
- end
70
71
 
71
- def lib_spec
72
- <<-FILE.strip_heredoc
73
- # frozen_string_literal: true
72
+ def lib_spec
73
+ <<-FILE.strip_heredoc
74
+ # frozen_string_literal: true
74
75
 
75
- require 'spec_helper'
76
+ require 'spec_helper'
76
77
 
77
- RSpec.describe Models::#{klass_name} do
78
- pending 'write specs'
78
+ RSpec.describe Models::#{klass_name} do
79
+ pending 'write specs'
80
+ end
81
+ FILE
79
82
  end
80
- FILE
81
83
  end
82
84
  end
83
85
  end
@@ -1,105 +1,107 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Starter
4
- module Templates
5
- module Sequel
6
- def model_klass
7
- 'Sequel::Model'
8
- end
4
+ module Builder
5
+ module Templates
6
+ module Sequel
7
+ def model_klass
8
+ 'Sequel::Model'
9
+ end
9
10
 
10
- def initializer
11
- <<-FILE.strip_heredoc
12
- # frozen_string_literal: true
11
+ def initializer
12
+ <<-FILE.strip_heredoc
13
+ # frozen_string_literal: true
13
14
 
14
- require 'yaml'
15
+ require 'yaml'
15
16
 
16
- # load Sequel Configuration
17
- settings = YAML.load_file('config/database.yml')
18
- DB = Sequel.connect(settings[ENV['RACK_ENV']])
17
+ # load Sequel Configuration
18
+ settings = YAML.load_file('config/database.yml')
19
+ DB = Sequel.connect(settings[ENV['RACK_ENV']])
19
20
 
20
- env = ENV['RACK_ENV'] || 'development'
21
+ env = ENV['RACK_ENV'] || 'development'
21
22
 
22
- logger = if %w[development test].include? env
23
- log_dir = File.join(Dir.getwd, 'log')
24
- log_file = File.join(log_dir, 'db.log')
25
- FileUtils.mkdir(log_dir) unless Dir.exist?(log_dir)
26
- Logger.new(File.open(log_file, 'a'))
27
- else
28
- Logger.new($stdout)
29
- end
23
+ logger = if %w[development test].include? env
24
+ log_dir = File.join(Dir.getwd, 'log')
25
+ log_file = File.join(log_dir, 'db.log')
26
+ FileUtils.mkdir(log_dir) unless Dir.exist?(log_dir)
27
+ Logger.new(File.open(log_file, 'a'))
28
+ else
29
+ Logger.new($stdout)
30
+ end
30
31
 
31
- DB.loggers << logger
32
+ DB.loggers << logger
32
33
 
33
- # FIXME: maybe remove it later …
34
- # see: https://groups.google.com/forum/#!topic/sequel-talk/QIIv5qoltjs
35
- Sequel::Model.require_valid_table = false
36
- Sequel::Model.plugin :force_encoding, 'UTF-8'
37
- FILE
38
- end
34
+ # FIXME: maybe remove it later …
35
+ # see: https://groups.google.com/forum/#!topic/sequel-talk/QIIv5qoltjs
36
+ Sequel::Model.require_valid_table = false
37
+ Sequel::Model.plugin :force_encoding, 'UTF-8'
38
+ FILE
39
+ end
39
40
 
40
- def rakefile
41
- <<-FILE.strip_heredoc
42
- # Sequel migration tasks
43
- namespace :db do
44
- Sequel.extension(:migration)
41
+ def rakefile
42
+ <<-FILE.strip_heredoc
43
+ # Sequel migration tasks
44
+ namespace :db do
45
+ Sequel.extension(:migration)
45
46
 
46
- desc "Prints current schema version"
47
- task version: :connect do
48
- version = DB.tables.include?(:schema_info) ? DB[:schema_info].first[:version] : 0
47
+ desc "Prints current schema version"
48
+ task version: :connect do
49
+ version = DB.tables.include?(:schema_info) ? DB[:schema_info].first[:version] : 0
49
50
 
50
- $stdout.print 'Schema Version: '
51
- $stdout.puts version
52
- end
51
+ $stdout.print 'Schema Version: '
52
+ $stdout.puts version
53
+ end
53
54
 
54
- desc 'Run all migrations in db/migrations'
55
- task migrate: :connect do
56
- Sequel::Migrator.apply(DB, 'db/migrations')
57
- Rake::Task['db:version'].execute
58
- end
55
+ desc 'Run all migrations in db/migrations'
56
+ task migrate: :connect do
57
+ Sequel::Migrator.apply(DB, 'db/migrations')
58
+ Rake::Task['db:version'].execute
59
+ end
59
60
 
60
- desc "Perform rollback to specified target or full rollback as default"
61
- task :rollback, [:target] => :connect do |t, args|
62
- args.with_defaults(:target => 0)
61
+ desc "Perform rollback to specified target or full rollback as default"
62
+ task :rollback, [:target] => :connect do |t, args|
63
+ args.with_defaults(:target => 0)
63
64
 
64
- Sequel::Migrator.run(DB, 'db/migrations', :target => args[:target].to_i)
65
- Rake::Task['db:version'].execute
66
- end
65
+ Sequel::Migrator.run(DB, 'db/migrations', :target => args[:target].to_i)
66
+ Rake::Task['db:version'].execute
67
+ end
67
68
 
68
- desc "Perform migration reset (full rollback and migration)"
69
- task reset: :connect do
70
- Sequel::Migrator.run(DB, 'db/migrations', target: 0)
71
- Sequel::Migrator.run(DB, 'db/migrations')
72
- Rake::Task['db:version'].execute
73
- end
69
+ desc "Perform migration reset (full rollback and migration)"
70
+ task reset: :connect do
71
+ Sequel::Migrator.run(DB, 'db/migrations', target: 0)
72
+ Sequel::Migrator.run(DB, 'db/migrations')
73
+ Rake::Task['db:version'].execute
74
+ end
74
75
 
75
- task connect: :environment do
76
- require './config/initializers/database'
76
+ task connect: :environment do
77
+ require './config/initializers/database'
78
+ end
77
79
  end
80
+ FILE
78
81
  end
79
- FILE
80
- end
81
82
 
82
- def gemfile
83
- <<-FILE.strip_heredoc
84
- # DB stack
85
- gem 'sequel'
86
- gem 'pg'
87
- FILE
88
- end
83
+ def gemfile
84
+ <<-FILE.strip_heredoc
85
+ # DB stack
86
+ gem 'sequel'
87
+ gem 'pg'
88
+ FILE
89
+ end
89
90
 
90
- def migration(_klass_name, resource)
91
- <<-FILE.strip_heredoc
92
- Sequel.migration do
93
- change do
94
- create_table :#{resource} do
95
- primary_key :id
91
+ def migration(_klass_name, resource)
92
+ <<-FILE.strip_heredoc
93
+ Sequel.migration do
94
+ change do
95
+ create_table :#{resource} do
96
+ primary_key :id
96
97
 
97
- DateTime :created_at
98
- DateTime :updated_at
98
+ DateTime :created_at
99
+ DateTime :updated_at
100
+ end
99
101
  end
100
102
  end
103
+ FILE
101
104
  end
102
- FILE
103
105
  end
104
106
  end
105
107
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Starter
4
- class FileFoo
4
+ class FileOps
5
5
  class << self
6
6
  # general file stuff
7
7
  #
@@ -61,7 +61,7 @@ module Starter
61
61
 
62
62
  file_name = "#{Time.now.strftime('%Y%m%d%H%m%S')}_create_#{klass_name.downcase}.rb"
63
63
  migration_dest = File.join(Dir.pwd, 'db', 'migrate', file_name)
64
- FileFoo.write_file(migration_dest, migration(klass_name, resource))
64
+ FileOps.write_file(migration_dest, migration(klass_name, resource))
65
65
  end
66
66
 
67
67
  def load_orm(orm: ::Starter::Config.read[:orm])
@@ -70,10 +70,10 @@ module Starter
70
70
  case @orm
71
71
  when 'sequel'
72
72
  require 'starter/builder/templates/sequel'
73
- extend(::Starter::Templates::Sequel)
73
+ extend(Starter::Builder::Templates::Sequel)
74
74
  when 'activerecord', 'ar'
75
75
  require 'starter/builder/templates/activerecord'
76
- extend(::Starter::Templates::ActiveRecord)
76
+ extend(Starter::Builder::Templates::ActiveRecord)
77
77
  else
78
78
  @orm = nil
79
79
  end
@@ -87,26 +87,26 @@ module Starter
87
87
 
88
88
  def build_initializer(dest)
89
89
  FileUtils.mkdir_p(dest)
90
- FileFoo.write_file(File.join(dest, 'database.rb'), initializer)
90
+ FileOps.write_file(File.join(dest, 'database.rb'), initializer)
91
91
  end
92
92
 
93
93
  def build_config(dest)
94
- FileFoo.write_file(File.join(dest, 'database.yml'), config)
94
+ FileOps.write_file(File.join(dest, 'database.yml'), config)
95
95
  end
96
96
 
97
97
  def build_standalone_migrations(dest)
98
- FileFoo.write_file(dest, standalone_migrations)
98
+ FileOps.write_file(dest, standalone_migrations)
99
99
  end
100
100
 
101
101
  # adds a middleware to config.ru
102
102
  def add_middleware(dest, middleware)
103
103
  replacement = "use #{middleware}\n\n\\1"
104
- FileFoo.call!(File.join(dest, 'config.ru')) { |content| content.sub!(/^(run.+)$/, replacement) }
104
+ FileOps.call!(File.join(dest, 'config.ru')) { |content| content.sub!(/^(run.+)$/, replacement) }
105
105
  end
106
106
 
107
107
  def append_to_file(file_name, content)
108
- original = FileFoo.read_file(file_name)
109
- FileFoo.write_file(file_name, "#{original}\n\n#{content}")
108
+ original = FileOps.read_file(file_name)
109
+ FileOps.write_file(file_name, "#{original}\n\n#{content}")
110
110
  end
111
111
 
112
112
  def prepare_for_migrations(dest)
@@ -6,8 +6,6 @@ require 'rack/test'
6
6
 
7
7
  module Starter
8
8
  module Rake
9
- require 'starter/builder'
10
-
11
9
  class GrapeTasks < ::Rake::TaskLib
12
10
  include Rack::Test::Methods
13
11
 
@@ -45,7 +45,7 @@ RSpec.shared_examples 'DELETE one' do
45
45
  let(:route) { route_from_description }
46
46
 
47
47
  subject { delete route }
48
- specify { expect(subject.status).to eql 200 }
48
+ specify { expect(subject.status).to eql 204 }
49
49
  end
50
50
 
51
51
  # plural forms
@@ -75,5 +75,5 @@ RSpec.shared_examples 'DELETE specific' do |key: nil|
75
75
  let(:specific_route) { "#{route_from_description}/#{key}" }
76
76
 
77
77
  subject { delete specific_route }
78
- specify { expect(subject.status).to eql 200 }
78
+ specify { expect(subject.status).to eql 204 }
79
79
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Starter
4
- VERSION = '1.5.1'
4
+ VERSION = '1.6.0'
5
5
  end
data/lib/starter.rb CHANGED
@@ -5,9 +5,13 @@ require 'awesome_print'
5
5
  require 'active_support'
6
6
  require 'active_support/core_ext/string'
7
7
 
8
- require 'starter/version'
9
- require 'starter/builder'
10
- require 'starter/config'
8
+ # require 'starter/version'
9
+ # require 'starter/builder'
10
+ # require 'starter/config'
11
+
12
+ require 'zeitwerk'
13
+ loader = Zeitwerk::Loader.for_gem
14
+ loader.setup
11
15
 
12
16
  module Starter
13
17
  autoload :Rake, 'starter/rake/grape_tasks'
data/template/Dockerfile CHANGED
@@ -13,4 +13,4 @@ RUN bundle install
13
13
 
14
14
  COPY . .
15
15
 
16
- CMD bundle exec thin start -p 9292 -e production --tag API-dummy --threaded
16
+ CMD bundle exec puma --tag API-dummy
data/template/Gemfile CHANGED
@@ -3,7 +3,7 @@
3
3
  source 'http://rubygems.org'
4
4
 
5
5
  # Server stuff
6
- gem 'thin'
6
+ gem 'puma'
7
7
 
8
8
  gem 'rack'
9
9
  gem 'rack-cors'
data/template/Rakefile CHANGED
@@ -21,8 +21,8 @@ task default: %i[spec rubocop]
21
21
 
22
22
  # grape-swagger tasks
23
23
  require 'grape-swagger/rake/oapi_tasks'
24
- GrapeSwagger::Rake::OapiTasks.new(::Api::Base)
24
+ GrapeSwagger::Rake::OapiTasks.new(Api::Base)
25
25
 
26
26
  # starter tasks
27
27
  require 'starter/rake/grape_tasks'
28
- Starter::Rake::GrapeTasks.new(::Api::Base)
28
+ Starter::Rake::GrapeTasks.new(Api::Base)