activerecord-bixformer 0.3.17 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/activerecord-bixformer/attribute/base.rb +1 -1
- data/lib/activerecord-bixformer/attribute/boolean.rb +3 -3
- data/lib/activerecord-bixformer/attribute/booletania.rb +1 -1
- data/lib/activerecord-bixformer/attribute/date.rb +1 -1
- data/lib/activerecord-bixformer/attribute/enumerize.rb +1 -1
- data/lib/activerecord-bixformer/attribute/integer.rb +42 -0
- data/lib/activerecord-bixformer/attribute/time.rb +1 -1
- data/lib/activerecord-bixformer/autoload.rb +1 -1
- data/lib/activerecord-bixformer/error.rb +5 -11
- data/lib/activerecord-bixformer/model/base.rb +20 -0
- data/lib/activerecord-bixformer/model/csv/base.rb +8 -4
- data/lib/activerecord-bixformer/model/csv/indexed.rb +8 -8
- data/lib/activerecord-bixformer/model/csv/mapped.rb +8 -8
- data/lib/activerecord-bixformer/plan.rb +3 -1
- data/lib/activerecord-bixformer/plan_accessor.rb +10 -0
- data/lib/activerecord-bixformer/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b7480345d2a5db1dcd0809914ddaba4bbe4de9cc
|
4
|
+
data.tar.gz: eda722ac022f0565ae4b3a84e6ddafc727f049ba
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4c0d417aa86d387084d73e7b0f21a5bb2216419ecccf473624fa1b455495539a37ac3cba99a5c14027eb3640a1f9ed7b552858181f29d80592a61db1932e46f9
|
7
|
+
data.tar.gz: dba239a89c70239e002a504fb85042a8c3a92aee9084d57f625f41fa16db2cd9e82fdc3cc71f9d40b341b9b102e822c36e81458fa012a2f34d3ea9398aba186d
|
@@ -3,7 +3,7 @@ module ActiveRecord
|
|
3
3
|
module Attribute
|
4
4
|
class Boolean < ::ActiveRecord::Bixformer::Attribute::Base
|
5
5
|
def export(record)
|
6
|
-
true_value
|
6
|
+
true_value = (@options.is_a?(::Hash) && @options[:true]) || 'true'
|
7
7
|
false_value = (@options.is_a?(::Hash) && @options[:false]) || 'false'
|
8
8
|
|
9
9
|
record_attribute_value(record).present? ? true_value : false_value
|
@@ -12,7 +12,7 @@ module ActiveRecord
|
|
12
12
|
def import(value)
|
13
13
|
return nil if value.blank?
|
14
14
|
|
15
|
-
true_value
|
15
|
+
true_value = (@options.is_a?(::Hash) && @options[:true]) || 'true'
|
16
16
|
false_value = (@options.is_a?(::Hash) && @options[:false]) || 'false'
|
17
17
|
|
18
18
|
case value
|
@@ -21,7 +21,7 @@ module ActiveRecord
|
|
21
21
|
when false_value
|
22
22
|
false
|
23
23
|
else
|
24
|
-
raise ::ActiveRecord::Bixformer::
|
24
|
+
raise ::ActiveRecord::Bixformer::AttributeError.new(self, value) if @options[:raise]
|
25
25
|
end
|
26
26
|
end
|
27
27
|
end
|
@@ -18,7 +18,7 @@ module ActiveRecord
|
|
18
18
|
|
19
19
|
return boolean_of[value] if boolean_of.key?(value)
|
20
20
|
|
21
|
-
raise ::ActiveRecord::Bixformer::
|
21
|
+
raise ::ActiveRecord::Bixformer::AttributeError.new(self, value) if @options[:raise]
|
22
22
|
end
|
23
23
|
end
|
24
24
|
end
|
@@ -14,7 +14,7 @@ module ActiveRecord
|
|
14
14
|
return nil if value.blank?
|
15
15
|
|
16
16
|
@model.activerecord_constant.__send__(@name).options.to_h[value.strip] or
|
17
|
-
raise ::ActiveRecord::Bixformer::
|
17
|
+
raise ::ActiveRecord::Bixformer::AttributeError.new(self, value) if @options[:raise]
|
18
18
|
end
|
19
19
|
end
|
20
20
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
module Bixformer
|
3
|
+
module Attribute
|
4
|
+
class Integer < ::ActiveRecord::Bixformer::Attribute::Base
|
5
|
+
def import(value)
|
6
|
+
return nil if value.blank?
|
7
|
+
|
8
|
+
unless value.strip.match(/\A[0-9]+\z/)
|
9
|
+
if @options[:raise]
|
10
|
+
raise ::ActiveRecord::Bixformer::AttributeError.new(self, value, :not_an_integer)
|
11
|
+
else
|
12
|
+
return nil
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
numeric_value = value.to_i
|
17
|
+
|
18
|
+
[
|
19
|
+
[:greater_than, -> (o, n) { n > o }],
|
20
|
+
[:greater_than_or_equal_to, -> (o, n) { n >= o }],
|
21
|
+
[:less_than, -> (o, n) { n < o }],
|
22
|
+
[:less_than_or_equal_to, -> (o, n) { n <= o }],
|
23
|
+
].each do |restrict_name, validator|
|
24
|
+
restrict_value = @options[restrict_name]
|
25
|
+
|
26
|
+
next unless restrict_value.is_a?(::Integer)
|
27
|
+
|
28
|
+
next if validator.call(restrict_value, numeric_value)
|
29
|
+
|
30
|
+
if @options[:raise]
|
31
|
+
raise ::ActiveRecord::Bixformer::AttributeError.new(self, value, restrict_name, count: restrict_value)
|
32
|
+
else
|
33
|
+
return nil
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
numeric_value
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -9,7 +9,6 @@ module ActiveRecord
|
|
9
9
|
autoload :Errors, 'activerecord-bixformer/error'
|
10
10
|
autoload :ImportError, 'activerecord-bixformer/error'
|
11
11
|
autoload :AttributeError, 'activerecord-bixformer/error'
|
12
|
-
autoload :DataInvalid, 'activerecord-bixformer/error'
|
13
12
|
|
14
13
|
module Attribute
|
15
14
|
autoload :Base, 'activerecord-bixformer/attribute/base'
|
@@ -18,6 +17,7 @@ module ActiveRecord
|
|
18
17
|
autoload :Date, 'activerecord-bixformer/attribute/date'
|
19
18
|
autoload :Enumerize, 'activerecord-bixformer/attribute/enumerize'
|
20
19
|
autoload :FormattedForeignKey, 'activerecord-bixformer/attribute/formatted_foreign_key'
|
20
|
+
autoload :Integer, 'activerecord-bixformer/attribute/integer'
|
21
21
|
autoload :Override, 'activerecord-bixformer/attribute/override'
|
22
22
|
autoload :String, 'activerecord-bixformer/attribute/string'
|
23
23
|
autoload :Time, 'activerecord-bixformer/attribute/time'
|
@@ -21,10 +21,10 @@ module ActiveRecord
|
|
21
21
|
end
|
22
22
|
|
23
23
|
class AttributeError < ::StandardError
|
24
|
-
def initialize(attribute, value, type)
|
24
|
+
def initialize(attribute, value, type = :invalid, options = {})
|
25
25
|
@attribute = attribute.model.translate(attribute.name)
|
26
26
|
|
27
|
-
super(generate_message(attribute, type, value))
|
27
|
+
super(generate_message(attribute, type, value, options))
|
28
28
|
end
|
29
29
|
|
30
30
|
def full_message
|
@@ -34,7 +34,7 @@ module ActiveRecord
|
|
34
34
|
private
|
35
35
|
|
36
36
|
# implemented with referencing to https://github.com/rails/rails/blob/517cf249c369d4bca40b1f590ca641d8b717985e/activemodel/lib/active_model/errors.rb#L462
|
37
|
-
def generate_message(attribute, type, value)
|
37
|
+
def generate_message(attribute, type, value, options)
|
38
38
|
model_klass = attribute.model.activerecord_constant
|
39
39
|
model_scope = model_klass.i18n_scope
|
40
40
|
|
@@ -58,21 +58,15 @@ module ActiveRecord
|
|
58
58
|
|
59
59
|
key = defaults.shift
|
60
60
|
|
61
|
-
options =
|
61
|
+
options = options.merge(
|
62
62
|
default: defaults,
|
63
63
|
model: model_klass.model_name.human,
|
64
64
|
attribute: model_klass.human_attribute_name(attribute.name),
|
65
65
|
value: value
|
66
|
-
|
66
|
+
)
|
67
67
|
|
68
68
|
I18n.translate(key, options)
|
69
69
|
end
|
70
70
|
end
|
71
|
-
|
72
|
-
class DataInvalid < AttributeError
|
73
|
-
def initialize(attribute, value)
|
74
|
-
super(attribute, value, :invalid)
|
75
|
-
end
|
76
|
-
end
|
77
71
|
end
|
78
72
|
end
|
@@ -39,6 +39,7 @@ module ActiveRecord
|
|
39
39
|
|
40
40
|
@preferred_skip_attributes = @plan.pickup_value_for(self, :preferred_skip_attributes, [])
|
41
41
|
@default_values = @plan.pickup_value_for(self, :default_values, {})
|
42
|
+
@sort_indexes = @plan.pickup_value_for(self, :sort_indexes, {})
|
42
43
|
|
43
44
|
# At present, translation function is only i18n
|
44
45
|
@translator = ::ActiveRecord::Bixformer::Translator::I18n.new
|
@@ -193,6 +194,25 @@ module ActiveRecord
|
|
193
194
|
|
194
195
|
values
|
195
196
|
end
|
197
|
+
|
198
|
+
def sortable_value(attribute, value)
|
199
|
+
index = @sort_indexes[attribute.name] || @plan.entry_attribute_size
|
200
|
+
|
201
|
+
{ index: index, value: value }
|
202
|
+
end
|
203
|
+
|
204
|
+
def sort(sortable_values)
|
205
|
+
sortable_values_size = sortable_values.size.to_f
|
206
|
+
|
207
|
+
sortable_values.sort_by.with_index(0) do |v, i|
|
208
|
+
# Enumerable#sort は安定ではないので、 sort_by を使って、
|
209
|
+
# 明示的にユニークで必ず増加する数値を加えることで、同じ index だった場合に
|
210
|
+
# 順序が変わらないことを保証する
|
211
|
+
v[:index] + i / sortable_values_size
|
212
|
+
end.map do |v|
|
213
|
+
v[:value]
|
214
|
+
end
|
215
|
+
end
|
196
216
|
end
|
197
217
|
end
|
198
218
|
end
|
@@ -25,10 +25,7 @@ module ActiveRecord
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def csv_titles
|
28
|
-
|
29
|
-
*@attributes.map { |attr| csv_title(attr.name) },
|
30
|
-
*@associations.flat_map(&:csv_titles)
|
31
|
-
]
|
28
|
+
sort(sortable_csv_titles)
|
32
29
|
end
|
33
30
|
|
34
31
|
def csv_title(attribute_name)
|
@@ -75,6 +72,13 @@ module ActiveRecord
|
|
75
72
|
association.import(csv_body_row, self_record_id)
|
76
73
|
end
|
77
74
|
end
|
75
|
+
|
76
|
+
def sortable_csv_titles
|
77
|
+
[
|
78
|
+
*@attributes.map { |attr| sortable_value(attr, csv_title(attr.name)) },
|
79
|
+
*@associations.flat_map { |assoc| assoc.__send__(:sortable_csv_titles) }
|
80
|
+
]
|
81
|
+
end
|
78
82
|
end
|
79
83
|
end
|
80
84
|
end
|
@@ -44,14 +44,6 @@ module ActiveRecord
|
|
44
44
|
super
|
45
45
|
end
|
46
46
|
|
47
|
-
def csv_titles
|
48
|
-
(1..options[:size]).flat_map do |index|
|
49
|
-
update_translator(index)
|
50
|
-
|
51
|
-
super
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
47
|
def csv_title(attribute_name)
|
56
48
|
# TODO: indexed 以外の複数を扱うクラスがあった時の対処が必要
|
57
49
|
if parents.find { |parent| parent.is_a?(::ActiveRecord::Bixformer::Model::Csv::Indexed) }
|
@@ -63,6 +55,14 @@ module ActiveRecord
|
|
63
55
|
|
64
56
|
private
|
65
57
|
|
58
|
+
def sortable_csv_titles
|
59
|
+
(1..options[:size]).flat_map do |index|
|
60
|
+
update_translator(index)
|
61
|
+
|
62
|
+
super
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
66
|
def update_translator(index)
|
67
67
|
@translator.model_arguments = { index: index }
|
68
68
|
|
@@ -46,14 +46,6 @@ module ActiveRecord
|
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
|
-
def csv_titles
|
50
|
-
@options[:in].flat_map do |key|
|
51
|
-
update_translator(key)
|
52
|
-
|
53
|
-
super
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
49
|
def translate(attribute_name)
|
58
50
|
# TODO: mapped 以外の複数を扱うクラスがあった時の対処が必要
|
59
51
|
if parents.find { |parent| parent.is_a?(::ActiveRecord::Bixformer::Model::Csv::Mapped) }
|
@@ -65,6 +57,14 @@ module ActiveRecord
|
|
65
57
|
|
66
58
|
private
|
67
59
|
|
60
|
+
def sortable_csv_titles
|
61
|
+
@options[:in].flat_map do |key|
|
62
|
+
update_translator(key)
|
63
|
+
|
64
|
+
super
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
68
|
def update_translator(key)
|
69
69
|
key = @options[:translate] ? @options[:translate].call(key) : key
|
70
70
|
|
@@ -14,6 +14,7 @@ module ActiveRecord
|
|
14
14
|
class_attribute :__bixformer_unique_attributes
|
15
15
|
class_attribute :__bixformer_required_condition
|
16
16
|
class_attribute :__bixformer_default_values
|
17
|
+
class_attribute :__bixformer_sort_indexes
|
17
18
|
class_attribute :__bixformer_translation_config
|
18
19
|
|
19
20
|
self.__bixformer_entry = {}
|
@@ -22,6 +23,7 @@ module ActiveRecord
|
|
22
23
|
self.__bixformer_unique_attributes = []
|
23
24
|
self.__bixformer_required_condition = {}
|
24
25
|
self.__bixformer_default_values = {}
|
26
|
+
self.__bixformer_sort_indexes = {}
|
25
27
|
self.__bixformer_translation_config = { scope: :bixformer, extend_scopes: [] }
|
26
28
|
end
|
27
29
|
|
@@ -36,7 +38,7 @@ module ActiveRecord
|
|
36
38
|
|
37
39
|
[
|
38
40
|
:entry, :preferred_skip_attributes, :required_attributes, :unique_attributes,
|
39
|
-
:required_condition, :default_values, :translation_config
|
41
|
+
:required_condition, :default_values, :sort_indexes, :translation_config
|
40
42
|
].each do |config_name|
|
41
43
|
define_method "bixformer_#{config_name}" do |v|
|
42
44
|
self.__send__("__bixformer_#{config_name}=", v)
|
@@ -100,6 +100,16 @@ module ActiveRecord
|
|
100
100
|
[type, arguments]
|
101
101
|
end
|
102
102
|
|
103
|
+
def entry_attribute_size
|
104
|
+
counter = -> (v) do
|
105
|
+
(v[:attributes] || {}).keys.size + (v[:associations] || {}).values.inject(0) do |sum, assoc_v|
|
106
|
+
sum + counter.call(assoc_v)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
@entry_attribute_size ||= counter.call(compile_config_value(:entry))
|
111
|
+
end
|
112
|
+
|
103
113
|
private
|
104
114
|
|
105
115
|
def compile_config_value(config_name)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-bixformer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hiroaki Otsu
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-10-
|
11
|
+
date: 2016-10-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -229,6 +229,7 @@ files:
|
|
229
229
|
- lib/activerecord-bixformer/attribute/date.rb
|
230
230
|
- lib/activerecord-bixformer/attribute/enumerize.rb
|
231
231
|
- lib/activerecord-bixformer/attribute/formatted_foreign_key.rb
|
232
|
+
- lib/activerecord-bixformer/attribute/integer.rb
|
232
233
|
- lib/activerecord-bixformer/attribute/override.rb
|
233
234
|
- lib/activerecord-bixformer/attribute/string.rb
|
234
235
|
- lib/activerecord-bixformer/attribute/time.rb
|