admin_it 1.0.7 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -0
  3. data/README.md +6 -0
  4. data/lib/admin_it/context/collection_context.rb +5 -22
  5. data/lib/admin_it/context/context.rb +13 -34
  6. data/lib/admin_it/context/show_context.rb +8 -7
  7. data/lib/admin_it/context/single_context.rb +35 -33
  8. data/lib/admin_it/context/table_context.rb +18 -11
  9. data/lib/admin_it/context/tiles_context.rb +14 -14
  10. data/lib/admin_it/data/active_record.rb +0 -2
  11. data/lib/admin_it/field/field.rb +95 -23
  12. data/lib/admin_it/filters/field_filter.rb +4 -0
  13. data/lib/admin_it/filters/filter.rb +37 -14
  14. data/lib/admin_it/helpers/table.rb +13 -17
  15. data/lib/admin_it/resource.rb +58 -115
  16. data/lib/admin_it/shared.rb +64 -0
  17. data/lib/admin_it/version.rb +1 -1
  18. data/lib/admin_it.rb +7 -5
  19. data/lib/extend_it/array_of.rb +3 -3
  20. data/lib/extend_it/asserts.rb +5 -3
  21. data/lib/extend_it/{class.rb → base.rb} +29 -10
  22. data/lib/extend_it/callbacks.rb +7 -7
  23. data/lib/extend_it/config.rb +30 -0
  24. data/lib/extend_it/dsl.rb +223 -64
  25. data/lib/extend_it/ensures.rb +193 -0
  26. data/lib/extend_it.rb +1 -1
  27. data/spec/extend_it/config_spec.rb +52 -0
  28. data/spec/extend_it/dsl_spec.rb +149 -0
  29. data/spec/extend_it/ensures_spec.rb +39 -0
  30. data/spec/lib/context/collection_context_spec.rb +4 -2
  31. data/spec/lib/context/context_spec.rb +3 -1
  32. data/spec/lib/context/single_context_spec.rb +3 -2
  33. data/spec/lib/data/object_spec.rb +2 -2
  34. data/spec/lib/field_spec.rb +1 -56
  35. data/spec/lib/resource_spec.rb +1 -13
  36. data/spec/spec_helper.rb +7 -0
  37. data/spec/support/example_groups/context_example_group.rb +3 -3
  38. metadata +14 -11
  39. data/lib/admin_it/renderable.rb +0 -18
  40. data/lib/extend_it/refines.rb +0 -6
  41. data/lib/extend_it/symbolize.rb +0 -39
  42. data/spec/lib/definitions_spec.rb +0 -171
  43. data/spec/lib/utils_spec.rb +0 -39
data/lib/extend_it/dsl.rb CHANGED
@@ -1,94 +1,253 @@
1
- require File.join %w(extend_it asserts)
2
- require File.join %w(extend_it symbolize)
3
-
4
- using ExtendIt::Symbolize
1
+ require File.join %w(extend_it ensures)
5
2
 
6
3
  module ExtendIt
7
4
  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
5
+ using ExtendIt::Ensures if ExtendIt.config.use_refines?
6
+
7
+ def self.included(base)
8
+ base.extend(ClassMethods)
9
+ base.class_eval do
10
+ define_method :dsl_obj do
11
+ self.class.dsl.new(self)
12
+ end
13
+ end
14
+ end
15
+
16
+ def self.extended(base)
17
+ base.extend(ClassMethods)
18
+ base.define_singleton_method :dsl_obj do
19
+ dsl.new(self)
20
+ end
21
+ end
22
+
23
+ def dsl_eval(&block)
24
+ dsl_obj.instance_eval(&block) if block_given?
25
+ end
26
+
27
+ module ClassMethods
28
+ def dsl(&block)
29
+ if @dsl.nil?
30
+ parent = superclass.respond_to?(:dsl) ? [superclass.dsl] : []
31
+ end
32
+ @dsl ||= Class.new(*parent) do
33
+ extend DslMethods
34
+
35
+ def initialize(receiver)
36
+ if receiver.nil? || receiver.frozen?
37
+ fail(ArgumentError, 'DSL receiver should be non-frozen object')
38
+ end
39
+ @dsl_receiver = receiver
40
+ end
41
+
42
+ private
43
+
44
+ attr_reader :dsl_receiver
45
+
46
+ def dsl_get(var_name, default = nil)
47
+ var_name = var_name.ensure_instance_variable_name || fail(
48
+ ArgumentError, "Wrong `var_name` argument: #{var_name.inspect}"
49
+ )
50
+ if default.nil? && !block_given?
51
+ fail(ArgumentError, '`default` or block should be specified')
52
+ end
53
+ if dsl_receiver.instance_variable_defined?(var_name)
54
+ dsl_receiver.instance_variable_get(var_name)
19
55
  else
20
- instance_exec(*args, &setter)
56
+ default = yield if block_given?
57
+ dsl_receiver.instance_variable_set(var_name, default)
21
58
  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)
59
+ end
60
+
61
+ def dsl_set(var_name, value)
62
+ var_name = var_name.ensure_instance_variable_name || fail(
63
+ ArgumentError, "Wrong `var_name` argument: #{var_name.inspect}"
64
+ )
65
+ setter_name = var_name.ensure_setter_name
66
+ if dsl_receiver.respond_to?(setter_name)
67
+ dsl_receiver.send(setter_name, value)
28
68
  else
29
- obj = setter.nil? ? default : instance_exec(&setter)
30
- instance_variable_set(var_name, obj)
69
+ dsl_receiver.instance_variable_set(var_name, value)
31
70
  end
32
- else
71
+ end
72
+ end
73
+ @dsl.class_eval(&block) if block_given?
74
+ @dsl
75
+ end
76
+ end
77
+
78
+ module DslMethods
79
+ def dsl_accessor(*names, default: nil, variable: nil, &setter)
80
+ names = names.ensure_symbols
81
+ variable = nil if names.size != 1
82
+ variable = variable.ensure_local_name unless variable.nil?
83
+ names.each do |name|
84
+ name = name.ensure_local_name || next
85
+ setter_name = name.ensure_setter_name
86
+
87
+ define_method setter_name do |*args|
88
+ obj =
89
+ if setter.nil?
90
+ default || args.first
91
+ else
92
+ dsl_receiver.instance_exec(*args, &setter)
93
+ end
94
+ dsl_set(variable || name, obj)
95
+ end
96
+
97
+ define_method name do |*args, &block|
33
98
  obj = send(setter_name, *args)
34
- obj.instance_eval(&block) unless obj.nil? || block.nil?
99
+ obj.dsl_eval(&block) if !block.nil? && obj.is_a?(Dsl)
35
100
  obj
36
101
  end
37
102
  end
38
103
  end
39
- end
40
104
 
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)
105
+ def dsl_boolean(*names, default: true, variable: nil)
106
+ default = default == true
107
+ names = names.ensure_symbols
108
+ variable = nil if names.size != 1
109
+ variable = variable.ensure_local_name unless variable.nil?
110
+ names.each do |name|
111
+ name = name.ensure_local_name || next
112
+ setter_name = name.ensure_setter_name
113
+
114
+ define_method name do |value = nil|
115
+ send(setter_name, value.nil? ? default : value)
116
+ end
117
+
118
+ define_method setter_name do |value = default|
119
+ dsl_set(variable || name, value == true)
120
+ end
48
121
  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)
122
+ end
123
+
124
+ def dsl_block(*names, variable: nil)
125
+ names = names.ensure_symbols
126
+ variable = nil if names.size != 1
127
+ variable = variable.ensure_local_name unless variable.nil?
128
+ names.each do |name|
129
+ name = name.ensure_local_name || next
130
+ define_method name do |&block|
131
+ return if block.nil?
132
+ dsl_set(variable || name, block)
54
133
  end
55
134
  end
56
135
  end
57
- end
58
136
 
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
137
+ def dsl_use_hash(hash_name, variable: nil)
138
+ hash_name = hash_name.ensure_local_name || fail(
139
+ ArgumentError,
140
+ '`hash_name` argument for `dsl_use_hash` should be a Symbol ' \
141
+ 'or a String'
142
+ )
143
+ variable = variable.ensure_local_name unless variable.nil?
144
+
145
+ define_method "use_#{hash_name}" do |*names, except: nil|
146
+ hash = dsl_get(variable || hash_name, {})
147
+ # puts "---< #{names}, except: #{except} #{hash.inspect}"
148
+ keys = hash.keys
149
+ names = Dsl.expand_asterisk(names.ensure_symbols, keys)
150
+ # puts "---> #{names}"
151
+ names = names.empty? ? keys : names & keys
152
+ # puts "---> #{names}"
153
+ names -= except.ensure_symbols
154
+ # puts "---> #{names}"
155
+ # puts ''
156
+ hash.replace(Hash[names.map { |n| [n, hash[n]] }])
157
+ end
158
+ end
159
+
160
+ def dsl_hash_of_objects(hash_name, variable: nil, single: nil, &creator)
161
+ unless block_given?
162
+ fail(
163
+ ArgumentError,
164
+ '`dsl_hash_of_objects` requires creator block to be present'
165
+ )
166
+ end
167
+ hash_name = hash_name.ensure_local_name || fail(
168
+ ArgumentError,
169
+ '`hash_name` argument for `dsl_hash_of_objects` should be' \
170
+ ' a Symbol or a String'
171
+ )
172
+ variable = variable.ensure_local_name unless variable.nil?
173
+
174
+ unless single.nil?
175
+ single = single.ensure_local_name || fail(
176
+ ArgumentError,
177
+ '`single` option for `dsl_hash_of_objects` should be' \
178
+ ' a Symbol or a String or nil'
179
+ )
180
+ define_method single do |name, **opts, &block|
181
+ name = name.ensure_symbol
182
+ unless name.nil?
183
+ hash = dsl_get(variable || hash_name, {})
184
+ obj = hash[name] ||=
185
+ dsl_receiver.instance_exec(name, **opts, &creator)
186
+ obj.dsl_eval(&block) if !block.nil? && obj.is_a?(Dsl)
69
187
  end
70
- else
71
- instance_variable_set(var_name, block)
72
188
  end
73
189
  end
190
+
191
+ define_method hash_name do |*names, **opts, &block|
192
+ hash = dsl_get(variable || hash_name, {})
193
+ Dsl.expand_asterisk(names.ensure_symbols, hash.keys).each do |name|
194
+ obj = hash[name] ||=
195
+ dsl_receiver.instance_exec(name, **opts, &creator)
196
+ obj.dsl_eval(&block) if !block.nil? && obj.is_a?(Dsl)
197
+ end
198
+ end
199
+
200
+ dsl_use_hash(hash_name, variable: variable)
74
201
  end
75
202
  end
76
203
 
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
204
+ protected
205
+
206
+ def self.expand_asterisk(arr, keys)
207
+ return arr unless arr.include?(:*)
208
+ arr.map { |a| a == :* ? keys - arr : a }.flatten
209
+ end
210
+ end
211
+
212
+ module DslModule
213
+ def self.incuded(base)
214
+ fail RuntimeError, 'DslModule can be only extended by other modules'
215
+ end
216
+
217
+ def self.extended(base)
218
+ unless base.is_a?(Module)
219
+ fail RuntimeError, 'DslModule can be only extended by modules'
220
+ end
221
+
222
+ base.define_singleton_method :included do |superbase|
223
+ if @included.is_a?(Array)
224
+ @included.each { |i| superbase.instance_eval(&i) }
85
225
  end
86
- except = [except] if !except.nil? && !except.is_a?(Array)
87
- if except.is_a?(Array)
88
- names -= except.ensure_symbols
226
+ if @dsl.is_a?(Array) && superbase.respond_to?(:dsl)
227
+ @dsl.each { |d| superbase.dsl(&d) }
89
228
  end
90
- hash.delete_if { |k, v| !names.include?(k) }
91
229
  end
230
+
231
+ base.define_singleton_method :extended do |superbase|
232
+ if @extended.is_a?(Array)
233
+ @extended.each { |e| superbase.instance_eval(&e) }
234
+ end
235
+ if @dsl.is_a?(Array) && superbase.respond_to?(:dsl)
236
+ @dsl.each { |d| superbase.dsl(&d) }
237
+ end
238
+ end
239
+ end
240
+
241
+ def included(&block)
242
+ (@included ||= []) << block if block_given?
243
+ end
244
+
245
+ def extended(&block)
246
+ (@extended ||= []) << block if block_given?
247
+ end
248
+
249
+ def dsl(&block)
250
+ (@dsl ||= []) << block if block_given?
92
251
  end
93
252
  end
94
253
  end
@@ -0,0 +1,193 @@
1
+ module ExtendIt
2
+ module Ensures
3
+ VAR_REGEXP = /\A
4
+ (?<class_access>@{1,2})?
5
+ (?<name>[a-z_][a-zA-Z_0-9]*)
6
+ (?<modifier>[?!=])?
7
+ \z/x
8
+ end
9
+ end
10
+
11
+ if ExtendIt.config.use_refines?
12
+ module ExtendIt
13
+ module Ensures
14
+ refine Object do
15
+ def ensure_symbol; end
16
+ def ensure_instance_variable_name; end
17
+ def ensure_setter_name; end
18
+ def ensure_checker_name; end
19
+ def ensure_bang_name; end
20
+ def ensure_local_name; end
21
+ end
22
+
23
+ refine String do
24
+ def ensure_symbol
25
+ to_sym
26
+ end
27
+
28
+ def ensure_symbols
29
+ [to_sym]
30
+ end
31
+
32
+ def ensure_instance_variable_name
33
+ matches = VAR_REGEXP.match(self)
34
+ matches.nil? ? nil : "@#{matches[:name]}".to_sym
35
+ end
36
+
37
+ def ensure_setter_name
38
+ matches = VAR_REGEXP.match(self)
39
+ matches.nil? ? nil : "#{matches[:name]}=".to_sym
40
+ end
41
+
42
+ def ensure_checker_name
43
+ matches = VAR_REGEXP.match(self)
44
+ matches.nil? ? nil : "#{matches[:name]}?".to_sym
45
+ end
46
+
47
+ def ensure_bang_name
48
+ matches = VAR_REGEXP.match(self)
49
+ matches.nil? ? nil : "#{matches[:name]}!".to_sym
50
+ end
51
+
52
+ def ensure_local_name
53
+ matches = VAR_REGEXP.match(self)
54
+ matches.nil? ? nil : matches[:name].to_sym
55
+ end
56
+ end
57
+
58
+ refine Symbol do
59
+ def ensure_symbol
60
+ self
61
+ end
62
+
63
+ def ensure_symbols
64
+ [self]
65
+ end
66
+
67
+ def ensure_instance_variable_name
68
+ matches = VAR_REGEXP.match(to_s)
69
+ matches.nil? ? nil : "@#{matches[:name]}".to_sym
70
+ end
71
+
72
+ def ensure_setter_name
73
+ matches = VAR_REGEXP.match(to_s)
74
+ matches.nil? ? nil : "#{matches[:name]}=".to_sym
75
+ end
76
+
77
+ def ensure_checker_name
78
+ matches = VAR_REGEXP.match(to_s)
79
+ matches.nil? ? nil : "#{matches[:name]}?".to_sym
80
+ end
81
+
82
+ def ensure_bang_name
83
+ matches = VAR_REGEXP.match(to_s)
84
+ matches.nil? ? nil : "#{matches[:name]}!".to_sym
85
+ end
86
+
87
+ def ensure_local_name
88
+ matches = VAR_REGEXP.match(to_s)
89
+ matches.nil? ? nil : matches[:name].to_sym
90
+ end
91
+ end
92
+
93
+ refine Array do
94
+ def ensure_symbols
95
+ flatten.map { |x| x.ensure_symbol }.compact
96
+ end
97
+ end
98
+ end
99
+ end
100
+ else
101
+ module ExtendIt
102
+ module Ensures; end
103
+ end
104
+
105
+ class Object
106
+ def ensure_symbol; end
107
+ def ensure_instance_variable_name; end
108
+ def ensure_setter_name; end
109
+ def ensure_checker_name; end
110
+ def ensure_bang_name; end
111
+ def ensure_local_name; end
112
+
113
+ def ensure_symbols
114
+ []
115
+ end
116
+ end
117
+
118
+ class String
119
+ def ensure_symbol
120
+ to_sym
121
+ end
122
+
123
+ def ensure_symbols
124
+ [to_sym]
125
+ end
126
+
127
+ def ensure_instance_variable_name
128
+ matches = ExtendIt::Ensures::VAR_REGEXP.match(self)
129
+ matches.nil? ? nil : "@#{matches[:name]}".to_sym
130
+ end
131
+
132
+ def ensure_setter_name
133
+ matches = ExtendIt::Ensures::VAR_REGEXP.match(self)
134
+ matches.nil? ? nil : "#{matches[:name]}=".to_sym
135
+ end
136
+
137
+ def ensure_checker_name
138
+ matches = ExtendIt::Ensures::VAR_REGEXP.match(self)
139
+ matches.nil? ? nil : "#{matches[:name]}?".to_sym
140
+ end
141
+
142
+ def ensure_bang_name
143
+ matches = ExtendIt::Ensures::VAR_REGEXP.match(self)
144
+ matches.nil? ? nil : "#{matches[:name]}!".to_sym
145
+ end
146
+
147
+ def ensure_local_name
148
+ matches = ExtendIt::Ensures::VAR_REGEXP.match(self)
149
+ matches.nil? ? nil : matches[:name].to_sym
150
+ end
151
+ end
152
+
153
+ class Symbol
154
+ def ensure_symbol
155
+ self
156
+ end
157
+
158
+ def ensure_symbols
159
+ [self]
160
+ end
161
+
162
+ def ensure_instance_variable_name
163
+ matches = ExtendIt::Ensures::VAR_REGEXP.match(to_s)
164
+ matches.nil? ? nil : "@#{matches[:name]}".to_sym
165
+ end
166
+
167
+ def ensure_setter_name
168
+ matches = ExtendIt::Ensures::VAR_REGEXP.match(to_s)
169
+ matches.nil? ? nil : "#{matches[:name]}=".to_sym
170
+ end
171
+
172
+ def ensure_checker_name
173
+ matches = ExtendIt::Ensures::VAR_REGEXP.match(to_s)
174
+ matches.nil? ? nil : "#{matches[:name]}?".to_sym
175
+ end
176
+
177
+ def ensure_bang_name
178
+ matches = ExtendIt::Ensures::VAR_REGEXP.match(to_s)
179
+ matches.nil? ? nil : "#{matches[:name]}!".to_sym
180
+ end
181
+
182
+ def ensure_local_name
183
+ matches = ExtendIt::Ensures::VAR_REGEXP.match(to_s)
184
+ matches.nil? ? nil : matches[:name].to_sym
185
+ end
186
+ end
187
+
188
+ class Array
189
+ def ensure_symbols
190
+ flatten.map { |x| x.ensure_symbol }.compact
191
+ end
192
+ end
193
+ end
data/lib/extend_it.rb CHANGED
@@ -1,4 +1,4 @@
1
- require File.join %w(extend_it refines)
1
+ require File.join %w(extend_it config)
2
2
  #require File.join %w(extend_it caller)
3
3
  #require File.join %w(extend_it array_of)
4
4
  #require File.join %w(extend_it dsl)
@@ -0,0 +1,52 @@
1
+ require 'spec_helper'
2
+
3
+ describe ExtendIt::Config do
4
+ before do
5
+ @tmp_use_refines = described_class.instance_variable_get(:@use_refines)
6
+ described_class.instance_variable_set(:@use_refines, nil)
7
+ end
8
+
9
+ after do
10
+ described_class.instance_variable_set(:@use_refines, @tmp_use_refines)
11
+ end
12
+
13
+ describe '::use_refines' do
14
+ it 'sets to false as default' do
15
+ expect(described_class.use_refines).to be_false
16
+ end
17
+
18
+ if RUBY_VERSION >= '2.1.0'
19
+ it 'sets value from argument' do
20
+ described_class.use_refines(true)
21
+ expect(described_class.use_refines).to be_true
22
+ end
23
+ else
24
+ it 'avoids of setting true value' do
25
+ expect {
26
+ described_class.use_refines(true)
27
+ }.to raise_error RuntimeError
28
+ end
29
+ end
30
+ end
31
+
32
+ describe '::use_refines=' do
33
+ if RUBY_VERSION >= '2.1.0'
34
+ it 'sets value from argument' do
35
+ described_class.use_refines = true
36
+ expect(described_class.use_refines).to be_true
37
+ end
38
+ else
39
+ it 'avoids of setting true value' do
40
+ expect {
41
+ described_class.use_refines = true
42
+ }.to raise_error RuntimeError
43
+ end
44
+ end
45
+ end
46
+
47
+ describe '::use_refines?' do
48
+ it 'sets to false as default' do
49
+ expect(described_class.use_refines?).to be_false
50
+ end
51
+ end
52
+ end