admin_it 1.0.5 → 1.0.6

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d370fe1c01e8e574315d4d5988d8b6bae33d5b39
4
- data.tar.gz: fdfa047dee1d91755c46e7cda5159c52a59f9ef9
3
+ metadata.gz: d3a63565c2793d51ed2992d7d4e01deeecc68543
4
+ data.tar.gz: 2fe03cded06fe4a4fedc76b2244f727a9dfaa876
5
5
  SHA512:
6
- metadata.gz: efcfb8cce0d3a3d5c273cecba04587d71f2a942685b29df42a0c4337078167487f27c77c4eca241759de54436d1653af8d7bf007da86a97ff1e1870f633a5bef
7
- data.tar.gz: 05b34351cab3a244be6e070b81f1992fb63665b9cb7546509f1651e0ed8ba5510375fd30e76b7ba25fc9c2cbb51b2dfe4757d57a8ed56cffcd254055ccce00e2
6
+ metadata.gz: 1cc3714caf30a63432ca69c6bed8ab1e6b01947918b6f7024daeb9a8951fbd026c1ec7ede09037b61386f0622e2971f0d1b2ae25a9c5532125bebb5169bc647b
7
+ data.tar.gz: ed25582af138eca0e80f23b1e2205880b4a74bc6ad830c74adf027ebfcf6eed05407e0180b14e2f15b074df284ba1362bf16b75f9c5f79d3f33ce8516431f4b9
data/README.md CHANGED
@@ -28,6 +28,7 @@ bundle install
28
28
  # Todo
29
29
 
30
30
  * use_fields not working in root resource context
31
+ * human-readable date and time fields
31
32
  * Test coverage
32
33
  * Entities editing/creating
33
34
 
@@ -37,6 +38,10 @@ bundle install
37
38
 
38
39
  # Changes
39
40
 
41
+ `1.0.6`
42
+
43
+ * fixed: [#1](/../../issues/1)
44
+
40
45
  `1.0.5`
41
46
 
42
47
  * font-awesome asset path fix
@@ -24,13 +24,13 @@
24
24
  - if filter.values.include?(v[:value])
25
25
  - a_class = 'label-success'
26
26
  - href = url_for(for_context.url_params( \
27
- filters: "#{filter.name}(-#{filter.value(v[:value])})", \
27
+ filters: "!#{filter.name}(-#{filter.value(v[:value])})", \
28
28
  active_filter: filter.name \
29
29
  ))
30
30
  - else
31
31
  - a_class = 'label-info'
32
32
  - href = url_for(for_context.url_params( \
33
- filters: "#{filter.name}(+#{filter.value(v[:value])})", \
33
+ filters: "!#{filter.name}(+#{filter.value(v[:value])})", \
34
34
  active_filter: filter.name \
35
35
  ))
36
36
  a class="label #{a_class}" href==href
@@ -1,4 +1,5 @@
1
1
  require 'json'
2
+ require 'csv'
2
3
  require File.join %w(extend_it symbolize)
3
4
 
4
5
  using ExtendIt::Symbolize
@@ -128,23 +129,7 @@ module AdminIt
128
129
  @filters ||= {}
129
130
  value.strip!
130
131
  @filters = {} if value.empty?
131
- value.split(/[;|]/).each do |str|
132
- str.strip!
133
- remove = str[0] == '-'
134
- str = str[1..-1] if remove
135
- m = Filter::REGEXP.match(str)
136
- next if m.nil?
137
- if remove
138
- @filters.delete(m[:name].to_sym)
139
- else
140
- name = m[:name].to_sym
141
- if @filters.key?(name)
142
- @filters[name].change(m[:params])
143
- else
144
- @filters[name] = Filter.load(str, self.class.filters)
145
- end
146
- end
147
- end
132
+ Filter.apply(value, @filters, self.class.filters)
148
133
  else
149
134
  @filters = {}
150
135
  end
@@ -15,9 +15,30 @@ module AdminIt
15
15
  include ExtendIt::Callbacks
16
16
  extend ExtendIt::Asserts
17
17
 
18
- REGEXP = /\A(?<name>[a-zA-Z_][a-zA-Z0-9_]*)(?:\((?<params>[^)]*)\))?\z/
19
-
20
- define_callbacks :save
18
+ REGEXP = /
19
+ (?<=\A|[,;|])\s*
20
+ (?<full>
21
+ (?<action>[!+\-])?
22
+ (?<name>[a-zA-Z_][a-zA-Z0-9_]*)
23
+ (?:\((?<params>[^)]*)\))?
24
+ )
25
+ \s*(?=[,;|]|\z)
26
+ /x
27
+
28
+ ARGUMENT_REGEXP = /
29
+ (?<=\A|[,;|])\s*
30
+ (?:
31
+ (?:(?<action>[+\-])|(?:(?<option>[a-zA-Z_][a-zA-Z0-9_]*)\s*:\s*))?
32
+ (?<token>
33
+ (?:'(?:[^\\']|\\.)*')|
34
+ (?:"(?:[^\\"]|\\.)*")|
35
+ (?:[^,;|\s]+)
36
+ )
37
+ )
38
+ \s*(?=[,;|]|\z)
39
+ /x
40
+
41
+ define_callbacks :initialize, :save, :load
21
42
 
22
43
  class << self
23
44
  extend ExtendIt::Dsl
@@ -49,29 +70,38 @@ module AdminIt
49
70
  create_class(name, _resource)
50
71
  end
51
72
 
52
- def self.load(str, filters)
73
+ def self.load(str, filter_classes)
53
74
  m = REGEXP.match(str)
54
- return nil if m.nil?
75
+ return nil if m.nil? || m[:action] == '-'
55
76
  name = m[:name].to_sym
56
- filter_class = filters.find { |f| f.filter_name == name }
77
+ filter_class = filter_classes.find { |f| f.filter_name == name }
57
78
  return nil if filter_class.nil?
58
- opts = {}
59
- args = m[:params].nil? ? [] : m[:params].split(',').map do |param|
60
- param.strip!
61
- arr = param.split(':')
62
- if arr.size > 1
63
- opts[arr[0].strip.to_sym] = arr[1].strip
64
- nil
79
+ filter = filter_class.new
80
+ filter.load(m[:params])
81
+ filter
82
+ end
83
+
84
+ def self.apply(str, filters, filter_classes)
85
+ list = str.scan(Filter::REGEXP)
86
+ filters.clear if list.all? { |_, act, _, _| act.nil? || act.empty? }
87
+ list.each do |full, action, name, params|
88
+ name = name.to_sym
89
+ if action == '-'
90
+ filters.delete(name)
91
+ elsif action == '!'
92
+ filters[name].load(params) if filters.key?(name)
65
93
  else
66
- arr[0]
94
+ filters[name] = Filter.load(full, filter_classes)
67
95
  end
68
96
  end
69
- args << opts unless opts.empty?
70
- filter_class.new(*args.compact)
71
97
  end
72
98
 
73
99
  class_attr_reader :display_name
74
100
 
101
+ def initialize
102
+ run_callbacks :initialize
103
+ end
104
+
75
105
  def name
76
106
  @name ||= self.class.filter_name
77
107
  end
@@ -90,7 +120,13 @@ module AdminIt
90
120
  result
91
121
  end
92
122
 
93
- def change(str)
123
+ def load(str)
124
+ return if str.nil?
125
+ args = parse_arguments(str)
126
+ unless args.empty?
127
+ opts = args.extract_options!
128
+ run_callbacks :load, arguments: { arguments: args, options: opts }
129
+ end
94
130
  end
95
131
 
96
132
  def apply(collection)
@@ -117,6 +153,34 @@ module AdminIt
117
153
  TIME_REGEXP = /\A#{TIME}\z/
118
154
  DATETIME_REGEXP = /\A#{DATE}(?:\s+|[\/.\-])#{TIME}\z/
119
155
 
156
+ def param_action(str)
157
+ case str
158
+ when '+' then :add
159
+ when '-' then :remove
160
+ else nil
161
+ end
162
+ end
163
+
164
+ def parse_arguments(str)
165
+ opts = {}
166
+ args = []
167
+ parent = self.class.parents.find do |p|
168
+ p.const_defined?(:ARGUMENT_REGEXP)
169
+ end
170
+ unless parent.nil?
171
+ str.scan(parent.const_get(:ARGUMENT_REGEXP)) do |a, o, v|
172
+ if o.nil? || o.empty?
173
+ action = param_action(a)
174
+ action.nil? ? args << v : (opts[action] ||= []) << v
175
+ else
176
+ opts[o.to_sym] = v
177
+ end
178
+ end
179
+ end
180
+ args << opts unless opts.empty?
181
+ args
182
+ end
183
+
120
184
  def parse_argument(arg)
121
185
  return arg unless arg.is_a?(String)
122
186
  arg.strip!
@@ -2,27 +2,25 @@ module AdminIt
2
2
  class ValueFilter < FieldFilter
3
3
  attr_reader :values
4
4
 
5
- def initialize(*values, **opts)
6
- @values = values.map { |v| parse_argument(v) }.uniq
5
+ def initialize
6
+ @values = []
7
7
  end
8
8
 
9
9
  before_save do |arguments: [], options: {}|
10
10
  arguments.concat(@values.map { |v| create_argument(v) })
11
11
  end
12
12
 
13
- def change(str)
14
- return if str.nil? || !str.is_a?(String) || str.empty?
15
- @values = [] unless /[+\-]/ =~ str
16
- str.split(',').each do |param|
17
- param.strip!
18
- if param[0] == '-'
19
- @values.delete_if { |v| v == parse_argument(param[1..-1]) }
20
- else
21
- param = param[1..-1] if param[0] == '+'
22
- @values << parse_argument(param)
13
+ after_load do |arguments: [], options: {}|
14
+ unless arguments.empty?
15
+ @values = arguments.map { |v| parse_argument(v) }.uniq
16
+ end
17
+ if options.key?(:add)
18
+ @values.concat(options[:add].map { |v| parse_argument(v) }).uniq!
19
+ elsif options.key?(:remove)
20
+ options[:remove].each do |remove|
21
+ @values.delete_if { |v| v == parse_argument(remove) }
23
22
  end
24
23
  end
25
- @values.uniq!
26
24
  end
27
25
 
28
26
  def all_values(collection = nil, &block)
@@ -1,5 +1,5 @@
1
1
  #
2
2
  module AdminIt
3
3
  # Current gem version
4
- VERSION = '1.0.5'
4
+ VERSION = '1.0.6'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: admin_it
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.5
4
+ version: 1.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexey Ovchinnikov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-13 00:00:00.000000000 Z
11
+ date: 2014-03-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails