activerecord-bixformer 0.3.17 → 0.4.0
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 +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
|