csv_rails 0.5.1 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -86,4 +86,12 @@ If you do not use :header option, header is using :fields and I18n transfer.
86
86
  end
87
87
  end
88
88
 
89
+ You also use i18n_scope option
90
+ # config/locales/ja.yml
91
+ ja:
92
+ csv:
93
+ name: なまえ
94
+
95
+ User.where("id < 1").all.to_csv(:i18n_scope => :csv) #=> "なまえ\n"
96
+
89
97
  Copyright (c) 2012 yalab, released under the MIT license
@@ -9,21 +9,26 @@ module CsvRails
9
9
 
10
10
  module ClassMethods
11
11
  def to_csv(opts={})
12
- fields = if opts[:fields]
13
- opts.delete(:fields)
14
- elsif respond_to?(:attribute_names)
15
- attribute_names
16
- elsif self.is_a?(::ActiveRecord::Relation)
17
- @klass.new.attribute_names
18
- else
19
- new.attribute_names
20
- end
21
- header = fields.map{|f| human_attribute_name(f) }
12
+ fields = opts[:fields] || csv_fields
13
+ scope = opts.delete(:i18n_scope)
14
+ header = fields.map{|f|
15
+ if scope
16
+ I18n.t("#{scope}.#{f}", :default => human_attribute_name(f))
17
+ else
18
+ human_attribute_name(f)
19
+ end
20
+ }
22
21
  all.to_csv(opts.update(:fields => fields, :header => header))
23
22
  end
24
23
 
25
- def csv_header(names)
26
- names.map{|n| human_attribute_name(n) }
24
+ def csv_fields
25
+ if respond_to?(:attribute_names)
26
+ attribute_names
27
+ elsif self.is_a?(::ActiveRecord::Relation)
28
+ @klass.new.attribute_names
29
+ else
30
+ new.attribute_names
31
+ end
27
32
  end
28
33
  end
29
34
 
@@ -12,17 +12,23 @@ module CsvRails
12
12
  # * <tt>:header</tt> - header
13
13
  # * <tt>:without_header</tt> - total_count
14
14
  # * <tt>:encoding</tt> - encoding
15
+ # * <tt>:i18n_scope</tt> - i18n scope
15
16
  def to_csv(opts={})
16
17
  fields = opts[:fields]
17
18
  header = if opts[:header]
18
19
  opts.delete(:header)
19
- elsif (klass = first.class).respond_to?(:csv_header)
20
- klass.csv_header(fields)
20
+ elsif (klass = first.class).respond_to?(:csv_fields)
21
+ klass.csv_fields
21
22
  else
22
- fields
23
+ scopes = ['csv_rails']
24
+ scopes << opts[:i18n_scope] if opts[:i18n_scope]
25
+ fields.map{|f|
26
+ defaults = scopes.map{|s| "#{s}.#{f}".to_sym }.push(f.to_s)
27
+ I18n.t(defaults.shift, :default => defaults)
28
+ } if fields
23
29
  end
24
30
  csv = CSV.generate do |_csv|
25
- _csv << header unless opts[:without_header]
31
+ _csv << header if header && !opts[:without_header]
26
32
  each do |element|
27
33
  _csv << element.to_csv_ary(fields, opts)
28
34
  end
@@ -1,3 +1,3 @@
1
1
  module CsvRails
2
- VERSION = "0.5.1"
2
+ VERSION = "0.5.2"
3
3
  end
@@ -73,12 +73,6 @@ class CsvRails::ActiveRecordTest < ActiveSupport::TestCase
73
73
  I18n.locale = :en
74
74
  end
75
75
 
76
- test ".csv_header with association" do
77
- I18n.locale = :ja
78
- assert_equal [User.human_attribute_name(:name), Group.human_attribute_name(:name)], User.csv_header([:name, :"groups.first.name"])
79
- I18n.locale = :en
80
- end
81
-
82
76
  test ".to_csv with association" do
83
77
  I18n.locale = :ja
84
78
  csv =<<-EOS.gsub(/^\s+/, '')
@@ -89,6 +83,13 @@ class CsvRails::ActiveRecordTest < ActiveSupport::TestCase
89
83
  I18n.locale = :en
90
84
  end
91
85
 
86
+ test ".to_csv with i18n option" do
87
+ I18n.locale = :ja
88
+ translated = [:id, :name].map{|f| I18n.t("csv_rails.#{f}") }.join(',')
89
+ assert_match /^#{translated}/, User.where('id < 1').to_csv(:i18n_scope => 'csv_rails')
90
+ I18n.locale = :en
91
+ end
92
+
92
93
  test ".to_csv with association using as_csv" do
93
94
  assert_equal @group.created_at_as_csv, User.includes(:groups).to_csv(:fields => [:"groups.first.created_at"], :without_header => true).chomp
94
95
  end
@@ -2,13 +2,45 @@
2
2
  require 'test_helper'
3
3
 
4
4
  class CsvRails::ArrayTest < ActiveSupport::TestCase
5
+ setup do
6
+ I18n.locale = :ja
7
+ @csv_rails_scope = {name: "名前", age: "年齢"}
8
+ @human_scope = {sex: '性別'}
9
+ I18n.backend.store_translations(:ja, :csv_rails => @csv_rails_scope, :human => @human_scope)
10
+ end
11
+
12
+ teardown do
13
+ I18n.locale = :en
14
+ end
15
+
5
16
  test ".to_csv with header option" do
6
17
  header = ['foo', 'bar']
7
18
  assert_equal header.join(','), [].to_csv(:header => header).chomp
8
19
  end
9
20
 
21
+ test ".to_csv using I18n csv_rails scope and accept i18n_scope option" do
22
+ translations = @csv_rails_scope.merge(@human_scope)
23
+ fields = translations.keys
24
+ assert_equal translations.values.join(','), [].to_csv(:fields => fields, :i18n_scope => :human).chomp
25
+ end
26
+
27
+ test ".to_csv not stored i18n" do
28
+ fields = [:sum, :max]
29
+ assert_equal fields.join(','), [].to_csv(:fields => fields).chomp
30
+ end
31
+
10
32
  test ".to_csv accept encoding" do
11
33
  name = "名前"
12
34
  assert_equal name.encode('SJIS'), [].to_csv(:header => [name], :encoding => 'SJIS').chomp
13
35
  end
36
+
37
+ test ".to_csv only it includes ActiveRecord instance" do
38
+ assert_nothing_raised do
39
+ [User.create(:name => 'satomicchy')].to_csv
40
+ end
41
+ end
42
+
43
+ test ".to_csv using empty array" do
44
+ assert_equal "", [].to_csv
45
+ end
14
46
  end
@@ -1,4 +1,7 @@
1
1
  ja:
2
+ csv_rails:
3
+ id: あいでぃー
4
+ name: なまえ
2
5
  activerecord:
3
6
  attributes:
4
7
  group: &groupmodel