admin_it 1.0.7 → 1.0.8

Sign up to get free protection for your applications and to get access to all the features.
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