azeroth 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/config.yml +22 -8
  3. data/.rubocop_todo.yml +3 -3
  4. data/Dockerfile +6 -0
  5. data/README.md +4 -0
  6. data/Rakefile +4 -0
  7. data/azeroth.gemspec +10 -7
  8. data/config/yardstick.rb +13 -0
  9. data/config/yardstick.yml +33 -0
  10. data/docker-compose.yml +14 -9
  11. data/lib/azeroth.rb +5 -2
  12. data/lib/azeroth/resource_builder.rb +17 -0
  13. data/lib/azeroth/resource_route_builder.rb +21 -0
  14. data/lib/azeroth/resourceable.rb +1 -4
  15. data/lib/azeroth/routes_builder.rb +35 -0
  16. data/lib/azeroth/version.rb +1 -1
  17. data/scripts/check_readme.sh +6 -0
  18. data/spec/lib/azeroth/resource_builder_spec.rb +47 -0
  19. data/spec/lib/azeroth/resource_route_builder_spec.rb +18 -0
  20. data/spec/lib/azeroth/resourceable/builder_spec.rb +4 -80
  21. data/spec/lib/azeroth/routes_builder_spec.rb +34 -0
  22. data/spec/support/{models → app/controllers}/controller.rb +0 -0
  23. data/spec/support/app/controllers/resource_builder_controller.rb +9 -0
  24. data/spec/support/app/controllers/resource_route_builder_controller.rb +18 -0
  25. data/spec/support/app/controllers/routes_builder_controller.rb +21 -0
  26. data/spec/support/{models → app/models}/document.rb +0 -0
  27. data/spec/support/{models → app/serializers}/serializer.rb +0 -0
  28. data/spec/support/matchers/add_method.rb +80 -0
  29. data/spec/support/shared_examples/resource_routes.rb +88 -0
  30. metadata +92 -36
  31. data/lib/azeroth/resourceable/resource_builder.rb +0 -19
  32. data/lib/azeroth/resourceable/resource_route_builder.rb +0 -23
  33. data/lib/azeroth/resourceable/routes_builder.rb +0 -37
  34. data/spec/lib/azeroth/resourceable/resource_builder_spec.rb +0 -5
  35. data/spec/lib/azeroth/resourceable/resource_route_builder_spec.rb +0 -5
  36. data/spec/lib/azeroth/resourceable/routes_builder_spec.rb +0 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: cd0ac3f2f138aaf17ba9d7d6a59191625cba1835
4
- data.tar.gz: caede26b0d20a7825d4a73537eda1ae6c4254f4a
2
+ SHA256:
3
+ metadata.gz: 564c4da855e8fb88cf9baadf79b22cc26574777869979c4e746ae4a2341334b4
4
+ data.tar.gz: 32fd29efed31108ec9c5a6a260a18b5238bbb995af0863917c91f6a7fc564d47
5
5
  SHA512:
6
- metadata.gz: 01c09c16de69d05b817544a75b193e194da9c3bfb91afc97bcd55a6ccb52d0b2e0a26489746ba89cd38665f6b24e007334780d464c3f3007212d3c85ca48ccbc
7
- data.tar.gz: 32b1cf4e03487ce7f29e86d1e7c4ea55ad64f62627e7e5cbaa173aa7c9c72ea3a6c39c7dad0beb75116ac804c4f887f759a6f2ed69316f365802948b912cc07c
6
+ metadata.gz: 9dc5c3dd01694a0fd7a1d171938a7a612dcea48d3631760b1b7de851cdd3f379194ae6f79ed2201fd009f4c3b4290ff550b9c154650f8a5f9e4128cbf6a5f636
7
+ data.tar.gz: b9233fa302ec9a94c1fb6947ef31f2ccfb5d4b8e37b7c8837c741883edaeef21851616ebdb6be098d7c74fd2a4af3d8a0bd81311d4de2930ed2ea6cb5715afbd
@@ -2,13 +2,27 @@ version: 2
2
2
  jobs:
3
3
  build:
4
4
  docker:
5
- - image: circleci/ruby:2.4.1
5
+ - image: darthjee/circleci_ruby_gems:0.0.1
6
6
  steps:
7
7
  - checkout
8
- - run: curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
9
- - run: chmod +x ./cc-test-reporter
10
- - run: ./cc-test-reporter before-build
11
- - run: bundle install
12
- - run: bundle exec rspec
13
- - run: rubocop
14
- - run: ./cc-test-reporter after-build --exit-code $?
8
+ - run:
9
+ name: Prepare Coverage Test Report
10
+ command: cc-test-reporter before-build
11
+ - run:
12
+ name: Bundle Install
13
+ command: bundle install
14
+ - run:
15
+ name: RSpec
16
+ command: bundle exec rspec
17
+ - run:
18
+ name: Rubocop
19
+ command: rubocop
20
+ - run:
21
+ name: Coverage Test Report
22
+ command: cc-test-reporter after-build --exit-code $?
23
+ - run:
24
+ name: Yardstick coverage check
25
+ command: bundle exec rake verify_measurements
26
+ - run:
27
+ name: Check version documentation
28
+ command: scripts/check_readme.sh
@@ -29,9 +29,9 @@ Style/Documentation:
29
29
  - 'lib/azeroth/model.rb'
30
30
  - 'lib/azeroth/resourceable.rb'
31
31
  - 'lib/azeroth/resourceable/builder.rb'
32
- - 'lib/azeroth/resourceable/resource_builder.rb'
33
- - 'lib/azeroth/resourceable/resource_route_builder.rb'
34
- - 'lib/azeroth/resourceable/routes_builder.rb'
32
+ - 'lib/azeroth/resource_builder.rb'
33
+ - 'lib/azeroth/resource_route_builder.rb'
34
+ - 'lib/azeroth/routes_builder.rb'
35
35
 
36
36
  # Offense count: 6
37
37
  # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
@@ -0,0 +1,6 @@
1
+ FROM darthjee/ruby_gems:0.0.1
2
+
3
+ USER app
4
+ COPY --chown=app ./ /home/app/app/
5
+
6
+ RUN bundle install
data/README.md CHANGED
@@ -5,3 +5,7 @@ Azeroth
5
5
  [![Issue Count](https://codeclimate.com/github/darthjee/azeroth/badges/issue_count.svg)](https://codeclimate.com/github/darthjee/azeroth)
6
6
 
7
7
  ![azeroth](https://raw.githubusercontent.com/darthjee/azeroth/master/azeroth.jpg)
8
+
9
+ Yard Documentation
10
+ -------------------
11
+ https://www.rubydoc.info/gems/azeroth/0.0.4
data/Rakefile CHANGED
@@ -1,5 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bundler/gem_tasks'
2
4
  require 'rspec/core/rake_task'
5
+ require 'yardstick/rake/measurement'
6
+ require './config/yardstick'
3
7
 
4
8
  RSpec::Core::RakeTask.new
5
9
 
@@ -16,7 +16,7 @@ Gem::Specification.new do |gem|
16
16
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
17
17
  gem.require_paths = ['lib']
18
18
 
19
- gem.add_runtime_dependency 'sinclair', '>= 1.0.0'
19
+ gem.add_runtime_dependency 'sinclair', '>= 1.1.2'
20
20
 
21
21
  gem.add_runtime_dependency 'activesupport', '~> 5.x'
22
22
  gem.add_runtime_dependency 'darthjee-active_ext', '>= 1.3.2'
@@ -25,10 +25,13 @@ Gem::Specification.new do |gem|
25
25
  gem.add_development_dependency 'activerecord', '~> 5.x'
26
26
  gem.add_development_dependency 'sqlite3', '>= 1.3.13'
27
27
 
28
- gem.add_development_dependency 'bundler', '~> 1.6'
29
- gem.add_development_dependency 'pry-nav'
30
- gem.add_development_dependency 'rake', '>= 12.3'
31
- gem.add_development_dependency 'rspec', '>= 3.7'
32
- gem.add_development_dependency 'rubocop'
33
- gem.add_development_dependency 'simplecov', '~> 0.16.1'
28
+ gem.add_development_dependency 'bundler', '~> 1.16.1'
29
+ gem.add_development_dependency 'pry-nav', '~> 0.2.4'
30
+ gem.add_development_dependency 'rake', '>= 12.3.1'
31
+ gem.add_development_dependency 'rspec', '>= 3.8'
32
+ gem.add_development_dependency 'rubocop', '0.58.1'
33
+ gem.add_development_dependency 'rubocop-rspec', '1.30.0'
34
+ gem.add_development_dependency 'simplecov', '~> 0.16.x'
35
+ gem.add_development_dependency 'yard', '>= 0.9.18'
36
+ gem.add_development_dependency 'yardstick', '>= 0.9.9'
34
37
  end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'yardstick/rake/measurement'
4
+ require 'yardstick/rake/verify'
5
+ require 'yaml'
6
+
7
+ options = YAML.load_file('config/yardstick.yml')
8
+
9
+ Yardstick::Rake::Measurement.new(:yardstick_measure, options) do |measurement|
10
+ measurement.output = 'measurement/report.txt'
11
+ end
12
+
13
+ Yardstick::Rake::Verify.new(:verify_measurements, options)
@@ -0,0 +1,33 @@
1
+ threshold: 52.6
2
+ require_exact_threshold: false
3
+ rules:
4
+ ApiTag::Presence:
5
+ enabled: true
6
+ exclude: []
7
+ ApiTag::Inclusion:
8
+ enabled: true
9
+ exclude: []
10
+ ApiTag::ProtectedMethod:
11
+ enabled: true
12
+ exclude: []
13
+ ApiTag::PrivateMethod:
14
+ enabled: true
15
+ exclude: []
16
+ ExampleTag:
17
+ enabled: true
18
+ exclude: []
19
+ ReturnTag:
20
+ enabled: true
21
+ exclude: []
22
+ Summary::Presence:
23
+ enabled: true
24
+ exclude: []
25
+ Summary::Length:
26
+ enabled: true
27
+ exclude: []
28
+ Summary::Delimiter:
29
+ enabled: true
30
+ exclude: []
31
+ Summary::SingleLine:
32
+ enabled: true
33
+ exclude: []
@@ -1,18 +1,23 @@
1
- version: '2'
1
+ version: '3'
2
2
  services:
3
3
  base: &base
4
- image: ruby:2.4.0
5
- working_dir: /home/app/azeroth
4
+ image: azeroth
5
+ working_dir: /home/app/app
6
6
  volumes:
7
- - .:/home/app/azeroth
8
- - azeroth_gems_2_4_0:/usr/local/bundle
7
+ - .:/home/app/app
9
8
 
10
- #################### CONTAINERS ####################
9
+ base_build:
10
+ <<: *base
11
+ build: .
12
+ command: echo done
11
13
 
12
14
  azeroth:
13
15
  <<: *base
14
16
  container_name: azeroth
15
- command: /bin/bash -c 'bundle install && bundle exec rspec'
17
+ depends_on: [base_build]
18
+ command: /bin/bash -c 'rspec'
16
19
 
17
- volumes:
18
- azeroth_gems_2_4_0:
20
+ test_all:
21
+ <<: *base
22
+ depends_on: [base_build]
23
+ command: /bin/bash -c 'rspec && yard && rake yardstick_measure && rake verify_measurements'
@@ -1,4 +1,7 @@
1
1
  module Azeroth
2
- autoload :Resourceable, 'azeroth/resourceable'
3
- autoload :Model, 'azeroth/model'
2
+ autoload :Resourceable, 'azeroth/resourceable'
3
+ autoload :Model, 'azeroth/model'
4
+ autoload :RoutesBuilder, 'azeroth/routes_builder'
5
+ autoload :ResourceRouteBuilder, 'azeroth/resource_route_builder'
6
+ autoload :ResourceBuilder, 'azeroth/resource_builder'
4
7
  end
@@ -0,0 +1,17 @@
1
+ module Azeroth
2
+ class ResourceBuilder
3
+ attr_reader :model, :builder
4
+
5
+ delegate :add_method, to: :builder
6
+
7
+ def initialize(model, builder)
8
+ @model = model
9
+ @builder = builder
10
+ end
11
+
12
+ def append
13
+ add_method(model.plural, "@#{model.plural} ||= #{model.klass}.all")
14
+ add_method(model.name, "@#{model.name} ||= #{model.plural}.find(#{model.name}_id)")
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,21 @@
1
+ module Azeroth
2
+ class ResourceRouteBuilder
3
+ attr_reader :model, :builder
4
+
5
+ delegate :add_method, to: :builder
6
+
7
+ def initialize(model, builder)
8
+ @model = model
9
+ @builder = builder
10
+ end
11
+
12
+ def append
13
+ add_method(:new_resource, "@new_resource ||= #{model.klass}.new")
14
+ add_method(:create_resource, "@create_resource ||= #{model.klass}.create(#{model.name}_params)")
15
+ add_method(:update_resource, "@update_resource ||= #{model.name}.tap { |v| v.update(#{model.name}_params) }")
16
+ add_method(:index_resource, model.plural)
17
+ add_method(:edit_resource, model.name)
18
+ add_method(:show_resource, model.name)
19
+ end
20
+ end
21
+ end
@@ -4,10 +4,7 @@ module Azeroth
4
4
  module Resourceable
5
5
  extend ActiveSupport::Concern
6
6
 
7
- autoload :Builder, 'azeroth/resourceable/builder'
8
- autoload :RoutesBuilder, 'azeroth/resourceable/routes_builder'
9
- autoload :ResourceBuilder, 'azeroth/resourceable/resource_builder'
10
- autoload :ResourceRouteBuilder, 'azeroth/resourceable/resource_route_builder'
7
+ autoload :Builder, 'azeroth/resourceable/builder'
11
8
 
12
9
  class_methods do
13
10
  def resource_for(name, **options)
@@ -0,0 +1,35 @@
1
+ module Azeroth
2
+ class RoutesBuilder
3
+ attr_reader :model, :builder
4
+
5
+ delegate :add_method, to: :builder
6
+
7
+ def initialize(model, builder)
8
+ @model = model
9
+ @builder = builder
10
+ end
11
+
12
+ def append
13
+ %i[index show new edit create update destroy].each do |route|
14
+ add_method(route, route_code[route].to_s)
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ def route_code
21
+ {
22
+ index: :render_basic,
23
+ show: :render_basic,
24
+ new: :render_basic,
25
+ edit: :render_basic,
26
+ create: :render_basic,
27
+ update: :render_basic,
28
+ destroy: <<-RUBY
29
+ #{model.name}.destroy
30
+ head :no_content
31
+ RUBY
32
+ }
33
+ end
34
+ end
35
+ end
@@ -1,3 +1,3 @@
1
1
  module Azeroth
2
- VERSION = '0.0.3'.freeze
2
+ VERSION = '0.0.4'.freeze
3
3
  end
@@ -0,0 +1,6 @@
1
+ #! /bin/bash
2
+
3
+ PROJECT=azeroth
4
+ VERSION=$(grep VERSION lib/$PROJECT/version.rb | sed -e "s/.*'\(.*\)'.*/\1/g")
5
+
6
+ grep https://www.rubydoc.info/gems/$PROJECT/$VERSION README.md
@@ -0,0 +1,47 @@
1
+ require 'spec_helper'
2
+
3
+ describe Azeroth::ResourceBuilder do
4
+ subject { described_class.new(model, builder) }
5
+
6
+ let(:model) { Azeroth::Model.new(:document) }
7
+ let(:builder) { Sinclair.new(klass) }
8
+ let(:klass) { Class.new(ResourceBuilderController) }
9
+
10
+ before do
11
+ subject.append
12
+ 10.times { Document.create }
13
+ end
14
+
15
+ describe '#append' do
16
+ it 'adds the listing method' do
17
+ expect { builder.build }
18
+ .to change { klass.new.respond_to?(:documents) }
19
+ .to(true)
20
+ end
21
+
22
+ it 'adds the fetching method' do
23
+ expect { builder.build }
24
+ .to change { klass.new.respond_to?(:document) }
25
+ .to(true)
26
+ end
27
+
28
+ context 'after the build' do
29
+ let(:controller) { klass.new(document_id: document.id) }
30
+ let(:document) { Document.create }
31
+
32
+ before { builder.build }
33
+
34
+ context 'when requesting the list of documents' do
35
+ it 'returns the list of documents' do
36
+ expect(controller.documents).to eq(Document.all)
37
+ end
38
+ end
39
+
40
+ context 'when requesting one document' do
41
+ it 'returns the requested document' do
42
+ expect(controller.document).to eq(document)
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ describe Azeroth::ResourceRouteBuilder do
4
+ subject { described_class.new(model, builder) }
5
+
6
+ let(:model) { Azeroth::Model.new(:document) }
7
+ let(:builder) { Sinclair.new(klass) }
8
+ let(:klass) { Class.new(ResourceRouteBuilderController) }
9
+
10
+ before do
11
+ subject.append
12
+ 10.times { Document.create }
13
+ end
14
+
15
+ describe '#append' do
16
+ it_behaves_like 'a route resource build'
17
+ end
18
+ end
@@ -1,92 +1,16 @@
1
1
  require 'spec_helper'
2
2
 
3
- shared_examples 'a builder that adds a resource for route' do |route|
4
- let(:params) { {} }
5
- let(:instance) { clazz.new(params) }
6
- let(:value) { instance.public_send("#{route}_resource") }
7
-
8
- it "adds #{route}_resource" do
9
- expect { subject.build }
10
- .to change { clazz.new.respond_to?(:"#{route}_resource") }
11
- .from(false).to(true)
12
- end
13
-
14
- it "#{route}_resource responds with correct resource" do
15
- subject.build
16
- expect(value.to_json).to eq(expected.to_json)
17
- end
18
- end
19
-
20
3
  describe Azeroth::Resourceable::Builder do
21
- subject { described_class.new(clazz, :document) }
4
+ subject { described_class.new(klass, :document) }
22
5
 
23
- let(:name) { 'The Doc' }
24
- let(:document_params) { { name: name } }
25
-
26
- let(:clazz) do
6
+ let(:klass) do
27
7
  Class.new(Controller) do
28
8
  end
29
9
  end
30
10
 
31
11
  describe '#build' do
32
- describe 'index_resource' do
33
- it_behaves_like 'a builder that adds a resource for route', :index do
34
- let(:expected) { Document.all }
35
- end
36
- end
37
-
38
- describe 'new_resource' do
39
- it_behaves_like 'a builder that adds a resource for route', :new do
40
- let(:expected) { Document.new }
41
- end
42
- end
43
-
44
- describe 'create_resource' do
45
- it_behaves_like 'a builder that adds a resource for route', :create do
46
- let(:expected) { Document.last }
47
- let(:params) { { document: document_params } }
48
-
49
- it 'creates the resource' do
50
- subject.build
51
- expect do
52
- instance.create_resource
53
- end.to change(Document, :count).by(1)
54
- end
55
- end
56
- end
57
-
58
- describe 'show_resource' do
59
- let(:document) { Document.create }
60
-
61
- it_behaves_like 'a builder that adds a resource for route', :show do
62
- let(:expected) { document }
63
- let(:params) { { id: document.id } }
64
- end
65
- end
66
-
67
- describe 'update_resource' do
68
- let!(:document) { Document.create }
69
-
70
- it_behaves_like 'a builder that adds a resource for route', :update do
71
- let(:expected) { Document.find(document.id) }
72
- let(:params) { { id: document.id, document: document_params } }
73
-
74
- context 'after the methods has been built' do
75
- before { subject.build }
76
-
77
- it 'updates the resource the resource' do
78
- expect do
79
- instance.update_resource
80
- end.to change { document.reload.name }.to(name)
81
- end
82
-
83
- it 'does not create the resource' do
84
- expect do
85
- instance.update_resource
86
- end.not_to change(Document, :count)
87
- end
88
- end
89
- end
12
+ it_behaves_like 'a route resource build' do
13
+ let(:builder) { subject }
90
14
  end
91
15
  end
92
16
  end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ describe Azeroth::RoutesBuilder do
4
+ subject { described_class.new(model, builder) }
5
+
6
+ let(:model) { Azeroth::Model.new(:document) }
7
+ let(:builder) { Sinclair.new(klass) }
8
+ let(:klass) { Class.new(RoutesBuilderController) }
9
+ let(:instance) { klass.new(params) }
10
+ let(:params) { {} }
11
+
12
+ before do
13
+ subject.append
14
+ 10.times { Document.create }
15
+ end
16
+
17
+ describe '#append' do
18
+ before { subject.append }
19
+
20
+ it 'adds index route' do
21
+ expect do
22
+ builder.build
23
+ end.to add_method(:index).to(klass.new)
24
+ end
25
+
26
+ describe 'when calling index' do
27
+ before { builder.build }
28
+
29
+ it 'returns the index object' do
30
+ expect(instance.perform(:index)).to eq(json: 'index_json')
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,9 @@
1
+ class ResourceBuilderController
2
+ def initialize(document_id: nil)
3
+ @document_id = document_id
4
+ end
5
+
6
+ private
7
+
8
+ attr_reader :document_id
9
+ end
@@ -0,0 +1,18 @@
1
+ class ResourceRouteBuilderController
2
+ def initialize(id: nil, document: nil)
3
+ @id = id
4
+ @document_params = document
5
+ end
6
+
7
+ private
8
+
9
+ attr_reader :id, :document_params
10
+
11
+ def document
12
+ documents.find(id)
13
+ end
14
+
15
+ def documents
16
+ Document.all
17
+ end
18
+ end
@@ -0,0 +1,21 @@
1
+ class RoutesBuilderController
2
+ def initialize(id: nil, document: nil)
3
+ @id = id
4
+ @document_params = document
5
+ end
6
+
7
+ def perform(action)
8
+ @action = action
9
+ send(action)
10
+ end
11
+
12
+ private
13
+
14
+ attr_reader :id, :document_params, :action
15
+
16
+ def render_basic
17
+ {
18
+ json: "#{action}_json"
19
+ }
20
+ end
21
+ end
@@ -0,0 +1,80 @@
1
+ module RSpec
2
+ module CustomMatchers
3
+ class AddMethod < Matchers::BuiltIn::BaseMatcher
4
+ attr_reader :method
5
+
6
+ def initialize(method = nil)
7
+ @method = method
8
+ end
9
+
10
+ def to(instance = nil, &block)
11
+ AddMethodTo.new(instance, method, &block)
12
+ end
13
+ end
14
+
15
+ class AddMethodTo < Matchers::BuiltIn::BaseMatcher
16
+ attr_reader :method, :instance, :block
17
+
18
+ def initialize(instance, method, &block)
19
+ @instance = instance
20
+ @method = method
21
+ @block = block
22
+ end
23
+
24
+ def description
25
+ "Adds method #{method} to #{instance_class}"
26
+ end
27
+
28
+ def failure_message
29
+ "expected #{method} to be added to #{instance_class} but " \
30
+ "#{@initial_state ? 'it already existed' : "it didn't"}"
31
+ end
32
+
33
+ def matches?(event_proc)
34
+ @event_proc = event_proc
35
+ return false unless event_proc.is_a?(Proc)
36
+ raise_block_syntax_error if block_given?
37
+ perform_change(event_proc)
38
+ changed?
39
+ end
40
+
41
+ def supports_block_expectations?
42
+ true
43
+ end
44
+
45
+ private
46
+
47
+ def changed?
48
+ !@initial_state && @final_state
49
+ end
50
+
51
+ def perform_change(event_proc)
52
+ @initial_state = evaluated_instance.respond_to?(method)
53
+ @evaluated_instance = nil
54
+ event_proc.call
55
+ @final_state = evaluated_instance.respond_to?(method)
56
+ end
57
+
58
+ def evaluated_instance
59
+ @evaluated_instance ||= instance || block.call
60
+ end
61
+
62
+ def instance_class
63
+ @instance_class ||= evaluated_instance.class
64
+ end
65
+
66
+ def raise_block_syntax_error
67
+ raise SyntaxError, 'Block not received by the `add_method_to` matcher. ' \
68
+ 'Perhaps you want to use `{ ... }` instead of do/end?'
69
+ end
70
+ end
71
+ end
72
+ end
73
+
74
+ module RSpec
75
+ module Matchers
76
+ def add_method(_method)
77
+ CustomMatchers::AddMethod.new(:index)
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,88 @@
1
+ shared_examples 'a builder that adds a resource for route' do |route|
2
+ let(:params) { {} }
3
+ let(:instance) { klass.new(params) }
4
+ let(:value) { instance.public_send("#{route}_resource") }
5
+
6
+ it "adds #{route}_resource" do
7
+ expect { builder.build }
8
+ .to change { klass.new.respond_to?(:"#{route}_resource") }
9
+ .from(false).to(true)
10
+ end
11
+
12
+ it "#{route}_resource responds with correct resource" do
13
+ builder.build
14
+ expect(value.to_json).to eq(expected.to_json)
15
+ end
16
+ end
17
+
18
+ shared_examples 'a route resource build' do
19
+ let(:name) { 'The Doc' }
20
+ let(:document_params) { { name: name } }
21
+
22
+ describe 'index_resource' do
23
+ it_behaves_like 'a builder that adds a resource for route', :index do
24
+ let(:expected) { Document.all }
25
+ end
26
+ end
27
+
28
+ describe 'new_resource' do
29
+ it_behaves_like 'a builder that adds a resource for route', :new do
30
+ let(:expected) { Document.new }
31
+
32
+ it 'does not create the resource' do
33
+ builder.build
34
+ expect do
35
+ instance.new_resource
36
+ end.not_to change(Document, :count)
37
+ end
38
+ end
39
+ end
40
+
41
+ describe 'create_resource' do
42
+ it_behaves_like 'a builder that adds a resource for route', :create do
43
+ let(:expected) { Document.last }
44
+ let(:params) { { document: document_params } }
45
+
46
+ it 'creates the resource' do
47
+ builder.build
48
+ expect do
49
+ instance.create_resource
50
+ end.to change(Document, :count).by(1)
51
+ end
52
+ end
53
+ end
54
+
55
+ describe 'show_resource' do
56
+ let(:document) { Document.create }
57
+
58
+ it_behaves_like 'a builder that adds a resource for route', :show do
59
+ let(:expected) { document }
60
+ let(:params) { { id: document.id } }
61
+ end
62
+ end
63
+
64
+ describe 'update_resource' do
65
+ let!(:document) { Document.create }
66
+
67
+ it_behaves_like 'a builder that adds a resource for route', :update do
68
+ let(:expected) { Document.find(document.id) }
69
+ let(:params) { { id: document.id, document: document_params } }
70
+
71
+ context 'after the methods has been built' do
72
+ before { builder.build }
73
+
74
+ it 'updates the resource the resource' do
75
+ expect do
76
+ instance.update_resource
77
+ end.to change { document.reload.name }.to(name)
78
+ end
79
+
80
+ it 'does not create the resource' do
81
+ expect do
82
+ instance.update_resource
83
+ end.not_to change(Document, :count)
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: azeroth
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Darthjee
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-06-20 00:00:00.000000000 Z
11
+ date: 2019-03-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sinclair
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 1.0.0
19
+ version: 1.1.2
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 1.0.0
26
+ version: 1.1.2
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: activesupport
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -100,84 +100,126 @@ dependencies:
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '1.6'
103
+ version: 1.16.1
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '1.6'
110
+ version: 1.16.1
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: pry-nav
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - ">="
115
+ - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: '0'
117
+ version: 0.2.4
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - ">="
122
+ - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: '0'
124
+ version: 0.2.4
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: rake
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
129
  - - ">="
130
130
  - !ruby/object:Gem::Version
131
- version: '12.3'
131
+ version: 12.3.1
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - ">="
137
137
  - !ruby/object:Gem::Version
138
- version: '12.3'
138
+ version: 12.3.1
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: rspec
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
143
  - - ">="
144
144
  - !ruby/object:Gem::Version
145
- version: '3.7'
145
+ version: '3.8'
146
146
  type: :development
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
150
  - - ">="
151
151
  - !ruby/object:Gem::Version
152
- version: '3.7'
152
+ version: '3.8'
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: rubocop
155
155
  requirement: !ruby/object:Gem::Requirement
156
156
  requirements:
157
- - - ">="
157
+ - - '='
158
158
  - !ruby/object:Gem::Version
159
- version: '0'
159
+ version: 0.58.1
160
160
  type: :development
161
161
  prerelease: false
162
162
  version_requirements: !ruby/object:Gem::Requirement
163
163
  requirements:
164
- - - ">="
164
+ - - '='
165
165
  - !ruby/object:Gem::Version
166
- version: '0'
166
+ version: 0.58.1
167
+ - !ruby/object:Gem::Dependency
168
+ name: rubocop-rspec
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - '='
172
+ - !ruby/object:Gem::Version
173
+ version: 1.30.0
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - '='
179
+ - !ruby/object:Gem::Version
180
+ version: 1.30.0
167
181
  - !ruby/object:Gem::Dependency
168
182
  name: simplecov
169
183
  requirement: !ruby/object:Gem::Requirement
170
184
  requirements:
171
185
  - - "~>"
172
186
  - !ruby/object:Gem::Version
173
- version: 0.16.1
187
+ version: 0.16.x
174
188
  type: :development
175
189
  prerelease: false
176
190
  version_requirements: !ruby/object:Gem::Requirement
177
191
  requirements:
178
192
  - - "~>"
179
193
  - !ruby/object:Gem::Version
180
- version: 0.16.1
194
+ version: 0.16.x
195
+ - !ruby/object:Gem::Dependency
196
+ name: yard
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - ">="
200
+ - !ruby/object:Gem::Version
201
+ version: 0.9.18
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: 0.9.18
209
+ - !ruby/object:Gem::Dependency
210
+ name: yardstick
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - ">="
214
+ - !ruby/object:Gem::Version
215
+ version: 0.9.9
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ version: 0.9.9
181
223
  description: ''
182
224
  email:
183
225
  - dev@gmail.com
@@ -189,31 +231,40 @@ files:
189
231
  - ".gitignore"
190
232
  - ".rubocop.yml"
191
233
  - ".rubocop_todo.yml"
234
+ - Dockerfile
192
235
  - Gemfile
193
236
  - LICENSE
194
237
  - README.md
195
238
  - Rakefile
196
239
  - azeroth.gemspec
197
240
  - azeroth.jpg
241
+ - config/yardstick.rb
242
+ - config/yardstick.yml
198
243
  - docker-compose.yml
199
244
  - lib/azeroth.rb
200
245
  - lib/azeroth/model.rb
246
+ - lib/azeroth/resource_builder.rb
247
+ - lib/azeroth/resource_route_builder.rb
201
248
  - lib/azeroth/resourceable.rb
202
249
  - lib/azeroth/resourceable/builder.rb
203
- - lib/azeroth/resourceable/resource_builder.rb
204
- - lib/azeroth/resourceable/resource_route_builder.rb
205
- - lib/azeroth/resourceable/routes_builder.rb
250
+ - lib/azeroth/routes_builder.rb
206
251
  - lib/azeroth/version.rb
252
+ - scripts/check_readme.sh
207
253
  - spec/lib/azeroth/model_spec.rb
254
+ - spec/lib/azeroth/resource_builder_spec.rb
255
+ - spec/lib/azeroth/resource_route_builder_spec.rb
208
256
  - spec/lib/azeroth/resourceable/builder_spec.rb
209
- - spec/lib/azeroth/resourceable/resource_builder_spec.rb
210
- - spec/lib/azeroth/resourceable/resource_route_builder_spec.rb
211
- - spec/lib/azeroth/resourceable/routes_builder_spec.rb
257
+ - spec/lib/azeroth/routes_builder_spec.rb
212
258
  - spec/spec_helper.rb
213
- - spec/support/models/controller.rb
214
- - spec/support/models/document.rb
215
- - spec/support/models/serializer.rb
259
+ - spec/support/app/controllers/controller.rb
260
+ - spec/support/app/controllers/resource_builder_controller.rb
261
+ - spec/support/app/controllers/resource_route_builder_controller.rb
262
+ - spec/support/app/controllers/routes_builder_controller.rb
263
+ - spec/support/app/models/document.rb
264
+ - spec/support/app/serializers/serializer.rb
265
+ - spec/support/matchers/add_method.rb
216
266
  - spec/support/schema.rb
267
+ - spec/support/shared_examples/resource_routes.rb
217
268
  homepage: https://github.com/darthjee/azeroth
218
269
  licenses: []
219
270
  metadata: {}
@@ -233,18 +284,23 @@ required_rubygems_version: !ruby/object:Gem::Requirement
233
284
  version: '0'
234
285
  requirements: []
235
286
  rubyforge_project:
236
- rubygems_version: 2.6.11
287
+ rubygems_version: 2.7.6
237
288
  signing_key:
238
289
  specification_version: 4
239
290
  summary: Azeroth
240
291
  test_files:
241
292
  - spec/lib/azeroth/model_spec.rb
293
+ - spec/lib/azeroth/resource_builder_spec.rb
294
+ - spec/lib/azeroth/resource_route_builder_spec.rb
242
295
  - spec/lib/azeroth/resourceable/builder_spec.rb
243
- - spec/lib/azeroth/resourceable/resource_builder_spec.rb
244
- - spec/lib/azeroth/resourceable/resource_route_builder_spec.rb
245
- - spec/lib/azeroth/resourceable/routes_builder_spec.rb
296
+ - spec/lib/azeroth/routes_builder_spec.rb
246
297
  - spec/spec_helper.rb
247
- - spec/support/models/controller.rb
248
- - spec/support/models/document.rb
249
- - spec/support/models/serializer.rb
298
+ - spec/support/app/controllers/controller.rb
299
+ - spec/support/app/controllers/resource_builder_controller.rb
300
+ - spec/support/app/controllers/resource_route_builder_controller.rb
301
+ - spec/support/app/controllers/routes_builder_controller.rb
302
+ - spec/support/app/models/document.rb
303
+ - spec/support/app/serializers/serializer.rb
304
+ - spec/support/matchers/add_method.rb
250
305
  - spec/support/schema.rb
306
+ - spec/support/shared_examples/resource_routes.rb
@@ -1,19 +0,0 @@
1
- module Azeroth
2
- module Resourceable
3
- class ResourceBuilder
4
- attr_reader :model, :builder
5
-
6
- delegate :add_method, to: :builder
7
-
8
- def initialize(model, builder)
9
- @model = model
10
- @builder = builder
11
- end
12
-
13
- def append
14
- add_method(model.plural, "@#{model.plural} ||= #{model.klass}.all")
15
- add_method(model.name, "@#{model.name} ||= #{model.plural}.find(#{model.name}_id)")
16
- end
17
- end
18
- end
19
- end
@@ -1,23 +0,0 @@
1
- module Azeroth
2
- module Resourceable
3
- class ResourceRouteBuilder
4
- attr_reader :model, :builder
5
-
6
- delegate :add_method, to: :builder
7
-
8
- def initialize(model, builder)
9
- @model = model
10
- @builder = builder
11
- end
12
-
13
- def append
14
- add_method(:new_resource, "@new_resource ||= #{model.klass}.new")
15
- add_method(:create_resource, "@create_resource ||= #{model.klass}.create(#{model.name}_params)")
16
- add_method(:update_resource, "@update_resource ||= #{model.name}.tap { |v| v.update(#{model.name}_params) }")
17
- add_method(:index_resource, model.plural)
18
- add_method(:edit_resource, model.name)
19
- add_method(:show_resource, model.name)
20
- end
21
- end
22
- end
23
- end
@@ -1,37 +0,0 @@
1
- module Azeroth
2
- module Resourceable
3
- class RoutesBuilder
4
- attr_reader :model, :builder
5
-
6
- delegate :add_method, to: :builder
7
-
8
- def initialize(model, builder)
9
- @model = model
10
- @builder = builder
11
- end
12
-
13
- def append
14
- %i[index show new edit create update destroy].each do |route|
15
- add_method(route, route_code[route].to_s)
16
- end
17
- end
18
-
19
- private
20
-
21
- def route_code
22
- {
23
- index: :render_basic,
24
- show: :render_basic,
25
- new: :render_basic,
26
- edit: :render_basic,
27
- create: :render_basic,
28
- update: :render_basic,
29
- destroy: <<-RUBY
30
- #{model.name}.destroy
31
- head :no_content
32
- RUBY
33
- }
34
- end
35
- end
36
- end
37
- end
@@ -1,5 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Azeroth::Resourceable::ResourceBuilder do
4
- xit 'Need to write it'
5
- end
@@ -1,5 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Azeroth::Resourceable::ResourceRouteBuilder do
4
- xit 'Need to write it'
5
- end
@@ -1,5 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Azeroth::Resourceable::RoutesBuilder do
4
- xit 'Needs to write it'
5
- end