rexport 1.1.0 → 1.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d221ba1ce52250f615cf3a2fe317802c1e1971c8fa823fc3c4716b2a1413f74c
4
- data.tar.gz: 78a2d0efc121851ec21c4705b35bfc752b80623a216951e168c15d405cf3f3ae
3
+ metadata.gz: 4b74f494058f073c3dbb32d53a74274bce5223f64d09c75ed971e9b0c2ba27a0
4
+ data.tar.gz: 7b4eec86b8a911ce049bc8205f656fa0904d4b5f405eeb1475a07e6cdfe658e6
5
5
  SHA512:
6
- metadata.gz: 53cde5307d7655120b1b1416a2a98171ad2af779c862d030e65c2917212037166138349802ff7506b007a10d616ad88260b34e8e9a485a434c9de5fd36bcf0b0
7
- data.tar.gz: 01b4c0e5ecdffb6528cbce4e0406bea8bbffdc772f81721cfe6fd7f0a02fc8d9e95477b3c11fbab61174a881ca57c89140a68fa0d60a1004ccaa0d4c375fcd67
6
+ metadata.gz: 9437e26f118ac7e267faa26e5b662d4391e09462501955b1d6c93e6eda8ceddf6c61a8c5e498b531d4da8e3eb6761984901e5b944f59f8dabc7bad288bd4f13c
7
+ data.tar.gz: 7287f82ee398f49c45a424d0a7538127d96bdfb3cb5e6160cc9d19b72eca2688976af71db0731f898f6d5c73147c4de9954fc086ea6faccfe6f61800b8351210
@@ -1,8 +1,8 @@
1
- <tr id="<%= dom_id(export_item) %>" class="<%= cycle('odd','even') %> <%= @export.modifiable? ? 'handle' : '' %>">
1
+ <%= tag.tr(id: dom_id(export_item), class: "handle") do %>
2
2
  <td class="row_title"><%= export_item.name %></td>
3
3
  <td><%= export_item.rexport_field %></td>
4
4
  <td class="table_icons">
5
- <%= link_to(image_tag('icon_edit.gif'), edit_export_item_path(export_item)) if @export.modifiable? %>
6
- <%= link_to_delete(export_item, text: false) if @export.modifiable? %>
5
+ <%= link_to(image_tag('icon_edit.gif'), edit_export_item_path(export_item)) %>
6
+ <%= link_to_delete(export_item, text: false) %>
7
7
  </td>
8
- </tr>
8
+ <% end %>
@@ -2,7 +2,7 @@
2
2
  <div id="custom_export_options">
3
3
  <h4>Options</h4>
4
4
  <ul>
5
- <li><%= link_to("#{image_tag('icon_edit.gif')} Edit".html_safe, edit_export_path(@export)) if @export.modifiable? %></li>
5
+ <li><%= link_to("#{image_tag('icon_edit.gif')} Edit".html_safe, edit_export_path(@export)) %></li>
6
6
  <li><%= link_to "#{image_tag('icon_export.png')} Export".html_safe, export_path(@export, format: :csv) %></li>
7
7
  <li><%= link_to "#{image_tag('icon_copy.png')} Copy".html_safe, exports_path(:original_export_id => @export.id), method: :post %></li>
8
8
  </ul>
@@ -29,12 +29,12 @@
29
29
  <th class='action_icons'>&nbsp;</th>
30
30
  </tr>
31
31
  </thead>
32
- <%= content_tag :tbody, {id: 'export_items'}.merge(@export.modifiable? ? {class: 'sortable', 'data-url' => export_item_sorting_path} : {}) do %>
32
+ <%= tag.tbody(id: 'export_items', class: 'sortable', 'data-url' => export_item_sorting_path) do %>
33
33
  <%= render partial: @export.export_items.ordered %>
34
34
  <% end %>
35
35
  </table>
36
36
 
37
- <%= content_tag(:p, 'Drag and drop the rows in the table above to re-order the export data left to right in the output (see sample below).', class: 'instructions') if @export.modifiable? %>
37
+ <%= tag.p('Drag and drop the rows in the table above to re-order the export data left to right in the output (see sample below).', class: 'instructions') %>
38
38
 
39
39
  <%= render(partial: 'filters') unless @export.export_filters.blank? %>
40
40
 
@@ -25,8 +25,8 @@
25
25
  <td class="table_icons">
26
26
  <%= link_to_export export_path(export, format: :csv), text: false %>
27
27
  <%= link_to_show export, text: false %>
28
- <%= link_to(image_tag('icon_edit.gif'), edit_export_path(export), title: 'Edit') if export.modifiable? %>
29
- <%= link_to_delete(export, text: false) if export.modifiable? %>
28
+ <%= link_to(image_tag('icon_edit.gif'), edit_export_path(export), title: 'Edit') %>
29
+ <%= link_to_delete(export, text: false) %>
30
30
  </td>
31
31
  </tr>
32
32
  <% end %>
@@ -3,97 +3,12 @@ module Rexport #:nodoc:
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  module ClassMethods
6
- # Returns hash of exportable data items
7
- def rexport_fields
8
- @rexport_fields ||= nil
9
- unless @rexport_fields
10
- @rexport_fields = HashWithIndifferentAccess.new
11
- initialize_rexport_fields
12
- end
13
- @rexport_fields
14
- end
15
-
16
- # Returns sorted array of rexport DataFields
17
- def rexport_fields_array
18
- rexport_fields.values.sort
19
- end
20
-
21
- # Adds a data item to rexport_fields
22
- def add_rexport_field(name, options = {})
23
- rexport_fields[name.to_s] = DataField.new(name, options)
24
- end
25
-
26
- # Adds associated methods to rexport_fields
27
- # :associations - an association or arrary of associations
28
- # :methods - a method or array of methods
29
- # :filter - if true will send type: :association to add_report_field
30
- def add_association_methods(options = {})
31
- options.stringify_keys!
32
- options.assert_valid_keys(%w(associations methods filter))
33
-
34
- methods = options.reverse_merge('methods' => 'name')['methods']
35
- methods = [methods] if methods.kind_of?(String)
36
-
37
- associations = options['associations']
38
- associations = [associations] if associations.kind_of?(String)
39
-
40
- type = options['filter'] ? :association : nil
41
-
42
- associations.each do |association|
43
- methods.each do |method|
44
- add_rexport_field("#{association}_#{method}", method: "#{association}.#{method}", type: type)
45
- end
46
- end
47
- end
48
-
49
- # Removes files from rexport_fields
50
- # useful to remove content columns you don't want included in exports
51
- def remove_rexport_fields(*fields)
52
- fields.flatten.each { |field| rexport_fields.delete(field.to_s) }
53
- end
54
-
55
- # Returns an array of export methods corresponding with field_names
56
- def get_rexport_methods(*field_names)
57
- field_names.flatten.map do |f|
58
- begin
59
- components = f.to_s.split('.')
60
- field_name = components.pop
61
- components.push(get_klass_from_associations(components).get_rexport_method(field_name)) * '.'
62
- rescue NoMethodError
63
- 'undefined_rexport_field'
64
- end
65
- end
66
- end
67
-
68
- # Returns the associated class by following the associations
6
+ # Returns the associated class by following the chain of associations
69
7
  def get_klass_from_associations(*associations)
70
8
  associations.flatten!
71
9
  return self if associations.empty?
72
10
  reflect_on_association(associations.shift.to_sym).klass.get_klass_from_associations(associations)
73
11
  end
74
-
75
- # Returns the export method for a given field_name
76
- def get_rexport_method(field_name)
77
- if rexport_fields[field_name]
78
- rexport_fields[field_name].method
79
- else
80
- raise NoMethodError
81
- end
82
- end
83
-
84
- def reset_column_information
85
- @rexport_fields = nil
86
- super
87
- end
88
-
89
- private
90
-
91
- # Adds content columns rexport_fields, includes callback
92
- # initialize_local_rexport_fields for client defined initialization
93
- def initialize_rexport_fields
94
- content_columns.each { |field| add_rexport_field(field.name, type: field.type) }
95
- initialize_local_rexport_fields if respond_to?(:initialize_local_rexport_fields)
96
- end
97
12
  end
98
13
 
99
14
  # Return an array of formatted export values for the passed methods
@@ -57,6 +57,11 @@ module Rexport #:nodoc:
57
57
  model_class_name.constantize
58
58
  end
59
59
 
60
+ # Returns a RexportModel for the current export_model
61
+ def rexport_model
62
+ @rexport_model ||= RexportModel.new(export_model)
63
+ end
64
+
60
65
  # Returns an array of RexportModels including export_model and associated rexport capable models
61
66
  def rexport_models
62
67
  @rexport_models ||= get_rexport_models(export_model)
@@ -117,11 +122,6 @@ module Rexport #:nodoc:
117
122
  end
118
123
  end
119
124
 
120
- def modifiable?
121
- # override to disable edit and destroy links for specific exports
122
- true
123
- end
124
-
125
125
  private
126
126
 
127
127
  def get_records(limit = nil)
@@ -136,21 +136,20 @@ module Rexport #:nodoc:
136
136
  objects.map { |object| object.export(rexport_methods) }
137
137
  end
138
138
 
139
- def get_rexport_models(rexport_model, result = [], path = nil)
140
- return unless rexport_model.respond_to?(:rexport_fields)
141
- result << RexportModel.new(rexport_model, path)
142
- get_associations(rexport_model).each do |associated_model|
143
- # prevent infinite loop by checking if this class is already in the result set
144
- unless result.detect { |model| model.klass == associated_model.klass }
145
- get_rexport_models(associated_model.klass, result, [path, associated_model.name].compact * '.')
146
- end
139
+ def get_rexport_models(model, results = [], path = nil)
140
+ return unless model.include?(Rexport::DataFields)
141
+ results << RexportModel.new(model, path: path)
142
+ get_associations(model).each do |associated_model|
143
+ # prevent infinite loop by checking if this class is already in the results set
144
+ next if results.detect { |result| result.klass == associated_model.klass }
145
+ get_rexport_models(associated_model.klass, results, [path, associated_model.name].compact * '.')
147
146
  end
148
- return result
147
+ return results
149
148
  end
150
149
 
151
- def get_associations(rexport_model)
150
+ def get_associations(model)
152
151
  %i(belongs_to has_one).map do |type|
153
- rexport_model.reflect_on_all_associations(type)
152
+ model.reflect_on_all_associations(type)
154
153
  end.flatten.reject(&:polymorphic?)
155
154
  end
156
155
 
@@ -177,7 +176,7 @@ module Rexport #:nodoc:
177
176
  end
178
177
 
179
178
  def rexport_methods
180
- @rexport_methods ||= export_model.get_rexport_methods(ordered_rexport_fields)
179
+ @rexport_methods ||= rexport_model.get_rexport_methods(ordered_rexport_fields)
181
180
  end
182
181
 
183
182
  def rexport_fields
@@ -2,13 +2,18 @@ module Rexport #:nodoc:
2
2
  class RexportModel
3
3
  attr_accessor :klass, :path
4
4
 
5
- def initialize(klass, path = nil)
5
+ def initialize(klass, path: nil)
6
6
  self.klass = klass
7
7
  self.path = path.to_s unless path.blank?
8
+ initialize_rexport_fields
9
+ end
10
+
11
+ def rexport_fields
12
+ @rexport_fields ||= HashWithIndifferentAccess.new
8
13
  end
9
14
 
10
15
  def rexport_fields_array
11
- klass.rexport_fields_array
16
+ rexport_fields.values.sort
12
17
  end
13
18
 
14
19
  def field_path(field_name)
@@ -16,8 +21,11 @@ module Rexport #:nodoc:
16
21
  end
17
22
 
18
23
  def collection_from_association(association)
19
- return klass.send("find_#{association}_for_rexport") if klass.respond_to?("find_#{association}_for_rexport")
20
- klass.reflect_on_association(association.to_sym).klass.all
24
+ if klass.respond_to?("find_#{association}_for_rexport")
25
+ klass.public_send("find_#{association}_for_rexport")
26
+ else
27
+ klass.reflect_on_association(association.to_sym).klass.all
28
+ end
21
29
  end
22
30
 
23
31
  def filter_column(field)
@@ -29,5 +37,82 @@ module Rexport #:nodoc:
29
37
  def name
30
38
  klass.name
31
39
  end
40
+
41
+ # Adds a data item to rexport_fields
42
+ def add_rexport_field(name, options = {})
43
+ rexport_fields[name.to_s] = DataField.new(name, options)
44
+ end
45
+
46
+ # Removes files from rexport_fields
47
+ # useful to remove content columns you don't want included in exports
48
+ def remove_rexport_fields(*fields)
49
+ fields.flatten.each { |field| rexport_fields.delete(field.to_s) }
50
+ end
51
+
52
+ # Adds associated methods to rexport_fields
53
+ # :associations - an association or arrary of associations
54
+ # :methods - a method or array of methods
55
+ # :filter - if true will send type: :association to add_report_field
56
+ def add_association_methods(options = {})
57
+ options.stringify_keys!
58
+ options.assert_valid_keys(%w(associations methods filter))
59
+
60
+ methods = options.reverse_merge('methods' => 'name')['methods']
61
+ methods = [methods] if methods.kind_of?(String)
62
+
63
+ associations = options['associations']
64
+ associations = [associations] if associations.kind_of?(String)
65
+
66
+ type = options['filter'] ? :association : nil
67
+
68
+ associations.each do |association|
69
+ methods.each do |method|
70
+ add_rexport_field("#{association}_#{method}", method: "#{association}.#{method}", type: type)
71
+ end
72
+ end
73
+ end
74
+
75
+ # Returns an array of export methods corresponding with field_names
76
+ def get_rexport_methods(*field_names)
77
+ field_names.flatten.map do |f|
78
+ begin
79
+ components = f.to_s.split('.')
80
+ field_name = components.pop
81
+ components.push(get_rexport_model(components).get_rexport_method(field_name)) * '.'
82
+ rescue NoMethodError
83
+ 'undefined_rexport_field'
84
+ end
85
+ end
86
+ end
87
+
88
+ protected
89
+
90
+ # Returns a rexport_model for the associated class by following the chain of associations
91
+ def get_rexport_model(associations)
92
+ associations.empty? ? self : rexport_models[associations.dup]
93
+ end
94
+
95
+ # Memoize rexport_models to avoid initializing rexport_fields multiple times
96
+ def rexport_models
97
+ @rexport_models ||= Hash.new do |hash, key|
98
+ hash[key] = self.class.new(klass.get_klass_from_associations(key))
99
+ end
100
+ end
101
+
102
+ # Returns the export method for a given field_name
103
+ def get_rexport_method(field_name)
104
+ if rexport_fields[field_name]
105
+ rexport_fields[field_name].method
106
+ else
107
+ raise NoMethodError
108
+ end
109
+ end
110
+
111
+ private
112
+
113
+ def initialize_rexport_fields
114
+ klass.content_columns.each { |field| add_rexport_field(field.name, type: field.type) }
115
+ klass.initialize_local_rexport_fields(self) if klass.respond_to?(:initialize_local_rexport_fields)
116
+ end
32
117
  end
33
118
  end
@@ -1,3 +1,3 @@
1
1
  module Rexport
2
- VERSION = '1.1.0'
2
+ VERSION = '1.2.0'
3
3
  end
data/test/test_helper.rb CHANGED
@@ -112,10 +112,10 @@ class Enrollment < ActiveRecord::Base
112
112
 
113
113
  private
114
114
 
115
- def Enrollment.initialize_local_rexport_fields
116
- add_rexport_field(:foo_method, method: :foo)
117
- add_rexport_field(:bad_method, method: 'bad_method')
118
- add_association_methods(associations: %w(status ilp_status))
115
+ def self.initialize_local_rexport_fields(rexport_model)
116
+ rexport_model.add_rexport_field(:foo_method, method: :foo)
117
+ rexport_model.add_rexport_field(:bad_method, method: 'bad_method')
118
+ rexport_model.add_association_methods(associations: %w(status ilp_status))
119
119
  end
120
120
  end
121
121
 
@@ -123,6 +123,10 @@ class Student < ActiveRecord::Base
123
123
  include Rexport::DataFields
124
124
  belongs_to :family
125
125
  has_many :enrollments
126
+
127
+ def self.find_family_for_rexport
128
+ Family.order(:name)
129
+ end
126
130
  end
127
131
 
128
132
  class Family < ActiveRecord::Base
@@ -135,8 +139,8 @@ class Family < ActiveRecord::Base
135
139
 
136
140
  private
137
141
 
138
- def Family.initialize_local_rexport_fields
139
- add_rexport_field(:foo_method, method: :foo)
142
+ def self.initialize_local_rexport_fields(rexport_model)
143
+ rexport_model.add_rexport_field(:foo_method, method: :foo)
140
144
  end
141
145
  end
142
146
 
@@ -158,9 +162,6 @@ class ExportFilter < ActiveRecord::Base
158
162
  end
159
163
 
160
164
  class SelfReferentialCheck < ActiveRecord::Base
165
+ include Rexport::DataFields
161
166
  belongs_to :enrollment
162
-
163
- def SelfReferentialCheck.rexport_fields
164
- 'trick get_rexport_models into believing we are exportable'
165
- end
166
167
  end
@@ -3,83 +3,6 @@ require 'test_helper'
3
3
  class DataFieldsTest < ActiveSupport::TestCase
4
4
 
5
5
  class RexportClassMethodsTest < DataFieldsTest
6
- test 'should initialize local rexport fields' do
7
- assert_equal(
8
- %w(active bad_method created_at foo_method grade ilp_status_name status_name updated_at),
9
- Enrollment.rexport_fields.keys.sort
10
- )
11
- end
12
-
13
- test 'should initialize data atributes' do
14
- assert_equal 'grade', Enrollment.rexport_fields[:grade].method
15
- assert_equal :integer, Enrollment.rexport_fields[:grade].type
16
- end
17
-
18
- test 'should initialize method' do
19
- assert_equal 'foo', Enrollment.rexport_fields[:foo_method].method
20
- assert_nil Enrollment.rexport_fields[:foo_method].type
21
- end
22
-
23
- test 'should return sorted data fields array' do
24
- assert_equal(
25
- %w(active bad_method created_at foo_method grade ilp_status_name status_name updated_at),
26
- Enrollment.rexport_fields_array.map(&:name)
27
- )
28
- end
29
-
30
- test 'should add single association method to rexport_fields' do
31
- assert_difference('Enrollment.rexport_fields.length') do
32
- Enrollment.add_association_methods(associations: 'test_association')
33
- end
34
- assert_equal 'test_association_name', Enrollment.rexport_fields[:test_association_name].name
35
- assert_equal 'test_association.name', Enrollment.rexport_fields[:test_association_name].method
36
- end
37
-
38
- test 'should add name methods for multiple associations' do
39
- assert_difference('Enrollment.rexport_fields.length', 3) do
40
- Enrollment.add_association_methods(associations: %w(a b c))
41
- end
42
- end
43
-
44
- test 'should add multiple methods for multiple associations' do
45
- assert_difference('Enrollment.rexport_fields.length', 9) do
46
- Enrollment.add_association_methods(associations: %w(a1 a2 a3), methods: %w(m1 m2 m3))
47
- end
48
- end
49
-
50
- test 'should get rexport methods' do
51
- assert_equal(
52
- ['student.family.foo',
53
- 'student.name',
54
- 'undefined_rexport_field',
55
- 'undefined_rexport_field',
56
- 'status.name',
57
- 'grade'
58
- ],
59
- Enrollment.get_rexport_methods(
60
- 'student.family.foo_method',
61
- 'student.name',
62
- 'student.bad_method',
63
- 'bad_association.test',
64
- 'status_name',
65
- 'grade'
66
- )
67
- )
68
- end
69
-
70
- test 'should remove single rexport field' do
71
- assert Enrollment.rexport_fields[:grade]
72
- assert Enrollment.remove_rexport_fields(:grade)
73
- assert_nil Enrollment.rexport_fields[:grade]
74
- end
75
-
76
- test 'should remove multiple rexport fields' do
77
- fields = %w(grade status_name foo_method)
78
- fields.each { |field| assert(Enrollment.rexport_fields[field]) }
79
- assert Enrollment.remove_rexport_fields(fields)
80
- fields.each { |field| assert_nil(Enrollment.rexport_fields[field]) }
81
- end
82
-
83
6
  test 'should get klass from assocations' do
84
7
  assert_equal Family, Enrollment.get_klass_from_associations('student', 'family')
85
8
  end
@@ -89,13 +12,6 @@ class DataFieldsTest < ActiveSupport::TestCase
89
12
  Enrollment.get_klass_from_associations('not_an_association')
90
13
  end
91
14
  end
92
-
93
- test 'should reset column information with rexport_reset' do
94
- Enrollment.expects(:initialize_rexport_fields).times(2).returns(true)
95
- assert Enrollment.rexport_fields
96
- Enrollment.reset_column_information
97
- assert Enrollment.rexport_fields
98
- end
99
15
  end
100
16
 
101
17
  class RexportInstanceMethodsTest < DataFieldsTest
@@ -202,10 +202,6 @@ class ExportMethodsTest < ActiveSupport::TestCase
202
202
  end
203
203
  end
204
204
 
205
- test 'should return true for modifiable?' do
206
- assert Export.new.modifiable?
207
- end
208
-
209
205
  private
210
206
 
211
207
  def create_export(fields: {}, filters: {})
@@ -1,35 +1,137 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class RexportModel < ActiveSupport::TestCase
4
- test 'should return correct foreign_key' do
5
- rexport_model = Rexport::RexportModel.new(Enrollment)
4
+ test 'should initialize rexport_fields' do
5
+ assert_equal(
6
+ %w(active bad_method created_at foo_method grade ilp_status_name status_name updated_at),
7
+ rexport_model.rexport_fields.keys.sort
8
+ )
9
+ end
10
+
11
+ test 'should initialize data atributes' do
12
+ assert_equal 'grade', rexport_model.rexport_fields[:grade].method
13
+ assert_equal :integer, rexport_model.rexport_fields[:grade].type
14
+ end
15
+
16
+ test 'should initialize method' do
17
+ assert_equal 'foo', rexport_model.rexport_fields[:foo_method].method
18
+ assert_nil rexport_model.rexport_fields[:foo_method].type
19
+ end
20
+
21
+ test 'should add single association method to rexport_fields' do
22
+ assert_fields_length do |rexport|
23
+ rexport.add_association_methods(associations: 'test_association')
24
+ assert_equal 'test_association_name', rexport.rexport_fields[:test_association_name].name
25
+ assert_equal 'test_association.name', rexport.rexport_fields[:test_association_name].method
26
+ end
27
+ end
28
+
29
+ test 'should add name methods for multiple associations' do
30
+ assert_fields_length(change: 3) do |rexport|
31
+ rexport.add_association_methods(associations: %w(a b c))
32
+ end
33
+ end
34
+
35
+ test 'should add multiple methods for multiple associations' do
36
+ assert_fields_length(change: 9) do |rexport|
37
+ rexport.add_association_methods(associations: %w(a1 a2 a3), methods: %w(m1 m2 m3))
38
+ end
39
+ end
40
+
41
+ test 'should remove single rexport field' do
42
+ rexport_model.tap do |rexport|
43
+ assert rexport.rexport_fields[:grade]
44
+ assert rexport.remove_rexport_fields(:grade)
45
+ assert_nil rexport.rexport_fields[:grade]
46
+ end
47
+ end
48
+
49
+ test 'should remove multiple rexport fields' do
50
+ fields = %w(grade status_name foo_method)
6
51
 
7
- data_field = Enrollment.rexport_fields['status_name']
8
- assert_equal 'status_id', rexport_model.filter_column(data_field)
52
+ rexport_model.tap do |rexport|
53
+ fields.each { |field| assert(rexport.rexport_fields[field]) }
54
+ assert rexport.remove_rexport_fields(fields)
55
+ fields.each { |field| assert_nil(rexport.rexport_fields[field]) }
56
+ end
57
+ end
9
58
 
10
- data_field = Enrollment.rexport_fields['ilp_status_name']
11
- assert_equal 'ilp_status_id', rexport_model.filter_column(data_field)
59
+ test 'should get rexport methods' do
60
+ assert_equal(
61
+ [
62
+ 'student.family.foo',
63
+ 'student.name',
64
+ 'undefined_rexport_field',
65
+ 'undefined_rexport_field',
66
+ 'status.name',
67
+ 'grade'
68
+ ],
69
+ rexport_model.get_rexport_methods(
70
+ 'student.family.foo_method',
71
+ 'student.name',
72
+ 'student.bad_method',
73
+ 'bad_association.test',
74
+ 'status_name',
75
+ 'grade'
76
+ )
77
+ )
78
+ end
79
+
80
+ test 'should use cached rexport_model when getting multiple fields from one model' do
81
+ rexport_model.tap do |rexport|
82
+ assert_equal ['student.name'], rexport.get_rexport_methods('student.name')
83
+ Student.expects(:get_klass_from_associations).times(0)
84
+ assert_equal ['student.date_of_birth'], rexport.get_rexport_methods('student.date_of_birth')
85
+ end
86
+ end
87
+
88
+ test 'should return default foreign_key' do
89
+ assert_equal 'status_id', rexport_model.filter_column(data_field('status_name'))
90
+ end
91
+
92
+ test 'should return custom foreign_key' do
93
+ assert_equal 'ilp_status_id', rexport_model.filter_column(data_field('ilp_status_name'))
12
94
  end
13
95
 
14
96
  test 'should call rexport_fields_array' do
15
- rexport_model = Rexport::RexportModel.new(Enrollment)
16
- Enrollment.expects(:rexport_fields_array).returns(true)
17
- assert rexport_model.rexport_fields_array
97
+ assert_equal(
98
+ %w(active bad_method created_at foo_method grade ilp_status_name status_name updated_at),
99
+ rexport_model.rexport_fields_array.map(&:name)
100
+ )
18
101
  end
19
102
 
20
103
  test 'should return field_path' do
21
- rexport_model = Rexport::RexportModel.new(Enrollment, 'foo')
22
- assert_equal 'foo.bar', rexport_model.field_path('bar')
104
+ assert_equal 'foo.bar', rexport_model(path: 'foo').field_path('bar')
23
105
  end
24
106
 
25
107
  test 'should return collection_from_association' do
26
- rexport_model = Rexport::RexportModel.new(Enrollment)
27
108
  Status.expects(:all).returns(true)
28
109
  assert rexport_model.collection_from_association('status')
29
110
  end
30
111
 
112
+ test 'should return custom find method for collection_from_association' do
113
+ Student.expects(:find_family_for_rexport).returns(true)
114
+ assert rexport_model(model: Student).collection_from_association('family')
115
+ end
116
+
117
+
31
118
  test 'should return class name' do
32
- rexport_model = Rexport::RexportModel.new(Enrollment)
33
119
  assert_equal 'Enrollment', rexport_model.name
34
120
  end
121
+
122
+ private
123
+
124
+ def rexport_model(model: Enrollment, path: nil)
125
+ Rexport::RexportModel.new(model, path: path)
126
+ end
127
+
128
+ def data_field(name)
129
+ rexport_model.rexport_fields[name]
130
+ end
131
+
132
+ def assert_fields_length(rexport: rexport_model, change: 1, &block)
133
+ assert_difference('rexport.rexport_fields.length', change) do
134
+ block.call(rexport)
135
+ end
136
+ end
35
137
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rexport
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aaron Baldwin
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2020-08-28 00:00:00.000000000 Z
12
+ date: 2021-06-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -17,42 +17,28 @@ dependencies:
17
17
  requirements:
18
18
  - - ">="
19
19
  - !ruby/object:Gem::Version
20
- version: 4.0.1
20
+ version: 6.0.3
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - ">="
26
26
  - !ruby/object:Gem::Version
27
- version: 4.0.1
28
- - !ruby/object:Gem::Dependency
29
- name: loofah
30
- requirement: !ruby/object:Gem::Requirement
31
- requirements:
32
- - - ">="
33
- - !ruby/object:Gem::Version
34
- version: 2.3.1
35
- type: :runtime
36
- prerelease: false
37
- version_requirements: !ruby/object:Gem::Requirement
38
- requirements:
39
- - - ">="
40
- - !ruby/object:Gem::Version
41
- version: 2.3.1
27
+ version: 6.0.3
42
28
  - !ruby/object:Gem::Dependency
43
29
  name: factory_bot
44
30
  requirement: !ruby/object:Gem::Requirement
45
31
  requirements:
46
32
  - - "~>"
47
33
  - !ruby/object:Gem::Version
48
- version: '6.1'
34
+ version: '6.2'
49
35
  type: :development
50
36
  prerelease: false
51
37
  version_requirements: !ruby/object:Gem::Requirement
52
38
  requirements:
53
39
  - - "~>"
54
40
  - !ruby/object:Gem::Version
55
- version: '6.1'
41
+ version: '6.2'
56
42
  - !ruby/object:Gem::Dependency
57
43
  name: sqlite3
58
44
  requirement: !ruby/object:Gem::Requirement
@@ -73,14 +59,14 @@ dependencies:
73
59
  requirements:
74
60
  - - "~>"
75
61
  - !ruby/object:Gem::Version
76
- version: '1.11'
62
+ version: '1.13'
77
63
  type: :development
78
64
  prerelease: false
79
65
  version_requirements: !ruby/object:Gem::Requirement
80
66
  requirements:
81
67
  - - "~>"
82
68
  - !ruby/object:Gem::Version
83
- version: '1.11'
69
+ version: '1.13'
84
70
  description: Rexport integrates into a Rails application making model data available
85
71
  for export into CSV files.
86
72
  email: