azeroth 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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