rexport 1.2.1 → 1.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.
@@ -1,15 +1,19 @@
1
- module Rexport #:nodoc:
1
+ # frozen_string_literal: true
2
+
3
+ module Rexport # :nodoc:
2
4
  class RexportModel
3
5
  attr_accessor :klass, :path
4
6
 
7
+ delegate :name, to: :klass
8
+
5
9
  def initialize(klass, path: nil)
6
10
  self.klass = klass
7
- self.path = path.to_s unless path.blank?
11
+ self.path = path&.to_s
8
12
  initialize_rexport_fields
9
13
  end
10
14
 
11
15
  def rexport_fields
12
- @rexport_fields ||= HashWithIndifferentAccess.new
16
+ @rexport_fields ||= ActiveSupport::HashWithIndifferentAccess.new
13
17
  end
14
18
 
15
19
  def rexport_fields_array
@@ -17,7 +21,7 @@ module Rexport #:nodoc:
17
21
  end
18
22
 
19
23
  def field_path(field_name)
20
- [path, field_name].compact * '.'
24
+ [path, field_name].compact * "."
21
25
  end
22
26
 
23
27
  def collection_from_association(association)
@@ -29,13 +33,7 @@ module Rexport #:nodoc:
29
33
  end
30
34
 
31
35
  def filter_column(field)
32
- return field.method unless field.method.include?('.')
33
- association = field.method.split('.').first
34
- klass.reflect_on_association(association.to_sym).foreign_key
35
- end
36
-
37
- def name
38
- klass.name
36
+ foreign_key_for(field.association_name) || field.method
39
37
  end
40
38
 
41
39
  # Adds a data item to rexport_fields
@@ -55,33 +53,23 @@ module Rexport #:nodoc:
55
53
  # :filter - if true will send type: :association to add_report_field
56
54
  def add_association_methods(options = {})
57
55
  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)
56
+ options.assert_valid_keys(%w[associations methods filter])
65
57
 
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
58
+ add_rexport_fields_for(
59
+ associations: [options["associations"]].flatten,
60
+ methods: [options["methods"] || "name"].flatten,
61
+ type: (options["filter"] ? :association : nil)
62
+ )
73
63
  end
74
64
 
75
65
  # Returns an array of export methods corresponding with field_names
76
66
  def get_rexport_methods(*field_names)
77
67
  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
68
+ components = f.to_s.split(".")
69
+ field_name = components.pop
70
+ components.push(get_rexport_model(components).get_rexport_method(field_name)) * "."
71
+ rescue NoMethodError
72
+ "undefined_rexport_field"
85
73
  end
86
74
  end
87
75
 
@@ -101,15 +89,23 @@ module Rexport #:nodoc:
101
89
 
102
90
  # Returns the export method for a given field_name
103
91
  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
92
+ rexport_fields[field_name]&.method || raise(NoMethodError)
109
93
  end
110
94
 
111
95
  private
112
96
 
97
+ def add_rexport_fields_for(associations:, methods:, type:)
98
+ associations.each do |association|
99
+ methods.each do |method|
100
+ add_rexport_field("#{association}_#{method}", method: "#{association}.#{method}", type: type)
101
+ end
102
+ end
103
+ end
104
+
105
+ def foreign_key_for(association_name)
106
+ klass.reflect_on_association(association_name).foreign_key if association_name.present?
107
+ end
108
+
113
109
  def initialize_rexport_fields
114
110
  klass.content_columns.each { |field| add_rexport_field(field.name, type: field.type) }
115
111
  klass.initialize_local_rexport_fields(self) if klass.respond_to?(:initialize_local_rexport_fields)
@@ -1,4 +1,6 @@
1
- module Rexport #:nodoc:
1
+ # frozen_string_literal: true
2
+
3
+ module Rexport # :nodoc:
2
4
  # A basic tree for building up ActiveRecord find :include parameters
3
5
  class TreeNode
4
6
  attr_accessor :name, :children
@@ -13,7 +15,8 @@ module Rexport #:nodoc:
13
15
  # Add one or more children to the tree
14
16
  def add_child(*names)
15
17
  names.flatten!
16
- return unless name = names.shift
18
+ return unless (name = names.shift)
19
+
17
20
  node = children.find { |c| c.name == name }
18
21
  node ? node.add_child(names) : (children << TreeNode.new(name, names))
19
22
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Rexport
2
- VERSION = '1.2.1'
4
+ VERSION = "1.4.0"
3
5
  end
data/lib/rexport.rb CHANGED
@@ -1,19 +1,22 @@
1
- require 'rexport/data_field'
2
- require 'rexport/data_fields'
3
- require 'rexport/export_filter_methods'
4
- require 'rexport/export_filters_controller_methods'
5
- require 'rexport/export_item_methods'
6
- require 'rexport/export_item_sortings_controller_methods'
7
- require 'rexport/export_items_controller_methods'
8
- require 'rexport/export_methods'
9
- require 'rexport/exports_controller_methods'
10
- require 'rexport/rexport_model'
11
- require 'rexport/tree_node'
1
+ # frozen_string_literal: true
2
+
3
+ require "rexport/data_field"
4
+ require "rexport/data_fields"
5
+ require "rexport/export_filter_methods"
6
+ require "rexport/export_filters_controller_methods"
7
+ require "rexport/export_item_methods"
8
+ require "rexport/export_item_sortings_controller_methods"
9
+ require "rexport/export_items_controller_methods"
10
+ require "rexport/export_methods"
11
+ require "rexport/exports_controller_methods"
12
+ require "rexport/formatter"
13
+ require "rexport/rexport_model"
14
+ require "rexport/tree_node"
12
15
 
13
16
  module Rexport
14
17
  SAMPLE_SIZE = 5
15
18
 
16
19
  class Engine < ::Rails::Engine
17
- config.paths['app/views'] << File.join(File.dirname(__FILE__),'../app/views')
20
+ config.paths["app/views"] << File.join(File.dirname(__FILE__), "../app/views")
18
21
  end
19
22
  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.2.1
4
+ version: 1.4.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: 2022-09-02 00:00:00.000000000 Z
12
+ date: 2023-03-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -25,58 +25,16 @@ dependencies:
25
25
  - - ">="
26
26
  - !ruby/object:Gem::Version
27
27
  version: 6.0.3
28
- - !ruby/object:Gem::Dependency
29
- name: factory_bot
30
- requirement: !ruby/object:Gem::Requirement
31
- requirements:
32
- - - "~>"
33
- - !ruby/object:Gem::Version
34
- version: '6.2'
35
- type: :development
36
- prerelease: false
37
- version_requirements: !ruby/object:Gem::Requirement
38
- requirements:
39
- - - "~>"
40
- - !ruby/object:Gem::Version
41
- version: '6.2'
42
- - !ruby/object:Gem::Dependency
43
- name: sqlite3
44
- requirement: !ruby/object:Gem::Requirement
45
- requirements:
46
- - - "~>"
47
- - !ruby/object:Gem::Version
48
- version: '1.4'
49
- type: :development
50
- prerelease: false
51
- version_requirements: !ruby/object:Gem::Requirement
52
- requirements:
53
- - - "~>"
54
- - !ruby/object:Gem::Version
55
- version: '1.4'
56
- - !ruby/object:Gem::Dependency
57
- name: mocha
58
- requirement: !ruby/object:Gem::Requirement
59
- requirements:
60
- - - "~>"
61
- - !ruby/object:Gem::Version
62
- version: '1.13'
63
- type: :development
64
- prerelease: false
65
- version_requirements: !ruby/object:Gem::Requirement
66
- requirements:
67
- - - "~>"
68
- - !ruby/object:Gem::Version
69
- version: '1.13'
70
28
  description: Rexport integrates into a Rails application making model data available
71
29
  for export into CSV files.
72
30
  email:
73
- - developers@brightwayslearning.org
31
+ - baldwina@brightwayslearning.org
74
32
  executables: []
75
33
  extensions: []
76
34
  extra_rdoc_files: []
77
35
  files:
78
36
  - MIT-LICENSE
79
- - README.rdoc
37
+ - README.md
80
38
  - Rakefile
81
39
  - app/helpers/exports_helper.rb
82
40
  - app/views/export_filters/_export_filter.html.erb
@@ -104,22 +62,17 @@ files:
104
62
  - lib/rexport/export_items_controller_methods.rb
105
63
  - lib/rexport/export_methods.rb
106
64
  - lib/rexport/exports_controller_methods.rb
65
+ - lib/rexport/formatter.rb
107
66
  - lib/rexport/rexport_model.rb
108
67
  - lib/rexport/tree_node.rb
109
68
  - lib/rexport/version.rb
110
- - test/factories.rb
111
- - test/test_helper.rb
112
- - test/unit/data_field_test.rb
113
- - test/unit/data_fields_test.rb
114
- - test/unit/export_filter_methods_test.rb
115
- - test/unit/export_item_methods_test.rb
116
- - test/unit/export_methods_test.rb
117
- - test/unit/rexport_model_test.rb
118
- - test/unit/tree_node_test.rb
119
69
  homepage: https://github.com/wwidea/rexport
120
70
  licenses:
121
71
  - MIT
122
- metadata: {}
72
+ metadata:
73
+ homepage_uri: https://github.com/wwidea/rexport
74
+ source_code_uri: https://github.com/wwidea/rexport
75
+ rubygems_mfa_required: 'true'
123
76
  post_install_message:
124
77
  rdoc_options: []
125
78
  require_paths:
@@ -128,24 +81,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
128
81
  requirements:
129
82
  - - ">="
130
83
  - !ruby/object:Gem::Version
131
- version: '0'
84
+ version: 2.7.0
132
85
  required_rubygems_version: !ruby/object:Gem::Requirement
133
86
  requirements:
134
87
  - - ">="
135
88
  - !ruby/object:Gem::Version
136
89
  version: '0'
137
90
  requirements: []
138
- rubygems_version: 3.3.9
91
+ rubygems_version: 3.4.5
139
92
  signing_key:
140
93
  specification_version: 4
141
94
  summary: Ruby on Rails gem to manage exports.
142
- test_files:
143
- - test/factories.rb
144
- - test/test_helper.rb
145
- - test/unit/data_field_test.rb
146
- - test/unit/data_fields_test.rb
147
- - test/unit/export_filter_methods_test.rb
148
- - test/unit/export_item_methods_test.rb
149
- - test/unit/export_methods_test.rb
150
- - test/unit/rexport_model_test.rb
151
- - test/unit/tree_node_test.rb
95
+ test_files: []
data/README.rdoc DELETED
@@ -1,17 +0,0 @@
1
- =Rexport
2
-
3
- Ruby on Rails gem to manage exports
4
-
5
-
6
- ==Installation
7
- 1. install gem
8
- 2. copy migration into application db/migrate folder and run
9
- 3. create models and mix in corresponding module
10
- * export => export_methods
11
- * export_item => export_item_methods
12
- * export_filter => export_filter_methods
13
-
14
-
15
- ==License
16
-
17
- Copyright (c) 2008-2018 Brightways Learning, released under the MIT license
data/test/factories.rb DELETED
@@ -1,111 +0,0 @@
1
- module Rexport
2
- module Factories
3
-
4
- FactoryBot.define do
5
-
6
- factory :status do
7
- name { 'active' }
8
- end
9
-
10
- factory :family do
11
- name { 'The Sample Family' }
12
- end
13
-
14
- factory :student do
15
- family { |family| family.association(:family) }
16
- name { 'Sammy Sample' }
17
- date_of_birth { Date.parse('2008-12-08') }
18
- end
19
-
20
- factory :enrollment do
21
- status { |status| status.association(:status) }
22
- student { |student| student.association(:student) }
23
- grade { 1 }
24
- updated_at { Time.now }
25
- end
26
-
27
- factory :second_grade_enrollment, class: 'Enrollment' do
28
- status { |status| status.association(:status) }
29
- grade { 2 }
30
- end
31
-
32
- factory :export do
33
- name { 'Enrollment Export' }
34
- model_class_name { 'Enrollment' }
35
- export_items do |items|
36
- %w(family_name_export_item grade_export_item status_name_export_item bogus_export_item).map do |item|
37
- items.association(item)
38
- end
39
- end
40
- end
41
-
42
- factory :filtered_export, class: 'Export' do
43
- name { 'Filtered Enrollment Export' }
44
- model_class_name { 'Enrollment' }
45
- export_items do |items|
46
- %w(grade_export_item status_name_export_item).map do |item|
47
- items.association(item)
48
- end
49
- end
50
- export_filters do |filters|
51
- %w(grade_filter status_filter).map do |filter|
52
- filters.association(filter)
53
- end
54
- end
55
- end
56
-
57
- factory :invalid_filtered_export, class: 'Export' do
58
- name { 'Invalid Filtered Enrollment Export' }
59
- model_class_name { 'Enrollment' }
60
- export_items do |items|
61
- %w(grade_export_item status_name_export_item).map do |item|
62
- items.association(item)
63
- end
64
- end
65
- export_filters do |filters|
66
- %w(invalid_filter).map do |filter|
67
- filters.association(filter)
68
- end
69
- end
70
- end
71
-
72
- factory :family_name_export_item, class: 'ExportItem' do
73
- position { 1 }
74
- name { 'Family Name' }
75
- rexport_field { 'student.family.name' }
76
- end
77
-
78
- factory :grade_export_item, class: 'ExportItem' do
79
- position { 2 }
80
- rexport_field { 'grade' }
81
- end
82
-
83
- factory :status_name_export_item, class: 'ExportItem' do
84
- position { 3 }
85
- name { 'Status' }
86
- rexport_field { 'status_name' }
87
- end
88
-
89
- factory :bogus_export_item, class: 'ExportItem' do
90
- position { 4 }
91
- name { 'Bogus Item' }
92
- rexport_field { 'bogus_field' }
93
- end
94
-
95
- factory :grade_filter, class: 'ExportFilter' do
96
- filter_field { 'grade' }
97
- value { '1' }
98
- end
99
-
100
- factory :status_filter, class: 'ExportFilter' do
101
- filter_field { 'status.name' }
102
- value { 'active' }
103
- end
104
-
105
- factory :invalid_filter, class: 'ExportFilter' do
106
- filter_field { 'invalid' }
107
- value { '1' }
108
- end
109
- end
110
- end
111
- end
data/test/test_helper.rb DELETED
@@ -1,167 +0,0 @@
1
- require 'simplecov'
2
- SimpleCov.start do
3
- add_filter '/test/'
4
- end
5
-
6
- $LOAD_PATH.unshift File.expand_path("../../lib", __FILE__)
7
- require "rails"
8
- require 'active_record'
9
- require "rexport"
10
-
11
- require 'minitest/autorun'
12
- require 'factory_bot'
13
- require 'mocha/minitest'
14
- require File.dirname(__FILE__) + '/factories'
15
-
16
- ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
17
-
18
- class ActiveSupport::TestCase
19
- include FactoryBot::Syntax::Methods
20
- include Rexport::Factories
21
-
22
- def setup
23
- suppress_output { setup_db }
24
- Enrollment.instance_variable_set('@rexport_fields', nil)
25
- Student.instance_variable_set('@rexport_fields', nil)
26
- end
27
-
28
- def teardown
29
- teardown_db
30
- end
31
-
32
- private
33
-
34
- def setup_db
35
- ActiveRecord::Schema.define(version: 1) do
36
- create_table :enrollments do |t|
37
- t.integer :student_id, :status_id, :grade
38
- t.boolean :active
39
- t.timestamps
40
- end
41
-
42
- create_table :students do |t|
43
- t.integer :family_id
44
- t.string :name
45
- t.date :date_of_birth
46
- t.timestamps
47
- end
48
-
49
- create_table :families do |t|
50
- t.string :name
51
- t.timestamps
52
- end
53
-
54
- create_table :statuses do |t|
55
- t.string :name
56
- end
57
-
58
- create_table :exports do |t|
59
- t.string :name
60
- t.string :model_class_name
61
- t.text :description
62
- end
63
-
64
- create_table :export_items do |t|
65
- t.integer :export_id
66
- t.string :name, :rexport_field
67
- t.integer :position
68
- end
69
-
70
- create_table :export_filters do |t|
71
- t.integer :export_id
72
- t.string :filter_field, :value
73
- end
74
-
75
- create_table :self_referential_checks do |t|
76
- end
77
- end
78
- end
79
-
80
- def teardown_db
81
- ActiveRecord::Base.connection.data_sources.each do |table|
82
- ActiveRecord::Base.connection.drop_table(table)
83
- end
84
- end
85
-
86
- def suppress_output
87
- original_stdout = $stdout.clone
88
- $stdout.reopen File.new('/dev/null', 'w')
89
- yield
90
- ensure
91
- $stdout.reopen original_stdout
92
- end
93
- end
94
-
95
- class ActiveRecord::Base
96
- class << self
97
- def acts_as_list(options = {})
98
- end
99
- end
100
- end
101
-
102
- class Enrollment < ActiveRecord::Base
103
- include Rexport::DataFields
104
- belongs_to :student
105
- belongs_to :status
106
- belongs_to :ilp_status, class_name: 'Status', foreign_key: 'ilp_status_id'
107
- belongs_to :self_referential_check
108
-
109
- def foo
110
- 'bar'
111
- end
112
-
113
- private
114
-
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
- end
120
- end
121
-
122
- class Student < ActiveRecord::Base
123
- include Rexport::DataFields
124
- belongs_to :family
125
- has_many :enrollments
126
-
127
- def self.find_family_for_rexport
128
- Family.order(:name)
129
- end
130
- end
131
-
132
- class Family < ActiveRecord::Base
133
- include Rexport::DataFields
134
- has_many :students
135
-
136
- def foo
137
- 'bar'
138
- end
139
-
140
- private
141
-
142
- def self.initialize_local_rexport_fields(rexport_model)
143
- rexport_model.add_rexport_field(:foo_method, method: :foo)
144
- end
145
- end
146
-
147
- class Status < ActiveRecord::Base
148
- # does not include Rexport
149
- has_many :enrollments
150
- end
151
-
152
- class Export < ActiveRecord::Base
153
- include Rexport::ExportMethods
154
- end
155
-
156
- class ExportItem < ActiveRecord::Base
157
- include Rexport::ExportItemMethods
158
- end
159
-
160
- class ExportFilter < ActiveRecord::Base
161
- include Rexport::ExportFilterMethods
162
- end
163
-
164
- class SelfReferentialCheck < ActiveRecord::Base
165
- include Rexport::DataFields
166
- belongs_to :enrollment
167
- end
@@ -1,25 +0,0 @@
1
- require 'test_helper'
2
-
3
- class DataFieldTest < ActiveSupport::TestCase
4
- test 'should stringify name' do
5
- assert_equal 'foo', Rexport::DataField.new(:foo).name
6
- end
7
-
8
- test 'should use name for method' do
9
- assert_equal 'foo', Rexport::DataField.new(:foo).method
10
- end
11
-
12
- test 'should save method' do
13
- assert_equal 'bar', Rexport::DataField.new(:foo, method: :bar).method
14
- end
15
-
16
- test 'should save type' do
17
- assert_equal :type_test, Rexport::DataField.new(:test, type: :type_test).type
18
- end
19
-
20
- test 'should_sort_data_fields' do
21
- a = Rexport::DataField.new(:a)
22
- b = Rexport::DataField.new(:b)
23
- assert_equal [a,b], [b,a].sort
24
- end
25
- end