magicka 0.4.0 → 0.5.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.
- checksums.yaml +4 -4
- data/.circleci/config.yml +19 -5
- data/.rubocop.yml +1 -1
- data/README.md +1 -1
- data/config/check_specs.yml +2 -0
- data/config/yardstick.yml +1 -1
- data/lib/magicka.rb +11 -8
- data/lib/magicka/aggregator.rb +47 -0
- data/lib/magicka/aggregator/method_builder.rb +44 -0
- data/lib/magicka/display.rb +11 -0
- data/lib/magicka/element.rb +7 -3
- data/lib/magicka/element/method_builder.rb +40 -0
- data/lib/magicka/form.rb +3 -36
- data/lib/magicka/helper.rb +14 -0
- data/lib/magicka/text.rb +8 -0
- data/lib/magicka/version.rb +1 -1
- data/spec/lib/magicka/aggregator_spec.rb +209 -0
- data/spec/lib/magicka/display_spec.rb +169 -0
- data/spec/lib/magicka/{method_builder_spec.rb → element/method_builder_spec.rb} +1 -1
- data/spec/lib/magicka/element_spec.rb +41 -0
- data/spec/lib/magicka/form_spec.rb +65 -4
- data/spec/lib/magicka/text_spec.rb +52 -0
- metadata +12 -4
- data/lib/magicka/method_builder.rb +0 -38
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 72a1f044386185ab6424ca7bee6714e104cc5e3187bf4ce0f789dda229e71f2c
|
4
|
+
data.tar.gz: 34ea858057a3b387a71d1eb1d9a25ac2265344e90d4a4e0b5b9ab5f5327dc399
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 618d045f43772a81df679643ffcf7999f2a05ca424d0d2fe5e30ee82a0a96801cfe5c6b2598b8dbd9efb8bb2ff5552a7d61a1d8b5555e2f6732c4106a35e4d0f
|
7
|
+
data.tar.gz: 8830926f9724a6ec3a516a222348be09f959059aae45311f2ae567f591c0d41a0e921c49a9fe71e6f708395c5739e6899d87e3873adebc120a629babed97edb0
|
data/.circleci/config.yml
CHANGED
@@ -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.
|
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/.rubocop.yml
CHANGED
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.4
|
14
|
+
[https://www.rubydoc.info/gems/magicka/0.5.4](https://www.rubydoc.info/gems/magicka/0.5.4)
|
15
15
|
|
16
16
|
Installation
|
17
17
|
---------------
|
data/config/check_specs.yml
CHANGED
data/config/yardstick.yml
CHANGED
data/lib/magicka.rb
CHANGED
@@ -10,12 +10,15 @@ require 'sinclair'
|
|
10
10
|
#
|
11
11
|
# module holding herlper to render inputs
|
12
12
|
module Magicka
|
13
|
-
autoload :VERSION,
|
14
|
-
autoload :
|
15
|
-
autoload :
|
16
|
-
autoload :
|
17
|
-
autoload :
|
18
|
-
autoload :
|
19
|
-
autoload :
|
20
|
-
autoload :
|
13
|
+
autoload :VERSION, 'magicka/version'
|
14
|
+
autoload :Aggregator, 'magicka/aggregator'
|
15
|
+
autoload :Button, 'magicka/button'
|
16
|
+
autoload :Display, 'magicka/display'
|
17
|
+
autoload :Element, 'magicka/element'
|
18
|
+
autoload :FormElement, 'magicka/form_element'
|
19
|
+
autoload :Form, 'magicka/form'
|
20
|
+
autoload :Helper, 'magicka/helper'
|
21
|
+
autoload :Input, 'magicka/input'
|
22
|
+
autoload :Select, 'magicka/select'
|
23
|
+
autoload :Text, 'magicka/text'
|
21
24
|
end
|
@@ -0,0 +1,47 @@
|
|
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, template: nil)
|
12
|
+
MethodBuilder
|
13
|
+
.new(self, element_class, method_name, template: template)
|
14
|
+
.prepare
|
15
|
+
.build
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
attr_reader :model
|
20
|
+
|
21
|
+
def initialize(renderer, model)
|
22
|
+
@renderer = renderer
|
23
|
+
@model = model
|
24
|
+
end
|
25
|
+
|
26
|
+
def with_model(model, base: self.model)
|
27
|
+
new_model = [base, model].compact.join('.')
|
28
|
+
|
29
|
+
yield self.class.new(renderer, new_model)
|
30
|
+
end
|
31
|
+
|
32
|
+
def equal?(other)
|
33
|
+
return unless other.class == self.class
|
34
|
+
|
35
|
+
other.renderer == renderer &&
|
36
|
+
other.model == model
|
37
|
+
end
|
38
|
+
|
39
|
+
alias == equal?
|
40
|
+
|
41
|
+
protected
|
42
|
+
|
43
|
+
attr_reader :renderer
|
44
|
+
|
45
|
+
delegate :render, to: :renderer
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,44 @@
|
|
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, template: nil)
|
10
|
+
super(klass)
|
11
|
+
|
12
|
+
@element_class = element_class
|
13
|
+
@method_name = method_name
|
14
|
+
@template = template
|
15
|
+
end
|
16
|
+
|
17
|
+
def prepare
|
18
|
+
element_klass = element_class
|
19
|
+
template_file = template
|
20
|
+
|
21
|
+
add_method(method_name) do |field, model: self.model, **args|
|
22
|
+
element_klass.render(
|
23
|
+
renderer: renderer, field: field,
|
24
|
+
model: model, template: template_file,
|
25
|
+
**args
|
26
|
+
)
|
27
|
+
end
|
28
|
+
|
29
|
+
self
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
attr_reader :element_class, :template
|
35
|
+
|
36
|
+
def method_name
|
37
|
+
@method_name ||= element_class
|
38
|
+
.name
|
39
|
+
.underscore
|
40
|
+
.gsub(%r{.*/}, '')
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/lib/magicka/element.rb
CHANGED
@@ -5,7 +5,8 @@ module Magicka
|
|
5
5
|
#
|
6
6
|
# Base class for element rendering
|
7
7
|
class Element < Sinclair::Options
|
8
|
-
autoload :ClassMethods,
|
8
|
+
autoload :ClassMethods, 'magicka/element/class_methods'
|
9
|
+
autoload :MethodBuilder, 'magicka/element/method_builder'
|
9
10
|
|
10
11
|
skip_validation
|
11
12
|
|
@@ -76,8 +77,11 @@ module Magicka
|
|
76
77
|
#
|
77
78
|
# @return [String]
|
78
79
|
def template
|
79
|
-
self
|
80
|
-
|
80
|
+
@template ||= self
|
81
|
+
.class
|
82
|
+
.name
|
83
|
+
.underscore
|
84
|
+
.gsub(%r{^.*/}, "#{template_folder}/")
|
81
85
|
end
|
82
86
|
end
|
83
87
|
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, cached: true) 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
|
data/lib/magicka/form.rb
CHANGED
@@ -2,45 +2,12 @@
|
|
2
2
|
|
3
3
|
module Magicka
|
4
4
|
# Class responsible for controlling one object form
|
5
|
-
class Form
|
6
|
-
|
7
|
-
|
8
|
-
def initialize(renderer, model)
|
9
|
-
@renderer = renderer
|
10
|
-
@model = model
|
11
|
-
end
|
12
|
-
|
13
|
-
def input(field, model: self.model, **args)
|
14
|
-
Input.render(renderer: renderer, field: field, model: model, **args)
|
15
|
-
end
|
16
|
-
|
17
|
-
def select(field, model: self.model, **args)
|
18
|
-
Select.render(renderer: renderer, field: field, model: model, **args)
|
19
|
-
end
|
5
|
+
class Form < Aggregator
|
6
|
+
with_element(Input)
|
7
|
+
with_element(Select)
|
20
8
|
|
21
9
|
def button(**args)
|
22
10
|
Button.render(renderer: renderer, **args)
|
23
11
|
end
|
24
|
-
|
25
|
-
def with_model(model)
|
26
|
-
new_model = [self.model, model].join('.')
|
27
|
-
|
28
|
-
yield Form.new(renderer, new_model)
|
29
|
-
end
|
30
|
-
|
31
|
-
def equal?(other)
|
32
|
-
return unless other.class == self.class
|
33
|
-
|
34
|
-
other.renderer == renderer &&
|
35
|
-
other.model == model
|
36
|
-
end
|
37
|
-
|
38
|
-
alias == equal?
|
39
|
-
|
40
|
-
protected
|
41
|
-
|
42
|
-
attr_reader :renderer
|
43
|
-
|
44
|
-
delegate :render, to: :renderer
|
45
12
|
end
|
46
13
|
end
|
data/lib/magicka/text.rb
ADDED
data/lib/magicka/version.rb
CHANGED
@@ -0,0 +1,209 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Magicka::Aggregator do
|
6
|
+
subject(:aggregator) { aggregator_class.new(renderer, model) }
|
7
|
+
|
8
|
+
let(:aggregator_class) { Class.new(described_class) }
|
9
|
+
let(:model) { :my_model }
|
10
|
+
let(:renderer) { instance_double('renderer') }
|
11
|
+
let(:template) { 'templates/forms/input' }
|
12
|
+
let(:locals) { {} }
|
13
|
+
|
14
|
+
describe '.with_element' do
|
15
|
+
context 'when seeting element class only' do
|
16
|
+
it do
|
17
|
+
expect { aggregator_class.with_element(Magicka::Input) }
|
18
|
+
.to add_method(:input)
|
19
|
+
.to(aggregator)
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'when built method is called' do
|
23
|
+
let(:template) { 'templates/forms/input' }
|
24
|
+
let(:field) { :field }
|
25
|
+
let(:label) { 'Label' }
|
26
|
+
let(:placeholder) { 'Value' }
|
27
|
+
|
28
|
+
let(:locals) do
|
29
|
+
{
|
30
|
+
field: field,
|
31
|
+
label: label,
|
32
|
+
ng_errors: 'my_model.errors.field',
|
33
|
+
ng_model: 'my_model.field',
|
34
|
+
placeholder: placeholder
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
let(:arguments) do
|
39
|
+
{
|
40
|
+
label: label,
|
41
|
+
placeholder: placeholder
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
before do
|
46
|
+
aggregator_class.with_element(Magicka::Input)
|
47
|
+
|
48
|
+
allow(renderer)
|
49
|
+
.to receive(:render)
|
50
|
+
.with(partial: template, locals: locals)
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'renders an input' do
|
54
|
+
aggregator.input(field, arguments)
|
55
|
+
|
56
|
+
expect(renderer).to have_received(:render)
|
57
|
+
end
|
58
|
+
|
59
|
+
context 'when passing a custom model' do
|
60
|
+
let(:locals) do
|
61
|
+
{
|
62
|
+
field: field,
|
63
|
+
label: label,
|
64
|
+
ng_errors: 'my_custom_model.errors.field',
|
65
|
+
ng_model: 'my_custom_model.field',
|
66
|
+
placeholder: placeholder
|
67
|
+
}
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'renders an input' do
|
71
|
+
aggregator.input(field, model: 'my_custom_model', **arguments)
|
72
|
+
|
73
|
+
expect(renderer).to have_received(:render)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
context 'when seeting element class and method' do
|
80
|
+
it do
|
81
|
+
expect { aggregator_class.with_element(Magicka::Input, :my_input) }
|
82
|
+
.to add_method(:my_input)
|
83
|
+
.to(aggregator)
|
84
|
+
end
|
85
|
+
|
86
|
+
context 'when built method is called' do
|
87
|
+
let(:template) { 'templates/forms/input' }
|
88
|
+
let(:field) { :field }
|
89
|
+
let(:label) { 'Label' }
|
90
|
+
let(:placeholder) { 'Value' }
|
91
|
+
|
92
|
+
let(:locals) do
|
93
|
+
{
|
94
|
+
field: field,
|
95
|
+
label: label,
|
96
|
+
ng_errors: 'my_model.errors.field',
|
97
|
+
ng_model: 'my_model.field',
|
98
|
+
placeholder: placeholder
|
99
|
+
}
|
100
|
+
end
|
101
|
+
|
102
|
+
let(:arguments) do
|
103
|
+
{
|
104
|
+
label: label,
|
105
|
+
placeholder: placeholder
|
106
|
+
}
|
107
|
+
end
|
108
|
+
|
109
|
+
before do
|
110
|
+
aggregator_class.with_element(Magicka::Input, :my_input)
|
111
|
+
|
112
|
+
allow(renderer)
|
113
|
+
.to receive(:render)
|
114
|
+
.with(partial: template, locals: locals)
|
115
|
+
end
|
116
|
+
|
117
|
+
it 'renders an input' do
|
118
|
+
aggregator.my_input(field, arguments)
|
119
|
+
|
120
|
+
expect(renderer).to have_received(:render)
|
121
|
+
end
|
122
|
+
|
123
|
+
context 'when passing a custom model' do
|
124
|
+
let(:locals) do
|
125
|
+
{
|
126
|
+
field: field,
|
127
|
+
label: label,
|
128
|
+
ng_errors: 'my_custom_model.errors.field',
|
129
|
+
ng_model: 'my_custom_model.field',
|
130
|
+
placeholder: placeholder
|
131
|
+
}
|
132
|
+
end
|
133
|
+
|
134
|
+
it 'renders an input' do
|
135
|
+
aggregator.my_input(field, model: 'my_custom_model', **arguments)
|
136
|
+
|
137
|
+
expect(renderer).to have_received(:render)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
context 'when seeting element class and template' do
|
144
|
+
it do
|
145
|
+
expect do
|
146
|
+
aggregator_class.with_element(Magicka::Input, template: template)
|
147
|
+
end
|
148
|
+
.to add_method(:input)
|
149
|
+
.to(aggregator)
|
150
|
+
end
|
151
|
+
|
152
|
+
context 'when built method is called' do
|
153
|
+
let(:template) { 'my_templates/my_input' }
|
154
|
+
let(:field) { :field }
|
155
|
+
let(:label) { 'Label' }
|
156
|
+
let(:placeholder) { 'Value' }
|
157
|
+
|
158
|
+
let(:locals) do
|
159
|
+
{
|
160
|
+
field: field,
|
161
|
+
label: label,
|
162
|
+
ng_errors: 'my_model.errors.field',
|
163
|
+
ng_model: 'my_model.field',
|
164
|
+
placeholder: placeholder
|
165
|
+
}
|
166
|
+
end
|
167
|
+
|
168
|
+
let(:arguments) do
|
169
|
+
{
|
170
|
+
label: label,
|
171
|
+
placeholder: placeholder
|
172
|
+
}
|
173
|
+
end
|
174
|
+
|
175
|
+
before do
|
176
|
+
aggregator_class.with_element(Magicka::Input, template: template)
|
177
|
+
|
178
|
+
allow(renderer)
|
179
|
+
.to receive(:render)
|
180
|
+
.with(partial: template, locals: locals)
|
181
|
+
end
|
182
|
+
|
183
|
+
it 'renders an input' do
|
184
|
+
aggregator.input(field, arguments)
|
185
|
+
|
186
|
+
expect(renderer).to have_received(:render)
|
187
|
+
end
|
188
|
+
|
189
|
+
context 'when passing a custom model' do
|
190
|
+
let(:locals) do
|
191
|
+
{
|
192
|
+
field: field,
|
193
|
+
label: label,
|
194
|
+
ng_errors: 'my_custom_model.errors.field',
|
195
|
+
ng_model: 'my_custom_model.field',
|
196
|
+
placeholder: placeholder
|
197
|
+
}
|
198
|
+
end
|
199
|
+
|
200
|
+
it 'renders an input' do
|
201
|
+
aggregator.input(field, model: 'my_custom_model', **arguments)
|
202
|
+
|
203
|
+
expect(renderer).to have_received(:render)
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
@@ -0,0 +1,169 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Magicka::Display 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/display/text' }
|
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/display/text' }
|
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
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
let(:arguments) do
|
35
|
+
{
|
36
|
+
label: label,
|
37
|
+
placeholder: placeholder
|
38
|
+
}
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'renders a text' do
|
42
|
+
form.input(field, arguments)
|
43
|
+
|
44
|
+
expect(renderer).to have_received(:render)
|
45
|
+
end
|
46
|
+
|
47
|
+
context 'when passing a custom model' do
|
48
|
+
let(:locals) do
|
49
|
+
{
|
50
|
+
field: field,
|
51
|
+
label: label,
|
52
|
+
ng_errors: 'my_custom_model.errors.field',
|
53
|
+
ng_model: 'my_custom_model.field'
|
54
|
+
}
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'renders a text' do
|
58
|
+
form.input(field, model: 'my_custom_model', **arguments)
|
59
|
+
|
60
|
+
expect(renderer).to have_received(:render)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe '#select' do
|
66
|
+
let(:template) { 'templates/display/text' }
|
67
|
+
let(:field) { :field }
|
68
|
+
let(:label) { 'Label' }
|
69
|
+
let(:options) { %i[option_a option_b] }
|
70
|
+
|
71
|
+
let(:locals) do
|
72
|
+
{
|
73
|
+
field: field,
|
74
|
+
label: label,
|
75
|
+
ng_errors: 'my_model.errors.field',
|
76
|
+
ng_model: 'my_model.field'
|
77
|
+
}
|
78
|
+
end
|
79
|
+
|
80
|
+
let(:arguments) do
|
81
|
+
{
|
82
|
+
label: label,
|
83
|
+
options: options
|
84
|
+
}
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'renders a text' do
|
88
|
+
form.select(field, arguments)
|
89
|
+
|
90
|
+
expect(renderer).to have_received(:render)
|
91
|
+
end
|
92
|
+
|
93
|
+
context 'when passing a custom model' do
|
94
|
+
let(:locals) do
|
95
|
+
{
|
96
|
+
field: field,
|
97
|
+
label: label,
|
98
|
+
ng_errors: 'my_custom_model.errors.field',
|
99
|
+
ng_model: 'my_custom_model.field'
|
100
|
+
}
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'renders a text' do
|
104
|
+
form.select(field, model: 'my_custom_model', **arguments)
|
105
|
+
|
106
|
+
expect(renderer).to have_received(:render)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
describe '#button' do
|
112
|
+
let(:ng_click) { 'controler.click()' }
|
113
|
+
let(:ng_disabled) { 'false' }
|
114
|
+
let(:classes) { 'custom class' }
|
115
|
+
let(:text) { 'Click' }
|
116
|
+
|
117
|
+
let(:arguments) do
|
118
|
+
{
|
119
|
+
ng_click: ng_click,
|
120
|
+
ng_disabled: ng_disabled,
|
121
|
+
classes: classes,
|
122
|
+
text: text
|
123
|
+
}
|
124
|
+
end
|
125
|
+
|
126
|
+
it 'renders nothing' do
|
127
|
+
form.button(arguments)
|
128
|
+
|
129
|
+
expect(renderer).not_to have_received(:render)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
describe '#with_model' do
|
134
|
+
let(:expected_form) { described_class.new(renderer, 'my_model.inner') }
|
135
|
+
|
136
|
+
it do
|
137
|
+
form.with_model(:inner) do |new_form|
|
138
|
+
expect(new_form).to eq(expected_form)
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
describe '#with_form' do
|
144
|
+
it do
|
145
|
+
form.with_model('sub') do |new_form|
|
146
|
+
expect(new_form)
|
147
|
+
.to eq(described_class.new(renderer, 'my_model.sub'))
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
context 'when passing a new base' do
|
152
|
+
it do
|
153
|
+
form.with_model('sub', base: :other_model) do |new_form|
|
154
|
+
expect(new_form)
|
155
|
+
.to eq(described_class.new(renderer, 'other_model.sub'))
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
context 'when passing an empty base' do
|
161
|
+
it do
|
162
|
+
form.with_model('sub', base: nil) do |new_form|
|
163
|
+
expect(new_form)
|
164
|
+
.to eq(described_class.new(renderer, 'sub'))
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
@@ -82,5 +82,46 @@ describe Magicka::Element do
|
|
82
82
|
expect(renderer).to have_received(:render)
|
83
83
|
end
|
84
84
|
end
|
85
|
+
|
86
|
+
context 'when class has a template but is initialized with template' do
|
87
|
+
subject(:element) do
|
88
|
+
klass.new(renderer: renderer, template: custom_template)
|
89
|
+
end
|
90
|
+
|
91
|
+
let(:custom_template) { 'custom_folder/custom_template' }
|
92
|
+
let(:expected_template) { custom_template }
|
93
|
+
|
94
|
+
before do
|
95
|
+
klass.template(template)
|
96
|
+
end
|
97
|
+
|
98
|
+
it do
|
99
|
+
element.render
|
100
|
+
|
101
|
+
expect(renderer).to have_received(:render)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
context 'when class has folder but is initialized with template' do
|
106
|
+
subject(:element) do
|
107
|
+
klass.new(renderer: renderer, template: custom_template)
|
108
|
+
end
|
109
|
+
|
110
|
+
let(:custom_template) { 'custom_folder/custom_template' }
|
111
|
+
let(:expected_template) { custom_template }
|
112
|
+
|
113
|
+
before do
|
114
|
+
klass.template_folder(folder)
|
115
|
+
|
116
|
+
method_builder.add_class_method(:name) { 'Magicka::MyElement' }
|
117
|
+
method_builder.build
|
118
|
+
end
|
119
|
+
|
120
|
+
it do
|
121
|
+
element.render
|
122
|
+
|
123
|
+
expect(renderer).to have_received(:render)
|
124
|
+
end
|
125
|
+
end
|
85
126
|
end
|
86
127
|
end
|
@@ -35,8 +35,7 @@ describe Magicka::Form do
|
|
35
35
|
let(:arguments) do
|
36
36
|
{
|
37
37
|
label: label,
|
38
|
-
placeholder: placeholder
|
39
|
-
model: model
|
38
|
+
placeholder: placeholder
|
40
39
|
}
|
41
40
|
end
|
42
41
|
|
@@ -45,6 +44,24 @@ describe Magicka::Form do
|
|
45
44
|
|
46
45
|
expect(renderer).to have_received(:render)
|
47
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
|
48
65
|
end
|
49
66
|
|
50
67
|
describe '#select' do
|
@@ -66,16 +83,33 @@ describe Magicka::Form do
|
|
66
83
|
let(:arguments) do
|
67
84
|
{
|
68
85
|
label: label,
|
69
|
-
model: model,
|
70
86
|
options: options
|
71
87
|
}
|
72
88
|
end
|
73
89
|
|
74
|
-
it 'renders
|
90
|
+
it 'renders a select' do
|
75
91
|
form.select(field, arguments)
|
76
92
|
|
77
93
|
expect(renderer).to have_received(:render)
|
78
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
|
79
113
|
end
|
80
114
|
|
81
115
|
describe '#button' do
|
@@ -119,4 +153,31 @@ describe Magicka::Form do
|
|
119
153
|
end
|
120
154
|
end
|
121
155
|
end
|
156
|
+
|
157
|
+
describe '#with_form' do
|
158
|
+
it do
|
159
|
+
form.with_model('sub') do |new_form|
|
160
|
+
expect(new_form)
|
161
|
+
.to eq(described_class.new(renderer, 'my_model.sub'))
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
context 'when passing a new base' do
|
166
|
+
it do
|
167
|
+
form.with_model('sub', base: :other_model) do |new_form|
|
168
|
+
expect(new_form)
|
169
|
+
.to eq(described_class.new(renderer, 'other_model.sub'))
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
context 'when passing an empty base' do
|
175
|
+
it do
|
176
|
+
form.with_model('sub', base: nil) do |new_form|
|
177
|
+
expect(new_form)
|
178
|
+
.to eq(described_class.new(renderer, 'sub'))
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
122
183
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Magicka::Text do
|
6
|
+
let(:renderer) { instance_double('renderer') }
|
7
|
+
let(:template) { 'templates/display/text' }
|
8
|
+
|
9
|
+
let(:model) { :my_model }
|
10
|
+
let(:field) { :field }
|
11
|
+
let(:label) { 'Label' }
|
12
|
+
|
13
|
+
let(:locals) do
|
14
|
+
{
|
15
|
+
field: field,
|
16
|
+
label: label,
|
17
|
+
ng_model: 'my_model.field',
|
18
|
+
ng_errors: 'my_model.errors.field'
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '.render' do
|
23
|
+
let(:arguments) do
|
24
|
+
{
|
25
|
+
renderer: renderer,
|
26
|
+
field: field,
|
27
|
+
label: label,
|
28
|
+
model: model
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
before do
|
33
|
+
allow(renderer)
|
34
|
+
.to receive(:render)
|
35
|
+
.with(partial: template, locals: locals)
|
36
|
+
end
|
37
|
+
|
38
|
+
it do
|
39
|
+
described_class.render(arguments)
|
40
|
+
|
41
|
+
expect(renderer).to have_received(:render)
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'when called with extra params' do
|
45
|
+
it do
|
46
|
+
described_class.render(name: 'Name', **arguments)
|
47
|
+
|
48
|
+
expect(renderer).to have_received(:render)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
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.4
|
4
|
+
version: 0.5.4
|
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-
|
11
|
+
date: 2020-06-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -397,14 +397,19 @@ 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
|
400
402
|
- lib/magicka/button.rb
|
403
|
+
- lib/magicka/display.rb
|
401
404
|
- lib/magicka/element.rb
|
402
405
|
- lib/magicka/element/class_methods.rb
|
406
|
+
- lib/magicka/element/method_builder.rb
|
403
407
|
- lib/magicka/form.rb
|
404
408
|
- lib/magicka/form_element.rb
|
409
|
+
- lib/magicka/helper.rb
|
405
410
|
- lib/magicka/input.rb
|
406
|
-
- lib/magicka/method_builder.rb
|
407
411
|
- lib/magicka/select.rb
|
412
|
+
- lib/magicka/text.rb
|
408
413
|
- lib/magicka/version.rb
|
409
414
|
- magicka.gemspec
|
410
415
|
- magicka.jpg
|
@@ -469,14 +474,17 @@ files:
|
|
469
474
|
- spec/dummy/storage/.keep
|
470
475
|
- spec/integration/readme/.keep
|
471
476
|
- spec/integration/yard/.keep
|
477
|
+
- spec/lib/magicka/aggregator_spec.rb
|
472
478
|
- spec/lib/magicka/button_spec.rb
|
479
|
+
- spec/lib/magicka/display_spec.rb
|
473
480
|
- spec/lib/magicka/element/class_methods_spec.rb
|
481
|
+
- spec/lib/magicka/element/method_builder_spec.rb
|
474
482
|
- spec/lib/magicka/element_spec.rb
|
475
483
|
- spec/lib/magicka/form_element_spec.rb
|
476
484
|
- spec/lib/magicka/form_spec.rb
|
477
485
|
- spec/lib/magicka/input_spec.rb
|
478
|
-
- spec/lib/magicka/method_builder_spec.rb
|
479
486
|
- spec/lib/magicka/select_spec.rb
|
487
|
+
- spec/lib/magicka/text_spec.rb
|
480
488
|
- spec/spec_helper.rb
|
481
489
|
- spec/support/models/.keep
|
482
490
|
- 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
|