csv_row_model 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1875456398a0d03c7704e622ef2fb992c628d436
4
- data.tar.gz: 8da58e2819b99eb9be2caa92e319ec505fa7f6b5
3
+ metadata.gz: 1659654bb54054a7ee93eacb161b4aeb1d6dcca7
4
+ data.tar.gz: b3f0d04925efa748ac1cbab7ca9445824d5b9f3d
5
5
  SHA512:
6
- metadata.gz: be79b067b838f8541dc176f82ba86dab9d4719354d8c500ed93f50bafc14e0eeeb9564e528c85fa619116d1b2274de0c217d7ab4ae81d2e6a9549f3eea3ead6c
7
- data.tar.gz: 09c668f2d08663000b284c91d1b1c77fea8109fc84b392143035fb39f9cca3f9ed6707084a8d0b3308d133384dfa7fc3fc517dc39d928b77f03d727599b2fccc
6
+ metadata.gz: 4a2576d69bb8c8ee6116a3df5041625fac583068ba9711db8caa37c2420553b0d03b2aa7fd2f84d3735b3a28a95b091398a9a5dd244b4cada34cbdab611bd7e7
7
+ data.tar.gz: c5cc99b9063d8529fdf6b4dc8dc507cf3df60165ca1c3e5347499f6af1baf5ee7e8a04d4d4b38cc0020240d6cb7331480a5080aa37bda2b2d337c179039b1620
data/README.md CHANGED
@@ -289,7 +289,7 @@ class ProjectImportRowModel < ProjectRowModel
289
289
 
290
290
  # this is shorthand for the psuedo_code:
291
291
  # def project
292
- # return if row_model.id.invalid? || row_model.name.invalid?
292
+ # return if row_model.id.blank? || row_model.name.blank?
293
293
  #
294
294
  # # turn off memoziation with `memoize: false` option
295
295
  # @project ||= __the_code_inside_the_block__
@@ -328,9 +328,9 @@ Also, the `attribute` defines a dynamic `#project` method that:
328
328
 
329
329
  1. Memoizes by default, turn off with `memoize: false` option
330
330
  2. All errors of `row_model` are propagated to the presenter when calling `presenter.valid?`
331
- 3. Handles dependencies. When any of the dependencies are `invalid?`:
332
- - The attribute block is not called and the attribute returns `nil`.
333
- - `presenter.errors` for dependencies are cleaned. For the example above, if `row_model.id/name` are `invalid?`, then
331
+ 3. Handles dependencies:
332
+ - When any of the dependencies are `blank?`, the attribute block is not called and the attribute returns `nil`.
333
+ - When any of the dependencies are `invalid?`, `presenter.errors` for dependencies are cleaned. For the example above, if `row_model.id/name` are `invalid?`, then
334
334
  the `:project` key is removed from the errors, so: `presenter.errors.keys # => [:id, :name]`
335
335
 
336
336
  ## Import Validations
@@ -440,7 +440,8 @@ class DynamicColumnModel
440
440
 
441
441
  column :first_name
442
442
  column :last_name
443
- dynamic_column :skills
443
+ # header is optional, below is the default_implementation
444
+ dynamic_column :skills, header: ->(skill_name) { skill_name }
444
445
  end
445
446
  ```
446
447
 
@@ -465,13 +466,6 @@ class DynamicColumnExportModel < DynamicColumnModel
465
466
  # below is an override, this is the default implementation: skill_name # => "skill1", then "skill2"
466
467
  source_model.skills.include?(skill_name) ? "Yes" : "No"
467
468
  end
468
-
469
- class << self
470
- # this is an override with the default implementation
471
- def skill_header(skill_name)
472
- skill_name
473
- end
474
- end
475
469
  end
476
470
 
477
471
  # the `skills` context is mapped to generate an array
@@ -1,8 +1,14 @@
1
+ require 'csv_row_model/concerns/invalid_options'
2
+
1
3
  module CsvRowModel
2
4
  module Concerns
3
5
  module InheritedClassVar
4
6
  extend ActiveSupport::Concern
5
7
 
8
+ included do
9
+ include InvalidOptions
10
+ end
11
+
6
12
  class_methods do
7
13
  # Clears the cache for a variable
8
14
  # @param variable_name [Symbol] variable_name to cache against
@@ -12,9 +18,41 @@ module CsvRowModel
12
18
 
13
19
  protected
14
20
 
21
+ # @param variable_name [Symbol] class variable name
22
+ def inherited_class_hash(variable_name, options={})
23
+ options = check_and_merge_options(options, dependencies: [])
24
+
25
+ options[:dependencies].each do |dependency_name|
26
+ define_singleton_method dependency_name do
27
+ class_cache(hidden_variable_name(dependency_name)) do
28
+ send("_#{dependency_name}")
29
+ end
30
+ end
31
+ end
32
+
33
+ hidden_variable_name = hidden_variable_name(variable_name)
34
+ define_singleton_method variable_name do
35
+ inherited_class_var(hidden_variable_name, {}, :merge)
36
+ end
37
+ define_singleton_method "merge_#{variable_name}" do |merge_value|
38
+ value = instance_variable_get(hidden_variable_name) || instance_variable_set(hidden_variable_name, {})
39
+
40
+ deep_clear_class_cache(hidden_variable_name)
41
+ options[:dependencies].each {|dependency_name| deep_clear_class_cache(hidden_variable_name(dependency_name)) }
42
+
43
+ value.merge!(merge_value)
44
+ end
45
+ end
46
+
47
+ # @param variable_name [Symbol] class variable name based on
48
+ # @return [Symbol] the hidden variable name for class_cache
49
+ def hidden_variable_name(variable_name)
50
+ "@_#{variable_name}".to_sym
51
+ end
52
+
15
53
  # @param included_module [Module] module to search for
16
54
  # @return [Array<Module>] inherited_ancestors of included_module (including self)
17
- def inherited_ancestors(included_module=inherited_class_module)
55
+ def inherited_ancestors(included_module=CsvRowModel::Concerns::InheritedClassVar)
18
56
  included_model_index = ancestors.index(included_module)
19
57
  included_model_index == 0 ? [included_module] : ancestors[0..(included_model_index - 1)]
20
58
  end
@@ -0,0 +1,17 @@
1
+ module CsvRowModel
2
+ module Concerns
3
+ module InvalidOptions
4
+ extend ActiveSupport::Concern
5
+
6
+ class_methods do
7
+ protected
8
+ def check_and_merge_options(options, default_options)
9
+ invalid_options = options.keys - default_options.keys
10
+ raise ArgumentError.new("Invalid option(s): #{invalid_options}") if invalid_options.present?
11
+
12
+ options.reverse_merge(default_options)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,52 @@
1
+ module CsvRowModel
2
+ module Export
3
+ module Attributes
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ self.column_names.each { |*args| define_attribute_method(*args) }
8
+ end
9
+
10
+ # @return [Hash] a map of `column_name => self.class.format_cell()public_send(column_name))`
11
+ def formatted_attributes
12
+ formatted_attributes_from_column_names self.class.column_names
13
+ end
14
+
15
+ def formatted_attribute(column_name)
16
+ self.class.format_cell(
17
+ public_send(column_name),
18
+ column_name,
19
+ self.class.index(column_name)
20
+ )
21
+ end
22
+
23
+ protected
24
+ def formatted_attributes_from_column_names(column_names)
25
+ array_to_block_hash(column_names) { |column_name| formatted_attribute(column_name) }
26
+ end
27
+
28
+ class_methods do
29
+ # See {Model#column}
30
+ def column(column_name, options={})
31
+ super
32
+ define_attribute_method(column_name)
33
+ end
34
+
35
+ # Define default attribute method for a column
36
+ # @param column_name [Symbol] the cell's column_name
37
+ def define_attribute_method(column_name)
38
+ define_method(column_name) do
39
+ source_model.public_send(column_name)
40
+ end
41
+ end
42
+
43
+ # Safe to override. Method applied to each cell by default
44
+ #
45
+ # @param cell [Object] the cell's value
46
+ def format_cell(cell, column_name, column_index)
47
+ cell
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -12,6 +12,11 @@ module CsvRowModel
12
12
  super.flatten
13
13
  end
14
14
 
15
+ # See Model::Columns#formatted_attributes
16
+ def formatted_attributes
17
+ super.merge(formatted_attributes_from_column_names(self.class.dynamic_column_names))
18
+ end
19
+
15
20
  class_methods do
16
21
  protected
17
22
 
@@ -16,10 +16,13 @@ module CsvRowModel
16
16
  # Add a row_model to the
17
17
  # @param [] source_model the source model of the export row model
18
18
  # @param [Hash] context the extra context given to the instance of the row model
19
+ # @return [CsvRowModel::Export] the row model appended
19
20
  def append_model(source_model, context={})
20
- export_model_class.new(source_model, context.to_h.reverse_merge(self.context)).to_rows.each do |row|
21
+ row_model = export_model_class.new(source_model, context.reverse_merge(self.context))
22
+ row_model.to_rows.each do |row|
21
23
  csv << row
22
24
  end
25
+ row_model
23
26
  end
24
27
  alias_method :<<, :append_model
25
28
 
@@ -35,7 +38,7 @@ module CsvRowModel
35
38
  CSV.open(file.path, "wb") do |csv|
36
39
  @csv = csv
37
40
  export_model_class.setup(csv, context, with_headers: with_headers)
38
- yield self
41
+ yield Proxy.new(self)
39
42
  end
40
43
  ensure
41
44
  @csv = nil
@@ -44,6 +47,17 @@ module CsvRowModel
44
47
  def to_s
45
48
  file.read
46
49
  end
50
+
51
+ class Proxy
52
+ def initialize(file)
53
+ @file = file
54
+ end
55
+
56
+ def append_model(*args)
57
+ @file.append_model(*args)
58
+ end
59
+ alias_method :<<, :append_model
60
+ end
47
61
  end
48
62
  end
49
63
  end
@@ -1,4 +1,5 @@
1
1
  require 'csv_row_model/export/dynamic_columns'
2
+ require 'csv_row_model/export/attributes'
2
3
 
3
4
  module CsvRowModel
4
5
  # Include this to with {Model} to have a RowModel for exporting to CSVs.
@@ -6,11 +7,10 @@ module CsvRowModel
6
7
  extend ActiveSupport::Concern
7
8
 
8
9
  included do
10
+ include Attributes
9
11
  include DynamicColumns
10
- attr_reader :source_model, :context
11
-
12
- self.column_names.each { |*args| define_attribute_method(*args) }
13
12
 
13
+ attr_reader :source_model, :context
14
14
  validates :source_model, presence: true
15
15
  end
16
16
 
@@ -27,34 +27,13 @@ module CsvRowModel
27
27
 
28
28
  # @return [Array] an array of public_send(column_name) of the CSV model
29
29
  def to_row
30
- attributes.values
30
+ formatted_attributes.values
31
31
  end
32
32
 
33
33
  class_methods do
34
34
  def setup(csv, context={}, with_headers: true)
35
35
  csv << headers(context) if with_headers
36
36
  end
37
-
38
- # See {Model#column}
39
- def column(column_name, options={})
40
- super
41
- define_attribute_method(column_name)
42
- end
43
-
44
- # Define default attribute method for a column
45
- # @param column_name [Symbol] the cell's column_name
46
- def define_attribute_method(column_name)
47
- define_method(column_name) do
48
- self.class.format_cell(source_model.public_send(column_name), column_name, self.class.index(column_name))
49
- end
50
- end
51
-
52
- # Safe to override. Method applied to each cell by default
53
- #
54
- # @param cell [Object] the cell's value
55
- def format_cell(cell, column_name, column_index)
56
- cell
57
- end
58
37
  end
59
38
  end
60
39
  end
@@ -102,16 +102,13 @@ module CsvRowModel
102
102
  def _read_row(skipped_rows={}, index=@index, ruby_csv=@ruby_csv)
103
103
  return unless valid?
104
104
 
105
- loop do
106
- row = ruby_csv.readline
105
+ row = ruby_csv.readline
106
+ raise "empty?" if row.try(:empty?)
107
107
 
108
- raise "empty?" if row.try(:empty?)
109
-
110
- index += 1 if index
108
+ index += 1 if index
111
109
 
112
- yield row if block_given?
113
- return row
114
- end
110
+ yield row if block_given?
111
+ row
115
112
  rescue Exception => e
116
113
  index += 1 if index
117
114
  yield [] if block_given?
@@ -5,6 +5,8 @@ module CsvRowModel
5
5
  include Concerns::Inspect
6
6
  include ActiveWarnings
7
7
 
8
+ inherited_class_hash :attributes, dependencies: %i[dependencies]
9
+
8
10
  attr_reader :row_model
9
11
 
10
12
  delegate :context, to: :row_model
@@ -64,15 +66,16 @@ module CsvRowModel
64
66
  end
65
67
 
66
68
  # @param [Array] Array of column_names to check
67
- # @return [Boolean] if column_names are valid
68
- def row_model_valid?(*column_names)
69
- row_model.valid? || (row_model.errors.keys & column_names).empty?
69
+ # @return [Boolean] if column_names are present
70
+ def row_model_present?(*column_names)
71
+ column_names.each { |column_name| return false if row_model.public_send(column_name).blank? }
72
+ true
70
73
  end
71
74
 
72
75
  # @param [Symbol] attribute_name the attribute to check
73
76
  # @return [Boolean] if the dependencies are valid
74
77
  def valid_dependencies?(attribute_name)
75
- row_model_valid?(*self.class.options(attribute_name)[:dependencies])
78
+ row_model_present?(*self.class.options(attribute_name)[:dependencies])
76
79
  end
77
80
 
78
81
  # equal to: @method_name ||= yield
@@ -84,20 +87,11 @@ module CsvRowModel
84
87
  end
85
88
 
86
89
  class << self
87
- def inherited_class_module
88
- Presenter
89
- end
90
-
91
90
  # @return [Array<Symbol>] attribute names for the Presenter
92
91
  def attribute_names
93
92
  attributes.keys
94
93
  end
95
94
 
96
- # @return [Hash{Symbol => Array}] map of `attribute_name => [options, block]`
97
- def attributes
98
- inherited_class_var :@_presenter_attributes, {}, :merge
99
- end
100
-
101
95
  # @param [Symbol] attribute_name name of attribute to find option
102
96
  # @return [Hash] options for the attribute_name
103
97
  def options(attribute_name)
@@ -110,32 +104,23 @@ module CsvRowModel
110
104
  attributes[attribute_name].last
111
105
  end
112
106
 
107
+ protected
113
108
  # @return [Hash{Symbol => Array}] map of `dependency => [array of presenter attributes dependent on dependency]`
114
- def dependencies
115
- class_cache(:@_presenter_dependencies) do
116
- dependencies = {}
117
- attribute_names.each do |attribute_name|
118
- options(attribute_name)[:dependencies].each do |dependency|
119
- dependencies[dependency] ||= []
120
- dependencies[dependency] << attribute_name
121
- end
109
+ def _dependencies
110
+ dependencies = {}
111
+ attribute_names.each do |attribute_name|
112
+ options(attribute_name)[:dependencies].each do |dependency|
113
+ dependencies[dependency] ||= []
114
+ dependencies[dependency] << attribute_name
122
115
  end
123
- dependencies
124
116
  end
117
+ dependencies
125
118
  end
126
119
 
127
- protected
128
120
  def inspect_methods
129
121
  @inspect_methods ||= %i[row_model].freeze
130
122
  end
131
123
 
132
- def merge_attribute(attribute_hash)
133
- @_presenter_attributes ||= {}
134
- deep_clear_class_cache(:@_presenter_attributes)
135
- deep_clear_class_cache(:@_presenter_dependencies)
136
- @_presenter_attributes.merge! attribute_hash
137
- end
138
-
139
124
  # Adds column to the row model
140
125
  #
141
126
  # @param [Symbol] attribute_name name of attribute to add
@@ -144,13 +129,9 @@ module CsvRowModel
144
129
  # @option options [Hash] :memoize whether to memoize the attribute (default: true)
145
130
  # @option options [Hash] :dependencies the dependcies it has with the underlying row_model (default: [])
146
131
  def attribute(attribute_name, options={}, &block)
147
- default_options = { memoize: true, dependencies: [] }
148
- invalid_options = options.keys - default_options.keys
149
- raise ArgumentError.new("Invalid option(s): #{invalid_options}") if invalid_options.present?
150
-
151
- options = options.reverse_merge(default_options)
132
+ options = check_and_merge_options(options, memoize: true, dependencies: [])
152
133
 
153
- merge_attribute(attribute_name.to_sym => [options, block])
134
+ merge_attributes(attribute_name.to_sym => [options, block])
154
135
  define_attribute_method(attribute_name)
155
136
  end
156
137
 
@@ -12,7 +12,7 @@ module CsvRowModel
12
12
  include Attributes
13
13
  include DynamicColumns
14
14
 
15
- attr_reader :attr_reader, :source_header, :source_row, :context, :index, :previous
15
+ attr_reader :source_header, :source_row, :context, :index, :previous
16
16
 
17
17
  self.column_names.each { |*args| define_attribute_method(*args) }
18
18
 
@@ -2,6 +2,9 @@ module CsvRowModel
2
2
  module Model
3
3
  module Children
4
4
  extend ActiveSupport::Concern
5
+ included do
6
+ inherited_class_hash :has_many_relationships
7
+ end
5
8
 
6
9
  # @return [Boolean] returns true, if the instance is a child
7
10
  def child?
@@ -40,20 +43,6 @@ module CsvRowModel
40
43
  end
41
44
 
42
45
  class_methods do
43
- # Won't work for Export right now
44
- #
45
- # @return [Hash] map of `relation_name => CsvRowModel::Import or CsvRowModel::Export class`
46
- def has_many_relationships
47
- inherited_class_var :@_has_many_relationships, {}, :merge
48
- end
49
-
50
- protected
51
- def merge_has_many_relationships(relation_hash)
52
- @_has_many_relationships ||= {}
53
- deep_clear_class_cache(:@_has_many_relationships)
54
- @_has_many_relationships.merge! relation_hash
55
- end
56
-
57
46
  # Defines a relationship between a row model (only one relation per model for now).
58
47
  #
59
48
  # @param [Symbol] relation_name the name of the relation
@@ -2,6 +2,9 @@ module CsvRowModel
2
2
  module Model
3
3
  module Columns
4
4
  extend ActiveSupport::Concern
5
+ included do
6
+ inherited_class_hash :columns
7
+ end
5
8
 
6
9
  # @return [Hash] a map of `column_name => public_send(column_name)`
7
10
  def attributes
@@ -17,10 +20,16 @@ module CsvRowModel
17
20
  end
18
21
 
19
22
  protected
23
+
20
24
  def attributes_from_column_names(column_names)
21
- column_names
22
- .zip(column_names.map { |column_name| public_send(column_name) })
23
- .to_h
25
+ array_to_block_hash(column_names) { |column_name| public_send(column_name) }
26
+ end
27
+
28
+ def array_to_block_hash(array, &block)
29
+ array
30
+ .zip(
31
+ array.map { |column_name| block.call(column_name) }
32
+ ).to_h
24
33
  end
25
34
 
26
35
  class_methods do
@@ -29,11 +38,6 @@ module CsvRowModel
29
38
  columns.keys
30
39
  end
31
40
 
32
- # @return [Hash] column names mapped to their options
33
- def columns
34
- inherited_class_var(:@_columns, {}, :merge)
35
- end
36
-
37
41
  # @param [Symbol] column_name name of column to find option
38
42
  # @return [Hash] options for the column_name
39
43
  def options(column_name)
@@ -55,7 +59,7 @@ module CsvRowModel
55
59
  # @param [Hash, OpenStruct] context name of column to check
56
60
  # @return [Array] column headers for the row model
57
61
  def headers(context={})
58
- @headers ||= columns.map { |name, options| options[:header] || format_header(name) }
62
+ columns.map { |name, options| options[:header] || format_header(name) }
59
63
  end
60
64
 
61
65
  # Safe to override
@@ -67,12 +71,6 @@ module CsvRowModel
67
71
 
68
72
  protected
69
73
 
70
- def merge_columns(column_hash)
71
- @_columns ||= {}
72
- deep_clear_class_cache(:@_columns)
73
- @_columns.merge!(column_hash)
74
- end
75
-
76
74
  VALID_OPTIONS_KEYS = %i[type parse validate_type default header header_matchs].freeze
77
75
 
78
76
  # Adds column to the row model
@@ -3,6 +3,10 @@ module CsvRowModel
3
3
  module DynamicColumns
4
4
  extend ActiveSupport::Concern
5
5
 
6
+ included do
7
+ inherited_class_hash :dynamic_columns
8
+ end
9
+
6
10
  # See Model::Columns#attributes
7
11
  def attributes
8
12
  super.merge(attributes_from_column_names(self.class.dynamic_column_names))
@@ -11,9 +15,14 @@ module CsvRowModel
11
15
  class_methods do
12
16
  # See Model::Columns::headers
13
17
  def headers(context={})
14
- @headers ||= super + dynamic_column_names.map do |column_name|
18
+ super + dynamic_column_headers(context)
19
+ end
20
+
21
+ def dynamic_column_headers(context={})
22
+ dynamic_column_names.map do |column_name|
15
23
  OpenStruct.new(context).public_send(column_name).each do |header_model|
16
- public_send(header_method_name(column_name), header_model)
24
+ header_proc = dynamic_column_options(column_name)[:header] || ->(header_model) { header_model }
25
+ instance_exec(header_model, &header_proc)
17
26
  end
18
27
  end.flatten
19
28
  end
@@ -24,32 +33,22 @@ module CsvRowModel
24
33
  offset ? columns.size + offset : nil
25
34
  end
26
35
 
36
+ def dynamic_column_options(column_name)
37
+ dynamic_columns[column_name]
38
+ end
39
+
27
40
  # @return [Array<Symbol>] column names for the row model
28
41
  def dynamic_column_names
29
42
  dynamic_columns.keys
30
43
  end
31
44
 
32
- # @return [Hash] column names mapped to their options
33
- def dynamic_columns
34
- inherited_class_var(:@_dynamic_columns, {}, :merge)
35
- end
36
-
37
- def header_method_name(column_name)
38
- "#{column_name.to_s.singularize}_header"
39
- end
40
45
  def singular_dynamic_attribute_method_name(column_name)
41
46
  column_name.to_s.singularize
42
47
  end
43
48
 
44
49
  protected
45
50
 
46
- def merge_dynamic_columns(column_hash)
47
- @_dynamic_columns ||= {}
48
- deep_clear_class_cache(:@_dynamic_columns)
49
- @_dynamic_columns.merge!(column_hash)
50
- end
51
-
52
- VALID_OPTIONS_KEYS = [].freeze
51
+ VALID_OPTIONS_KEYS = %i[header].freeze
53
52
 
54
53
  # define a dynamic_column, must be after all normal columns
55
54
  #
@@ -60,14 +59,8 @@ module CsvRowModel
60
59
  extra_keys = options.keys - VALID_OPTIONS_KEYS
61
60
  raise ArgumentError.new("invalid options #{extra_keys}") unless extra_keys.empty?
62
61
 
63
- define_header_method(column_name)
64
-
65
62
  merge_dynamic_columns(column_name.to_sym => options)
66
63
  end
67
-
68
- def define_header_method(column_name)
69
- define_singleton_method(header_method_name(column_name)) { |header_model| header_model }
70
- end
71
64
  end
72
65
  end
73
66
  end
@@ -61,10 +61,6 @@ module CsvRowModel
61
61
  def csv_string_model(&block)
62
62
  csv_string_model_class.class_eval(&block)
63
63
  end
64
-
65
- def inherited_class_module
66
- Model
67
- end
68
64
  end
69
65
  end
70
66
  end
@@ -1,3 +1,3 @@
1
1
  module CsvRowModel
2
- VERSION = "0.2.1"
2
+ VERSION = "0.3.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: csv_row_model
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steve Chung
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-10-28 00:00:00.000000000 Z
11
+ date: 2015-11-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -62,8 +62,10 @@ files:
62
62
  - lib/csv_row_model.rb
63
63
  - lib/csv_row_model/concerns/inherited_class_var.rb
64
64
  - lib/csv_row_model/concerns/inspect.rb
65
+ - lib/csv_row_model/concerns/invalid_options.rb
65
66
  - lib/csv_row_model/engine.rb
66
67
  - lib/csv_row_model/export.rb
68
+ - lib/csv_row_model/export/attributes.rb
67
69
  - lib/csv_row_model/export/dynamic_columns.rb
68
70
  - lib/csv_row_model/export/file.rb
69
71
  - lib/csv_row_model/export/file_model.rb
@@ -111,7 +113,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
111
113
  version: '0'
112
114
  requirements: []
113
115
  rubyforge_project:
114
- rubygems_version: 2.4.6
116
+ rubygems_version: 2.4.5
115
117
  signing_key:
116
118
  specification_version: 4
117
119
  summary: Import and export your custom CSVs with a intuitive shared Ruby interface.