csv_row_model 1.0.0.beta1 → 1.0.0.beta2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rspec +2 -1
- data/README.md +22 -9
- data/lib/csv_row_model/concerns/attributes_base.rb +86 -0
- data/lib/csv_row_model/concerns/check_options.rb +7 -9
- data/lib/csv_row_model/concerns/dynamic_columns_base.rb +47 -0
- data/lib/csv_row_model/concerns/export/attributes.rb +26 -0
- data/lib/csv_row_model/{export → concerns/export}/base.rb +1 -1
- data/lib/csv_row_model/concerns/export/dynamic_columns.rb +33 -0
- data/lib/csv_row_model/concerns/hidden_module.rb +15 -0
- data/lib/csv_row_model/concerns/import/attributes.rb +52 -0
- data/lib/csv_row_model/{import → concerns/import}/base.rb +10 -18
- data/lib/csv_row_model/{import → concerns/import}/csv_string_model.rb +2 -3
- data/lib/csv_row_model/concerns/import/dynamic_columns.rb +50 -0
- data/lib/csv_row_model/{import → concerns/import}/represents.rb +2 -2
- data/lib/csv_row_model/concerns/inspect.rb +5 -6
- data/lib/csv_row_model/{model/columns.rb → concerns/model/attributes.rb} +8 -31
- data/lib/csv_row_model/{model → concerns/model}/base.rb +1 -11
- data/lib/csv_row_model/{model → concerns/model}/children.rb +7 -1
- data/lib/csv_row_model/{model → concerns/model}/dynamic_columns.rb +23 -42
- data/lib/csv_row_model/export/file_model.rb +2 -15
- data/lib/csv_row_model/export.rb +3 -3
- data/lib/csv_row_model/import/file.rb +62 -22
- data/lib/csv_row_model/import/file_model.rb +3 -4
- data/lib/csv_row_model/import.rb +5 -9
- data/lib/csv_row_model/internal/attribute_base.rb +22 -0
- data/lib/csv_row_model/internal/concerns/column_shared.rb +21 -0
- data/lib/csv_row_model/internal/concerns/dynamic_column_shared.rb +28 -0
- data/lib/csv_row_model/internal/dynamic_column_attribute_base.rb +42 -0
- data/lib/csv_row_model/internal/export/attribute.rb +15 -0
- data/lib/csv_row_model/internal/export/dynamic_column_attribute.rb +21 -0
- data/lib/csv_row_model/{import/cell.rb → internal/import/attribute.rb} +4 -13
- data/lib/csv_row_model/{import → internal/import}/csv.rb +11 -13
- data/lib/csv_row_model/internal/import/dynamic_column_attribute.rb +33 -0
- data/lib/csv_row_model/{import → internal/import}/representation.rb +2 -2
- data/lib/csv_row_model/internal/model/dynamic_column_header.rb +22 -0
- data/lib/csv_row_model/internal/model/header.rb +25 -0
- data/lib/csv_row_model/model/file_model.rb +0 -1
- data/lib/csv_row_model/model.rb +5 -12
- data/lib/csv_row_model/validators/{boolean_format.rb → boolean_format_validator.rb} +1 -1
- data/lib/csv_row_model/validators/date_format_validator.rb +7 -0
- data/lib/csv_row_model/validators/date_time_format_validator.rb +7 -0
- data/lib/csv_row_model/validators/{default_change.rb → default_change_validator.rb} +0 -0
- data/lib/csv_row_model/validators/float_format_validator.rb +7 -0
- data/lib/csv_row_model/validators/integer_format_validator.rb +15 -0
- data/lib/csv_row_model/version.rb +1 -1
- data/lib/csv_row_model.rb +16 -37
- metadata +35 -33
- data/lib/csv_row_model/engine.rb +0 -5
- data/lib/csv_row_model/export/attributes.rb +0 -46
- data/lib/csv_row_model/export/cell.rb +0 -24
- data/lib/csv_row_model/export/dynamic_column_cell.rb +0 -29
- data/lib/csv_row_model/export/dynamic_columns.rb +0 -46
- data/lib/csv_row_model/import/attributes.rb +0 -66
- data/lib/csv_row_model/import/dynamic_column_cell.rb +0 -37
- data/lib/csv_row_model/import/dynamic_columns.rb +0 -59
- data/lib/csv_row_model/import/file/callbacks.rb +0 -17
- data/lib/csv_row_model/import/file/validations.rb +0 -43
- data/lib/csv_row_model/model/comparison.rb +0 -15
- data/lib/csv_row_model/model/dynamic_column_cell.rb +0 -44
- data/lib/csv_row_model/validators/date_format.rb +0 -9
- data/lib/csv_row_model/validators/date_time_format.rb +0 -9
- data/lib/csv_row_model/validators/float_format.rb +0 -9
- data/lib/csv_row_model/validators/integer_format.rb +0 -9
- data/lib/csv_row_model/validators/number_validator.rb +0 -16
- data/lib/csv_row_model/validators/validate_attributes.rb +0 -27
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'csv_row_model/internal/model/header'
|
2
|
+
require 'csv_row_model/internal/concerns/dynamic_column_shared'
|
3
|
+
|
4
|
+
module CsvRowModel
|
5
|
+
module Model
|
6
|
+
class DynamicColumnHeader < Header
|
7
|
+
include DynamicColumnShared
|
8
|
+
|
9
|
+
def value
|
10
|
+
header_models.map { |header_model| header_proc.call(header_model) }
|
11
|
+
end
|
12
|
+
|
13
|
+
def header_proc
|
14
|
+
options[:header] || ->(header_model) { format_header(header_model) }
|
15
|
+
end
|
16
|
+
|
17
|
+
def format_header(header_model)
|
18
|
+
row_model_class.format_dynamic_column_header(header_model, column_name, column_index, context)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'csv_row_model/internal/concerns/column_shared'
|
2
|
+
|
3
|
+
module CsvRowModel
|
4
|
+
module Model
|
5
|
+
class Header
|
6
|
+
include ColumnShared
|
7
|
+
|
8
|
+
attr_reader :column_name, :row_model_class, :context
|
9
|
+
|
10
|
+
def initialize(column_name, row_model_class, context)
|
11
|
+
@column_name = column_name
|
12
|
+
@row_model_class = row_model_class
|
13
|
+
@context = OpenStruct.new(context)
|
14
|
+
end
|
15
|
+
|
16
|
+
def value
|
17
|
+
options[:header] || formatted_header
|
18
|
+
end
|
19
|
+
|
20
|
+
def formatted_header
|
21
|
+
row_model_class.format_header(column_name, column_index, context)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/csv_row_model/model.rb
CHANGED
@@ -1,25 +1,18 @@
|
|
1
|
-
require 'csv_row_model/model/base'
|
2
|
-
require 'csv_row_model/model/
|
3
|
-
require 'csv_row_model/model/children'
|
4
|
-
require 'csv_row_model/model/dynamic_columns'
|
5
|
-
require 'csv_row_model/model/comparison'
|
1
|
+
require 'csv_row_model/concerns/model/base'
|
2
|
+
require 'csv_row_model/concerns/model/attributes'
|
3
|
+
require 'csv_row_model/concerns/model/children'
|
4
|
+
require 'csv_row_model/concerns/model/dynamic_columns'
|
6
5
|
|
7
6
|
module CsvRowModel
|
8
7
|
# Base module for representing a RowModel---a model that represents row(s).
|
9
8
|
module Model
|
10
9
|
extend ActiveSupport::Concern
|
11
10
|
|
12
|
-
include InheritedClassVar
|
13
|
-
|
14
11
|
include ActiveWarnings
|
15
|
-
include Validators::ValidateAttributes
|
16
12
|
|
17
13
|
include Base
|
18
|
-
|
19
|
-
include Columns
|
14
|
+
include Attributes
|
20
15
|
include Children
|
21
16
|
include DynamicColumns
|
22
|
-
|
23
|
-
include Comparison
|
24
17
|
end
|
25
18
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
class BooleanFormatValidator < ActiveModel::EachValidator # :nodoc:
|
2
2
|
# inspired by https://github.com/MrJoy/to_bool/blob/5c9ed38e47c638725e33530ea1a8aec96281af20/lib/to_bool.rb#L23
|
3
|
-
FALSE_BOOLEAN_REGEX = /^(false|f|no|n|0
|
3
|
+
FALSE_BOOLEAN_REGEX = /^(false|f|no|n|0)$/i
|
4
4
|
TRUE_BOOLEAN_REGEX = /^(true|t|yes|y|1)$/i
|
5
5
|
|
6
6
|
def validate_each(record, attribute, value)
|
File without changes
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class IntegerFormatValidator < ActiveModel::EachValidator # :nodoc:
|
2
|
+
def validate_each(record, attribute, value)
|
3
|
+
Integer(value)
|
4
|
+
rescue ArgumentError
|
5
|
+
integer = value.to_i
|
6
|
+
return if integer == value.to_f && integer != 0
|
7
|
+
add_error(record, attribute)
|
8
|
+
rescue TypeError
|
9
|
+
add_error(record, attribute)
|
10
|
+
end
|
11
|
+
|
12
|
+
def add_error(record, attribute)
|
13
|
+
record.errors.add(attribute, 'is not a Integer format')
|
14
|
+
end
|
15
|
+
end
|
data/lib/csv_row_model.rb
CHANGED
@@ -1,49 +1,28 @@
|
|
1
|
-
autoload = false
|
2
|
-
# autoload = true #uncomment for testing purposes only, not covered by rspec
|
3
|
-
|
4
1
|
class Boolean; end unless defined? Boolean
|
5
2
|
|
6
3
|
require 'csv_row_model/version'
|
7
4
|
|
5
|
+
require 'csv'
|
8
6
|
require 'active_model'
|
9
|
-
require 'active_support/all'
|
10
7
|
require 'active_warnings'
|
11
|
-
require 'csv'
|
12
|
-
|
13
|
-
require 'inherited_class_var'
|
14
|
-
|
15
|
-
if autoload && defined?(Rails)
|
16
|
-
require 'csv_row_model/engine'
|
17
|
-
else
|
18
|
-
require 'csv_row_model/concerns/inspect'
|
19
|
-
require 'csv_row_model/concerns/check_options'
|
20
|
-
|
21
|
-
require 'csv_row_model/validators/validate_attributes'
|
22
|
-
|
23
|
-
require 'csv_row_model/model'
|
24
|
-
require 'csv_row_model/model/file_model'
|
25
8
|
|
26
|
-
|
27
|
-
require 'csv_row_model/import/file_model'
|
28
|
-
require 'csv_row_model/import/csv'
|
29
|
-
require 'csv_row_model/import/file'
|
9
|
+
require 'csv_row_model/concerns/check_options'
|
30
10
|
|
11
|
+
require 'csv_row_model/model'
|
12
|
+
require 'csv_row_model/model/file_model'
|
31
13
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
end
|
14
|
+
require 'csv_row_model/import'
|
15
|
+
require 'csv_row_model/import/file_model'
|
16
|
+
require 'csv_row_model/import/file'
|
36
17
|
|
37
|
-
require 'csv_row_model/validators/default_change'
|
38
18
|
|
39
|
-
require 'csv_row_model/
|
40
|
-
require 'csv_row_model/
|
41
|
-
require 'csv_row_model/
|
42
|
-
require 'csv_row_model/validators/date_format'
|
43
|
-
require 'csv_row_model/validators/float_format'
|
44
|
-
require 'csv_row_model/validators/integer_format'
|
19
|
+
require 'csv_row_model/export'
|
20
|
+
require 'csv_row_model/export/file'
|
21
|
+
require 'csv_row_model/export/file_model'
|
45
22
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
23
|
+
require 'csv_row_model/validators/default_change_validator'
|
24
|
+
require 'csv_row_model/validators/boolean_format_validator'
|
25
|
+
require 'csv_row_model/validators/date_time_format_validator'
|
26
|
+
require 'csv_row_model/validators/date_format_validator'
|
27
|
+
require 'csv_row_model/validators/float_format_validator'
|
28
|
+
require 'csv_row_model/validators/integer_format_validator'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: csv_row_model
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.
|
4
|
+
version: 1.0.0.beta2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Steve Chung
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-
|
12
|
+
date: 2016-07-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activemodel
|
@@ -74,47 +74,49 @@ files:
|
|
74
74
|
- bin/setup
|
75
75
|
- csv_row_model.gemspec
|
76
76
|
- lib/csv_row_model.rb
|
77
|
+
- lib/csv_row_model/concerns/attributes_base.rb
|
77
78
|
- lib/csv_row_model/concerns/check_options.rb
|
79
|
+
- lib/csv_row_model/concerns/dynamic_columns_base.rb
|
80
|
+
- lib/csv_row_model/concerns/export/attributes.rb
|
81
|
+
- lib/csv_row_model/concerns/export/base.rb
|
82
|
+
- lib/csv_row_model/concerns/export/dynamic_columns.rb
|
83
|
+
- lib/csv_row_model/concerns/hidden_module.rb
|
84
|
+
- lib/csv_row_model/concerns/import/attributes.rb
|
85
|
+
- lib/csv_row_model/concerns/import/base.rb
|
86
|
+
- lib/csv_row_model/concerns/import/csv_string_model.rb
|
87
|
+
- lib/csv_row_model/concerns/import/dynamic_columns.rb
|
88
|
+
- lib/csv_row_model/concerns/import/represents.rb
|
78
89
|
- lib/csv_row_model/concerns/inspect.rb
|
79
|
-
- lib/csv_row_model/
|
90
|
+
- lib/csv_row_model/concerns/model/attributes.rb
|
91
|
+
- lib/csv_row_model/concerns/model/base.rb
|
92
|
+
- lib/csv_row_model/concerns/model/children.rb
|
93
|
+
- lib/csv_row_model/concerns/model/dynamic_columns.rb
|
80
94
|
- lib/csv_row_model/export.rb
|
81
|
-
- lib/csv_row_model/export/attributes.rb
|
82
|
-
- lib/csv_row_model/export/base.rb
|
83
|
-
- lib/csv_row_model/export/cell.rb
|
84
|
-
- lib/csv_row_model/export/dynamic_column_cell.rb
|
85
|
-
- lib/csv_row_model/export/dynamic_columns.rb
|
86
95
|
- lib/csv_row_model/export/file.rb
|
87
96
|
- lib/csv_row_model/export/file_model.rb
|
88
97
|
- lib/csv_row_model/import.rb
|
89
|
-
- lib/csv_row_model/import/attributes.rb
|
90
|
-
- lib/csv_row_model/import/base.rb
|
91
|
-
- lib/csv_row_model/import/cell.rb
|
92
|
-
- lib/csv_row_model/import/csv.rb
|
93
|
-
- lib/csv_row_model/import/csv_string_model.rb
|
94
|
-
- lib/csv_row_model/import/dynamic_column_cell.rb
|
95
|
-
- lib/csv_row_model/import/dynamic_columns.rb
|
96
98
|
- lib/csv_row_model/import/file.rb
|
97
|
-
- lib/csv_row_model/import/file/callbacks.rb
|
98
|
-
- lib/csv_row_model/import/file/validations.rb
|
99
99
|
- lib/csv_row_model/import/file_model.rb
|
100
|
-
- lib/csv_row_model/
|
101
|
-
- lib/csv_row_model/
|
100
|
+
- lib/csv_row_model/internal/attribute_base.rb
|
101
|
+
- lib/csv_row_model/internal/concerns/column_shared.rb
|
102
|
+
- lib/csv_row_model/internal/concerns/dynamic_column_shared.rb
|
103
|
+
- lib/csv_row_model/internal/dynamic_column_attribute_base.rb
|
104
|
+
- lib/csv_row_model/internal/export/attribute.rb
|
105
|
+
- lib/csv_row_model/internal/export/dynamic_column_attribute.rb
|
106
|
+
- lib/csv_row_model/internal/import/attribute.rb
|
107
|
+
- lib/csv_row_model/internal/import/csv.rb
|
108
|
+
- lib/csv_row_model/internal/import/dynamic_column_attribute.rb
|
109
|
+
- lib/csv_row_model/internal/import/representation.rb
|
110
|
+
- lib/csv_row_model/internal/model/dynamic_column_header.rb
|
111
|
+
- lib/csv_row_model/internal/model/header.rb
|
102
112
|
- lib/csv_row_model/model.rb
|
103
|
-
- lib/csv_row_model/model/base.rb
|
104
|
-
- lib/csv_row_model/model/children.rb
|
105
|
-
- lib/csv_row_model/model/columns.rb
|
106
|
-
- lib/csv_row_model/model/comparison.rb
|
107
|
-
- lib/csv_row_model/model/dynamic_column_cell.rb
|
108
|
-
- lib/csv_row_model/model/dynamic_columns.rb
|
109
113
|
- lib/csv_row_model/model/file_model.rb
|
110
|
-
- lib/csv_row_model/validators/
|
111
|
-
- lib/csv_row_model/validators/
|
112
|
-
- lib/csv_row_model/validators/
|
113
|
-
- lib/csv_row_model/validators/
|
114
|
-
- lib/csv_row_model/validators/
|
115
|
-
- lib/csv_row_model/validators/
|
116
|
-
- lib/csv_row_model/validators/number_validator.rb
|
117
|
-
- lib/csv_row_model/validators/validate_attributes.rb
|
114
|
+
- lib/csv_row_model/validators/boolean_format_validator.rb
|
115
|
+
- lib/csv_row_model/validators/date_format_validator.rb
|
116
|
+
- lib/csv_row_model/validators/date_time_format_validator.rb
|
117
|
+
- lib/csv_row_model/validators/default_change_validator.rb
|
118
|
+
- lib/csv_row_model/validators/float_format_validator.rb
|
119
|
+
- lib/csv_row_model/validators/integer_format_validator.rb
|
118
120
|
- lib/csv_row_model/version.rb
|
119
121
|
homepage: https://github.com/s12chung/csv_row_model
|
120
122
|
licenses:
|
data/lib/csv_row_model/engine.rb
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
require 'csv_row_model/export/cell'
|
2
|
-
|
3
|
-
module CsvRowModel
|
4
|
-
module Export
|
5
|
-
module Attributes
|
6
|
-
extend ActiveSupport::Concern
|
7
|
-
|
8
|
-
included do
|
9
|
-
self.column_names.each { |*args| define_attribute_method(*args) }
|
10
|
-
end
|
11
|
-
|
12
|
-
def cell_objects
|
13
|
-
@cell_objects ||= array_to_block_hash(self.class.column_names) { |column_name| Cell.new(column_name, self) }
|
14
|
-
end
|
15
|
-
|
16
|
-
# @return [Hash] a map of `column_name => formatted_attributes`
|
17
|
-
def formatted_attributes
|
18
|
-
array_to_block_hash(self.class.column_names) { |column_name| formatted_attribute(column_name) }
|
19
|
-
end
|
20
|
-
|
21
|
-
def formatted_attribute(column_name)
|
22
|
-
cell_objects[column_name].try(:value)
|
23
|
-
end
|
24
|
-
|
25
|
-
def source_attribute(column_name)
|
26
|
-
cell_objects[column_name].try(:source_value)
|
27
|
-
end
|
28
|
-
|
29
|
-
class_methods do
|
30
|
-
protected
|
31
|
-
# See {Model#column}
|
32
|
-
def column(column_name, options={})
|
33
|
-
super
|
34
|
-
define_attribute_method(column_name)
|
35
|
-
end
|
36
|
-
|
37
|
-
# Define default attribute method for a column
|
38
|
-
# @param column_name [Symbol] the cell's column_name
|
39
|
-
def define_attribute_method(column_name)
|
40
|
-
return if method_defined? column_name
|
41
|
-
define_method(column_name) { source_model.public_send(column_name) }
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
module CsvRowModel
|
2
|
-
module Export
|
3
|
-
class Cell
|
4
|
-
attr_reader :column_name, :row_model
|
5
|
-
|
6
|
-
def initialize(column_name, row_model)
|
7
|
-
@column_name = column_name
|
8
|
-
@row_model = row_model
|
9
|
-
end
|
10
|
-
|
11
|
-
def value
|
12
|
-
formatted_value
|
13
|
-
end
|
14
|
-
|
15
|
-
def formatted_value
|
16
|
-
@formatted_value ||= row_model.class.format_cell(source_value, column_name, row_model.class.index(column_name), row_model.context)
|
17
|
-
end
|
18
|
-
|
19
|
-
def source_value
|
20
|
-
row_model.public_send(column_name)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
module CsvRowModel
|
2
|
-
module Export
|
3
|
-
class DynamicColumnCell < CsvRowModel::Model::DynamicColumnCell
|
4
|
-
def unformatted_value
|
5
|
-
formatted_cells
|
6
|
-
end
|
7
|
-
|
8
|
-
def formatted_cells
|
9
|
-
cells.map.with_index.map do |cell, index|
|
10
|
-
row_model.class.format_cell(cell, column_name, dynamic_column_index + index, row_model.context)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def cells
|
15
|
-
header_models.map { |header_model| call_process_cell(header_model) }
|
16
|
-
end
|
17
|
-
|
18
|
-
def header_models
|
19
|
-
row_model.context.public_send(column_name)
|
20
|
-
end
|
21
|
-
|
22
|
-
class << self
|
23
|
-
def define_process_cell(row_model_class, column_name)
|
24
|
-
super { |header_model| header_model }
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
@@ -1,46 +0,0 @@
|
|
1
|
-
require 'csv_row_model/export/dynamic_column_cell'
|
2
|
-
|
3
|
-
module CsvRowModel
|
4
|
-
module Export
|
5
|
-
module DynamicColumns
|
6
|
-
extend ActiveSupport::Concern
|
7
|
-
|
8
|
-
included do
|
9
|
-
self.dynamic_column_names.each { |*args| define_dynamic_attribute_method(*args) }
|
10
|
-
end
|
11
|
-
|
12
|
-
def cell_objects
|
13
|
-
@dynamic_column_cell_objects ||= super.merge(array_to_block_hash(self.class.dynamic_column_names) do |column_name|
|
14
|
-
DynamicColumnCell.new(column_name, self)
|
15
|
-
end)
|
16
|
-
end
|
17
|
-
|
18
|
-
# @return [Array] an array of public_send(column_name) of the CSV model
|
19
|
-
def to_row
|
20
|
-
super.flatten
|
21
|
-
end
|
22
|
-
|
23
|
-
# See Model::Export#formatted_attributes
|
24
|
-
def formatted_attributes
|
25
|
-
super.merge!(array_to_block_hash(self.class.dynamic_column_names) { |column_name| formatted_attribute(column_name) })
|
26
|
-
end
|
27
|
-
|
28
|
-
class_methods do
|
29
|
-
protected
|
30
|
-
|
31
|
-
# See {Model::DynamicColumns#dynamic_column}
|
32
|
-
def dynamic_column(column_name, options={})
|
33
|
-
super
|
34
|
-
define_dynamic_attribute_method(column_name)
|
35
|
-
end
|
36
|
-
|
37
|
-
# Define default attribute method for a dynamic_column
|
38
|
-
# @param column_name [Symbol] the cell's column_name
|
39
|
-
def define_dynamic_attribute_method(column_name)
|
40
|
-
define_method(column_name) { formatted_attribute(column_name) }
|
41
|
-
DynamicColumnCell.define_process_cell(self, column_name)
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
@@ -1,66 +0,0 @@
|
|
1
|
-
require 'csv_row_model/import/cell'
|
2
|
-
|
3
|
-
module CsvRowModel
|
4
|
-
module Import
|
5
|
-
module Attributes
|
6
|
-
extend ActiveSupport::Concern
|
7
|
-
|
8
|
-
included do
|
9
|
-
self.column_names.each { |*args| define_attribute_method(*args) }
|
10
|
-
end
|
11
|
-
|
12
|
-
def cell_objects
|
13
|
-
@cell_objects ||= begin
|
14
|
-
csv_string_model.valid?
|
15
|
-
_cell_objects(csv_string_model.errors)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
# @return [Hash] a map of `column_name => original_attribute(column_name)`
|
20
|
-
def original_attributes
|
21
|
-
array_to_block_hash(self.class.column_names) { |column_name| original_attribute(column_name) }
|
22
|
-
end
|
23
|
-
|
24
|
-
# @return [Object] the column's attribute before override
|
25
|
-
def original_attribute(column_name)
|
26
|
-
cell_objects[column_name].try(:value)
|
27
|
-
end
|
28
|
-
|
29
|
-
# return [Hash] a map changes from {.column}'s default option': `column_name -> [value_before_default, default_set]`
|
30
|
-
def default_changes
|
31
|
-
array_to_block_hash(self.class.column_names) { |column_name| cell_objects[column_name].default_change }.delete_if {|k, v| v.blank? }
|
32
|
-
end
|
33
|
-
|
34
|
-
protected
|
35
|
-
# to prevent circular dependency with csv_string_model
|
36
|
-
def _cell_objects(csv_string_model_errors={})
|
37
|
-
array_to_block_hash(self.class.column_names) do |column_name|
|
38
|
-
Cell.new(column_name, mapped_row[column_name], csv_string_model_errors[column_name], self)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
class_methods do
|
43
|
-
protected
|
44
|
-
# See {Model#column}
|
45
|
-
def column(column_name, options={})
|
46
|
-
super
|
47
|
-
define_attribute_method(column_name)
|
48
|
-
end
|
49
|
-
|
50
|
-
def merge_options(column_name, options={})
|
51
|
-
original_options = columns[column_name]
|
52
|
-
csv_string_model_class.add_type_validation(column_name, columns[column_name]) unless original_options[:validate_type]
|
53
|
-
super
|
54
|
-
end
|
55
|
-
|
56
|
-
# Define default attribute method for a column
|
57
|
-
# @param column_name [Symbol] the cell's column_name
|
58
|
-
def define_attribute_method(column_name)
|
59
|
-
return if method_defined? column_name
|
60
|
-
csv_string_model_class.add_type_validation(column_name, columns[column_name])
|
61
|
-
define_method(column_name) { original_attribute(column_name) }
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
module CsvRowModel
|
2
|
-
module Import
|
3
|
-
class DynamicColumnCell < CsvRowModel::Model::DynamicColumnCell
|
4
|
-
attr_reader :source_headers, :source_cells
|
5
|
-
|
6
|
-
def initialize(column_name, source_headers, source_cells, row_model)
|
7
|
-
@source_headers = source_headers
|
8
|
-
@source_cells = source_cells
|
9
|
-
super(column_name, row_model)
|
10
|
-
end
|
11
|
-
|
12
|
-
def unformatted_value
|
13
|
-
formatted_cells.zip(formatted_headers).map do |formatted_cell, source_header|
|
14
|
-
call_process_cell(formatted_cell, source_header)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def formatted_cells
|
19
|
-
source_cells.map.with_index do |source_cell, index|
|
20
|
-
row_model.class.format_cell(source_cell, column_name, dynamic_column_index + index, row_model.context)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def formatted_headers
|
25
|
-
source_headers.map.with_index do |source_header, index|
|
26
|
-
row_model.class.format_dynamic_column_header(source_header, column_name, dynamic_column_index, index, row_model.context)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
class << self
|
31
|
-
def define_process_cell(row_model_class, column_name)
|
32
|
-
super { |formatted_cell, source_header| formatted_cell }
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
@@ -1,59 +0,0 @@
|
|
1
|
-
require 'csv_row_model/import/dynamic_column_cell'
|
2
|
-
|
3
|
-
module CsvRowModel
|
4
|
-
module Import
|
5
|
-
module DynamicColumns
|
6
|
-
extend ActiveSupport::Concern
|
7
|
-
|
8
|
-
included do
|
9
|
-
self.dynamic_column_names.each { |*args| define_dynamic_attribute_method(*args) }
|
10
|
-
end
|
11
|
-
|
12
|
-
def cell_objects
|
13
|
-
@dynamic_column_cell_objects ||= super.merge(array_to_block_hash(self.class.dynamic_column_names) do |column_name|
|
14
|
-
DynamicColumnCell.new(column_name, dynamic_column_source_headers, dynamic_column_source_cells, self)
|
15
|
-
end)
|
16
|
-
end
|
17
|
-
|
18
|
-
# @return [Hash] a map of `column_name => original_attribute(column_name)`
|
19
|
-
def original_attributes
|
20
|
-
super.merge!(array_to_block_hash(self.class.dynamic_column_names) { |column_name| original_attribute(column_name) })
|
21
|
-
end
|
22
|
-
|
23
|
-
# @return [Array] dynamic_column headers
|
24
|
-
def dynamic_column_source_headers
|
25
|
-
self.class.dynamic_column_source_headers source_header
|
26
|
-
end
|
27
|
-
|
28
|
-
# @return [Array] dynamic_column row data
|
29
|
-
def dynamic_column_source_cells
|
30
|
-
self.class.dynamic_column_source_cells source_row
|
31
|
-
end
|
32
|
-
|
33
|
-
class_methods do
|
34
|
-
def dynamic_column_source_headers(source_header)
|
35
|
-
dynamic_columns? ? source_header[columns.size..-1] : []
|
36
|
-
end
|
37
|
-
|
38
|
-
def dynamic_column_source_cells(source_row)
|
39
|
-
dynamic_columns? ? source_row[columns.size..-1] : []
|
40
|
-
end
|
41
|
-
|
42
|
-
protected
|
43
|
-
|
44
|
-
# See {Model#dynamic_column}
|
45
|
-
def dynamic_column(column_name, options={})
|
46
|
-
super
|
47
|
-
define_dynamic_attribute_method(column_name)
|
48
|
-
end
|
49
|
-
|
50
|
-
# Define default attribute method for a column
|
51
|
-
# @param column_name [Symbol] the cell's column_name
|
52
|
-
def define_dynamic_attribute_method(column_name)
|
53
|
-
define_method(column_name) { original_attribute(column_name) }
|
54
|
-
DynamicColumnCell.define_process_cell(self, column_name)
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
module CsvRowModel
|
2
|
-
module Import
|
3
|
-
class File
|
4
|
-
module Callbacks
|
5
|
-
extend ActiveSupport::Concern
|
6
|
-
|
7
|
-
included do
|
8
|
-
extend ActiveModel::Callbacks
|
9
|
-
|
10
|
-
define_model_callbacks :each_iteration
|
11
|
-
define_model_callbacks :next
|
12
|
-
define_model_callbacks :abort, :skip, only: :before
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|