magicka 1.0.0 → 1.2.0

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 (66) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +6 -9
  3. data/.github/copilot-instructions.md +229 -0
  4. data/.github/magicka-usage.md +394 -0
  5. data/.github/sinclair-usage.md +492 -0
  6. data/.gitignore +1 -1
  7. data/.rubocop.yml +19 -2
  8. data/.rubocop_todo.yml +12 -0
  9. data/Dockerfile +2 -2
  10. data/Gemfile +33 -0
  11. data/Makefile +21 -0
  12. data/README.md +6 -7
  13. data/Rakefile +3 -0
  14. data/config/check_specs.yml +0 -2
  15. data/config/yardstick.yml +8 -2
  16. data/lib/magicka/aggregator/class_methods.rb +3 -1
  17. data/lib/magicka/aggregator/method_builder.rb +35 -28
  18. data/lib/magicka/aggregator.rb +19 -9
  19. data/lib/magicka/display.rb +1 -1
  20. data/lib/magicka/element/class_methods.rb +5 -3
  21. data/lib/magicka/element.rb +4 -2
  22. data/lib/magicka/form_element.rb +1 -1
  23. data/lib/magicka/helper/aggregator_options.rb +64 -0
  24. data/lib/magicka/helper/class_methods.rb +10 -2
  25. data/lib/magicka/helper/method_builder.rb +10 -6
  26. data/lib/magicka/helper.rb +12 -6
  27. data/lib/magicka/version.rb +1 -1
  28. data/magicka.gemspec +3 -31
  29. data/magicka.jpg +0 -0
  30. data/spec/dummy/app/controllers/application_controller.rb +1 -0
  31. data/spec/dummy/app/controllers/documents_controller.rb +9 -0
  32. data/spec/dummy/app/models/document.rb +5 -0
  33. data/spec/dummy/app/models/magicka/data_entry.rb +7 -0
  34. data/spec/dummy/app/models/magicka/data_table.rb +6 -0
  35. data/spec/dummy/app/views/documents/show.html.erb +6 -0
  36. data/spec/dummy/app/views/templates/display/_data_entry.html.erb +2 -0
  37. data/spec/dummy/bin/setup +0 -4
  38. data/spec/dummy/bin/update +0 -4
  39. data/spec/dummy/config/environments/development.rb +2 -1
  40. data/spec/dummy/config/environments/production.rb +2 -2
  41. data/spec/dummy/config/initializers/magicka.rb +7 -0
  42. data/spec/dummy/config/puma.rb +3 -3
  43. data/spec/dummy/config/routes.rb +1 -0
  44. data/spec/dummy/db/schema.rb +5 -0
  45. data/spec/integration/yard/magicka/helper_spec.rb +33 -0
  46. data/spec/lib/magicka/aggregator/class_methods_spec.rb +352 -0
  47. data/spec/lib/magicka/aggregator/method_builder_spec.rb +29 -0
  48. data/spec/lib/magicka/aggregator_spec.rb +1 -222
  49. data/spec/lib/magicka/button_spec.rb +1 -1
  50. data/spec/lib/magicka/display_spec.rb +1 -1
  51. data/spec/lib/magicka/element/class_methods_spec.rb +1 -1
  52. data/spec/lib/magicka/element_spec.rb +1 -1
  53. data/spec/lib/magicka/form_element_spec.rb +1 -1
  54. data/spec/lib/magicka/form_spec.rb +1 -1
  55. data/spec/lib/magicka/helper/aggregator_options_spec.rb +99 -0
  56. data/spec/lib/magicka/helper/class_methods_spec.rb +101 -0
  57. data/spec/lib/magicka/helper_spec.rb +2 -18
  58. data/spec/lib/magicka/input_spec.rb +1 -1
  59. data/spec/lib/magicka/select_spec.rb +1 -1
  60. data/spec/lib/magicka/text_spec.rb +1 -1
  61. data/spec/spec_helper.rb +7 -1
  62. data/spec/support/factories/document.rb +7 -0
  63. data/spec/support/factory_bot.rb +7 -0
  64. data/spec/support/models/custom_aggregator.rb +12 -0
  65. data/spec/support/models/my_element.rb +6 -0
  66. metadata +29 -372
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Magicka::Helper::AggregatorOptions do
6
+ subject(:options) { described_class.new(options_hash) }
7
+
8
+ let(:options_hash) do
9
+ {
10
+ aggregator: aggregator,
11
+ type: type,
12
+ config_block: config_block
13
+ }
14
+ end
15
+
16
+ let(:aggregator_class) { Class.new(Magicka::Aggregator) }
17
+ let(:aggregator) { aggregator_class }
18
+ let(:type) { :my_aggregator }
19
+ let(:config_block) do
20
+ proc { with_element(Magicka::Input) }
21
+ end
22
+
23
+ describe '#configured_aggregator' do
24
+ let(:renderer) { instance_double(ActionView::OutputBuffer) }
25
+ let(:model) { Object.new }
26
+ let(:element_class) { Magicka::Input }
27
+
28
+ before do
29
+ allow(element_class).to receive(:render).with(
30
+ renderer: renderer,
31
+ field: :name,
32
+ model: model,
33
+ template: nil
34
+ )
35
+ end
36
+
37
+ context 'when aggregator is a class' do
38
+ context 'when config block is given' do
39
+ it 'returns the given aggregator class' do
40
+ expect(options.configured_aggregator)
41
+ .to be(aggregator)
42
+ end
43
+
44
+ it 'configure the aggregator' do
45
+ options.configured_aggregator.new(renderer, model)
46
+ .input(:name)
47
+
48
+ expect(element_class).to have_received(:render)
49
+ end
50
+ end
51
+
52
+ context 'when config block is not given' do
53
+ let(:config_block) { nil }
54
+
55
+ it 'returns the given aggregator class' do
56
+ expect(options.configured_aggregator)
57
+ .to be(aggregator)
58
+ end
59
+ end
60
+ end
61
+
62
+ context 'when aggregator is a String' do
63
+ let(:aggregator) { "Magicka::#{aggregator_name}" }
64
+ let(:aggregator_name) { :CustomAggregator }
65
+
66
+ before { Magicka.const_set(aggregator_name, aggregator_class) }
67
+
68
+ context 'when config block is given' do
69
+ let(:aggregator_name) { :CustomAggregator1 }
70
+
71
+ it 'returns the given aggregator class' do
72
+ expect(options.configured_aggregator)
73
+ .to be(aggregator_class)
74
+ end
75
+ end
76
+
77
+ context 'when config block is given and is called' do
78
+ let(:aggregator_name) { :CustomAggregator2 }
79
+
80
+ it 'configure the aggregator' do
81
+ options.configured_aggregator.new(renderer, model)
82
+ .input(:name)
83
+
84
+ expect(element_class).to have_received(:render)
85
+ end
86
+ end
87
+
88
+ context 'when config block is not given' do
89
+ let(:aggregator_name) { :CustomAggregator3 }
90
+ let(:config_block) { nil }
91
+
92
+ it 'returns the given aggregator class' do
93
+ expect(options.configured_aggregator)
94
+ .to be(aggregator_class)
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,101 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Magicka::Helper::ClassMethods do
6
+ subject(:object) { klass.new }
7
+
8
+ let(:model) { Object.new }
9
+
10
+ let(:helper_class) { Magicka::Helper }
11
+ let(:klass) do
12
+ Class.new do
13
+ include Magicka::Helper
14
+ end
15
+ end
16
+
17
+ describe '#with' do
18
+ let(:aggregator_class) do
19
+ Class.new(Magicka::Aggregator) do
20
+ def self.name
21
+ 'Magicka::MyClass'
22
+ end
23
+ end
24
+ end
25
+
26
+ context 'when passing a class' do
27
+ it do
28
+ expect { helper_class.with(aggregator_class) }
29
+ .to add_method('magicka_my_class')
30
+ .to(object)
31
+ end
32
+
33
+ context 'when the method is called' do
34
+ before { helper_class.with(aggregator_class) }
35
+
36
+ it do
37
+ object.magicka_my_class(model) do |aggregator|
38
+ expect(aggregator).to be_a(aggregator_class)
39
+ end
40
+ end
41
+ end
42
+
43
+ context 'when an element is added in the block' do
44
+ before do
45
+ helper_class.with(aggregator_class) do
46
+ with_element(Magicka::Input, :my_input)
47
+ end
48
+ end
49
+
50
+ it do
51
+ object.magicka_my_class(model) do |aggregator|
52
+ expect(aggregator).to respond_to(:my_input)
53
+ end
54
+ end
55
+ end
56
+ end
57
+
58
+ context 'when passing a string as agregator' do
59
+ let(:aggregator_name) { :Test1Aggregator }
60
+ let(:aggregator_class_name) { "Magicka::#{aggregator_name}" }
61
+
62
+ it do
63
+ expect { helper_class.with(aggregator_class_name, :test1_aggregator) }
64
+ .to add_method('magicka_test1_aggregator')
65
+ .to(object)
66
+ end
67
+
68
+ context 'when the method is called' do
69
+ before do
70
+ helper_class.with(aggregator_class_name, :test1_aggregator)
71
+
72
+ Magicka.const_set(aggregator_name, aggregator_class)
73
+ end
74
+
75
+ it do
76
+ object.magicka_test1_aggregator(model) do |aggregator|
77
+ expect(aggregator).to be_a(aggregator_class)
78
+ end
79
+ end
80
+ end
81
+
82
+ context 'when an element is added in the block' do
83
+ let(:aggregator_name) { :Test2Aggregator }
84
+
85
+ before do
86
+ helper_class.with(aggregator_class_name, :test2_aggregator) do
87
+ with_element(Magicka::Input, :my_input)
88
+ end
89
+
90
+ Magicka.const_set(aggregator_name, aggregator_class)
91
+ end
92
+
93
+ it do
94
+ object.magicka_test2_aggregator(model) do |aggregator|
95
+ expect(aggregator).to respond_to(:my_input)
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
@@ -5,30 +5,14 @@ require 'spec_helper'
5
5
  describe Magicka::Helper do
6
6
  subject(:object) { klass.new }
7
7
 
8
+ let(:model) { Object.new }
9
+
8
10
  let(:klass) do
9
11
  Class.new do
10
12
  include Magicka::Helper
11
13
  end
12
14
  end
13
15
 
14
- let(:model) { 'model' }
15
-
16
- describe '.with' do
17
- let(:aggregator_class) do
18
- Class.new(Magicka::Aggregator) do
19
- def self.name
20
- 'Magicka::MyClass'
21
- end
22
- end
23
- end
24
-
25
- it do
26
- expect { described_class.with(aggregator_class) }
27
- .to add_method('magicka_my_class')
28
- .to(object)
29
- end
30
- end
31
-
32
16
  describe '#magicka_display' do
33
17
  it do
34
18
  object.magicka_display(model) do |display|
@@ -3,7 +3,7 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  describe Magicka::Input do
6
- let(:renderer) { instance_double('renderer') }
6
+ let(:renderer) { instance_double(ActionView::Base) }
7
7
  let(:template) { 'templates/forms/input' }
8
8
 
9
9
  let(:model) { :my_model }
@@ -3,7 +3,7 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  describe Magicka::Select do
6
- let(:renderer) { instance_double('renderer') }
6
+ let(:renderer) { instance_double(ActionView::Base) }
7
7
  let(:template) { 'templates/forms/select' }
8
8
 
9
9
  let(:model) { :my_model }
@@ -3,7 +3,7 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  describe Magicka::Text do
6
- let(:renderer) { instance_double('renderer') }
6
+ let(:renderer) { instance_double(ActionView::Base) }
7
7
  let(:template) { 'templates/display/text' }
8
8
 
9
9
  let(:model) { :my_model }
data/spec/spec_helper.rb CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  require 'simplecov'
4
4
 
5
+ if ENV['CI']
6
+ require 'simplecov-lcov'
7
+ SimpleCov::Formatter::LcovFormatter.config.report_with_single_file = true
8
+ SimpleCov.formatter = SimpleCov::Formatter::LcovFormatter
9
+ end
10
+
5
11
  SimpleCov.start do
6
12
  add_filter '/spec/'
7
13
  end
@@ -21,7 +27,7 @@ require 'active_support/railtie'
21
27
  require 'sinclair/matchers'
22
28
 
23
29
  support_files = File.expand_path('spec/support/**/*.rb')
24
- Dir[support_files].sort.each { |file| require file }
30
+ Dir[support_files].each { |file| require file }
25
31
 
26
32
  RSpec::Matchers.define_negated_matcher :not_change, :change
27
33
  RSpec::Matchers.define_negated_matcher :not_add_method, :add_method
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :document, class: '::Document' do
5
+ sequence(:name) { |n| "Name-#{n}" }
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.configure do |config|
4
+ config.include FactoryBot::Syntax::Methods
5
+ end
6
+
7
+ FactoryBot.find_definitions
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Magicka
4
+ class CustomAggregator < Aggregator
5
+ with_element(Input)
6
+ with_element(Select)
7
+
8
+ def button(**args)
9
+ Button.render(renderer: renderer, **args)
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Magicka
4
+ class MyElement < Element
5
+ end
6
+ end