as_csv 1.0.2 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: fab6c26d2cc4b35271b2e283e491551b0b543462
4
+ data.tar.gz: 57575c488181311eead7ec3f0d06720d542cce3a
5
+ SHA512:
6
+ metadata.gz: 1ef85d7066f7fab2bed8429e747f00a09d37bf185e27f6811dc352ee49a2b1c3f49c38661ab4cfd372eec297617e34fa39c566a6d8bc2f3c258a3a7d141c6610
7
+ data.tar.gz: eb9680322c9c6aef090247f6a492b37bb94953ce177c2148df5cb018b9d7a347e2d38d998cd4f56228d4a7b95e172864e80f2cd5c25ee70e48ccb519b84fd604
data/.gitignore CHANGED
@@ -18,3 +18,5 @@ spec/dummy/db/*.sqlite3
18
18
  spec/dummy/log/*.log
19
19
  spec/dummy/tmp/
20
20
  spec/dummy/.sass-cache
21
+ .rbx
22
+ Gemfile.lock
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/.travis.yml CHANGED
@@ -1,3 +1,6 @@
1
1
  language: ruby
2
- rvm: 1.9.3
3
2
  script: bundle exec rspec
3
+ rvm:
4
+ - 2.0.0
5
+ - 1.9.3
6
+ - jruby-19mode
data/Gemfile CHANGED
@@ -2,3 +2,5 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in as_csv.gemspec
4
4
  gemspec
5
+
6
+ gem 'activerecord-jdbcsqlite3-adapter', :platform => :jruby
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![Build Status](https://travis-ci.org/danielfone/as_csv.png)](https://travis-ci.org/danielfone/as_csv)
4
4
  [![Dependency Status](https://gemnasium.com/danielfone/as_csv.png)](https://gemnasium.com/danielfone/as_csv)
5
- [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/danielfone/as_csv)
5
+ [![Code Climate](https://codeclimate.com/github/danielfone/as_csv.png)](https://codeclimate.com/github/danielfone/as_csv)
6
6
 
7
7
  This gem allows you to expose CSV in your apps as you'd expose JSON or XML.
8
8
 
@@ -14,7 +14,9 @@ Ruby 1.8 will work, but by default the order of the columns will not be guarante
14
14
 
15
15
  Add this line to your application's Gemfile:
16
16
 
17
- gem 'as_csv'
17
+ ```ruby
18
+ gem 'as_csv'
19
+ ```
18
20
 
19
21
  ## Basic Usage
20
22
 
@@ -77,7 +79,7 @@ id,name,description,code
77
79
  > puts Widget.first.to_csv
78
80
  id,name,description,code
79
81
  1,widget-1,widget-description-1,1001
80
- => nil
82
+ => nil
81
83
  ```
82
84
 
83
85
  Behind the scenes, any classes that `include ActiveModel::Serialization` will expose their `attributes` with `to_csv`.
@@ -105,7 +107,7 @@ widget-1,1001
105
107
  widget-2,1002
106
108
  widget-3,1003
107
109
  widget-4,1004
108
- => nil
110
+ => nil
109
111
  >
110
112
  ```
111
113
 
@@ -167,3 +169,5 @@ bar2,bar2-description,,xyz98765
167
169
  6. Commit your changes (`git commit -am 'Add some feature'`)
168
170
  7. Push to the branch (`git push origin my-new-feature`)
169
171
  8. Create new Pull Request
172
+
173
+
data/as_csv.gemspec CHANGED
@@ -1,24 +1,25 @@
1
1
  # -*- encoding: utf-8 -*-
2
- lib = File.expand_path('../lib', __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'as_csv/version'
2
+ require File.expand_path '../lib/as_csv/version', __FILE__
5
3
 
6
4
  Gem::Specification.new do |gem|
7
5
  gem.name = "as_csv"
8
6
  gem.version = AsCSV::VERSION
9
7
  gem.authors = ["Daniel Fone"]
10
- gem.email = ["daniel@fone.net.nz"]
8
+ gem.email = %w[daniel@fone.net.nz]
11
9
  gem.description = %q{Instant CSV support for Rails}
12
10
  gem.summary = %q{Instant CSV support for Rails}
13
11
  gem.homepage = "https://github.com/danielfone/as_csv"
14
12
 
15
13
  gem.files = `git ls-files`.split($/)
16
- gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
14
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
- gem.require_paths = ["lib"]
15
+ gem.require_paths = %w[lib]
19
16
 
20
- gem.add_development_dependency "rails", "~> 3.2"
21
- gem.add_development_dependency "rspec-rails", "~> 2.12"
22
- gem.add_development_dependency "sqlite3"
23
- gem.add_development_dependency "fastercsv" if RUBY_VERSION < '1.9'
17
+ gem.add_runtime_dependency "activemodel", '>= 3.0'
18
+ gem.add_runtime_dependency "actionpack", '>= 3.0'
19
+
20
+ # Tests
21
+ gem.add_development_dependency "rails", ">= 3.0"
22
+ gem.add_development_dependency "sqlite3" unless defined? JRUBY_VERSION
23
+ gem.add_development_dependency "rspec-rails", "~> 3.0"
24
+ gem.add_development_dependency "simplecov"
24
25
  end
@@ -1,7 +1,23 @@
1
+ require 'csv'
2
+ require 'as_csv/csv_builder'
3
+
1
4
  class Array
5
+
2
6
  def to_csv_with_builder(opts={})
3
- AsCSV::CSVBuilder.new(self, opts).to_csv || to_csv_without_builder
7
+ use_csv_builder? and csv_builder(opts).to_csv or to_csv_without_builder
4
8
  end
9
+
5
10
  alias_method :to_csv_without_builder, :to_csv
6
11
  alias_method :to_csv, :to_csv_with_builder
12
+
13
+ private
14
+
15
+ def use_csv_builder?
16
+ any? { |e| e.respond_to? :as_csv }
17
+ end
18
+
19
+ def csv_builder(opts)
20
+ AsCSV::CSVBuilder.new self, opts
21
+ end
22
+
7
23
  end
@@ -1,35 +1,45 @@
1
+ require 'csv'
2
+
1
3
  module AsCSV
2
4
  class CSVBuilder
3
5
  attr_reader :records, :options
4
6
 
5
7
  def initialize(records, options={})
6
- @records = [*records]
8
+ @records = Array(records)
7
9
  @options = options
10
+ validate
8
11
  end
9
12
 
10
13
  def to_csv
11
- rows.collect { |row| CSVProxy.generate_line row }.join if valid?
14
+ rows.collect { |row| CSV.generate_line row }.join
12
15
  end
13
16
 
14
- def rows
15
- @rows ||= [headers] + data_rows if valid?
16
- end
17
+ private
17
18
 
18
- def headers
19
- @headers ||= csv_hashes.collect(&:keys).flatten.uniq if valid?
20
- end
19
+ def rows
20
+ @rows ||= [headers] + data_rows
21
+ end
21
22
 
22
- def data_rows
23
- @data_rows ||= csv_hashes.collect { |csv_hash| data_row csv_hash } if valid?
24
- end
23
+ def headers
24
+ @headers ||= csv_hashes.collect(&:keys).flatten.uniq
25
+ end
25
26
 
26
- def valid?
27
- csv_hashes.any? && validate_hashes!
28
- end
27
+ def data_rows
28
+ @data_rows ||= csv_hashes.collect { |csv_hash| data_row csv_hash }
29
+ end
29
30
 
30
- private
31
+ def validate
32
+ validate_members
33
+ validate_hashes
34
+ end
35
+
36
+ def validate_members
37
+ if records.any? { |r| not r.respond_to? :as_csv }
38
+ raise TypeError, 'Some elements do not respond to :as_csv'
39
+ end
40
+ end
31
41
 
32
- def validate_hashes!
42
+ def validate_hashes
33
43
  csv_hashes.each do |hash|
34
44
  raise TypeError, "expected as_csv to return Hash" unless hash.is_a? Hash
35
45
  end
@@ -42,5 +52,5 @@ module AsCSV
42
52
  def data_row(csv_hash)
43
53
  headers.collect { |header| csv_hash[header] }
44
54
  end
45
- end
55
+ end
46
56
  end
@@ -0,0 +1,15 @@
1
+ require 'as_csv/csv_builder'
2
+
3
+ module ActiveModel::Serialization
4
+ def as_csv(options={})
5
+ attributes
6
+ end
7
+
8
+ def to_csv(*args)
9
+ AsCSV::CSVBuilder.new(self, *args).to_csv
10
+ end
11
+ end
12
+
13
+ ActionController::Renderers.add :csv do |obj, options|
14
+ obj.respond_to?(:to_csv) ? obj.to_csv(options) : obj
15
+ end
@@ -1,3 +1,3 @@
1
1
  module AsCSV
2
- VERSION = "1.0.2"
2
+ VERSION = "2.0.0"
3
3
  end
data/lib/as_csv.rb CHANGED
@@ -1,9 +1,3 @@
1
1
  require "as_csv/version"
2
- require "as_csv/csv_proxy"
3
- require "as_csv/csv_builder"
4
2
  require "as_csv/core_ext/array"
5
- require "as_csv/active_model"
6
- require "as_csv/action_renderer"
7
-
8
- module AsCSV
9
- end
3
+ require "as_csv/railtie"
data/script/rspec ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # This file was generated by Bundler.
4
+ #
5
+ # The application 'rspec' is installed as part of a gem, and
6
+ # this file is here to facilitate running it.
7
+ #
8
+
9
+ require 'pathname'
10
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
11
+ Pathname.new(__FILE__).realpath)
12
+
13
+ require 'rubygems'
14
+ require 'bundler/setup'
15
+
16
+ load Gem.bin_path('rspec-core', 'rspec')
@@ -1,4 +1,4 @@
1
- require 'spec_helper'
1
+ require 'rails_helper'
2
2
 
3
3
  describe RenderWidgetsController, :widgets_controllers do
4
4
  exercise_controller
@@ -1,4 +1,4 @@
1
- require 'spec_helper'
1
+ require 'rails_helper'
2
2
 
3
3
  describe RespondWithWidgetsController, :widgets_controllers do
4
4
  exercise_controller
@@ -1,27 +1,34 @@
1
1
  require 'spec_helper'
2
+ require 'as_csv/core_ext/array'
2
3
 
3
4
  describe Array do
4
- it { should respond_to(:to_csv) }
5
- it { should respond_to(:to_csv_with_builder) }
6
- it { should respond_to(:to_csv_without_builder) }
5
+ subject(:array) do
6
+ [
7
+ double(:foo, :as_csv => {:header => '1'}),
8
+ double(:foo, :as_csv => {:header => '2'}),
9
+ double(:foo, :as_csv => {:header1 => '3'}),
10
+ ]
11
+ end
7
12
 
8
- context 'with objects responding to `as_csv`' do
9
- before { subject << stub(:foo, :as_csv => {:header => 'value'})}
13
+ describe '#to_csv' do
14
+ subject { array.to_csv }
10
15
 
11
- specify do
12
- AsCSV::CSVBuilder.any_instance.should_receive(:to_csv).and_call_original
13
- subject.should_not_receive(:to_csv_without_builder)
14
- subject.to_csv
16
+ it 'should use :as_csv on its elements if present' do
17
+ should eq "header,header1\n1,\n2,\n,3\n"
15
18
  end
16
- end
17
19
 
18
- context 'without objects responding to `as_csv`' do
19
- before { subject << 1 }
20
+ context 'with mixed elements' do
21
+ before { array << 1 }
22
+ it 'should raise a TypeError' do
23
+ expect { subject }.to raise_error TypeError
24
+ end
25
+ end
20
26
 
21
- specify do
22
- AsCSV::CSVBuilder.any_instance.should_receive(:to_csv).and_call_original
23
- subject.should_receive(:to_csv_without_builder)
24
- subject.to_csv
27
+ context 'with literals' do
28
+ before { array.clear; array << 1 }
29
+ it 'should not use :as_csv' do
30
+ should eq "1\n"
31
+ end
25
32
  end
26
33
  end
27
34
 
@@ -2,7 +2,7 @@ class RenderWidgetsController < ApplicationController
2
2
 
3
3
  def index
4
4
  respond_to do |format|
5
- format.csv { render :csv => WidgetWithOptions.scoped, :style => :full }
5
+ format.csv { render :csv => WidgetWithOptions.all, :style => :full }
6
6
  end
7
7
  end
8
8
 
@@ -2,7 +2,7 @@ class RespondWithWidgetsController < ApplicationController
2
2
  respond_to :csv
3
3
 
4
4
  def index
5
- respond_with WidgetWithOptions.scoped, :style => :full
5
+ respond_with WidgetWithOptions.all, :style => :full
6
6
  end
7
7
 
8
8
  def show
@@ -1,3 +1,2 @@
1
1
  class Widget < ActiveRecord::Base
2
- attr_accessible :code, :description, :name
3
2
  end
@@ -43,11 +43,6 @@ module Dummy
43
43
  # like if you have constraints or database-specific column types
44
44
  # config.active_record.schema_format = :sql
45
45
 
46
- # Enforce whitelist mode for mass assignment.
47
- # This will create an empty whitelist of attributes available for mass-assignment for all models
48
- # in your app. As such, your models will need to explicitly whitelist or blacklist accessible
49
- # parameters by using an attr_accessible or attr_protected declaration.
50
- config.active_record.whitelist_attributes = true
51
46
 
52
47
  end
53
48
  end
@@ -29,9 +29,8 @@ Dummy::Application.configure do
29
29
  # ActionMailer::Base.deliveries array.
30
30
  config.action_mailer.delivery_method = :test
31
31
 
32
- # Raise exception on mass assignment protection for Active Record models
33
- config.active_record.mass_assignment_sanitizer = :strict
34
-
35
32
  # Print deprecation notices to the stderr
36
33
  config.active_support.deprecation = :stderr
34
+
35
+ config.eager_load = false
37
36
  end
@@ -1,112 +1,76 @@
1
1
  require 'spec_helper'
2
+ require 'as_csv/csv_builder'
2
3
 
3
4
  describe AsCSV::CSVBuilder do
4
- subject(:csv_builder) { described_class.new records, options }
5
+ subject(:builder) { described_class.new records, options }
5
6
  let(:records) { nil }
6
7
  let(:options) { Hash.new }
7
8
 
8
- EXPOSED_METHODS = [:headers, :rows, :data_rows, :to_csv].freeze
9
+ describe '#to_csv' do
10
+ subject { builder.to_csv }
9
11
 
10
- describe '#rows' do
11
- subject(:rows) { csv_builder.rows }
12
- before { csv_builder.stub :headers => headers, :data_rows => data_rows, "valid?" => true }
13
- let(:headers) { %w(h1 h2) }
14
- let(:data_rows) { [%w(v11 v12), %w(v21 v22)] }
12
+ context 'with single record' do
13
+ let(:records) do
14
+ double(:foo, :as_csv => {
15
+ :first => '1',
16
+ :second => '2',
17
+ :third => '3'
18
+ })
19
+ end
15
20
 
16
- specify { csv_builder.should be_valid }
17
- it { should == [headers, *data_rows] }
18
- end
19
-
20
- context 'with single record' do
21
- let(:records) do
22
- stub(:foo, :as_csv => {
23
- :first => '1',
24
- :second => '2',
25
- :third => '3'
26
- })
21
+ it 'should render correctly' do
22
+ should eq "first,second,third\n1,2,3\n"
23
+ end
27
24
  end
28
25
 
29
- its(:headers) { should == [:first, :second, :third] }
30
- its(:data_rows) { should == [%w(1 2 3)] }
31
- its(:to_csv) do
32
- should == <<-CSV
33
- first,second,third
34
- 1,2,3
35
- CSV
36
- end
37
- end
38
-
39
- context 'with homogenous records' do
40
- let(:records) { [record1, record2] }
41
- 2.times do |i|
42
- let("record#{i+1}") do
43
- stub(:foo, :as_csv => {
44
- :first => "1#{i}",
45
- :second => "2#{i}",
46
- :third => "3#{i}"
47
- })
26
+ context 'with homogenous records' do
27
+ let(:records) do
28
+ 2.times.map do |i|
29
+ double(:foo, :as_csv => {
30
+ :first => "1#{i}",
31
+ :second => "2#{i}",
32
+ :third => "3#{i}"
33
+ })
34
+ end
48
35
  end
49
- end
50
36
 
51
- its(:headers) { should == [:first, :second, :third] }
52
- its(:data_rows) { should == [%w(10 20 30), %w(11 21 31)] }
53
- its(:to_csv) do
54
- should == <<-CSV
55
- first,second,third
56
- 10,20,30
57
- 11,21,31
58
- CSV
37
+ it 'should render correctly' do
38
+ should == "first,second,third\n10,20,30\n11,21,31\n"
39
+ end
59
40
  end
60
- end
61
41
 
62
- context 'with hetreogenous records' do
63
- let(:records) { [record1, record2] }
64
- 2.times do |i|
65
- let("record#{i+1}") do
66
- stub(:foo, :as_csv => {
67
- "first#{i}" => "1#{i}",
68
- "second#{i}" => "2#{i}",
69
- "third#{i}" => "3#{i}"
70
- })
42
+ context 'with hetreogenous records' do
43
+ let(:records) do
44
+ 2.times.map do |i|
45
+ double(:foo, :as_csv => {
46
+ "first#{i}" => "1#{i}",
47
+ "second#{i}" => "2#{i}",
48
+ "third#{i}" => "3#{i}"
49
+ })
50
+ end
71
51
  end
72
- end
73
52
 
74
- its(:headers) { should == %w(first0 second0 third0 first1 second1 third1) }
75
- its(:data_rows) { should == [["10", "20", "30", nil, nil, nil], [nil, nil, nil, "11", "21", "31"]] }
76
- its(:to_csv) do
77
- should == <<-CSV
78
- first0,second0,third0,first1,second1,third1
53
+ it 'should merge headers' do
54
+ should == "first0,second0,third0,first1,second1,third1
79
55
  10,20,30,,,
80
56
  ,,,11,21,31
81
- CSV
82
- end
83
- end
84
-
85
- context 'with nil record' do
86
- let(:records) { nil }
87
-
88
- it { should_not be_valid }
89
- EXPOSED_METHODS.each do |method|
90
- its(method) { should == nil }
57
+ "
58
+ end
91
59
  end
92
- end
93
60
 
94
- context 'with record not respond_to? `as_csv`' do
95
- let(:records) { stub(:foo) }
61
+ context 'with record not respond_to? `as_csv`' do
62
+ let(:records) { double(:foo) }
96
63
 
97
- it { should_not be_valid }
98
- EXPOSED_METHODS.each do |method|
99
- its(method) { should == nil }
64
+ it 'should raise an error' do
65
+ expect { builder.to_csv }.to raise_error TypeError
66
+ end
100
67
  end
101
- end
102
68
 
103
- context 'with record `as_csv` != Hash' do
104
- let(:records) { stub(:foo, :as_csv => 'test') }
69
+ context 'with record `as_csv` != Hash' do
70
+ let(:records) { double(:foo, :as_csv => 'test') }
105
71
 
106
- message = "expected as_csv to return Hash"
107
- ([:valid?] + EXPOSED_METHODS).each do |method|
108
- specify(%Q{`#{method}` should raise "#{message}"}) do
109
- expect { csv_builder.send method }.to raise_error TypeError, message
72
+ it 'should raise an error' do
73
+ expect { builder.to_csv }.to raise_error TypeError
110
74
  end
111
75
  end
112
76
  end
@@ -1,4 +1,4 @@
1
- require 'spec_helper'
1
+ require 'rails_helper'
2
2
 
3
3
  class Serializable
4
4
  include ActiveModel::Serialization
@@ -1,18 +1,18 @@
1
- require 'spec_helper'
1
+ require 'rails_helper'
2
2
 
3
3
  describe Widget do
4
4
  it { should respond_to :to_csv }
5
5
  it { should respond_to :as_csv }
6
6
 
7
7
  describe 'dummy' do
8
- subject(:dummy_widget) { Widget.create! :name => "widget-name", :description => 'widget-description', :code => 1234 }
8
+ subject(:dummy_widget) { Widget.new :name => "widget-name", :description => 'widget-description', :code => 1234 }
9
9
 
10
10
  describe :to_csv do
11
11
  subject { dummy_widget.to_csv }
12
12
  it do
13
13
  should == <<-CSV.strip_heredoc
14
14
  id,name,description,code
15
- 1,widget-name,widget-description,1234
15
+ ,widget-name,widget-description,1234
16
16
  CSV
17
17
  end
18
18
  end
@@ -1,7 +1,7 @@
1
- require 'spec_helper'
1
+ require 'rails_helper'
2
2
 
3
3
  describe WidgetWithOptions do
4
- subject(:widget) { described_class.new :name => 'widget-name', :code => 1234 }
4
+ subject(:widget) { WidgetWithOptions.new :name => 'widget-name', :code => 1234 }
5
5
 
6
6
  describe :to_csv do
7
7
  subject { widget.to_csv(options) }
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ # Configure Rails Environment
4
+ ENV["RAILS_ENV"] = "test"
5
+
6
+ require File.expand_path("../dummy/config/environment.rb", __FILE__)
7
+ require 'rspec/rails'
8
+
9
+ Rails.backtrace_cleaner.remove_silencers!
10
+
11
+ RSpec.configure do |config|
12
+ # If you're not using ActiveRecord, or you'd prefer not to run each of your
13
+ # examples within a transaction, remove the following line or assign false
14
+ # instead of true.
15
+ config.use_transactional_fixtures = true
16
+
17
+ # If true, the base class of anonymous controllers will be inferred
18
+ # automatically. This will be the default behavior in future versions of
19
+ # rspec-rails.
20
+ config.infer_base_class_for_anonymous_controllers = false
21
+
22
+ config.infer_spec_type_from_file_location!
23
+
24
+ config.extend WidgetsControllerMixin, :widgets_controllers
25
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,29 +1,10 @@
1
- # Configure Rails Environment
2
- ENV["RAILS_ENV"] = "test"
3
-
4
- require File.expand_path("../dummy/config/environment.rb", __FILE__)
5
- require 'rspec/rails'
6
-
7
- Rails.backtrace_cleaner.remove_silencers!
1
+ require 'simplecov'
2
+ SimpleCov.start
8
3
 
9
4
  # Requires supporting ruby files with custom matchers and macros, etc,
10
5
  # in spec/support/ and its subdirectories.
11
6
  Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
12
7
 
13
8
  RSpec.configure do |config|
14
- # If you're not using ActiveRecord, or you'd prefer not to run each of your
15
- # examples within a transaction, remove the following line or assign false
16
- # instead of true.
17
- config.use_transactional_fixtures = true
18
-
19
- # If true, the base class of anonymous controllers will be inferred
20
- # automatically. This will be the default behavior in future versions of
21
- # rspec-rails.
22
- config.infer_base_class_for_anonymous_controllers = false
23
-
24
- config.treat_symbols_as_metadata_keys_with_true_values = true
25
-
26
9
  config.order = "random"
27
-
28
- config.extend WidgetsControllerMixin, :widgets_controllers
29
10
  end
@@ -9,36 +9,30 @@ module WidgetsControllerMixin
9
9
  ]
10
10
  end
11
11
 
12
- context 'GET show/1.csv' do
12
+ describe 'GET show/1.csv' do
13
13
  before { get :show, :id => 1, :format => :csv }
14
- describe 'response' do
15
- subject { response }
16
- its(:code) { should == "200" }
17
- its(:content_type) { should == "text/csv" }
18
- its(:body) do
19
- should == <<-CSV.strip_heredoc
20
- id,name,description,code
21
- 1,widget-1,widget-description-1,1001
22
- CSV
23
- end
14
+ it 'should respond with the CSV' do
15
+ expect(response.code).to eq "200"
16
+ expect(response.content_type).to eq "text/csv"
17
+ expect(response.body).to eq <<-CSV.strip_heredoc
18
+ id,name,description,code
19
+ 1,widget-1,widget-description-1,1001
20
+ CSV
24
21
  end
25
22
  end
26
23
 
27
24
  context 'GET index.csv' do
28
25
  before { get :index, :format => :csv }
29
- describe 'response' do
30
- subject { response }
31
- its(:code) { should == "200" }
32
- its(:content_type) { should == "text/csv" }
33
- its(:body) do
34
- should == <<-CSV.strip_heredoc
35
- name,code,full
36
- widget-1,1001,true
37
- widget-2,1002,true
38
- widget-3,1003,true
39
- widget-4,1004,true
40
- CSV
41
- end
26
+ it 'should respond with the CSV' do
27
+ expect(response.code).to eq "200"
28
+ expect(response.content_type).to eq "text/csv"
29
+ expect(response.body).to eq <<-CSV.strip_heredoc
30
+ name,code,full
31
+ widget-1,1001,true
32
+ widget-2,1002,true
33
+ widget-3,1003,true
34
+ widget-4,1004,true
35
+ CSV
42
36
  end
43
37
  end
44
38
  end
metadata CHANGED
@@ -1,64 +1,99 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: as_csv
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
5
- prerelease:
4
+ version: 2.0.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Daniel Fone
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-01-15 00:00:00.000000000 Z
11
+ date: 2014-08-06 00:00:00.000000000 Z
13
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activemodel
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '3.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '3.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: actionpack
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '3.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '3.0'
14
41
  - !ruby/object:Gem::Dependency
15
42
  name: rails
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
16
49
  prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: sqlite3
17
57
  requirement: !ruby/object:Gem::Requirement
18
58
  requirements:
19
- - - ~>
59
+ - - ">="
20
60
  - !ruby/object:Gem::Version
21
- version: '3.2'
22
- none: false
61
+ version: '0'
23
62
  type: :development
63
+ prerelease: false
24
64
  version_requirements: !ruby/object:Gem::Requirement
25
65
  requirements:
26
- - - ~>
66
+ - - ">="
27
67
  - !ruby/object:Gem::Version
28
- version: '3.2'
29
- none: false
68
+ version: '0'
30
69
  - !ruby/object:Gem::Dependency
31
70
  name: rspec-rails
32
- prerelease: false
33
71
  requirement: !ruby/object:Gem::Requirement
34
72
  requirements:
35
- - - ~>
73
+ - - "~>"
36
74
  - !ruby/object:Gem::Version
37
- version: '2.12'
38
- none: false
75
+ version: '3.0'
39
76
  type: :development
77
+ prerelease: false
40
78
  version_requirements: !ruby/object:Gem::Requirement
41
79
  requirements:
42
- - - ~>
80
+ - - "~>"
43
81
  - !ruby/object:Gem::Version
44
- version: '2.12'
45
- none: false
82
+ version: '3.0'
46
83
  - !ruby/object:Gem::Dependency
47
- name: sqlite3
48
- prerelease: false
84
+ name: simplecov
49
85
  requirement: !ruby/object:Gem::Requirement
50
86
  requirements:
51
- - - ! '>='
87
+ - - ">="
52
88
  - !ruby/object:Gem::Version
53
89
  version: '0'
54
- none: false
55
90
  type: :development
91
+ prerelease: false
56
92
  version_requirements: !ruby/object:Gem::Requirement
57
93
  requirements:
58
- - - ! '>='
94
+ - - ">="
59
95
  - !ruby/object:Gem::Version
60
96
  version: '0'
61
- none: false
62
97
  description: Instant CSV support for Rails
63
98
  email:
64
99
  - daniel@fone.net.nz
@@ -66,21 +101,20 @@ executables: []
66
101
  extensions: []
67
102
  extra_rdoc_files: []
68
103
  files:
69
- - .gitignore
70
- - .travis.yml
104
+ - ".gitignore"
105
+ - ".rspec"
106
+ - ".travis.yml"
71
107
  - Gemfile
72
- - Gemfile.lock
73
108
  - LICENSE.txt
74
109
  - README.md
75
110
  - Rakefile
76
111
  - as_csv.gemspec
77
112
  - lib/as_csv.rb
78
- - lib/as_csv/action_renderer.rb
79
- - lib/as_csv/active_model.rb
80
113
  - lib/as_csv/core_ext/array.rb
81
114
  - lib/as_csv/csv_builder.rb
82
- - lib/as_csv/csv_proxy.rb
115
+ - lib/as_csv/railtie.rb
83
116
  - lib/as_csv/version.rb
117
+ - script/rspec
84
118
  - spec/controllers/render_widgets_controller_spec.rb
85
119
  - spec/controllers/respond_with_widgets_controller_spec.rb
86
120
  - spec/core_ext/array_spec.rb
@@ -101,8 +135,6 @@ files:
101
135
  - spec/dummy/config/boot.rb
102
136
  - spec/dummy/config/database.yml
103
137
  - spec/dummy/config/environment.rb
104
- - spec/dummy/config/environments/development.rb
105
- - spec/dummy/config/environments/production.rb
106
138
  - spec/dummy/config/environments/test.rb
107
139
  - spec/dummy/config/initializers/backtrace_silencers.rb
108
140
  - spec/dummy/config/initializers/inflections.rb
@@ -125,31 +157,31 @@ files:
125
157
  - spec/models/active_model_spec.rb
126
158
  - spec/models/widget_spec.rb
127
159
  - spec/models/widget_with_options_spec.rb
160
+ - spec/rails_helper.rb
128
161
  - spec/spec_helper.rb
129
162
  - spec/support/widgets_controller_mixin.rb
130
163
  homepage: https://github.com/danielfone/as_csv
131
164
  licenses: []
165
+ metadata: {}
132
166
  post_install_message:
133
167
  rdoc_options: []
134
168
  require_paths:
135
169
  - lib
136
170
  required_ruby_version: !ruby/object:Gem::Requirement
137
171
  requirements:
138
- - - ! '>='
172
+ - - ">="
139
173
  - !ruby/object:Gem::Version
140
174
  version: '0'
141
- none: false
142
175
  required_rubygems_version: !ruby/object:Gem::Requirement
143
176
  requirements:
144
- - - ! '>='
177
+ - - ">="
145
178
  - !ruby/object:Gem::Version
146
179
  version: '0'
147
- none: false
148
180
  requirements: []
149
181
  rubyforge_project:
150
- rubygems_version: 1.8.24
182
+ rubygems_version: 2.4.1
151
183
  signing_key:
152
- specification_version: 3
184
+ specification_version: 4
153
185
  summary: Instant CSV support for Rails
154
186
  test_files:
155
187
  - spec/controllers/render_widgets_controller_spec.rb
@@ -172,8 +204,6 @@ test_files:
172
204
  - spec/dummy/config/boot.rb
173
205
  - spec/dummy/config/database.yml
174
206
  - spec/dummy/config/environment.rb
175
- - spec/dummy/config/environments/development.rb
176
- - spec/dummy/config/environments/production.rb
177
207
  - spec/dummy/config/environments/test.rb
178
208
  - spec/dummy/config/initializers/backtrace_silencers.rb
179
209
  - spec/dummy/config/initializers/inflections.rb
@@ -196,5 +226,6 @@ test_files:
196
226
  - spec/models/active_model_spec.rb
197
227
  - spec/models/widget_spec.rb
198
228
  - spec/models/widget_with_options_spec.rb
229
+ - spec/rails_helper.rb
199
230
  - spec/spec_helper.rb
200
231
  - spec/support/widgets_controller_mixin.rb
data/Gemfile.lock DELETED
@@ -1,107 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- as_csv (1.0.0)
5
-
6
- GEM
7
- remote: https://rubygems.org/
8
- specs:
9
- actionmailer (3.2.11)
10
- actionpack (= 3.2.11)
11
- mail (~> 2.4.4)
12
- actionpack (3.2.11)
13
- activemodel (= 3.2.11)
14
- activesupport (= 3.2.11)
15
- builder (~> 3.0.0)
16
- erubis (~> 2.7.0)
17
- journey (~> 1.0.4)
18
- rack (~> 1.4.0)
19
- rack-cache (~> 1.2)
20
- rack-test (~> 0.6.1)
21
- sprockets (~> 2.2.1)
22
- activemodel (3.2.11)
23
- activesupport (= 3.2.11)
24
- builder (~> 3.0.0)
25
- activerecord (3.2.11)
26
- activemodel (= 3.2.11)
27
- activesupport (= 3.2.11)
28
- arel (~> 3.0.2)
29
- tzinfo (~> 0.3.29)
30
- activeresource (3.2.11)
31
- activemodel (= 3.2.11)
32
- activesupport (= 3.2.11)
33
- activesupport (3.2.11)
34
- i18n (~> 0.6)
35
- multi_json (~> 1.0)
36
- arel (3.0.2)
37
- builder (3.0.4)
38
- diff-lcs (1.1.3)
39
- erubis (2.7.0)
40
- hike (1.2.1)
41
- i18n (0.6.1)
42
- journey (1.0.4)
43
- json (1.7.6)
44
- mail (2.4.4)
45
- i18n (>= 0.4.0)
46
- mime-types (~> 1.16)
47
- treetop (~> 1.4.8)
48
- mime-types (1.19)
49
- multi_json (1.5.0)
50
- polyglot (0.3.3)
51
- rack (1.4.3)
52
- rack-cache (1.2)
53
- rack (>= 0.4)
54
- rack-ssl (1.3.2)
55
- rack
56
- rack-test (0.6.2)
57
- rack (>= 1.0)
58
- rails (3.2.11)
59
- actionmailer (= 3.2.11)
60
- actionpack (= 3.2.11)
61
- activerecord (= 3.2.11)
62
- activeresource (= 3.2.11)
63
- activesupport (= 3.2.11)
64
- bundler (~> 1.0)
65
- railties (= 3.2.11)
66
- railties (3.2.11)
67
- actionpack (= 3.2.11)
68
- activesupport (= 3.2.11)
69
- rack-ssl (~> 1.3.2)
70
- rake (>= 0.8.7)
71
- rdoc (~> 3.4)
72
- thor (>= 0.14.6, < 2.0)
73
- rake (10.0.3)
74
- rdoc (3.12)
75
- json (~> 1.4)
76
- rspec-core (2.12.2)
77
- rspec-expectations (2.12.1)
78
- diff-lcs (~> 1.1.3)
79
- rspec-mocks (2.12.1)
80
- rspec-rails (2.12.2)
81
- actionpack (>= 3.0)
82
- activesupport (>= 3.0)
83
- railties (>= 3.0)
84
- rspec-core (~> 2.12.0)
85
- rspec-expectations (~> 2.12.0)
86
- rspec-mocks (~> 2.12.0)
87
- sprockets (2.2.2)
88
- hike (~> 1.2)
89
- multi_json (~> 1.0)
90
- rack (~> 1.0)
91
- tilt (~> 1.1, != 1.3.0)
92
- sqlite3 (1.3.7)
93
- thor (0.16.0)
94
- tilt (1.3.3)
95
- treetop (1.4.12)
96
- polyglot
97
- polyglot (>= 0.3.1)
98
- tzinfo (0.3.35)
99
-
100
- PLATFORMS
101
- ruby
102
-
103
- DEPENDENCIES
104
- as_csv!
105
- rails (~> 3.2)
106
- rspec-rails (~> 2.12)
107
- sqlite3
@@ -1,5 +0,0 @@
1
- if defined? ActionController::Renderers
2
- ActionController::Renderers.add :csv do |obj, options|
3
- obj.respond_to?(:to_csv) ? obj.to_csv(options) : obj
4
- end
5
- end
@@ -1,11 +0,0 @@
1
- if defined? ActiveModel::Serialization
2
- module ActiveModel::Serialization
3
- def as_csv(options={})
4
- attributes
5
- end
6
-
7
- def to_csv(*args)
8
- [self].to_csv(*args)
9
- end
10
- end
11
- end
@@ -1,13 +0,0 @@
1
- if RUBY_VERSION >= '1.9'
2
- require 'csv'
3
- AsCSV::CSVProxy = CSV
4
- else
5
- begin
6
- gem 'fastercsv'
7
- require 'fastercsv'
8
-
9
- AsCSV::CSVProxy = FasterCSV
10
- rescue LoadError => e
11
- raise "Error : FasterCSV not installed, please `gem install fastercsv` for faster processing on Ruby 1.8"
12
- end
13
- end
@@ -1,32 +0,0 @@
1
- Dummy::Application.configure do
2
- # Settings specified here will take precedence over those in config/application.rb
3
-
4
- # In the development environment your application's code is reloaded on
5
- # every request. This slows down response time but is perfect for development
6
- # since you don't have to restart the web server when you make code changes.
7
- config.cache_classes = false
8
-
9
- # Log error messages when you accidentally call methods on nil.
10
- config.whiny_nils = true
11
-
12
- # Show full error reports and disable caching
13
- config.consider_all_requests_local = true
14
- config.action_controller.perform_caching = false
15
-
16
- # Don't care if the mailer can't send
17
- config.action_mailer.raise_delivery_errors = false
18
-
19
- # Print deprecation notices to the Rails logger
20
- config.active_support.deprecation = :log
21
-
22
- # Only use best-standards-support built into browsers
23
- config.action_dispatch.best_standards_support = :builtin
24
-
25
- # Raise exception on mass assignment protection for Active Record models
26
- config.active_record.mass_assignment_sanitizer = :strict
27
-
28
- # Log the query plan for queries taking more than this (works
29
- # with SQLite, MySQL, and PostgreSQL)
30
- config.active_record.auto_explain_threshold_in_seconds = 0.5
31
-
32
- end
@@ -1,54 +0,0 @@
1
- Dummy::Application.configure do
2
- # Settings specified here will take precedence over those in config/application.rb
3
-
4
- # Code is not reloaded between requests
5
- config.cache_classes = true
6
-
7
- # Full error reports are disabled and caching is turned on
8
- config.consider_all_requests_local = false
9
- config.action_controller.perform_caching = true
10
-
11
- # Disable Rails's static asset server (Apache or nginx will already do this)
12
- config.serve_static_assets = false
13
-
14
-
15
- # Specifies the header that your server uses for sending files
16
- # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache
17
- # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx
18
-
19
- # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
20
- # config.force_ssl = true
21
-
22
- # See everything in the log (default is :info)
23
- # config.log_level = :debug
24
-
25
- # Prepend all log lines with the following tags
26
- # config.log_tags = [ :subdomain, :uuid ]
27
-
28
- # Use a different logger for distributed setups
29
- # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new)
30
-
31
- # Use a different cache store in production
32
- # config.cache_store = :mem_cache_store
33
-
34
- # Enable serving of images, stylesheets, and JavaScripts from an asset server
35
- # config.action_controller.asset_host = "http://assets.example.com"
36
-
37
-
38
- # Disable delivery errors, bad email addresses will be ignored
39
- # config.action_mailer.raise_delivery_errors = false
40
-
41
- # Enable threaded mode
42
- # config.threadsafe!
43
-
44
- # Enable locale fallbacks for I18n (makes lookups for any locale fall back to
45
- # the I18n.default_locale when a translation can not be found)
46
- config.i18n.fallbacks = true
47
-
48
- # Send deprecation notices to registered listeners
49
- config.active_support.deprecation = :notify
50
-
51
- # Log the query plan for queries taking more than this (works
52
- # with SQLite, MySQL, and PostgreSQL)
53
- # config.active_record.auto_explain_threshold_in_seconds = 0.5
54
- end