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.
- checksums.yaml +4 -4
- data/.ruby-version +1 -0
- data/README.md +6 -0
- data/lib/admin_it/context/collection_context.rb +5 -22
- data/lib/admin_it/context/context.rb +13 -34
- data/lib/admin_it/context/show_context.rb +8 -7
- data/lib/admin_it/context/single_context.rb +35 -33
- data/lib/admin_it/context/table_context.rb +18 -11
- data/lib/admin_it/context/tiles_context.rb +14 -14
- data/lib/admin_it/data/active_record.rb +0 -2
- data/lib/admin_it/field/field.rb +95 -23
- data/lib/admin_it/filters/field_filter.rb +4 -0
- data/lib/admin_it/filters/filter.rb +37 -14
- data/lib/admin_it/helpers/table.rb +13 -17
- data/lib/admin_it/resource.rb +58 -115
- data/lib/admin_it/shared.rb +64 -0
- data/lib/admin_it/version.rb +1 -1
- data/lib/admin_it.rb +7 -5
- data/lib/extend_it/array_of.rb +3 -3
- data/lib/extend_it/asserts.rb +5 -3
- data/lib/extend_it/{class.rb → base.rb} +29 -10
- data/lib/extend_it/callbacks.rb +7 -7
- data/lib/extend_it/config.rb +30 -0
- data/lib/extend_it/dsl.rb +223 -64
- data/lib/extend_it/ensures.rb +193 -0
- data/lib/extend_it.rb +1 -1
- data/spec/extend_it/config_spec.rb +52 -0
- data/spec/extend_it/dsl_spec.rb +149 -0
- data/spec/extend_it/ensures_spec.rb +39 -0
- data/spec/lib/context/collection_context_spec.rb +4 -2
- data/spec/lib/context/context_spec.rb +3 -1
- data/spec/lib/context/single_context_spec.rb +3 -2
- data/spec/lib/data/object_spec.rb +2 -2
- data/spec/lib/field_spec.rb +1 -56
- data/spec/lib/resource_spec.rb +1 -13
- data/spec/spec_helper.rb +7 -0
- data/spec/support/example_groups/context_example_group.rb +3 -3
- metadata +14 -11
- data/lib/admin_it/renderable.rb +0 -18
- data/lib/extend_it/refines.rb +0 -6
- data/lib/extend_it/symbolize.rb +0 -39
- data/spec/lib/definitions_spec.rb +0 -171
- data/spec/lib/utils_spec.rb +0 -39
data/lib/admin_it/resource.rb
CHANGED
@@ -1,62 +1,52 @@
|
|
1
|
-
require File.join %w(extend_it
|
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::
|
4
|
+
using ExtendIt::Ensures
|
7
5
|
|
8
6
|
module AdminIt
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
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
|
-
|
24
|
-
|
25
|
-
|
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
|
-
|
30
|
-
|
31
|
-
|
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
|
-
|
37
|
-
|
38
|
-
|
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
|
-
|
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
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
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
|
-
|
115
|
-
@contexts[name]
|
104
|
+
context(name)
|
116
105
|
end
|
117
106
|
|
118
|
-
def context(
|
119
|
-
|
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
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
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
|
-
|
284
|
-
|
285
|
-
|
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[
|
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
|
data/lib/admin_it/version.rb
CHANGED
data/lib/admin_it.rb
CHANGED
@@ -1,13 +1,15 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
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
|
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)
|
data/lib/extend_it/array_of.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
require 'forwardable'
|
2
|
-
require File.join %w(extend_it
|
2
|
+
require File.join %w(extend_it ensures)
|
3
3
|
require File.join %w(extend_it asserts)
|
4
4
|
|
5
|
-
using ExtendIt::
|
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.
|
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] == '?'
|
data/lib/extend_it/asserts.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
require File.join %w(extend_it caller)
|
2
|
-
require File.join %w(extend_it
|
2
|
+
require File.join %w(extend_it ensures)
|
3
3
|
|
4
|
-
|
5
|
-
using ExtendIt::
|
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
|
2
|
-
|
3
|
-
using ExtendIt::Symbolize
|
1
|
+
require File.join %w(extend_it ensures)
|
4
2
|
|
5
3
|
module ExtendIt
|
6
|
-
module
|
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.
|
33
|
-
attr_name
|
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 =
|
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
|
-
|
55
|
+
else
|
40
56
|
define_method attr_name do
|
41
|
-
self.class.
|
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
|
data/lib/extend_it/callbacks.rb
CHANGED
@@ -1,18 +1,18 @@
|
|
1
|
-
require File.join %w(extend_it
|
2
|
-
require File.join %w(extend_it
|
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?(
|
15
|
-
fail RuntimeError, "#{base.name} should extend ExtendIt::
|
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.
|
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
|