magicka 0.0.1 → 0.3.1
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/Dockerfile +1 -1
- data/README.md +2 -2
- data/config/check_specs.yml +1 -0
- data/config/yardstick.yml +3 -2
- data/lib/magicka.rb +15 -2
- data/lib/magicka/button.rb +9 -0
- data/lib/magicka/element.rb +83 -0
- data/lib/magicka/element/class_methods.rb +70 -0
- data/lib/magicka/form_element.rb +49 -0
- data/lib/magicka/input.rb +8 -0
- data/lib/magicka/method_builder.rb +38 -0
- data/lib/magicka/select.rb +8 -0
- data/lib/magicka/version.rb +2 -2
- data/magicka.gemspec +5 -5
- data/spec/lib/magicka/button_spec.rb +54 -0
- data/spec/lib/magicka/element/class_methods_spec.rb +173 -0
- data/spec/lib/magicka/element_spec.rb +86 -0
- data/spec/lib/magicka/form_element_spec.rb +87 -0
- data/spec/lib/magicka/input_spec.rb +55 -0
- data/spec/lib/magicka/method_builder_spec.rb +46 -0
- data/spec/lib/magicka/select_spec.rb +55 -0
- data/spec/spec_helper.rb +3 -3
- metadata +26 -13
- data/spec/lib/magicka_spec.rb +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7939778de2faac419e42a17986de873d7cbefa0b65531dcc968f697411e0ee7a
|
4
|
+
data.tar.gz: 831909938f84d296ba8706893b13c5ef7bf9f5b16e2d57cb10986e83151a2ed3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 74b61fb09691f38d280b08adde917d838866b918f23d4b9a530bf0f43cd22d8c963980bd5e02de23b89e601bbb708fd374da6e5285e7507d33e1b319fe9937a7
|
7
|
+
data.tar.gz: 8a263ca1eb2a0fc180e4fdc9eff054aede6452e19819d788b1e6c3f203875104ea177c1f2b8d38b14d5909d506528fb2a621fcdb4aafe9ab7ff49513bac3509e
|
data/Dockerfile
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
Magicka
|
2
2
|
====
|
3
3
|
[](https://codeclimate.com/github/darthjee/magicka)
|
4
4
|
[](https://codeclimate.com/github/darthjee/magicka/coverage)
|
@@ -11,7 +11,7 @@ Jace
|
|
11
11
|
|
12
12
|
Yard Documentation
|
13
13
|
-------------------
|
14
|
-
[https://www.rubydoc.info/gems/magicka/0.
|
14
|
+
[https://www.rubydoc.info/gems/magicka/0.3.1](https://www.rubydoc.info/gems/magicka/0.3.1)
|
15
15
|
|
16
16
|
Installation
|
17
17
|
---------------
|
data/config/check_specs.yml
CHANGED
data/config/yardstick.yml
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
threshold:
|
1
|
+
threshold: 92.2
|
2
2
|
require_exact_threshold: false
|
3
3
|
rules:
|
4
4
|
ApiTag::Presence:
|
@@ -21,7 +21,8 @@ rules:
|
|
21
21
|
exclude: []
|
22
22
|
Summary::Presence:
|
23
23
|
enabled: true
|
24
|
-
exclude:
|
24
|
+
exclude:
|
25
|
+
- Magicka::Element#initialize
|
25
26
|
Summary::Length:
|
26
27
|
enabled: true
|
27
28
|
exclude: []
|
data/lib/magicka.rb
CHANGED
@@ -2,6 +2,19 @@
|
|
2
2
|
|
3
3
|
# @api public
|
4
4
|
# @author darthjee
|
5
|
-
|
6
|
-
|
5
|
+
|
6
|
+
require 'sinclair'
|
7
|
+
|
8
|
+
# @api public
|
9
|
+
# @author Darthjee
|
10
|
+
#
|
11
|
+
# module holding herlper to render inputs
|
12
|
+
module Magicka
|
13
|
+
autoload :VERSION, 'magicka/version'
|
14
|
+
autoload :Button, 'magicka/button'
|
15
|
+
autoload :Element, 'magicka/element'
|
16
|
+
autoload :FormElement, 'magicka/form_element'
|
17
|
+
autoload :Input, 'magicka/input'
|
18
|
+
autoload :MethodBuilder, 'magicka/method_builder'
|
19
|
+
autoload :Select, 'magicka/select'
|
7
20
|
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Magicka
|
4
|
+
# @api public
|
5
|
+
#
|
6
|
+
# Base class for element rendering
|
7
|
+
class Element < Sinclair::Options
|
8
|
+
autoload :ClassMethods, 'magicka/element/class_methods'
|
9
|
+
|
10
|
+
skip_validation
|
11
|
+
|
12
|
+
class << self
|
13
|
+
# @api public
|
14
|
+
# @!visibility public
|
15
|
+
#
|
16
|
+
# Add available options
|
17
|
+
#
|
18
|
+
# @return [Array<Sinclair::MethodDefinition>]
|
19
|
+
alias with_attributes with_options
|
20
|
+
|
21
|
+
include ClassMethods
|
22
|
+
end
|
23
|
+
|
24
|
+
# @method with_attributes
|
25
|
+
# @api public
|
26
|
+
# @!visibility public
|
27
|
+
#
|
28
|
+
# Adds attribute
|
29
|
+
#
|
30
|
+
# This will affect initialization and add readers
|
31
|
+
#
|
32
|
+
# @return [Array]
|
33
|
+
|
34
|
+
# Render element HTML
|
35
|
+
def render
|
36
|
+
renderer.render partial: template, locals: locals
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
attr_reader :renderer
|
42
|
+
# @api private
|
43
|
+
# @private
|
44
|
+
# @method renderer
|
45
|
+
#
|
46
|
+
# Object responsible for rendering the HTML
|
47
|
+
|
48
|
+
# @api private
|
49
|
+
# @private
|
50
|
+
#
|
51
|
+
# @param (see .render)
|
52
|
+
def initialize(renderer:, **args)
|
53
|
+
@renderer = renderer
|
54
|
+
super(**args)
|
55
|
+
end
|
56
|
+
|
57
|
+
# @api private
|
58
|
+
# @private
|
59
|
+
#
|
60
|
+
# Returns hash of local variables
|
61
|
+
#
|
62
|
+
# Local variablees will be available when rendering
|
63
|
+
# the template
|
64
|
+
#
|
65
|
+
# @return [Hash]
|
66
|
+
def locals
|
67
|
+
self.class.locals.inject({}) do |hash, attribute|
|
68
|
+
hash.merge!(attribute => send(attribute))
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
# @api public
|
73
|
+
# @private
|
74
|
+
#
|
75
|
+
# Returns template file location
|
76
|
+
#
|
77
|
+
# @return [String]
|
78
|
+
def template
|
79
|
+
self.class.name.underscore
|
80
|
+
.gsub(%r{^.*/}, "#{template_folder}/")
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Magicka
|
4
|
+
class Element < Sinclair::Options
|
5
|
+
# @api public
|
6
|
+
#
|
7
|
+
# Class methods used for metaprograming of elements
|
8
|
+
module ClassMethods
|
9
|
+
# render template using the given prameters
|
10
|
+
#
|
11
|
+
# @param renderer [Object] object responsible for rendering
|
12
|
+
# the HTML
|
13
|
+
# @param args [Hash] Extra options
|
14
|
+
def render(renderer:, **args)
|
15
|
+
new(renderer: renderer, **args).render
|
16
|
+
end
|
17
|
+
|
18
|
+
# list of attributes to be used when rendering
|
19
|
+
#
|
20
|
+
# @return [Set<Symbol>]
|
21
|
+
def locals
|
22
|
+
@locals ||= superclass.try(:locals)&.dup || Set.new([])
|
23
|
+
end
|
24
|
+
|
25
|
+
# Sets template for element type
|
26
|
+
#
|
27
|
+
# @return [Array<Sinclair::MethodDefinition>]
|
28
|
+
def template(template)
|
29
|
+
MethodBuilder
|
30
|
+
.new(self)
|
31
|
+
.add_template(template)
|
32
|
+
end
|
33
|
+
|
34
|
+
# Sets template folder for element type
|
35
|
+
#
|
36
|
+
# @return [Array<Sinclair::MethodDefinition>]
|
37
|
+
def template_folder(folder)
|
38
|
+
MethodBuilder
|
39
|
+
.new(self)
|
40
|
+
.add_template_folder(folder)
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
# @api public
|
46
|
+
# @!visibility public
|
47
|
+
#
|
48
|
+
# Add an attribute to locals when rendereing
|
49
|
+
#
|
50
|
+
# the attribute will be a call to the a method
|
51
|
+
# with same name
|
52
|
+
#
|
53
|
+
# @return [Set<Symbol>]
|
54
|
+
def with_locals(*args)
|
55
|
+
locals.merge(args)
|
56
|
+
end
|
57
|
+
|
58
|
+
# @api public
|
59
|
+
# @!visibility public
|
60
|
+
#
|
61
|
+
# Adds attribute and locals
|
62
|
+
#
|
63
|
+
# @return [Array]
|
64
|
+
def with_attribute_locals(*args)
|
65
|
+
with_locals(*args)
|
66
|
+
with_attributes(*args)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Magicka
|
4
|
+
# @api public
|
5
|
+
#
|
6
|
+
# Basic class for elements for forms
|
7
|
+
class FormElement < Element
|
8
|
+
with_attribute_locals :field, :label
|
9
|
+
with_attributes :model
|
10
|
+
with_locals :ng_errors, :ng_model
|
11
|
+
|
12
|
+
template_folder 'templates/forms'
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
# @api private
|
17
|
+
# @private
|
18
|
+
#
|
19
|
+
# Label to be shon near the input
|
20
|
+
#
|
21
|
+
# when no label is provided, the name of
|
22
|
+
# the field is used
|
23
|
+
#
|
24
|
+
# @return [String]
|
25
|
+
def label
|
26
|
+
@label ||= field.to_s.capitalize.gsub(/_/, ' ')
|
27
|
+
end
|
28
|
+
|
29
|
+
# @api private
|
30
|
+
# @private
|
31
|
+
#
|
32
|
+
# ng model to be represented with the input
|
33
|
+
#
|
34
|
+
# @return [String]
|
35
|
+
def ng_model
|
36
|
+
[model, field].join('.')
|
37
|
+
end
|
38
|
+
|
39
|
+
# @api private
|
40
|
+
# @private
|
41
|
+
#
|
42
|
+
# ng errors to be exposed with the input
|
43
|
+
#
|
44
|
+
# @return [String]
|
45
|
+
def ng_errors
|
46
|
+
[model, :errors, field].join('.')
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,38 @@
|
|
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
|
data/lib/magicka/version.rb
CHANGED
data/magicka.gemspec
CHANGED
@@ -19,17 +19,17 @@ Gem::Specification.new do |gem|
|
|
19
19
|
gem.test_files = gem.files.grep(%r{^(test|gem|features)/})
|
20
20
|
gem.require_paths = ['lib']
|
21
21
|
|
22
|
-
gem.add_runtime_dependency 'activesupport', '~> 5.2.4.
|
23
|
-
gem.add_runtime_dependency 'sinclair', '>= 1.6.
|
22
|
+
gem.add_runtime_dependency 'activesupport', '~> 5.2.4.3'
|
23
|
+
gem.add_runtime_dependency 'sinclair', '>= 1.6.7'
|
24
24
|
|
25
|
-
gem.add_development_dependency 'actionpack', '5.2.4.
|
26
|
-
gem.add_development_dependency 'activerecord', '5.2.4.
|
25
|
+
gem.add_development_dependency 'actionpack', '5.2.4.3'
|
26
|
+
gem.add_development_dependency 'activerecord', '5.2.4.3'
|
27
27
|
gem.add_development_dependency 'bundler', '1.16.1'
|
28
28
|
gem.add_development_dependency 'factory_bot', '5.2.0'
|
29
29
|
gem.add_development_dependency 'nokogiri', '1.10.9'
|
30
30
|
gem.add_development_dependency 'pry', '0.12.2'
|
31
31
|
gem.add_development_dependency 'pry-nav', '0.3.0'
|
32
|
-
gem.add_development_dependency 'rails', '5.2.4.
|
32
|
+
gem.add_development_dependency 'rails', '5.2.4.3'
|
33
33
|
gem.add_development_dependency 'rails-controller-testing', '1.0.4'
|
34
34
|
gem.add_development_dependency 'rake', '13.0.1'
|
35
35
|
gem.add_development_dependency 'reek', '5.6.0'
|
@@ -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
|
@@ -0,0 +1,173 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Magicka::Element::ClassMethods do
|
6
|
+
subject(:element) { klass.new(renderer: renderer) }
|
7
|
+
|
8
|
+
let(:klass) do
|
9
|
+
Class.new(Magicka::Element)
|
10
|
+
end
|
11
|
+
|
12
|
+
let(:renderer) { instance_double('renderer') }
|
13
|
+
let(:template) { 'templates/forms/element' }
|
14
|
+
let(:locals) { {} }
|
15
|
+
|
16
|
+
describe '.with_attributes' do
|
17
|
+
it do
|
18
|
+
expect { klass.send(:with_attributes, :field) }
|
19
|
+
.to add_method(:field)
|
20
|
+
.to(klass)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '.template' do
|
25
|
+
it do
|
26
|
+
expect { klass.template(template) }
|
27
|
+
.to add_method(:template)
|
28
|
+
.to(klass)
|
29
|
+
end
|
30
|
+
|
31
|
+
context 'when method is build as requested' do
|
32
|
+
before { klass.template(template) }
|
33
|
+
|
34
|
+
it 'returns the defined template when method is called' do
|
35
|
+
expect(element.template).to eq(template)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe '.template_folder' do
|
41
|
+
let(:folder) { 'templates/forms' }
|
42
|
+
|
43
|
+
it do
|
44
|
+
expect { klass.template_folder(folder) }
|
45
|
+
.to add_method(:template_folder)
|
46
|
+
.to(klass)
|
47
|
+
end
|
48
|
+
|
49
|
+
context 'when method is build as requested' do
|
50
|
+
before { klass.template_folder(folder) }
|
51
|
+
|
52
|
+
it 'returns the defined template when method is called' do
|
53
|
+
expect(element.template_folder).to eq(folder)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe '.render' do
|
59
|
+
before do
|
60
|
+
klass.template(template)
|
61
|
+
|
62
|
+
allow(renderer)
|
63
|
+
.to receive(:render)
|
64
|
+
.with(partial: template, locals: locals)
|
65
|
+
end
|
66
|
+
|
67
|
+
it do
|
68
|
+
klass.render(renderer: renderer)
|
69
|
+
|
70
|
+
expect(renderer).to have_received(:render)
|
71
|
+
end
|
72
|
+
|
73
|
+
context 'when called with extra params' do
|
74
|
+
it do
|
75
|
+
klass.render(renderer: renderer, name: 'Name')
|
76
|
+
|
77
|
+
expect(renderer).to have_received(:render)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
describe '.locals' do
|
83
|
+
it { expect(Magicka::Element.locals).to eq(Set.new([])) }
|
84
|
+
|
85
|
+
context 'when calling on a subclass' do
|
86
|
+
it { expect(klass.locals).to eq(Set.new([])) }
|
87
|
+
end
|
88
|
+
|
89
|
+
context 'when called on subclass' do
|
90
|
+
let(:subclass) { Class.new(klass) }
|
91
|
+
|
92
|
+
before { klass.send(:with_locals, :field, :model) }
|
93
|
+
|
94
|
+
it { expect(subclass.locals).to eq(Set.new(%i[field model])) }
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
describe 'with_locals' do
|
99
|
+
it do
|
100
|
+
expect { klass.send(:with_locals, :field, :model) }
|
101
|
+
.to change(klass, :locals)
|
102
|
+
.from([])
|
103
|
+
.to(%i[field model])
|
104
|
+
end
|
105
|
+
|
106
|
+
it do
|
107
|
+
expect { klass.send(:with_locals, :field, :model) }
|
108
|
+
.not_to change(Magicka::Element, :locals)
|
109
|
+
end
|
110
|
+
|
111
|
+
it do
|
112
|
+
expect { klass.send(:with_locals, :field) }
|
113
|
+
.not_to add_method(:field)
|
114
|
+
.to(klass)
|
115
|
+
end
|
116
|
+
|
117
|
+
context 'when called on subclass' do
|
118
|
+
let(:subclass) { Class.new(klass) }
|
119
|
+
|
120
|
+
before { klass.send(:with_locals, :field, :model) }
|
121
|
+
|
122
|
+
it do
|
123
|
+
expect { subclass.send(:with_locals, :error) }
|
124
|
+
.to change(subclass, :locals)
|
125
|
+
.from(%i[field model])
|
126
|
+
.to(%i[field model error])
|
127
|
+
end
|
128
|
+
|
129
|
+
it do
|
130
|
+
expect { subclass.send(:with_locals, :error) }
|
131
|
+
.not_to change(klass, :locals)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
describe 'with_attribute_locals' do
|
137
|
+
it do
|
138
|
+
expect { klass.send(:with_attribute_locals, :field, :model) }
|
139
|
+
.to change(klass, :locals)
|
140
|
+
.from([])
|
141
|
+
.to(%i[field model])
|
142
|
+
end
|
143
|
+
|
144
|
+
it do
|
145
|
+
expect { klass.send(:with_attribute_locals, :field, :model) }
|
146
|
+
.not_to change(Magicka::Element, :locals)
|
147
|
+
end
|
148
|
+
|
149
|
+
it do
|
150
|
+
expect { klass.send(:with_attribute_locals, :field) }
|
151
|
+
.to add_method(:field)
|
152
|
+
.to(klass)
|
153
|
+
end
|
154
|
+
|
155
|
+
context 'when called on subclass' do
|
156
|
+
let(:subclass) { Class.new(klass) }
|
157
|
+
|
158
|
+
before { klass.send(:with_attribute_locals, :field, :model) }
|
159
|
+
|
160
|
+
it do
|
161
|
+
expect { subclass.send(:with_attribute_locals, :error) }
|
162
|
+
.to change(subclass, :locals)
|
163
|
+
.from(%i[field model])
|
164
|
+
.to(%i[field model error])
|
165
|
+
end
|
166
|
+
|
167
|
+
it do
|
168
|
+
expect { subclass.send(:with_attribute_locals, :error) }
|
169
|
+
.not_to change(klass, :locals)
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Magicka::Element do
|
6
|
+
subject(:element) { klass.new(renderer: renderer) }
|
7
|
+
|
8
|
+
let(:klass) do
|
9
|
+
Class.new(described_class)
|
10
|
+
end
|
11
|
+
|
12
|
+
let(:renderer) { instance_double('renderer') }
|
13
|
+
let(:template) { 'templates/forms/element' }
|
14
|
+
let(:folder) { 'templates/forms' }
|
15
|
+
let(:locals) { {} }
|
16
|
+
|
17
|
+
let(:method_builder) { Sinclair.new(klass) }
|
18
|
+
let(:expected_template) { template }
|
19
|
+
|
20
|
+
describe '#render' do
|
21
|
+
before do
|
22
|
+
allow(renderer)
|
23
|
+
.to receive(:render)
|
24
|
+
.with(partial: expected_template, locals: locals)
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'when class has a defined template' do
|
28
|
+
before do
|
29
|
+
klass.template(template)
|
30
|
+
end
|
31
|
+
|
32
|
+
it do
|
33
|
+
element.render
|
34
|
+
|
35
|
+
expect(renderer).to have_received(:render)
|
36
|
+
end
|
37
|
+
|
38
|
+
context 'when initialized with extra params' do
|
39
|
+
subject(:element) do
|
40
|
+
klass.new(renderer: renderer, name: 'Name')
|
41
|
+
end
|
42
|
+
|
43
|
+
it do
|
44
|
+
element.render
|
45
|
+
|
46
|
+
expect(renderer).to have_received(:render)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context 'when class have locals defined' do
|
51
|
+
subject(:element) do
|
52
|
+
klass.new(renderer: renderer, name: 'Name')
|
53
|
+
end
|
54
|
+
|
55
|
+
let(:locals) { { name: 'Name' } }
|
56
|
+
|
57
|
+
before do
|
58
|
+
klass.send(:with_attribute_locals, :name)
|
59
|
+
end
|
60
|
+
|
61
|
+
it do
|
62
|
+
element.render
|
63
|
+
|
64
|
+
expect(renderer).to have_received(:render)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
context 'when class has only folder defined' do
|
70
|
+
let(:expected_template) { 'templates/forms/my_element' }
|
71
|
+
|
72
|
+
before do
|
73
|
+
klass.template_folder(folder)
|
74
|
+
|
75
|
+
method_builder.add_class_method(:name) { 'Magicka::MyElement' }
|
76
|
+
method_builder.build
|
77
|
+
end
|
78
|
+
|
79
|
+
it do
|
80
|
+
element.render
|
81
|
+
|
82
|
+
expect(renderer).to have_received(:render)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -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,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Magicka::Input do
|
6
|
+
let(:renderer) { instance_double('renderer') }
|
7
|
+
let(:template) { 'templates/forms/input' }
|
8
|
+
|
9
|
+
let(:model) { :my_model }
|
10
|
+
let(:field) { :field }
|
11
|
+
let(:label) { 'Label' }
|
12
|
+
let(:placeholder) { 'Value' }
|
13
|
+
|
14
|
+
let(:locals) do
|
15
|
+
{
|
16
|
+
field: field,
|
17
|
+
label: label,
|
18
|
+
ng_errors: 'my_model.errors.field',
|
19
|
+
ng_model: 'my_model.field',
|
20
|
+
placeholder: placeholder
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '.render' do
|
25
|
+
let(:arguments) do
|
26
|
+
{
|
27
|
+
renderer: renderer,
|
28
|
+
field: field,
|
29
|
+
label: label,
|
30
|
+
placeholder: placeholder,
|
31
|
+
model: model
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
before do
|
36
|
+
allow(renderer)
|
37
|
+
.to receive(:render)
|
38
|
+
.with(partial: template, locals: locals)
|
39
|
+
end
|
40
|
+
|
41
|
+
it do
|
42
|
+
described_class.render(arguments)
|
43
|
+
|
44
|
+
expect(renderer).to have_received(:render)
|
45
|
+
end
|
46
|
+
|
47
|
+
context 'when called with extra params' do
|
48
|
+
it do
|
49
|
+
described_class.render(name: 'Name', **arguments)
|
50
|
+
|
51
|
+
expect(renderer).to have_received(:render)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Magicka::MethodBuilder do
|
6
|
+
subject(:builder) { described_class.new(klass) }
|
7
|
+
|
8
|
+
let(:klass) { Class.new }
|
9
|
+
let(:instance) { klass.new }
|
10
|
+
|
11
|
+
describe '#add_template' do
|
12
|
+
let(:template) { 'path_to_template' }
|
13
|
+
|
14
|
+
it do
|
15
|
+
expect { builder.add_template(template) }
|
16
|
+
.to add_method(:template)
|
17
|
+
.to(klass)
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'when method is build as requested' do
|
21
|
+
before { builder.add_template(template) }
|
22
|
+
|
23
|
+
it 'returns the defined template when method is called' do
|
24
|
+
expect(instance.template).to eq(template)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe '#add_template_folder' do
|
30
|
+
let(:folder) { 'path_to_template_folder' }
|
31
|
+
|
32
|
+
it do
|
33
|
+
expect { builder.add_template_folder(folder) }
|
34
|
+
.to add_method(:template_folder)
|
35
|
+
.to(klass)
|
36
|
+
end
|
37
|
+
|
38
|
+
context 'when method is build as requested' do
|
39
|
+
before { builder.add_template_folder(folder) }
|
40
|
+
|
41
|
+
it 'returns the defined template folder when method is called' do
|
42
|
+
expect(instance.template_folder).to eq(folder)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Magicka::Select do
|
6
|
+
let(:renderer) { instance_double('renderer') }
|
7
|
+
let(:template) { 'templates/forms/select' }
|
8
|
+
|
9
|
+
let(:model) { :my_model }
|
10
|
+
let(:field) { :field }
|
11
|
+
let(:label) { 'Label' }
|
12
|
+
let(:options) { %i[option_a option_b] }
|
13
|
+
|
14
|
+
let(:locals) do
|
15
|
+
{
|
16
|
+
field: field,
|
17
|
+
label: label,
|
18
|
+
ng_errors: 'my_model.errors.field',
|
19
|
+
ng_model: 'my_model.field',
|
20
|
+
options: options
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '.render' do
|
25
|
+
let(:arguments) do
|
26
|
+
{
|
27
|
+
renderer: renderer,
|
28
|
+
field: field,
|
29
|
+
label: label,
|
30
|
+
model: model,
|
31
|
+
options: options
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
before do
|
36
|
+
allow(renderer)
|
37
|
+
.to receive(:render)
|
38
|
+
.with(partial: template, locals: locals)
|
39
|
+
end
|
40
|
+
|
41
|
+
it do
|
42
|
+
described_class.render(arguments)
|
43
|
+
|
44
|
+
expect(renderer).to have_received(:render)
|
45
|
+
end
|
46
|
+
|
47
|
+
context 'when called with extra params' do
|
48
|
+
it do
|
49
|
+
described_class.render(name: 'Name', **arguments)
|
50
|
+
|
51
|
+
expect(renderer).to have_received(:render)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -2,12 +2,10 @@
|
|
2
2
|
|
3
3
|
require 'simplecov'
|
4
4
|
|
5
|
-
SimpleCov.
|
5
|
+
SimpleCov.start do
|
6
6
|
add_filter '/spec/'
|
7
7
|
end
|
8
8
|
|
9
|
-
SimpleCov.start 'gem'
|
10
|
-
|
11
9
|
require 'magicka'
|
12
10
|
require 'pry-nav'
|
13
11
|
|
@@ -20,6 +18,7 @@ require File.expand_path('spec/dummy/config/environment')
|
|
20
18
|
require File.expand_path('spec/dummy/db/schema.rb')
|
21
19
|
require 'rspec/rails'
|
22
20
|
require 'active_support/railtie'
|
21
|
+
require 'sinclair/matchers'
|
23
22
|
|
24
23
|
support_files = File.expand_path('spec/support/**/*.rb')
|
25
24
|
Dir[support_files].sort.each { |file| require file }
|
@@ -34,4 +33,5 @@ RSpec.configure do |config|
|
|
34
33
|
config.filter_run_excluding :integration unless ENV['ALL']
|
35
34
|
|
36
35
|
config.order = 'random'
|
36
|
+
config.include Sinclair::Matchers
|
37
37
|
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
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- DarthJee
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-06-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -16,56 +16,56 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 5.2.4.
|
19
|
+
version: 5.2.4.3
|
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: 5.2.4.
|
26
|
+
version: 5.2.4.3
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: sinclair
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 1.6.
|
33
|
+
version: 1.6.7
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 1.6.
|
40
|
+
version: 1.6.7
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: actionpack
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - '='
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 5.2.4.
|
47
|
+
version: 5.2.4.3
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - '='
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 5.2.4.
|
54
|
+
version: 5.2.4.3
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: activerecord
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - '='
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 5.2.4.
|
61
|
+
version: 5.2.4.3
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - '='
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 5.2.4.
|
68
|
+
version: 5.2.4.3
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: bundler
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -142,14 +142,14 @@ dependencies:
|
|
142
142
|
requirements:
|
143
143
|
- - '='
|
144
144
|
- !ruby/object:Gem::Version
|
145
|
-
version: 5.2.4.
|
145
|
+
version: 5.2.4.3
|
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: 5.2.4.
|
152
|
+
version: 5.2.4.3
|
153
153
|
- !ruby/object:Gem::Dependency
|
154
154
|
name: rails-controller-testing
|
155
155
|
requirement: !ruby/object:Gem::Requirement
|
@@ -397,6 +397,13 @@ files:
|
|
397
397
|
- config/yardstick.yml
|
398
398
|
- docker-compose.yml
|
399
399
|
- lib/magicka.rb
|
400
|
+
- lib/magicka/button.rb
|
401
|
+
- lib/magicka/element.rb
|
402
|
+
- lib/magicka/element/class_methods.rb
|
403
|
+
- lib/magicka/form_element.rb
|
404
|
+
- lib/magicka/input.rb
|
405
|
+
- lib/magicka/method_builder.rb
|
406
|
+
- lib/magicka/select.rb
|
400
407
|
- lib/magicka/version.rb
|
401
408
|
- magicka.gemspec
|
402
409
|
- magicka.jpg
|
@@ -461,7 +468,13 @@ files:
|
|
461
468
|
- spec/dummy/storage/.keep
|
462
469
|
- spec/integration/readme/.keep
|
463
470
|
- spec/integration/yard/.keep
|
464
|
-
- spec/lib/
|
471
|
+
- spec/lib/magicka/button_spec.rb
|
472
|
+
- spec/lib/magicka/element/class_methods_spec.rb
|
473
|
+
- spec/lib/magicka/element_spec.rb
|
474
|
+
- spec/lib/magicka/form_element_spec.rb
|
475
|
+
- spec/lib/magicka/input_spec.rb
|
476
|
+
- spec/lib/magicka/method_builder_spec.rb
|
477
|
+
- spec/lib/magicka/select_spec.rb
|
465
478
|
- spec/spec_helper.rb
|
466
479
|
- spec/support/models/.keep
|
467
480
|
- spec/support/shared_examples/.keep
|