collection2csv 0.1.4 → 0.1.5

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
  SHA1:
3
- metadata.gz: 43ae44a7c263e2b23ab48ec1fe14f2953be6b780
4
- data.tar.gz: 7def884e570400c259567f02d658dbf737277157
3
+ metadata.gz: 2a03592303be2e3e37bc565307258beff0c0676d
4
+ data.tar.gz: 4f9aa3248e6ae78e160d63c02a6e8037ed1f23f5
5
5
  SHA512:
6
- metadata.gz: 1882a29a6ff91646cda97de146fd0843f069f6ebf510dbe55813563c76e079cf93f938e38d755fceada81faaf1c7c765354ec7c3533aba33afa3d7d20af5c8b3
7
- data.tar.gz: 69649b2bdd4534f9343791007be068b48b55b2908a2077cab4b5c70d529682125c7b7855ef9d328e1e7fe674513110af4351cfccb00f50828761c54b2bc4ed51
6
+ metadata.gz: 1294c69e6506a36223dc725ab176737fed4169d78aabfa7ccd773660321c9ca7122949f051377629142e776535682f04488afc38f394f4bb36666032853085c9
7
+ data.tar.gz: 9e3dcbee2cb5512aec40caeb3b85a26081c292c6888a887a572bbee523ab3c42933d9659513c47f63b9f31e6791c649e3b8ee252034a5682a9c212cb2bf60c33
data/.gitignore CHANGED
@@ -7,3 +7,4 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
+ /gemfiles/*.lock
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
@@ -1,8 +1,26 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 1.9.3
4
- - 2.0.0
5
- - 2.1.4
6
- - 2.1.5
7
- - 2.2.1
8
- before_install: gem install bundler -v 1.10.6
3
+ - 2.2.5
4
+ - 2.3.1
5
+ - ruby-head
6
+
7
+ before_install: gem install bundler
8
+
9
+ before_script:
10
+ - cd spec/dummy_app
11
+ - bundle exec rake db:create db:migrate
12
+ - cd ../../
13
+
14
+
15
+ cache: bundler
16
+
17
+
18
+ gemfile:
19
+ - gemfiles/rails_4.0.gemfile
20
+ - gemfiles/rails_4.1.gemfile
21
+ - gemfiles/rails_4.2.gemfile
22
+ - gemfiles/rails_5.0.gemfile
23
+
24
+ matrix:
25
+ allow_failures:
26
+ - rvm: ruby-head
@@ -0,0 +1,23 @@
1
+ appraise "rails-4.0" do
2
+ gem "rails", "4.0"
3
+ gem "sqlite3"
4
+ gem "database_cleaner"
5
+ end
6
+
7
+ appraise "rails-4.1" do
8
+ gem "rails", "4.1"
9
+ gem "sqlite3"
10
+ gem "database_cleaner"
11
+ end
12
+
13
+ appraise "rails-4.2" do
14
+ gem "rails", "4.2"
15
+ gem "sqlite3"
16
+ gem "database_cleaner"
17
+ end
18
+
19
+ appraise "rails-5.0" do
20
+ gem "rails", "5.0"
21
+ gem "sqlite3"
22
+ gem "database_cleaner"
23
+ end
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in collection2csv.gemspec
4
- gemspec
4
+ gemspec
data/README.md CHANGED
@@ -26,14 +26,27 @@ Or install it yourself as:
26
26
 
27
27
  Use the collection_download helper like any other regular tag helper :
28
28
 
29
- <%= collection_download(@collection) %>
29
+ <%= collection_download(@activerecord_collection) %>
30
+
31
+ eg: <%= collection_download(@users) %>
30
32
 
31
33
  In order to select a particular columns use column names as follows
32
34
 
33
- <%= collection_download(@collection,'column_name1,column_name2') %>
35
+ <%= collection_download(@activerecord_collection, {columns: ['id','name']}) %>
36
+
37
+ eg: <%= collection_download(@users, {columns: ['id','name']}) %>
38
+
39
+ Download link text can be provided as follows
40
+
41
+ <%= collection_download(@activerecord_collection, {link_text: 'export'}) %>
34
42
 
35
- Note: @collection is a ActiveRecord Collection
43
+ eg: <%= collection_download(@users, {link_text: 'export'}) %>
36
44
 
45
+ Supports Associations
46
+
47
+ <%= collection_download(@activerecord_collection, {columns: ['id','name'], associations: {association_name: ['id','name']}}) %>
48
+
49
+ eg: <%= collection_download(@users, {columns: ['id','name'], associations: {book: ['name', 'author']}}) %>
37
50
 
38
51
  ## Contributing
39
52
 
@@ -42,5 +55,4 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/ethira
42
55
 
43
56
  ## License
44
57
 
45
- The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
46
-
58
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
data/Rakefile CHANGED
@@ -1,4 +1,19 @@
1
+ require "rubygems"
2
+ require "bundler/setup"
1
3
  require "bundler/gem_tasks"
2
4
  require "rspec/core/rake_task"
3
- RSpec::Core::RakeTask.new
4
- task :default => :spec
5
+ require "appraisal"
6
+
7
+ RSpec::Core::RakeTask.new(:spec)
8
+
9
+ if !ENV["APPRAISAL_INITIALIZED"] && !ENV["TRAVIS"]
10
+ task :default do
11
+ system('bundle exec rake appraisal spec')
12
+ end
13
+ task :test do
14
+ system('bundle exec rake appraisal spec')
15
+ end
16
+ else
17
+ task :default => :spec
18
+ task :test => :spec
19
+ end
@@ -1,27 +1,9 @@
1
1
  require 'csv'
2
+ require 'collection2csv/convertor'
2
3
  class Collection2csvController < ApplicationController
4
+
3
5
  def convert
4
- klass = params[:klass].constantize
5
- if params[:column_names].present?
6
- column_names = params[:column_names].split(',').to_a
7
- else
8
- column_names = klass.column_names
9
- end
10
- collection = klass.find(params[:ids])
11
- respond_to do |format|
12
- format.csv { send_data to_csv(collection,column_names) ,:filename => "#{klass}_#{DateTime.now.to_formatted_s(:db)}.csv"
13
- }
14
- end
6
+ send_data Collection2csv::Convertor.new(params).perform, filename: "#{params[:klass]}_#{DateTime.now.to_formatted_s(:db)}.csv"
15
7
  end
16
8
 
17
- private
18
-
19
- def to_csv(collection,column_names)
20
- CSV.generate do |csv|
21
- csv << column_names.map(&:humanize)
22
- collection.each do |product|
23
- csv << product.attributes.values_at(*column_names)
24
- end
25
- end
26
- end
27
- end
9
+ end
@@ -1,8 +1,11 @@
1
1
  module CollectionToCsvHelper
2
- def collection_download(collection,column_names={})
2
+ def collection_download(collection,options={})
3
+ column_names = options[:columns].presence
4
+ associations = options[:associations].presence
5
+ link_text = options[:link_text].presence || 'Download'
3
6
  klass = collection.try(:first).class
4
- raise "#{collection} is not a ActiveRecord collection" unless klass.ancestors.include?(ActiveRecord::Base)
7
+ raise(RuntimeError, "#{collection} is not a ActiveRecord collection") unless klass.ancestors.include?(ActiveRecord::Base)
5
8
  collection_ids = collection.map(&:id)
6
- link_to "Download" , collection2csv_path(ids: collection_ids,klass: klass,format: "csv",column_names: column_names)
9
+ link_to link_text , collection2csv_path(ids: collection_ids,klass: klass,format: "csv",column_names: column_names,associations: associations)
7
10
  end
8
11
  end
@@ -23,12 +23,14 @@ Gem::Specification.new do |spec|
23
23
  end
24
24
 
25
25
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
26
+ spec.test_files = `git ls-files -- Appraisals {spec,gemfiles}/*`.split("\n")
26
27
  spec.bindir = "exe"
27
28
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
29
  spec.require_paths = ["lib"]
29
- spec.required_ruby_version = '>= 1.9.3'
30
+ spec.required_ruby_version = '>= 2.0.0'
30
31
  spec.add_development_dependency "bundler", "~> 1.10"
31
32
  spec.add_development_dependency "rake", "~> 10.0"
32
- spec.add_development_dependency "rspec"
33
+ spec.add_development_dependency "rspec-rails"
34
+ spec.add_development_dependency "appraisal"
33
35
 
34
36
  end
@@ -0,0 +1,9 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "4.0"
6
+ gem "sqlite3"
7
+ gem "database_cleaner"
8
+
9
+ gemspec :path => "../"
@@ -0,0 +1,9 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "4.1"
6
+ gem "sqlite3"
7
+ gem "database_cleaner"
8
+
9
+ gemspec :path => "../"
@@ -0,0 +1,9 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "4.2"
6
+ gem "sqlite3"
7
+ gem "database_cleaner"
8
+
9
+ gemspec :path => "../"
@@ -0,0 +1,9 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "5.0"
6
+ gem "sqlite3"
7
+ gem "database_cleaner"
8
+
9
+ gemspec :path => "../"
@@ -1,12 +1,11 @@
1
1
  require "collection2csv/version"
2
+ require "collection2csv/convertor"
2
3
 
3
4
  module Collection2csv
4
5
  class Engine < Rails::Engine
5
6
  initializer "Collection2csv.load_app_instance_data" do |app|
6
-
7
- config.app_root = app.root
8
- end
9
-
7
+ config.app_root = app.root
8
+ end
10
9
  end
11
10
  end
12
11
 
@@ -0,0 +1,104 @@
1
+ require 'csv'
2
+ module Collection2csv
3
+ class Convertor
4
+ def initialize(params)
5
+ @klass = params[:klass].constantize
6
+ @column_names_from_params = params[:column_names].presence
7
+ @associations_from_params = params[:associations].presence
8
+ @column_names = @column_names_from_params || @klass.column_names
9
+ @associations = @associations_from_params || {}
10
+ @association_class_names = {}
11
+ @association_column_names = []
12
+ @primary_ids = params[:ids]
13
+ end
14
+
15
+ def perform
16
+ validate
17
+ download
18
+ end
19
+
20
+ private
21
+
22
+ def validate
23
+ validate_columns if @column_names_from_params.present?
24
+ validate_associations if @associations_from_params.present?
25
+ end
26
+
27
+ def download
28
+ @collections = @klass.includes(@associations.try(:keys)).find(@primary_ids)
29
+ to_csv(@collections,@column_names,@associations)
30
+ end
31
+
32
+ def validate_columns
33
+ false_columns = @column_names - @klass.column_names
34
+ raise_error(false_columns,'column',@klass.name) unless false_columns.empty?
35
+ end
36
+
37
+ def raise_error(false_entities, pluralizer, source = nil)
38
+ msg = construct_error_msg(false_entities, pluralizer)
39
+ msg << ' in ' if source.present?
40
+ raise msg + source
41
+ end
42
+
43
+ def construct_error_msg(false_entities,pluralizer)
44
+ false_entities.join(', ') + ' ' + pluralizer.pluralize(false_entities.count) + ' not found'
45
+ end
46
+
47
+ def validate_associations
48
+ unless @associations.empty?
49
+ get_association_class_names
50
+ validate_association_column_names
51
+ end
52
+ end
53
+
54
+ def validate_association_keys
55
+ non_associative_keys = @associations.keys - @klass.reflections.keys
56
+ raise_error(non_associative_keys,'association') unless non_associative_keys.empty?
57
+ end
58
+
59
+ def get_association_class_names
60
+ @klass.reflect_on_all_associations.each do |association|
61
+ @association_class_names["#{association.name}"] = association.options[:class_name].presence || association.name.to_s.camelize
62
+ end
63
+ end
64
+
65
+ def validate_association_column_names
66
+ @associations.each do |association_key , association_value|
67
+ false_columns = association_value - @association_class_names[association_key.to_s].constantize.column_names
68
+ raise_error(false_columns,'column',association_key) unless false_columns.empty?
69
+ end
70
+ end
71
+
72
+ def generate_header
73
+ @header = @column_names.map(&:camelize)
74
+ @header += association_column_names
75
+ end
76
+
77
+ def association_column_names
78
+ @associations.each do | association_key, association_value |
79
+ association_value.each { |column_name| @association_column_names << "#{association_key}_#{column_name}" }
80
+ end
81
+ @association_column_names.map(&:camelize)
82
+ end
83
+
84
+ def generate_column_data(collection)
85
+ data = collection.attributes.values_at(*@column_names)
86
+ data = @associations.empty? ? data : generate_column_data_for_association(collection, data)
87
+ end
88
+
89
+ def generate_column_data_for_association(collection, data)
90
+ @associations.each do |association_key , association_value |
91
+ obj = collection.public_send(association_key)
92
+ data += obj.present? ? obj.attributes.values_at(*association_value) : Array.new(association_value.count,"")
93
+ end
94
+ data
95
+ end
96
+
97
+ def to_csv(collections,column_names,associations)
98
+ CSV.generate do |csv|
99
+ csv << generate_header
100
+ @collections.each { |collection| csv << generate_column_data(collection) }
101
+ end
102
+ end
103
+ end
104
+ end
@@ -1,3 +1,3 @@
1
1
  module Collection2csv
2
- VERSION = "0.1.4"
2
+ VERSION = "0.1.5"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: collection2csv
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - ethiraj
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-05-14 00:00:00.000000000 Z
11
+ date: 2016-09-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -39,7 +39,21 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '10.0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: rspec
42
+ name: rspec-rails
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: appraisal
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
59
  - - ">="
@@ -60,7 +74,9 @@ extensions: []
60
74
  extra_rdoc_files: []
61
75
  files:
62
76
  - ".gitignore"
77
+ - ".rspec"
63
78
  - ".travis.yml"
79
+ - Appraisals
64
80
  - CODE_OF_CONDUCT.md
65
81
  - Gemfile
66
82
  - LICENSE.txt
@@ -72,7 +88,12 @@ files:
72
88
  - bin/setup
73
89
  - collection2csv.gemspec
74
90
  - config/routes.rb
91
+ - gemfiles/rails_4.0.gemfile
92
+ - gemfiles/rails_4.1.gemfile
93
+ - gemfiles/rails_4.2.gemfile
94
+ - gemfiles/rails_5.0.gemfile
75
95
  - lib/collection2csv.rb
96
+ - lib/collection2csv/convertor.rb
76
97
  - lib/collection2csv/version.rb
77
98
  homepage: https://github.com/ethirajsrinivasan/collection2csv
78
99
  licenses:
@@ -87,7 +108,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
87
108
  requirements:
88
109
  - - ">="
89
110
  - !ruby/object:Gem::Version
90
- version: 1.9.3
111
+ version: 2.0.0
91
112
  required_rubygems_version: !ruby/object:Gem::Requirement
92
113
  requirements:
93
114
  - - ">="
@@ -95,8 +116,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
95
116
  version: '0'
96
117
  requirements: []
97
118
  rubyforge_project:
98
- rubygems_version: 2.4.8
119
+ rubygems_version: 2.5.1
99
120
  signing_key:
100
121
  specification_version: 4
101
122
  summary: Download ActiveRecord collection as csv
102
- test_files: []
123
+ test_files:
124
+ - Appraisals