rexport 1.2.1 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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