admin_it 1.0.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 +7 -0
- data/.gitignore +18 -0
- data/.rspec +2 -0
- data/.rubocop.yml +5 -0
- data/.yardopts +3 -0
- data/Gemfile +5 -0
- data/README.md +58 -0
- data/README_RU.md +52 -0
- data/Rakefile +23 -0
- data/admin_it.gemspec +38 -0
- data/app/assets/fonts/admin_it/FontAwesome.otf +0 -0
- data/app/assets/fonts/admin_it/fontawesome-webfont.eot +0 -0
- data/app/assets/fonts/admin_it/fontawesome-webfont.svg +414 -0
- data/app/assets/fonts/admin_it/fontawesome-webfont.ttf +0 -0
- data/app/assets/fonts/admin_it/fontawesome-webfont.woff +0 -0
- data/app/assets/fonts/admin_it/glyphicons-halflings-regular.eot +0 -0
- data/app/assets/fonts/admin_it/glyphicons-halflings-regular.svg +229 -0
- data/app/assets/fonts/admin_it/glyphicons-halflings-regular.ttf +0 -0
- data/app/assets/fonts/admin_it/glyphicons-halflings-regular.woff +0 -0
- data/app/assets/javascript/admin_it/admin_it.js +89 -0
- data/app/assets/javascript/admin_it/bootstrap.min.js +6 -0
- data/app/assets/stylesheets/admin_it/admin_it.css +25 -0
- data/app/assets/stylesheets/admin_it/bootstrap-theme.min.css +7 -0
- data/app/assets/stylesheets/admin_it/bootstrap.min.css +7 -0
- data/app/assets/stylesheets/admin_it/font-awesome.min.css +4 -0
- data/app/views/admin_it/context/_table.html.slim +38 -0
- data/app/views/admin_it/context/_tiles.html.slim +23 -0
- data/app/views/admin_it/edit.html.slim +2 -0
- data/app/views/admin_it/new.html.slim +2 -0
- data/app/views/admin_it/shared/_child.html.slim +15 -0
- data/app/views/admin_it/shared/_fields.html.slim +19 -0
- data/app/views/admin_it/shared/_filters.html.slim +40 -0
- data/app/views/admin_it/shared/_form.html.slim +50 -0
- data/app/views/admin_it/shared/_pagination.html.slim +41 -0
- data/app/views/admin_it/shared/_toolbar.html.slim +30 -0
- data/app/views/admin_it/show.html.slim +6 -0
- data/app/views/admin_it/table.html.slim +2 -0
- data/app/views/admin_it/tiles.html.slim +2 -0
- data/app/views/layouts/admin_it.html.slim +37 -0
- data/app/views/layouts/admin_it_dialog.html.slim +8 -0
- data/config.ru +7 -0
- data/lib/admin_it/config.rb +24 -0
- data/lib/admin_it/context/collection_context.rb +239 -0
- data/lib/admin_it/context/context.rb +232 -0
- data/lib/admin_it/context/show_context.rb +45 -0
- data/lib/admin_it/context/single_context.rb +199 -0
- data/lib/admin_it/context/table_context.rb +66 -0
- data/lib/admin_it/context/tiles_context.rb +31 -0
- data/lib/admin_it/context.rb +6 -0
- data/lib/admin_it/controller.rb +42 -0
- data/lib/admin_it/data/active_record.rb +283 -0
- data/lib/admin_it/data/data_behavior.rb +18 -0
- data/lib/admin_it/data/hash.rb +27 -0
- data/lib/admin_it/data/object.rb +51 -0
- data/lib/admin_it/data.rb +24 -0
- data/lib/admin_it/definitions.rb +89 -0
- data/lib/admin_it/engine.rb +56 -0
- data/lib/admin_it/env.rb +37 -0
- data/lib/admin_it/errors.rb +5 -0
- data/lib/admin_it/field/field.rb +174 -0
- data/lib/admin_it/field.rb +1 -0
- data/lib/admin_it/filters/entity_filter.rb +4 -0
- data/lib/admin_it/filters/field_filter.rb +31 -0
- data/lib/admin_it/filters/filter.rb +150 -0
- data/lib/admin_it/filters/value_filter.rb +52 -0
- data/lib/admin_it/filters.rb +4 -0
- data/lib/admin_it/helpers/field.rb +25 -0
- data/lib/admin_it/helpers/input.rb +22 -0
- data/lib/admin_it/helpers/page.rb +26 -0
- data/lib/admin_it/helpers/table.rb +85 -0
- data/lib/admin_it/helpers/tiles.rb +17 -0
- data/lib/admin_it/helpers/toolbar.rb +40 -0
- data/lib/admin_it/helpers/top_menu.rb +39 -0
- data/lib/admin_it/helpers.rb +12 -0
- data/lib/admin_it/locales/en.yml +14 -0
- data/lib/admin_it/locales/ru.yml +14 -0
- data/lib/admin_it/renderable.rb +18 -0
- data/lib/admin_it/resource.rb +292 -0
- data/lib/admin_it/utils.rb +21 -0
- data/lib/admin_it/version.rb +5 -0
- data/lib/admin_it.rb +19 -0
- data/lib/extend_it/array_of.rb +181 -0
- data/lib/extend_it/asserts.rb +38 -0
- data/lib/extend_it/callbacks.rb +105 -0
- data/lib/extend_it/caller.rb +35 -0
- data/lib/extend_it/class.rb +47 -0
- data/lib/extend_it/dsl.rb +94 -0
- data/lib/extend_it/refines.rb +6 -0
- data/lib/extend_it/symbolize.rb +39 -0
- data/lib/extend_it.rb +5 -0
- data/spec/internal/config/database.yml +3 -0
- data/spec/internal/config/routes.rb +3 -0
- data/spec/internal/db/combustion_test.sqlite +0 -0
- data/spec/internal/db/schema.rb +3 -0
- data/spec/internal/log/.gitignore +1 -0
- data/spec/internal/public/favicon.ico +0 -0
- data/spec/lib/context/collection_context_spec.rb +20 -0
- data/spec/lib/context/context_spec.rb +28 -0
- data/spec/lib/context/single_context_spec.rb +26 -0
- data/spec/lib/data/object_spec.rb +29 -0
- data/spec/lib/definitions_spec.rb +171 -0
- data/spec/lib/field_spec.rb +62 -0
- data/spec/lib/resource_spec.rb +39 -0
- data/spec/lib/utils_spec.rb +39 -0
- data/spec/spec_helper.rb +21 -0
- data/spec/support/example_groups/context_example_group.rb +50 -0
- data/spec/support/shared_examples/context.rb +2 -0
- metadata +337 -0
@@ -0,0 +1,181 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
require File.join %w(extend_it symbolize)
|
3
|
+
require File.join %w(extend_it asserts)
|
4
|
+
|
5
|
+
using ExtendIt::Symbolize
|
6
|
+
|
7
|
+
module ExtendIt
|
8
|
+
module ArrayOf
|
9
|
+
def array_of(entity_class, &block)
|
10
|
+
array_name = "ArrayOf#{entity_class.name.split('::').last}"
|
11
|
+
array_class = Class.new(SimpleDelegator) do
|
12
|
+
@entity_class = entity_class
|
13
|
+
@scopes = {}
|
14
|
+
@finder = nil
|
15
|
+
extend ArrayOf::ArrayClassMethods
|
16
|
+
include ArrayOf::ArrayMethods
|
17
|
+
end
|
18
|
+
array_class.class_eval(&block) if block_given?
|
19
|
+
const_set(array_name, array_class)
|
20
|
+
end
|
21
|
+
|
22
|
+
module ArrayClassMethods
|
23
|
+
include Asserts
|
24
|
+
|
25
|
+
attr_reader :scopes, :finder
|
26
|
+
|
27
|
+
def select(arr)
|
28
|
+
if arr.is_a?(self)
|
29
|
+
arr.to_a
|
30
|
+
else
|
31
|
+
arr.select { |a| a.is_a?(@entity_class) }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def entity?(obj)
|
36
|
+
obj.is_a?(@entity_class)
|
37
|
+
end
|
38
|
+
|
39
|
+
def scope(*names, &block)
|
40
|
+
names.flatten.uniq.each do |name|
|
41
|
+
name = name.symbolize || next
|
42
|
+
@scopes[name] = block.nil? ? proc { |e| e.send(name) } : block
|
43
|
+
str = name.to_s
|
44
|
+
if str[-1] == '?'
|
45
|
+
@scopes[str[0..-2].to_sym] = block.nil? ? proc { |e| e.send(name) } : block
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def find_by(name, &block)
|
51
|
+
assert_symbol(:name)
|
52
|
+
@finder = block.nil? ? proc { |e| e.send(name) } : block
|
53
|
+
end
|
54
|
+
|
55
|
+
def has_finder?
|
56
|
+
!@finder.nil?
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
module ArrayMethods
|
61
|
+
def initialize(*arr)
|
62
|
+
@array = self.class.select(arr.flatten)
|
63
|
+
super(@array)
|
64
|
+
end
|
65
|
+
|
66
|
+
def scope(name)
|
67
|
+
if name.is_a?(Symbol)
|
68
|
+
if self.class.scopes.include?(name)
|
69
|
+
self.class.new(@array.select(&self.class.scopes[name]))
|
70
|
+
end
|
71
|
+
else
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def [](*args)
|
76
|
+
if args.size == 1 && args.first.is_a?(Symbol)
|
77
|
+
unless self.class.finder.nil?
|
78
|
+
return @array.find { |e| self.class.finder.call(e) == args.first }
|
79
|
+
end
|
80
|
+
else
|
81
|
+
end
|
82
|
+
@array[*args]
|
83
|
+
end
|
84
|
+
|
85
|
+
%i(& + * - | clear collect collect! delete_if drop drop_while each
|
86
|
+
each_index keep_if first last map reject reject! reverse reverse!
|
87
|
+
reverse_each rotate rotate! sample select select! shift shuffle
|
88
|
+
shuffle! slice slice! sort sort! sort_by! take take_while uniq uniq!
|
89
|
+
values_at).each do |method|
|
90
|
+
define_method method do |*args, &block|
|
91
|
+
result = @array.send(method, *args, &block)
|
92
|
+
if result == @array
|
93
|
+
self
|
94
|
+
elsif result.is_a?(Array)
|
95
|
+
self.class.new(result)
|
96
|
+
else
|
97
|
+
result
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def <<(obj)
|
103
|
+
return unless self.class.entity?(obj)
|
104
|
+
@array << obj
|
105
|
+
end
|
106
|
+
|
107
|
+
def []=(*args)
|
108
|
+
return unless self.class.entity?(args.last)
|
109
|
+
@array.send(:[]=, *args)
|
110
|
+
end
|
111
|
+
|
112
|
+
def to_a
|
113
|
+
@array
|
114
|
+
end
|
115
|
+
|
116
|
+
def to_ary
|
117
|
+
@array
|
118
|
+
end
|
119
|
+
|
120
|
+
%i(concat replace).each do |method|
|
121
|
+
define_method method do |other|
|
122
|
+
@array.send(method, self.class.select(other))
|
123
|
+
self
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def fill(*args)
|
128
|
+
if block_given?
|
129
|
+
@array.fill(*args) do |index|
|
130
|
+
obj = yield index
|
131
|
+
self.class.entity?(obj) ? obj : @array[index]
|
132
|
+
end
|
133
|
+
else
|
134
|
+
return self unless self.class.entity?(args.first)
|
135
|
+
@array.fill(*args)
|
136
|
+
end
|
137
|
+
self
|
138
|
+
end
|
139
|
+
|
140
|
+
def insert(index, *other)
|
141
|
+
@array.insert(index, self.class.select(other))
|
142
|
+
self
|
143
|
+
end
|
144
|
+
|
145
|
+
def map!(&block)
|
146
|
+
array = @array
|
147
|
+
array_class = self.class
|
148
|
+
enum = Enumerator.new do |yielder|
|
149
|
+
array.replace(array.map do |entity|
|
150
|
+
obj = (yielder << entity)
|
151
|
+
array_class.entity?(obj) ? obj : nil
|
152
|
+
end.compact)
|
153
|
+
end
|
154
|
+
if block_given?
|
155
|
+
enum.each(&block)
|
156
|
+
self
|
157
|
+
else
|
158
|
+
enum
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
%i(push unshift).each do |method|
|
163
|
+
define_method method do |*args|
|
164
|
+
@array.send(method, *self.class.select(args))
|
165
|
+
self
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
%i(assoc combination compact compact! flatten flatten pack permutation
|
170
|
+
product rassoc repeated_combination repeated_permutation transpose
|
171
|
+
zip).each do |method|
|
172
|
+
define_method method do |*args|
|
173
|
+
fail(
|
174
|
+
RuntimError,
|
175
|
+
"Method #{method} is not allowed in #{self.class.name}"
|
176
|
+
)
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require File.join %w(extend_it caller)
|
2
|
+
require File.join %w(extend_it symbolize)
|
3
|
+
|
4
|
+
using ExtendIt::Caller
|
5
|
+
using ExtendIt::Symbolize
|
6
|
+
|
7
|
+
module ExtendIt
|
8
|
+
module Asserts
|
9
|
+
private
|
10
|
+
|
11
|
+
if RUBY_VERSION >= '2.1.0'
|
12
|
+
def assert_symbol(*names, binding: nil)
|
13
|
+
return unless binding ||= caller_binding
|
14
|
+
names.each do |name|
|
15
|
+
name = name.ensure_symbol || next
|
16
|
+
var = binding.local_variable_get(name)
|
17
|
+
var = var.ensure_symbol || fail(
|
18
|
+
ArgumentError,
|
19
|
+
"Argument `#{name}` should be a Symbol or String",
|
20
|
+
caller[1..-1]
|
21
|
+
)
|
22
|
+
binding.local_variable_set(name, var)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
else
|
26
|
+
def assert_symbol(*names, binding: nil)
|
27
|
+
return unless binding ||= caller_binding
|
28
|
+
names.each do |name|
|
29
|
+
name = name.ensure_symbol || next
|
30
|
+
binding.eval(
|
31
|
+
"#{name} = #{name}.ensure_symbol || fail(ArgumentError," \
|
32
|
+
" 'Argument `#{name}` should be a Symbol or String')"
|
33
|
+
)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
require File.join %w(extend_it symbolize)
|
2
|
+
require File.join %w(extend_it class)
|
3
|
+
|
4
|
+
using ExtendIt::Symbolize
|
5
|
+
|
6
|
+
module ExtendIt
|
7
|
+
module Callbacks
|
8
|
+
CALLBACKS = %i(before after around)
|
9
|
+
|
10
|
+
def self.included(base)
|
11
|
+
unless base.is_a?(Class)
|
12
|
+
fail RuntimeError, 'Can be included in classes only'
|
13
|
+
end
|
14
|
+
unless (class << base; self end).included_modules.include?(ExtendIt::Class)
|
15
|
+
fail RuntimeError, "#{base.name} should extend ExtendIt::Class"
|
16
|
+
end
|
17
|
+
base.extend(ClassMethods)
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.extended(base)
|
21
|
+
fail RuntimeError, 'This module can\'t be extended'
|
22
|
+
end
|
23
|
+
|
24
|
+
def run_callbacks(*names, arguments: [], original_context: false)
|
25
|
+
# sanitize arguments
|
26
|
+
arguments = [] if arguments.nil?
|
27
|
+
arguments = [arguments] unless arguments.is_a?(Array)
|
28
|
+
|
29
|
+
parents = self.class.parents
|
30
|
+
parents_rev = parents.reverse
|
31
|
+
|
32
|
+
names.ensure_symbols.each do |name|
|
33
|
+
around = []
|
34
|
+
around_name = "@around_#{name}".to_sym
|
35
|
+
var_name = "@before_#{name}".to_sym
|
36
|
+
parents_rev.each do |p|
|
37
|
+
if p.instance_variable_defined?(around_name)
|
38
|
+
arr = p.instance_variable_get(around_name)
|
39
|
+
arr.each do |b|
|
40
|
+
if original_context == true
|
41
|
+
b.call(*arguments)
|
42
|
+
else
|
43
|
+
instance_exec(*arguments, &b)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
around.concat(arr)
|
47
|
+
end
|
48
|
+
if p.instance_variable_defined?(var_name)
|
49
|
+
p.instance_variable_get(var_name).each do |b|
|
50
|
+
if original_context == true
|
51
|
+
b.call(*arguments)
|
52
|
+
else
|
53
|
+
instance_exec(*arguments, &b)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
yield if block_given?
|
59
|
+
around.reverse.each do |b|
|
60
|
+
if original_context == true
|
61
|
+
b.call(*arguments)
|
62
|
+
else
|
63
|
+
instance_exec(*arguments, &b)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
var_name = "@after_#{name}".to_sym
|
67
|
+
parents.each do |p|
|
68
|
+
if p.instance_variable_defined?(var_name)
|
69
|
+
p.instance_variable_get(var_name).each do |b|
|
70
|
+
if original_context == true
|
71
|
+
b.call(*arguments)
|
72
|
+
else
|
73
|
+
instance_exec(*arguments, &b)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
module ClassMethods
|
82
|
+
def define_callbacks(*names, callbacks: [:before, :after])
|
83
|
+
callbacks = [:before, :after] unless callbacks.is_a?(Array)
|
84
|
+
callbacks.select! { |cb| CALLBACKS.include?(cb) }
|
85
|
+
names.each do |name|
|
86
|
+
name = name.symbolize || next
|
87
|
+
callbacks.each do |cb|
|
88
|
+
cb_name = "#{cb}_#{name}".to_sym
|
89
|
+
var_name = "@#{cb_name}".to_sym
|
90
|
+
define_singleton_method cb_name do |&block|
|
91
|
+
return if block.nil?
|
92
|
+
arr =
|
93
|
+
if instance_variable_defined?(var_name)
|
94
|
+
instance_variable_get(var_name)
|
95
|
+
else
|
96
|
+
instance_variable_set(var_name, [])
|
97
|
+
end
|
98
|
+
arr << block
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'continuation' if RUBY_VERSION >= '1.9.0'
|
2
|
+
|
3
|
+
module ExtendIt
|
4
|
+
module Caller
|
5
|
+
# http://rubychallenger.blogspot.ru/2011/07/caller-binding.html
|
6
|
+
refine Object do
|
7
|
+
def caller_binding
|
8
|
+
cc, count = nil, 0
|
9
|
+
set_trace_func(lambda { |event, file, lineno, id, binding, klass|
|
10
|
+
if count == 2
|
11
|
+
set_trace_func nil
|
12
|
+
cc.call(binding)
|
13
|
+
elsif event == 'return'
|
14
|
+
count += 1
|
15
|
+
end
|
16
|
+
})
|
17
|
+
return callcc { |cont| cc = cont }
|
18
|
+
end
|
19
|
+
|
20
|
+
def caller_eval(str)
|
21
|
+
cc, ok = nil, false
|
22
|
+
set_trace_func(lambda { |event, file, lineno, id, binding, klass|
|
23
|
+
if ok
|
24
|
+
set_trace_func nil
|
25
|
+
cc.call(binding)
|
26
|
+
else
|
27
|
+
ok = event == "return"
|
28
|
+
end
|
29
|
+
})
|
30
|
+
return unless bb = callcc { |c| cc = c; nil }
|
31
|
+
eval(str, bb)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require File.join %w(extend_it symbolize)
|
2
|
+
|
3
|
+
using ExtendIt::Symbolize
|
4
|
+
|
5
|
+
module ExtendIt
|
6
|
+
module Class
|
7
|
+
def self.extended(base)
|
8
|
+
base.instance_eval do
|
9
|
+
define_singleton_method :parents do
|
10
|
+
@parents ||= ancestors.take_while { |a| a != base }.concat([base])
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def call_inherited(method_name, *args, base_first: false, &block)
|
16
|
+
arr = parents.select { |parent| parent.methods.include?(method_name) }
|
17
|
+
arr.reverse! if base_first == true
|
18
|
+
arr.reduce([]) { |a, e| a << e.send(method_name, *args, &block) }
|
19
|
+
end
|
20
|
+
|
21
|
+
def inherited_class_reader(*names)
|
22
|
+
names.ensure_symbols.each do |name|
|
23
|
+
var = "@#{name}"
|
24
|
+
define_singleton_method(name) do
|
25
|
+
p = parents.find { |parent| parent.instance_variable_defined?(var) }
|
26
|
+
p.nil? ? nil : p.instance_variable_get(var)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def class_attr_reader(*attrs)
|
32
|
+
attrs.flatten.uniq.each do |attr_name|
|
33
|
+
attr_name = attr_name.to_sym if attr_name.is_a?(String)
|
34
|
+
next unless attr_name.is_a?(Symbol)
|
35
|
+
next if instance_methods.include?(attr_name)
|
36
|
+
var_name = "@#{attr_name}".to_sym
|
37
|
+
if methods.include?(attr_name)
|
38
|
+
define_method(attr_name) { self.class.send(attr_name) }
|
39
|
+
elsif instance_variable_defined?(var_name)
|
40
|
+
define_method attr_name do
|
41
|
+
self.class.instance_variable_get(var_name)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
require File.join %w(extend_it asserts)
|
2
|
+
require File.join %w(extend_it symbolize)
|
3
|
+
|
4
|
+
using ExtendIt::Symbolize
|
5
|
+
|
6
|
+
module ExtendIt
|
7
|
+
module Dsl
|
8
|
+
include Asserts
|
9
|
+
|
10
|
+
def dsl_accessor(*names, default: nil, &setter)
|
11
|
+
names.flatten.uniq.each do |name|
|
12
|
+
name = name.symbolize || next
|
13
|
+
var_name = "@#{name}".to_sym
|
14
|
+
setter_name = "#{name}=".to_sym
|
15
|
+
define_method setter_name do |*args|
|
16
|
+
obj =
|
17
|
+
if setter.nil?
|
18
|
+
default || args.first
|
19
|
+
else
|
20
|
+
instance_exec(*args, &setter)
|
21
|
+
end
|
22
|
+
instance_variable_set(var_name, obj)
|
23
|
+
end
|
24
|
+
define_method name do |*args, &block|
|
25
|
+
if args.empty? && block.nil?
|
26
|
+
if instance_variable_defined?(var_name)
|
27
|
+
instance_variable_get(var_name)
|
28
|
+
else
|
29
|
+
obj = setter.nil? ? default : instance_exec(&setter)
|
30
|
+
instance_variable_set(var_name, obj)
|
31
|
+
end
|
32
|
+
else
|
33
|
+
obj = send(setter_name, *args)
|
34
|
+
obj.instance_eval(&block) unless obj.nil? || block.nil?
|
35
|
+
obj
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def dsl_boolean(*names, default: true)
|
42
|
+
default = default == true
|
43
|
+
names.flatten.uniq.each do |name|
|
44
|
+
name = name.symbolize || next
|
45
|
+
var_name = "@#{name}".to_sym
|
46
|
+
define_method "#{name}=" do |value = default|
|
47
|
+
instance_variable_set(var_name, value == true)
|
48
|
+
end
|
49
|
+
define_method "#{name}?" do
|
50
|
+
if instance_variable_defined?(var_name)
|
51
|
+
instance_variable_get(var_name) == true
|
52
|
+
else
|
53
|
+
instance_variable_set(var_name, default)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def dsl_block(*names)
|
60
|
+
names.flatten.uniq.each do |name|
|
61
|
+
var_name = "@#{name}".to_sym
|
62
|
+
define_method name do |*args, &block|
|
63
|
+
if block.nil?
|
64
|
+
if instance_variable_defined?(var_name)
|
65
|
+
instance_variable_get(var_name)
|
66
|
+
# instance_exec(*args, &b) unless b.nil?
|
67
|
+
# else
|
68
|
+
# nil
|
69
|
+
end
|
70
|
+
else
|
71
|
+
instance_variable_set(var_name, block)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def dsl_use_hash(hash_name)
|
78
|
+
assert_symbol(:hash_name, binding: binding)
|
79
|
+
define_method "use_#{hash_name}" do |*names, except: nil|
|
80
|
+
hash = instance_variable_get("@#{hash_name}")
|
81
|
+
if names.empty?
|
82
|
+
names = hash.keys
|
83
|
+
else
|
84
|
+
names = names.ensure_symbols & hash.keys
|
85
|
+
end
|
86
|
+
except = [except] if !except.nil? && !except.is_a?(Array)
|
87
|
+
if except.is_a?(Array)
|
88
|
+
names -= except.ensure_symbols
|
89
|
+
end
|
90
|
+
hash.delete_if { |k, v| !names.include?(k) }
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module ExtendIt
|
2
|
+
module Symbolize
|
3
|
+
refine Object do
|
4
|
+
def symbolize
|
5
|
+
nil
|
6
|
+
end
|
7
|
+
|
8
|
+
def ensure_symbol
|
9
|
+
nil
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
refine String do
|
14
|
+
def symbolize
|
15
|
+
to_sym
|
16
|
+
end
|
17
|
+
|
18
|
+
def ensure_symbol
|
19
|
+
to_sym
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
refine Symbol do
|
24
|
+
def symbolize
|
25
|
+
self
|
26
|
+
end
|
27
|
+
|
28
|
+
def ensure_symbol
|
29
|
+
self
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
refine Array do
|
34
|
+
def ensure_symbols
|
35
|
+
flatten.map { |x| x.ensure_symbol }.compact
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/extend_it.rb
ADDED
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
*.log
|
File without changes
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe AdminIt::CollectionContext do
|
4
|
+
let(:context_class) { described_class.create_class(:test, object_resource) }
|
5
|
+
subject { context_class.new }
|
6
|
+
|
7
|
+
# class DSL methods
|
8
|
+
it { expect(context_class.collection?).to be_true }
|
9
|
+
it { expect(context_class.single?).to be_false }
|
10
|
+
|
11
|
+
# instance methods
|
12
|
+
it { expect(subject.collection?).to be_true }
|
13
|
+
it { expect(subject.single?).to be_false }
|
14
|
+
|
15
|
+
it 'has entities setter' do
|
16
|
+
arr = [object_class.new, object_class.new]
|
17
|
+
subject.entities = arr
|
18
|
+
expect(subject.entities).to be_kind_of Enumerator
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe AdminIt::Context do
|
4
|
+
let(:context_class) { described_class.create_class(:test, object_resource) }
|
5
|
+
subject { context_class.new }
|
6
|
+
|
7
|
+
# DSL methods
|
8
|
+
it { expect(context_class.collection?).to be_false }
|
9
|
+
it { expect(context_class.single?).to be_false }
|
10
|
+
|
11
|
+
# instance methods
|
12
|
+
it { expect(subject.collection?).to be_false }
|
13
|
+
it { expect(subject.single?).to be_false }
|
14
|
+
|
15
|
+
it 'sets entity class to Resource entity class' do
|
16
|
+
expect(subject.entity_class).to eq object_resource.entity_class
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'sets fields to empty array by default' do
|
20
|
+
expect(subject.class.fields).to eq []
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'extends AdminIt::Object context by default' do
|
24
|
+
expect(subject.class.included_modules)
|
25
|
+
.to include AdminIt::ObjectData::Context
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe AdminIt::SingleContext do
|
4
|
+
let(:context_class) { described_class.create_class(:test, object_resource) }
|
5
|
+
|
6
|
+
describe 'DSL methods' do
|
7
|
+
subject { context_class }
|
8
|
+
|
9
|
+
it { expect(subject.collection?).to be_false }
|
10
|
+
it { expect(subject.single?).to be_true }
|
11
|
+
end
|
12
|
+
|
13
|
+
describe 'instance methods' do
|
14
|
+
subject { context_class.new }
|
15
|
+
|
16
|
+
it 'sets empty emtity for nil values' do
|
17
|
+
subject.entity = nil
|
18
|
+
expect(subject.values).to be_kind_of Hash
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'sets entity Object' do
|
22
|
+
subject.entity = Object.new
|
23
|
+
expect(subject.values).to be_kind_of Hash
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe AdminIt::ObjectData::Context do
|
4
|
+
before do
|
5
|
+
object_class.class_eval do
|
6
|
+
def r; 'r_value'; end
|
7
|
+
def rw; @rw_value ||= 'rw_value'; end
|
8
|
+
def rw=(value); @rw_value = value; end
|
9
|
+
def w=(value); @w_value = value; end
|
10
|
+
def bool?; true; end
|
11
|
+
def wrong_getter_arity(test); true; end
|
12
|
+
def wrong_setter1_arity=(test, me); true; end
|
13
|
+
def wrong_setter2_arity=; true; end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'retrieves all fields for ancestors' do
|
18
|
+
fields = object_context.fields(scope: :all)
|
19
|
+
expect(fields.size).to eq 3
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'reads fields' do
|
23
|
+
single_object_context.entity = object
|
24
|
+
expect(single_object_context.values).to eq r: 'r_value', rw: 'rw_value'
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe AdminIt::ObjectData::Field do
|
29
|
+
end
|