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
@@ -1,62 +1,52 @@
1
- require File.join %w(extend_it symbolize)
2
- require File.join %w(extend_it asserts)
1
+ require File.join %w(extend_it base)
3
2
  require File.join %w(extend_it callbacks)
4
- require File.join %w(extend_it class)
5
3
 
6
- using ExtendIt::Symbolize
4
+ using ExtendIt::Ensures
7
5
 
8
6
  module AdminIt
9
- module FieldsHolder
10
- def fields(scope: :visible)
11
- case scope
12
- when nil, :all then @fields.values
13
- when :visible then @fields.values.select { |f| f.visible? }
14
- when :hidden then @fields.values.select { |f| !f.visible? }
15
- when :readable then @fields.values.select { |f| f.readable? }
16
- when :writable then @fields.values.select { |f| f.writable? }
17
- when :sortable then @fields.values.select { |f| f.sortable? }
18
- when Field::TYPES then @fields.values.select { |f| f.type == scope }
19
- else @fields.values
7
+ class Resource
8
+ extend ExtendIt::Base
9
+ include ExtendIt::Callbacks
10
+ include ExtendIt::Dsl
11
+ include Iconed
12
+ include FieldsHolder
13
+ include FiltersHolder
14
+
15
+ dsl do
16
+ dsl_hash_of_objects :contexts, single: :context do |name, **opts|
17
+ context_class = opts[:class] || opts[:context_class] || Context
18
+ unless context_class.is_a?(Class) && context_class <= Context
19
+ fail(
20
+ ArgumentError,
21
+ 'context class should be AdminIt::Context descendant'
22
+ )
23
+ end
24
+ @contexts[name] = context_class.create(name, entity_class)
20
25
  end
21
- end
22
26
 
23
- def hide_fields(*names)
24
- names.ensure_symbols.each do |name|
25
- @fields[name].hide if @fields.key?(name)
27
+ dsl_boolean :confirm_destroy
28
+ dsl_accessor :display_name
29
+
30
+ def collection(&block)
31
+ return unless block_given?
32
+ hash = dsl_get(:contexts, {})
33
+ hash.select { |_, c| c.collection? }.each { |_, c| c.dsl_eval(&block) }
26
34
  end
27
- end
28
35
 
29
- def show_fields(*names)
30
- names.ensure_symbols.each do |name|
31
- @fields[name].show if @fields.key?(name)
36
+ def single(&block)
37
+ return unless block_given?
38
+ hash = dsl_get(:contexts, {})
39
+ hash.select { |_, c| c.single? }.each { |_, c| c.dsl_eval(&block) }
32
40
  end
33
- end
34
- end
35
41
 
36
- module FiltersHolder
37
- def filters(scope: :all)
38
- @filters ||= {}
39
- case scope
40
- when nil, :all then @filters.values
41
- else @filters.values
42
+ dsl_accessor :default_context do |value|
43
+ value = value.ensure_symbol
44
+ @contexts.key?(value) ? value : nil
42
45
  end
43
46
  end
44
- end
45
-
46
- class Resource
47
- extend ExtendIt::Class
48
- extend ExtendIt::Dsl
49
- include ExtendIt::Asserts
50
- include ExtendIt::Callbacks
51
- include FieldsHolder
52
- include FiltersHolder
53
47
 
54
48
  attr_reader :name, :plural, :entity_class, :menu
55
49
 
56
- dsl_accessor :icon
57
- dsl_use_hash :fields
58
- dsl_boolean :confirm_destroy
59
-
60
50
  define_callbacks :initialize
61
51
 
62
52
  def initialize(
@@ -66,7 +56,11 @@ module AdminIt
66
56
  destroyable: true,
67
57
  auto_filters: true
68
58
  )
69
- assert_symbol(:name)
59
+ name = name.ensure_symbol || fail(
60
+ ArgumentError,
61
+ '`name` argument for resource constructor should be a Symbol ' \
62
+ 'or a String'
63
+ )
70
64
 
71
65
  @name, @entity_class = name, entity_class
72
66
  if @entity_class.nil?
@@ -98,79 +92,32 @@ module AdminIt
98
92
  end
99
93
  end
100
94
 
101
- def field(*names, field_class: nil, &block)
102
- names.ensure_symbols.each do |name|
103
- if @fields.key?(name)
104
- field = @fields[name]
105
- else
106
- field_class = Field if field_class.nil? || !field_class <= Field
107
- field = @fields[name] = field_class.create(name, entity_class)
108
- end
109
- field.instance_eval(&block) if block_given?
110
- end
95
+ def confirm_destroy?
96
+ @confirm_destroy.nil? ? @confirm_destroy = true : @confirm_destroy == true
97
+ end
98
+
99
+ def destroyable?
100
+ @destroyable.nil? ? @destroyable = true : @destroyable == true
111
101
  end
112
102
 
113
103
  def [](name)
114
- assert_symbol(:name)
115
- @contexts[name]
104
+ context(name)
116
105
  end
117
106
 
118
- def context(*names, context_class: nil, &block)
119
- names.ensure_symbols.each do |name|
120
- if @contexts.key?(name)
121
- context = @contexts[name]
122
- else
123
- if context_class.nil? || !context_class <= Context
124
- context_class = Context
125
- end
126
- context = @contexts[name] = context_class.create(name, entity_class)
127
- end
128
- context.instance_eval(&block) if block_given?
129
- end
107
+ def context(name)
108
+ @contexts[name.ensure_symbol]
130
109
  end
131
110
 
132
111
  def contexts
133
112
  @contexts.values
134
113
  end
135
114
 
136
- dsl_use_hash :contexts
137
-
138
- def filter(name, filter_class: nil, &block)
139
- assert_symbol(:name)
140
- filter = @filters[name]
141
- if filter.nil?
142
- filter_class = Filter if filter_class.nil? || !filter_class <= Filter
143
- filter = @filters[name] = filter_class.create(name, self)
144
- end
145
- filter.instance_eval(&block) if block_given?
146
- end
147
-
148
- dsl_use_hash :filters
149
-
150
- def collection(&block)
151
- return unless block_given?
152
- contexts.select { |c| c.collection? }.each do |c|
153
- c.instance_eval(&block)
154
- end
155
- end
156
-
157
- def single(&block)
158
- return unless block_given?
159
- contexts.select { |c| c.single? }.each do |c|
160
- c.instance_eval(&block)
161
- end
162
- end
163
-
164
115
  def default_context(value = nil)
165
- if value.nil?
166
- return @default_context unless @default_context.nil?
167
- if collections.size > 0
168
- @default_context = collections.first.context_name
169
- elsif singles.size > 0
170
- @default_context = singles.first.context_name
171
- end
172
- else
173
- @default_context = @contexts.keys.include?(value) ? value : default_context
116
+ return @default_context unless @default_context.nil?
117
+ if collections.size > 0
118
+ @default_context = collections.first.context_name
119
+ elsif singles.size > 0
120
+ @default_context = singles.first.context_name
174
121
  end
175
122
  end
176
123
 
@@ -179,11 +126,7 @@ module AdminIt
179
126
  end
180
127
 
181
128
  def display_name
182
- plural.split('_').map { |s| s.capitalize }.join(' ')
183
- end
184
-
185
- def destroyable?
186
- @destroyable
129
+ @display_name ||= plural.split('_').map { |s| s.capitalize }.join(' ')
187
130
  end
188
131
 
189
132
  def collection_path
@@ -280,11 +223,11 @@ module AdminIt
280
223
  end
281
224
 
282
225
  def self.resource(name, entity_class = nil, **opts, &block)
283
- _resource = Resource.new(name, entity_class, **opts)
284
- _resource.instance_eval(&block) if block_given?
285
- _resource.define_controller
226
+ resource = Resource.new(name, entity_class, **opts)
227
+ resource.dsl_eval(&block) if block_given?
228
+ resource.define_controller
286
229
  @resources ||= {}
287
- @resources[_resource.name] = _resource
230
+ @resources[resource.name] = resource
288
231
  end
289
232
 
290
233
  def self.resources
@@ -0,0 +1,64 @@
1
+ require File.join %w(extend_it dsl)
2
+
3
+ module AdminIt
4
+ module Renderable
5
+ extend ExtendIt::DslModule
6
+
7
+ dsl { dsl_block :render }
8
+
9
+ def render(entity, instance = nil, &block)
10
+ return if @render.nil?
11
+ # method used as event emmiter, call block in instance or caller
12
+ # context if it present
13
+ if instance.nil?
14
+ @render.call(entity)
15
+ else
16
+ instance.instance_exec(entity, &@render)
17
+ end
18
+ end
19
+ end
20
+
21
+ module Iconed
22
+ extend ExtendIt::DslModule
23
+
24
+ dsl do
25
+ dsl_accessor :icon
26
+ end
27
+
28
+ def icon=(value)
29
+ @icon = value.nil? ? default_icon : value.to_s
30
+ end
31
+
32
+ def icon
33
+ @icon ||= default_icon
34
+ end
35
+
36
+ protected
37
+
38
+ def default_icon
39
+ ''
40
+ end
41
+ end
42
+
43
+ module DisplayableName
44
+ extend ExtendIt::DslModule
45
+
46
+ dsl do
47
+ dsl_accessor :display_name
48
+ end
49
+
50
+ def display_name=(value)
51
+ @display_name = value.nil? ? default_display_name : value.to_s
52
+ end
53
+
54
+ def display_name
55
+ @display_name ||= default_display_name
56
+ end
57
+
58
+ protected
59
+
60
+ def default_display_name
61
+ ''
62
+ end
63
+ end
64
+ end
@@ -1,5 +1,5 @@
1
1
  #
2
2
  module AdminIt
3
3
  # Current gem version
4
- VERSION = '1.0.7'
4
+ VERSION = '1.0.8'
5
5
  end
data/lib/admin_it.rb CHANGED
@@ -1,13 +1,15 @@
1
- #require 'extend_it'
2
- #module AdminIt
3
- # using ExtendIt::Refines
4
- #end
1
+ require 'extend_it'
2
+ require File.join %w(extend_it ensures)
3
+
4
+ module AdminIt
5
+ using ExtendIt::Ensures if ExtendIt.config.use_refines?
6
+ end
5
7
 
6
8
  require File.join %w(admin_it env)
7
9
  require File.join %w(admin_it errors)
8
10
  require File.join %w(admin_it utils)
9
11
  require File.join %w(admin_it config)
10
- require File.join %w(admin_it renderable)
12
+ require File.join %w(admin_it shared)
11
13
  require File.join %w(admin_it data)
12
14
  require File.join %w(admin_it field)
13
15
  require File.join %w(admin_it filters)
@@ -1,8 +1,8 @@
1
1
  require 'forwardable'
2
- require File.join %w(extend_it symbolize)
2
+ require File.join %w(extend_it ensures)
3
3
  require File.join %w(extend_it asserts)
4
4
 
5
- using ExtendIt::Symbolize
5
+ using ExtendIt::Ensures if ExtendIt.config.use_refines?
6
6
 
7
7
  module ExtendIt
8
8
  module ArrayOf
@@ -38,7 +38,7 @@ module ExtendIt
38
38
 
39
39
  def scope(*names, &block)
40
40
  names.flatten.uniq.each do |name|
41
- name = name.symbolize || next
41
+ name = name.ensure_symbol || next
42
42
  @scopes[name] = block.nil? ? proc { |e| e.send(name) } : block
43
43
  str = name.to_s
44
44
  if str[-1] == '?'
@@ -1,8 +1,10 @@
1
1
  require File.join %w(extend_it caller)
2
- require File.join %w(extend_it symbolize)
2
+ require File.join %w(extend_it ensures)
3
3
 
4
- using ExtendIt::Caller
5
- using ExtendIt::Symbolize
4
+ if ExtendIt.config.use_refines?
5
+ using ExtendIt::Caller
6
+ using ExtendIt::Ensures
7
+ end
6
8
 
7
9
  module ExtendIt
8
10
  module Asserts
@@ -1,9 +1,9 @@
1
- require File.join %w(extend_it symbolize)
2
-
3
- using ExtendIt::Symbolize
1
+ require File.join %w(extend_it ensures)
4
2
 
5
3
  module ExtendIt
6
- module Class
4
+ module Base
5
+ using ExtendIt::Ensures if ExtendIt.config.use_refines?
6
+
7
7
  def self.extended(base)
8
8
  base.instance_eval do
9
9
  define_singleton_method :parents do
@@ -12,6 +12,23 @@ module ExtendIt
12
12
  end
13
13
  end
14
14
 
15
+ def metaclass(&block)
16
+ if @metaclass.nil?
17
+ @metaclass = (class << self; self end)
18
+ @metaclass.extend(Base)
19
+ end
20
+ @metaclass.class_eval(&block) if block_given?
21
+ @metaclass
22
+ end
23
+
24
+ def attr_checker(*names)
25
+ names.ensure_symbols.each do |name|
26
+ define_method "#{name}?" do
27
+ instance_variable_get("@#{name}") == true
28
+ end
29
+ end
30
+ end
31
+
15
32
  def call_inherited(method_name, *args, base_first: false, &block)
16
33
  arr = parents.select { |parent| parent.methods.include?(method_name) }
17
34
  arr.reverse! if base_first == true
@@ -29,16 +46,18 @@ module ExtendIt
29
46
  end
30
47
 
31
48
  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)
49
+ attrs.ensure_symbols.each do |attr_name|
50
+ attr_name.ensure_local_name || next
35
51
  next if instance_methods.include?(attr_name)
36
- var_name = "@#{attr_name}".to_sym
52
+ var_name = attr_name.ensure_instance_variable_name
37
53
  if methods.include?(attr_name)
38
54
  define_method(attr_name) { self.class.send(attr_name) }
39
- elsif instance_variable_defined?(var_name)
55
+ else
40
56
  define_method attr_name do
41
- self.class.instance_variable_get(var_name)
57
+ p = self.class.parents.find do |parent|
58
+ parent.instance_variable_defined?(var_name)
59
+ end
60
+ p.nil? ? nil : p.instance_variable_get(var_name)
42
61
  end
43
62
  end
44
63
  end
@@ -1,18 +1,18 @@
1
- require File.join %w(extend_it symbolize)
2
- require File.join %w(extend_it class)
3
-
4
- using ExtendIt::Symbolize
1
+ require File.join %w(extend_it ensures)
2
+ require File.join %w(extend_it base)
5
3
 
6
4
  module ExtendIt
7
5
  module Callbacks
6
+ using ExtendIt::Ensures if ExtendIt.config.use_refines?
7
+
8
8
  CALLBACKS = %i(before after around)
9
9
 
10
10
  def self.included(base)
11
11
  unless base.is_a?(Class)
12
12
  fail RuntimeError, 'Can be included in classes only'
13
13
  end
14
- unless (class << base; self end).included_modules.include?(ExtendIt::Class)
15
- fail RuntimeError, "#{base.name} should extend ExtendIt::Class"
14
+ unless (class << base; self end).included_modules.include?(Base)
15
+ fail RuntimeError, "#{base.name} should extend ExtendIt::Base"
16
16
  end
17
17
  base.extend(ClassMethods)
18
18
  end
@@ -83,7 +83,7 @@ module ExtendIt
83
83
  callbacks = [:before, :after] unless callbacks.is_a?(Array)
84
84
  callbacks.select! { |cb| CALLBACKS.include?(cb) }
85
85
  names.each do |name|
86
- name = name.symbolize || next
86
+ name = name.ensure_symbol || next
87
87
  callbacks.each do |cb|
88
88
  cb_name = "#{cb}_#{name}".to_sym
89
89
  var_name = "@#{cb_name}".to_sym
@@ -0,0 +1,30 @@
1
+ module ExtendIt
2
+ module Config
3
+ def self.use_refines(value = nil)
4
+ if value.nil?
5
+ @use_refines.nil? ? @use_refines = false : @use_refines
6
+ else
7
+ self.use_refines = value
8
+ end
9
+ end
10
+
11
+ def self.use_refines=(value)
12
+ unless RUBY_VERSION >= '2.1.0'
13
+ fail(
14
+ RuntimeError,
15
+ 'Refinements can be used only with ruby versions >= 2.1.0'
16
+ )
17
+ end
18
+ @use_refines = value == true
19
+ end
20
+
21
+ def self.use_refines?
22
+ @use_refines
23
+ end
24
+ end
25
+
26
+ def self.config
27
+ yield Config if block_given?
28
+ Config
29
+ end
30
+ end