magicka 0.2.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9431c86cdde2b07ceb2abfd3554f2e40a086df1dc8cfb760dbc7db514db1dcbe
4
- data.tar.gz: 30e5f36c63e91fb2a6ce81f25f147b474e6613abeca0446c04cfe96d587cfbbd
3
+ metadata.gz: 05ffde0ed491999459ac688704b00c0ce07e2c93ae89aaa75f78a1c6b8acabba
4
+ data.tar.gz: 6d08209c27862a6791917a32e322775bfc801a00dcb666924d7b0b387c92f03b
5
5
  SHA512:
6
- metadata.gz: ab094ae97de3a63092f2835032152ee71e8747faffef2988540e5ef225b4187d8d688c2578accbccf7e90a7adf02a876bd2b89f847f1a7307d580b552b505a2e
7
- data.tar.gz: fc74112bcde8321f00b6fee6e61984c13f80ed280ac4ddbfd2bfff59f824c88cdfe796703e914918b0cbbd3f7e6b47a47e9cff94c875d0da7b920d189b093bd3
6
+ metadata.gz: 4d2aa6d343fe5104e275dc9257fb838c650f0353406452b217fb17f40978ea4152838c56181300bec3f1da208f28764790e947619f5137426545206c540e5952
7
+ data.tar.gz: 91036aeff9fbefe61eacc3b93005e8f51e9c6cf86ce7cb618e5360ea8059c7ba6df680c4bd5cebf9c57cb3a8154058b63aa1aeb1c362261b4613e4707cf41ca0
@@ -7,8 +7,12 @@ workflows:
7
7
  filters:
8
8
  tags:
9
9
  only: /.*/
10
+ - checks:
11
+ filters:
12
+ tags:
13
+ only: /.*/
10
14
  - build-and-release:
11
- requires: [test]
15
+ requires: [test, checks]
12
16
  filters:
13
17
  tags:
14
18
  only: /\d+\.\d+\.\d+/
@@ -18,7 +22,7 @@ workflows:
18
22
  jobs:
19
23
  test:
20
24
  docker:
21
- - image: darthjee/circleci_rails_gems:0.5.4
25
+ - image: darthjee/circleci_rails_gems:0.6.0
22
26
  environment:
23
27
  PROJECT: magicka
24
28
  steps:
@@ -32,12 +36,22 @@ jobs:
32
36
  - run:
33
37
  name: RSpec
34
38
  command: bundle exec rspec
35
- - run:
36
- name: Rubocop
37
- command: rubocop
38
39
  - run:
39
40
  name: Coverage Test Report
40
41
  command: cc-test-reporter after-build --exit-code $?
42
+ checks:
43
+ docker:
44
+ - image: darthjee/circleci_rails_gems:0.6.0
45
+ environment:
46
+ PROJECT: magicka
47
+ steps:
48
+ - checkout
49
+ - run:
50
+ name: Bundle Install
51
+ command: bundle install
52
+ - run:
53
+ name: Rubocop
54
+ command: rubocop
41
55
  - run:
42
56
  name: Yardstick coverage check
43
57
  command: bundle exec rake verify_measurements
data/README.md CHANGED
@@ -11,7 +11,7 @@ Magicka
11
11
 
12
12
  Yard Documentation
13
13
  -------------------
14
- [https://www.rubydoc.info/gems/magicka/0.2,0](https://www.rubydoc.info/gems/magicka/0.2.0)
14
+ [https://www.rubydoc.info/gems/magicka/0.5.0](https://www.rubydoc.info/gems/magicka/0.5.0)
15
15
 
16
16
  Installation
17
17
  ---------------
@@ -1,3 +1,5 @@
1
1
  ignore:
2
2
  - lib/magicka/version.rb
3
3
  - lib/magicka.rb
4
+ - lib/magicka/aggregator.rb
5
+ - lib/magicka/aggregator/method_builder.rb
@@ -1,4 +1,4 @@
1
- threshold: 92.2
1
+ threshold: 85.5
2
2
  require_exact_threshold: false
3
3
  rules:
4
4
  ApiTag::Presence:
@@ -10,9 +10,12 @@ require 'sinclair'
10
10
  #
11
11
  # module holding herlper to render inputs
12
12
  module Magicka
13
- autoload :VERSION, 'magicka/version'
14
- autoload :Element, 'magicka/element'
15
- autoload :Input, 'magicka/input'
16
- autoload :InputElement, 'magicka/input_element'
17
- autoload :MethodBuilder, 'magicka/method_builder'
13
+ autoload :VERSION, 'magicka/version'
14
+ autoload :Aggregator, 'magicka/aggregator'
15
+ autoload :Button, 'magicka/button'
16
+ autoload :Element, 'magicka/element'
17
+ autoload :FormElement, 'magicka/form_element'
18
+ autoload :Form, 'magicka/form'
19
+ autoload :Input, 'magicka/input'
20
+ autoload :Select, 'magicka/select'
18
21
  end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Magicka
4
+ # @api public
5
+ #
6
+ # Class representing an element agregator, representing a model
7
+ class Aggregator
8
+ autoload :MethodBuilder, 'magicka/aggregator/method_builder'
9
+
10
+ class << self
11
+ def with_element(element_class, method_name = nil)
12
+ MethodBuilder
13
+ .new(self, element_class, method_name)
14
+ .prepare
15
+ .build
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Magicka
4
+ class Aggregator
5
+ # @api private
6
+ #
7
+ # Class responsible for building an {Aggregator} method
8
+ class MethodBuilder < Sinclair
9
+ def initialize(klass, element_class, method_name = nil)
10
+ super(klass)
11
+
12
+ @element_class = element_class
13
+ @method_name = method_name
14
+ end
15
+
16
+ def prepare
17
+ element_klass = element_class
18
+
19
+ add_method(method_name) do |field, model: self.model, **args|
20
+ element_klass.render(
21
+ renderer: renderer, field: field, model: model, **args
22
+ )
23
+ end
24
+
25
+ self
26
+ end
27
+
28
+ private
29
+
30
+ attr_reader :element_class
31
+
32
+ def method_name
33
+ @method_name ||= element_class
34
+ .name
35
+ .underscore
36
+ .gsub(%r{.*/}, '')
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Magicka
4
+ # Button element representing an HTML +<button/>+
5
+ class Button < Element
6
+ with_attribute_locals :ng_click, :ng_disabled, :classes, :text
7
+ template_folder 'templates/forms'
8
+ end
9
+ end
@@ -5,7 +5,8 @@ module Magicka
5
5
  #
6
6
  # Base class for element rendering
7
7
  class Element < Sinclair::Options
8
- autoload :ClassMethods, 'magicka/element/class_methods'
8
+ autoload :ClassMethods, 'magicka/element/class_methods'
9
+ autoload :MethodBuilder, 'magicka/element/method_builder'
9
10
 
10
11
  skip_validation
11
12
 
@@ -76,7 +77,7 @@ module Magicka
76
77
  #
77
78
  # @return [String]
78
79
  def template
79
- name.underscore
80
+ self.class.name.underscore
80
81
  .gsub(%r{^.*/}, "#{template_folder}/")
81
82
  end
82
83
  end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Magicka
4
+ class Element
5
+ # @api private
6
+ #
7
+ # class responsible for building methods on {Magicka::Element}
8
+ class MethodBuilder < Sinclair
9
+ # adds a mehtod +#template+
10
+ #
11
+ # The method will always return the template given in the params
12
+ #
13
+ # @param template [String] path to template file
14
+ #
15
+ # @return [Array<Sinclair::MethodDefinition>]
16
+ def add_template(template)
17
+ add_method(:template) do
18
+ template
19
+ end
20
+
21
+ build
22
+ end
23
+
24
+ # adds a mehtod +#template_folder+
25
+ #
26
+ # The method will always return the template folder given in the params
27
+ #
28
+ # @param template_folder [String] path to template folder
29
+ #
30
+ # @return [Array<Sinclair::MethodDefinition>]
31
+ def add_template_folder(folder)
32
+ add_method(:template_folder) do
33
+ folder
34
+ end
35
+
36
+ build
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Magicka
4
+ # Class responsible for controlling one object form
5
+ class Form < Aggregator
6
+ attr_reader :model
7
+
8
+ def initialize(renderer, model)
9
+ @renderer = renderer
10
+ @model = model
11
+ end
12
+
13
+ with_element(Input)
14
+ with_element(Select)
15
+
16
+ def button(**args)
17
+ Button.render(renderer: renderer, **args)
18
+ end
19
+
20
+ def with_model(model)
21
+ new_model = [self.model, model].join('.')
22
+
23
+ yield Form.new(renderer, new_model)
24
+ end
25
+
26
+ def equal?(other)
27
+ return unless other.class == self.class
28
+
29
+ other.renderer == renderer &&
30
+ other.model == model
31
+ end
32
+
33
+ alias == equal?
34
+
35
+ protected
36
+
37
+ attr_reader :renderer
38
+
39
+ delegate :render, to: :renderer
40
+ end
41
+ end
@@ -4,11 +4,13 @@ module Magicka
4
4
  # @api public
5
5
  #
6
6
  # Basic class for elements for forms
7
- class InputElement < Element
7
+ class FormElement < Element
8
8
  with_attribute_locals :field, :label
9
9
  with_attributes :model
10
10
  with_locals :ng_errors, :ng_model
11
11
 
12
+ template_folder 'templates/forms'
13
+
12
14
  private
13
15
 
14
16
  # @api private
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Magicka
4
4
  # Input element representing an HTML +<input/>+
5
- class Input < InputElement
5
+ class Input < FormElement
6
6
  with_attribute_locals :placeholder
7
7
  end
8
8
  end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Magicka
4
+ # Select element representing an HTML +<select/>+
5
+ class Select < FormElement
6
+ with_attribute_locals :options
7
+ end
8
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Magicka
4
- VERSION = '0.2.0'
4
+ VERSION = '0.5.0'
5
5
  end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Magicka::Button do
6
+ let(:renderer) { instance_double('renderer') }
7
+ let(:template) { 'templates/forms/button' }
8
+
9
+ let(:ng_click) { 'controler.click()' }
10
+ let(:ng_disabled) { 'false' }
11
+ let(:classes) { 'custom class' }
12
+ let(:text) { 'Click' }
13
+
14
+ let(:locals) do
15
+ {
16
+ ng_click: ng_click,
17
+ ng_disabled: ng_disabled,
18
+ classes: classes,
19
+ text: text
20
+ }
21
+ end
22
+
23
+ describe '.render' do
24
+ let(:arguments) do
25
+ {
26
+ renderer: renderer,
27
+ ng_click: ng_click,
28
+ ng_disabled: ng_disabled,
29
+ classes: classes,
30
+ text: text
31
+ }
32
+ end
33
+
34
+ before do
35
+ allow(renderer)
36
+ .to receive(:render)
37
+ .with(partial: template, locals: locals)
38
+ end
39
+
40
+ it do
41
+ described_class.render(arguments)
42
+
43
+ expect(renderer).to have_received(:render)
44
+ end
45
+
46
+ context 'when called with extra params' do
47
+ it do
48
+ described_class.render(name: 'Name', **arguments)
49
+
50
+ expect(renderer).to have_received(:render)
51
+ end
52
+ end
53
+ end
54
+ end
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- describe Magicka::MethodBuilder do
5
+ describe Magicka::Element::MethodBuilder do
6
6
  subject(:builder) { described_class.new(klass) }
7
7
 
8
8
  let(:klass) { Class.new }
@@ -67,12 +67,12 @@ describe Magicka::Element do
67
67
  end
68
68
 
69
69
  context 'when class has only folder defined' do
70
- let(:expected_template) { 'templates/forms/input' }
70
+ let(:expected_template) { 'templates/forms/my_element' }
71
71
 
72
72
  before do
73
73
  klass.template_folder(folder)
74
74
 
75
- method_builder.add_method(:name) { 'Magicka::Input' }
75
+ method_builder.add_class_method(:name) { 'Magicka::MyElement' }
76
76
  method_builder.build
77
77
  end
78
78
 
@@ -0,0 +1,87 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Magicka::FormElement do
6
+ let(:renderer) { instance_double('renderer') }
7
+ let(:template) { 'templates/forms/custom_template' }
8
+
9
+ let(:expected_template) { template }
10
+
11
+ let(:model) { :my_model }
12
+ let(:field) { :field }
13
+ let(:label) { 'Label' }
14
+ let(:klass) { Class.new(described_class) }
15
+
16
+ let(:locals) do
17
+ {
18
+ field: field,
19
+ label: label,
20
+ ng_errors: 'my_model.errors.field',
21
+ ng_model: 'my_model.field'
22
+ }
23
+ end
24
+
25
+ describe '.render' do
26
+ let(:arguments) do
27
+ {
28
+ renderer: renderer,
29
+ field: field,
30
+ label: label,
31
+ model: model
32
+ }
33
+ end
34
+
35
+ before do
36
+ allow(renderer)
37
+ .to receive(:render)
38
+ .with(partial: expected_template, locals: locals)
39
+ end
40
+
41
+ context 'when defined template' do
42
+ before do
43
+ klass.template(template)
44
+ end
45
+
46
+ it do
47
+ klass.render(arguments)
48
+
49
+ expect(renderer).to have_received(:render)
50
+ end
51
+
52
+ context 'when called with extra params' do
53
+ it do
54
+ klass.render(name: 'Name', **arguments)
55
+
56
+ expect(renderer).to have_received(:render)
57
+ end
58
+ end
59
+ end
60
+
61
+ context 'when not defining a template' do
62
+ let(:method_builder) { Sinclair.new(klass) }
63
+ let(:expected_template) { 'templates/forms/my_custom_element' }
64
+
65
+ before do
66
+ method_builder.add_class_method(:name) do
67
+ 'Magicka::MyCustomElement'
68
+ end
69
+ method_builder.build
70
+ end
71
+
72
+ it do
73
+ klass.render(arguments)
74
+
75
+ expect(renderer).to have_received(:render)
76
+ end
77
+
78
+ context 'when called with extra params' do
79
+ it do
80
+ klass.render(name: 'Name', **arguments)
81
+
82
+ expect(renderer).to have_received(:render)
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,156 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Magicka::Form do
6
+ subject(:form) { described_class.new(renderer, model) }
7
+
8
+ let(:model) { :my_model }
9
+ let(:renderer) { instance_double('renderer') }
10
+ let(:template) { 'templates/forms/input' }
11
+ let(:locals) { {} }
12
+
13
+ before do
14
+ allow(renderer)
15
+ .to receive(:render)
16
+ .with(partial: template, locals: locals)
17
+ end
18
+
19
+ describe '#input' do
20
+ let(:template) { 'templates/forms/input' }
21
+ let(:field) { :field }
22
+ let(:label) { 'Label' }
23
+ let(:placeholder) { 'Value' }
24
+
25
+ let(:locals) do
26
+ {
27
+ field: field,
28
+ label: label,
29
+ ng_errors: 'my_model.errors.field',
30
+ ng_model: 'my_model.field',
31
+ placeholder: placeholder
32
+ }
33
+ end
34
+
35
+ let(:arguments) do
36
+ {
37
+ label: label,
38
+ placeholder: placeholder
39
+ }
40
+ end
41
+
42
+ it 'renders an input' do
43
+ form.input(field, arguments)
44
+
45
+ expect(renderer).to have_received(:render)
46
+ end
47
+
48
+ context 'when passing a custom model' do
49
+ let(:locals) do
50
+ {
51
+ field: field,
52
+ label: label,
53
+ ng_errors: 'my_custom_model.errors.field',
54
+ ng_model: 'my_custom_model.field',
55
+ placeholder: placeholder
56
+ }
57
+ end
58
+
59
+ it 'renders an input' do
60
+ form.input(field, model: 'my_custom_model', **arguments)
61
+
62
+ expect(renderer).to have_received(:render)
63
+ end
64
+ end
65
+ end
66
+
67
+ describe '#select' do
68
+ let(:template) { 'templates/forms/select' }
69
+ let(:field) { :field }
70
+ let(:label) { 'Label' }
71
+ let(:options) { %i[option_a option_b] }
72
+
73
+ let(:locals) do
74
+ {
75
+ field: field,
76
+ label: label,
77
+ ng_errors: 'my_model.errors.field',
78
+ ng_model: 'my_model.field',
79
+ options: options
80
+ }
81
+ end
82
+
83
+ let(:arguments) do
84
+ {
85
+ label: label,
86
+ options: options
87
+ }
88
+ end
89
+
90
+ it 'renders a select' do
91
+ form.select(field, arguments)
92
+
93
+ expect(renderer).to have_received(:render)
94
+ end
95
+
96
+ context 'when passing a custom model' do
97
+ let(:locals) do
98
+ {
99
+ field: field,
100
+ label: label,
101
+ ng_errors: 'my_custom_model.errors.field',
102
+ ng_model: 'my_custom_model.field',
103
+ options: options
104
+ }
105
+ end
106
+
107
+ it 'renders a select' do
108
+ form.select(field, model: 'my_custom_model', **arguments)
109
+
110
+ expect(renderer).to have_received(:render)
111
+ end
112
+ end
113
+ end
114
+
115
+ describe '#button' do
116
+ let(:template) { 'templates/forms/button' }
117
+ let(:ng_click) { 'controler.click()' }
118
+ let(:ng_disabled) { 'false' }
119
+ let(:classes) { 'custom class' }
120
+ let(:text) { 'Click' }
121
+
122
+ let(:locals) do
123
+ {
124
+ ng_click: ng_click,
125
+ ng_disabled: ng_disabled,
126
+ classes: classes,
127
+ text: text
128
+ }
129
+ end
130
+
131
+ let(:arguments) do
132
+ {
133
+ ng_click: ng_click,
134
+ ng_disabled: ng_disabled,
135
+ classes: classes,
136
+ text: text
137
+ }
138
+ end
139
+
140
+ it 'renders an input' do
141
+ form.button(arguments)
142
+
143
+ expect(renderer).to have_received(:render)
144
+ end
145
+ end
146
+
147
+ describe '#with_model' do
148
+ let(:expected_form) { described_class.new(renderer, 'my_model.inner') }
149
+
150
+ it do
151
+ form.with_model(:inner) do |new_form|
152
+ expect(new_form).to eq(expected_form)
153
+ end
154
+ end
155
+ end
156
+ end
@@ -2,34 +2,33 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- describe Magicka::InputElement do
5
+ describe Magicka::Select do
6
6
  let(:renderer) { instance_double('renderer') }
7
- let(:template) { 'templates/forms/input' }
7
+ let(:template) { 'templates/forms/select' }
8
8
 
9
9
  let(:model) { :my_model }
10
10
  let(:field) { :field }
11
11
  let(:label) { 'Label' }
12
+ let(:options) { %i[option_a option_b] }
12
13
 
13
14
  let(:locals) do
14
15
  {
15
16
  field: field,
16
17
  label: label,
17
18
  ng_errors: 'my_model.errors.field',
18
- ng_model: 'my_model.field'
19
+ ng_model: 'my_model.field',
20
+ options: options
19
21
  }
20
22
  end
21
23
 
22
- before do
23
- described_class.template(template)
24
- end
25
-
26
24
  describe '.render' do
27
25
  let(:arguments) do
28
26
  {
29
27
  renderer: renderer,
30
28
  field: field,
31
29
  label: label,
32
- model: model
30
+ model: model,
31
+ options: options
33
32
  }
34
33
  end
35
34
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: magicka
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - DarthJee
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-02 00:00:00.000000000 Z
11
+ date: 2020-06-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -397,11 +397,16 @@ files:
397
397
  - config/yardstick.yml
398
398
  - docker-compose.yml
399
399
  - lib/magicka.rb
400
+ - lib/magicka/aggregator.rb
401
+ - lib/magicka/aggregator/method_builder.rb
402
+ - lib/magicka/button.rb
400
403
  - lib/magicka/element.rb
401
404
  - lib/magicka/element/class_methods.rb
405
+ - lib/magicka/element/method_builder.rb
406
+ - lib/magicka/form.rb
407
+ - lib/magicka/form_element.rb
402
408
  - lib/magicka/input.rb
403
- - lib/magicka/input_element.rb
404
- - lib/magicka/method_builder.rb
409
+ - lib/magicka/select.rb
405
410
  - lib/magicka/version.rb
406
411
  - magicka.gemspec
407
412
  - magicka.jpg
@@ -466,11 +471,14 @@ files:
466
471
  - spec/dummy/storage/.keep
467
472
  - spec/integration/readme/.keep
468
473
  - spec/integration/yard/.keep
474
+ - spec/lib/magicka/button_spec.rb
469
475
  - spec/lib/magicka/element/class_methods_spec.rb
476
+ - spec/lib/magicka/element/method_builder_spec.rb
470
477
  - spec/lib/magicka/element_spec.rb
471
- - spec/lib/magicka/input_element_spec.rb
478
+ - spec/lib/magicka/form_element_spec.rb
479
+ - spec/lib/magicka/form_spec.rb
472
480
  - spec/lib/magicka/input_spec.rb
473
- - spec/lib/magicka/method_builder_spec.rb
481
+ - spec/lib/magicka/select_spec.rb
474
482
  - spec/spec_helper.rb
475
483
  - spec/support/models/.keep
476
484
  - spec/support/shared_examples/.keep
@@ -1,38 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Magicka
4
- # @api private
5
- #
6
- # class responsible for building methods on {Magicka::Element}
7
- class MethodBuilder < Sinclair
8
- # adds a mehtod +#template+
9
- #
10
- # The method will always return the template given in the params
11
- #
12
- # @param template [String] path to template file
13
- #
14
- # @return [Array<Sinclair::MethodDefinition>]
15
- def add_template(template)
16
- add_method(:template) do
17
- template
18
- end
19
-
20
- build
21
- end
22
-
23
- # adds a mehtod +#template_folder+
24
- #
25
- # The method will always return the template folder given in the params
26
- #
27
- # @param template_folder [String] path to template folder
28
- #
29
- # @return [Array<Sinclair::MethodDefinition>]
30
- def add_template_folder(folder)
31
- add_method(:template_folder) do
32
- folder
33
- end
34
-
35
- build
36
- end
37
- end
38
- end