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
@@ -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