rexport 0.5.4 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +5 -5
  2. data/Rakefile +6 -34
  3. data/app/views/export_filters/_export_filter.html.erb +2 -2
  4. data/app/views/export_items/_export_item.html.erb +2 -2
  5. data/app/views/exports/_edit.html.erb +2 -2
  6. data/app/views/exports/_filters.html.erb +1 -1
  7. data/app/views/exports/_form.html.erb +6 -6
  8. data/app/views/exports/_rexport_model.html.erb +1 -1
  9. data/app/views/exports/_show.html.erb +6 -6
  10. data/app/views/exports/edit.html.erb +1 -1
  11. data/app/views/exports/index.html.erb +5 -5
  12. data/app/views/exports/new.html.erb +2 -2
  13. data/app/views/exports/show.html.erb +1 -1
  14. data/config/routes.rb +6 -6
  15. data/db/migrate/20091105182959_create_export_tables.rb +3 -3
  16. data/lib/rexport.rb +3 -1
  17. data/lib/rexport/data_field.rb +17 -0
  18. data/lib/rexport/data_fields.rb +25 -56
  19. data/lib/rexport/export_filter_methods.rb +46 -24
  20. data/lib/rexport/export_item_methods.rb +29 -34
  21. data/lib/rexport/export_methods.rb +161 -208
  22. data/lib/rexport/exports_controller_methods.rb +22 -28
  23. data/lib/rexport/rexport_model.rb +33 -0
  24. data/lib/rexport/tree_node.rb +13 -16
  25. data/lib/rexport/version.rb +1 -1
  26. data/test/factories.rb +58 -53
  27. data/test/test_helper.rb +29 -33
  28. data/test/unit/data_field_test.rb +11 -11
  29. data/test/unit/data_fields_test.rb +137 -95
  30. data/test/unit/export_filter_methods_test.rb +37 -0
  31. data/test/unit/export_item_methods_test.rb +21 -0
  32. data/test/unit/export_methods_test.rb +185 -59
  33. data/test/unit/rexport_model_test.rb +12 -12
  34. data/test/unit/tree_node_test.rb +20 -20
  35. metadata +14 -26
  36. data/test/jenkins.bash +0 -3
  37. data/test/log/test.log +0 -3891
@@ -3,73 +3,67 @@ module Rexport
3
3
  def index
4
4
  @exports = Export.categorical.alphabetical
5
5
  end
6
-
6
+
7
7
  def show
8
8
  @export = Export.find(params[:id])
9
-
9
+
10
10
  respond_to do |format|
11
11
  format.html # show.html.erb
12
- format.csv { send_data(@export.to_csv, :type => export_content_type, :filename => filename) }
12
+ format.csv { send_data(@export.to_csv, type: export_content_type, filename: filename) }
13
13
  end
14
14
  end
15
-
15
+
16
16
  def new
17
17
  @export = Export.new(export_params)
18
18
  end
19
-
19
+
20
20
  def edit
21
21
  @export = Export.find(params[:id])
22
22
  end
23
-
23
+
24
24
  def create
25
25
  @export = params[:original_export_id] ? Export.find(params[:original_export_id]).copy : Export.new(export_params)
26
-
26
+
27
27
  if @export.save
28
28
  redirect_to @export, notice: 'Export was successfully created.'
29
29
  else
30
30
  render :new
31
31
  end
32
32
  end
33
-
33
+
34
34
  def update
35
35
  @export = Export.find(params[:id])
36
-
36
+
37
37
  if @export.update_attributes(export_params)
38
38
  redirect_to @export, notice: 'Export was successfully updated.'
39
39
  else
40
40
  render :edit
41
41
  end
42
42
  end
43
-
43
+
44
44
  def destroy
45
45
  @export = Export.find(params[:id])
46
46
  @export.destroy
47
-
47
+
48
48
  redirect_to exports_url
49
49
  end
50
-
50
+
51
51
  private
52
-
52
+
53
53
  def export_params
54
- params.require(:export).permit(:name, :model_class_name, :description).merge(rexport_fields: rexport_fields, export_filter_attributes: export_filter_attributes)
54
+ params.require(:export).permit(
55
+ :name,
56
+ :model_class_name,
57
+ :description,
58
+ rexport_fields: {},
59
+ export_filter_attributes: {}
60
+ )
55
61
  end
56
-
57
- def rexport_fields
58
- permit_all params[:export][:rexport_fields]
59
- end
60
-
61
- def export_filter_attributes
62
- permit_all params[:export][:export_filter_attributes]
63
- end
64
-
65
- def permit_all(params)
66
- params ? params.permit! : []
67
- end
68
-
62
+
69
63
  def export_content_type
70
64
  request.user_agent =~ /windows/i ? 'application/vnd.ms-excel' : 'text/csv'
71
65
  end
72
-
66
+
73
67
  def filename
74
68
  "#{@export.model_class_name}_#{@export.name.gsub(/ /, '_')}_#{Time.now.strftime('%Y%m%d')}.csv"
75
69
  end
@@ -0,0 +1,33 @@
1
+ module Rexport #:nodoc:
2
+ class RexportModel
3
+ attr_accessor :klass, :path
4
+
5
+ def initialize(klass, path = nil)
6
+ self.klass = klass
7
+ self.path = path.to_s unless path.blank?
8
+ end
9
+
10
+ def rexport_fields_array
11
+ klass.rexport_fields_array
12
+ end
13
+
14
+ def field_path(field_name)
15
+ [path, field_name].compact * '.'
16
+ end
17
+
18
+ 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
21
+ end
22
+
23
+ def filter_column(field)
24
+ return field.method unless field.method.include?('.')
25
+ association = field.method.split('.').first
26
+ klass.reflect_on_association(association.to_sym).foreign_key
27
+ end
28
+
29
+ def name
30
+ klass.name
31
+ end
32
+ end
33
+ end
@@ -2,44 +2,41 @@ module Rexport #:nodoc:
2
2
  # A basic tree for building up ActiveRecord find :include parameters
3
3
  class TreeNode
4
4
  attr_accessor :name, :children
5
-
5
+
6
6
  # Initialize a tree node setting name and adding a child if one was passed
7
7
  def initialize(name, *names)
8
8
  self.name = name
9
9
  self.children = []
10
10
  add_child(names)
11
11
  end
12
-
12
+
13
13
  # Add one or more children to the tree
14
14
  def add_child(*names)
15
15
  names.flatten!
16
16
  return unless name = names.shift
17
- if node = children.find {|c| c.name == name}
18
- node.add_child(names)
19
- else
20
- children << TreeNode.new(name, names)
21
- end
17
+ node = children.find { |c| c.name == name }
18
+ node ? node.add_child(names) : (children << TreeNode.new(name, names))
22
19
  end
23
-
20
+
24
21
  # Return an array representation of the tree
25
22
  def to_a
26
- [name, children.map {|c| c.to_a}]
23
+ [name, children.map(&:to_a)]
27
24
  end
28
-
25
+
29
26
  # Return a :include comptatible statement from the tree
30
27
  def to_include
31
- children.map {|c| c.build_include}
28
+ children.map(&:build_include)
32
29
  end
33
-
30
+
34
31
  # Return the include parameters for a child
35
32
  def build_include
36
- leaf_node? ? name.to_sym : { name.to_sym => children.map {|c| c.build_include} }
33
+ leaf_node? ? name.to_sym : { name.to_sym => children.map(&:build_include) }
37
34
  end
38
-
35
+
39
36
  private
40
-
37
+
41
38
  def leaf_node?
42
39
  children.blank?
43
40
  end
44
41
  end
45
- end
42
+ end
@@ -1,3 +1,3 @@
1
1
  module Rexport
2
- VERSION = '0.5.4'
2
+ VERSION = '1.0.0'
3
3
  end
@@ -1,86 +1,91 @@
1
1
  module Rexport
2
2
  module Factories
3
-
4
- FactoryGirl.define do
5
-
3
+
4
+ FactoryBot.define do
5
+
6
6
  factory :status do
7
- name 'active'
7
+ name { 'active' }
8
8
  end
9
9
 
10
10
  factory :family do
11
- name 'The Sample Family'
11
+ name { 'The Sample Family' }
12
12
  end
13
-
13
+
14
14
  factory :student do
15
- family {|f| f.association(:family)}
16
- name 'Sammy Sample'
17
- date_of_birth Date.parse('2008-12-08')
15
+ family { |family| family.association(:family) }
16
+ name { 'Sammy Sample' }
17
+ date_of_birth { Date.parse('2008-12-08') }
18
18
  end
19
-
19
+
20
20
  factory :enrollment do
21
- status {|status| status.association(:status)}
22
- student {|s| s.association(:student)}
23
- grade 1
21
+ status { |status| status.association(:status) }
22
+ student { |student| student.association(:student) }
23
+ grade { 1 }
24
+ updated_at { Time.now }
24
25
  end
25
-
26
- factory :second_grade_enrollment, :class => 'Enrollment' do
27
- status {|status| status.association(:status)}
28
- grade 2
26
+
27
+ factory :second_grade_enrollment, class: 'Enrollment' do
28
+ status { |status| status.association(:status) }
29
+ grade { 2 }
29
30
  end
30
-
31
+
31
32
  factory :export do
32
- name 'Enrollment Export'
33
- model_class_name 'Enrollment'
33
+ name { 'Enrollment Export' }
34
+ model_class_name { 'Enrollment' }
34
35
  export_items do |items|
35
36
  %w(family_name_export_item grade_export_item status_name_export_item bogus_export_item).map do |item|
36
37
  items.association(item)
37
38
  end
38
39
  end
39
40
  end
40
-
41
- factory :filtered_export, :class => 'Export' do
42
- name 'Filtered Enrollment Export'
43
- model_class_name 'Enrollment'
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
44
50
  export_filters do |filters|
45
51
  %w(grade_filter status_filter).map do |filter|
46
52
  filters.association(filter)
47
53
  end
48
54
  end
49
55
  end
50
-
51
- factory :family_name_export_item, :class => 'ExportItem' do
52
- position 1
53
- name 'Family Name'
54
- rexport_field 'student.family.name'
56
+
57
+ factory :family_name_export_item, class: 'ExportItem' do
58
+ position { 1 }
59
+ name { 'Family Name' }
60
+ rexport_field { 'student.family.name' }
55
61
  end
56
-
57
- factory :grade_export_item, :class => 'ExportItem' do
58
- position 2
59
- name 'Grade'
60
- rexport_field 'grade'
62
+
63
+ factory :grade_export_item, class: 'ExportItem' do
64
+ position { 2 }
65
+ rexport_field { 'grade' }
61
66
  end
62
-
63
- factory :status_name_export_item, :class => 'ExportItem' do
64
- position 3
65
- name 'Status'
66
- rexport_field 'status_name'
67
+
68
+ factory :status_name_export_item, class: 'ExportItem' do
69
+ position { 3 }
70
+ name { 'Status' }
71
+ rexport_field { 'status_name' }
67
72
  end
68
-
69
- factory :bogus_export_item, :class => 'ExportItem' do
70
- position 4
71
- name 'Bogus Item'
72
- rexport_field 'bogus_field'
73
+
74
+ factory :bogus_export_item, class: 'ExportItem' do
75
+ position { 4 }
76
+ name { 'Bogus Item' }
77
+ rexport_field { 'bogus_field' }
73
78
  end
74
-
75
- factory :grade_filter, :class => 'ExportFilter' do
76
- filter_field 'grade'
77
- value '1'
79
+
80
+ factory :grade_filter, class: 'ExportFilter' do
81
+ filter_field { 'grade' }
82
+ value { '1' }
78
83
  end
79
-
80
- factory :status_filter, :class => 'ExportFilter' do
81
- filter_field 'status.name'
82
- value 'active'
84
+
85
+ factory :status_filter, class: 'ExportFilter' do
86
+ filter_field { 'status.name' }
87
+ value { 'active' }
83
88
  end
84
89
  end
85
90
  end
86
- end
91
+ end
@@ -1,29 +1,26 @@
1
- require 'minitest/autorun'
2
- require 'rubygems'
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"
3
8
  require 'active_record'
4
- require 'active_support/test_case'
5
- require 'logger'
6
- require 'factory_girl'
7
- require 'mocha/mini_test'
8
- require File.dirname(__FILE__) + '/factories'
9
- require File.dirname(__FILE__) + '/../lib/rexport/data_fields'
10
- require File.dirname(__FILE__) + '/../lib/rexport/export_methods'
11
- require File.dirname(__FILE__) + '/../lib/rexport/export_item_methods'
12
- require File.dirname(__FILE__) + '/../lib/rexport/export_filter_methods'
13
- require File.dirname(__FILE__) + '/../lib/rexport/tree_node'
9
+ require "rexport"
14
10
 
15
- ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
11
+ require 'minitest/autorun'
12
+ require 'factory_bot'
13
+ require 'mocha/minitest'
14
+ require File.dirname(__FILE__) + '/factories'
16
15
 
17
- RAILS_DEFAULT_LOGGER = Logger.new(File.dirname(__FILE__) + '/log/test.log')
18
- RAILS_DEFAULT_LOGGER.level = Logger::DEBUG
19
- ActiveRecord::Base.logger = RAILS_DEFAULT_LOGGER
16
+ ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
20
17
 
21
18
  class ActiveSupport::TestCase
22
- include FactoryGirl::Syntax::Methods
19
+ include FactoryBot::Syntax::Methods
23
20
  include Rexport::Factories
24
21
 
25
22
  def setup
26
- setup_db
23
+ suppress_output { setup_db }
27
24
  Enrollment.instance_variable_set('@rexport_fields', nil)
28
25
  Student.instance_variable_set('@rexport_fields', nil)
29
26
  end
@@ -32,17 +29,10 @@ class ActiveSupport::TestCase
32
29
  teardown_db
33
30
  end
34
31
 
35
- # Placeholder so test/unit ignores test cases without any tests.
36
- def default_test
37
- end
38
-
39
32
  private
40
33
 
41
34
  def setup_db
42
- old_stdout = $stdout
43
- $stdout = StringIO.new
44
-
45
- ActiveRecord::Schema.define(:version => 1) do
35
+ ActiveRecord::Schema.define(version: 1) do
46
36
  create_table :enrollments do |t|
47
37
  t.integer :student_id, :status_id, :grade
48
38
  t.boolean :active
@@ -85,8 +75,6 @@ class ActiveSupport::TestCase
85
75
  create_table :self_referential_checks do |t|
86
76
  end
87
77
  end
88
-
89
- $stdout = old_stdout
90
78
  end
91
79
 
92
80
  def teardown_db
@@ -94,6 +82,14 @@ class ActiveSupport::TestCase
94
82
  ActiveRecord::Base.connection.drop_table(table)
95
83
  end
96
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
97
93
  end
98
94
 
99
95
  class ActiveRecord::Base
@@ -107,7 +103,7 @@ class Enrollment < ActiveRecord::Base
107
103
  include Rexport::DataFields
108
104
  belongs_to :student
109
105
  belongs_to :status
110
- belongs_to :ilp_status, :class_name => 'Status', :foreign_key => 'ilp_status_id'
106
+ belongs_to :ilp_status, class_name: 'Status', foreign_key: 'ilp_status_id'
111
107
  belongs_to :self_referential_check
112
108
 
113
109
  def foo
@@ -117,9 +113,9 @@ class Enrollment < ActiveRecord::Base
117
113
  private
118
114
 
119
115
  def Enrollment.initialize_local_rexport_fields
120
- add_rexport_field(:foo_method, :method => :foo)
121
- add_rexport_field(:bad_method, :method => 'bad_method')
122
- add_association_methods(:associations => %w(status ilp_status))
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))
123
119
  end
124
120
  end
125
121
 
@@ -140,7 +136,7 @@ class Family < ActiveRecord::Base
140
136
  private
141
137
 
142
138
  def Family.initialize_local_rexport_fields
143
- add_rexport_field(:foo_method, :method => :foo)
139
+ add_rexport_field(:foo_method, method: :foo)
144
140
  end
145
141
  end
146
142