cloudxls 0.6.2 → 0.7.0

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.
data/README.md CHANGED
@@ -1,3 +1,39 @@
1
- # cloudxls gem
1
+ # Installation
2
2
 
3
- This is a simple wrapper for the cloudxls api.
3
+ gem install cloudxls
4
+
5
+ Or in your Gemfile
6
+
7
+ gem 'cloudxls', '~> 0.7.0'
8
+
9
+ To get started, add the following to your PHP script:
10
+
11
+ # Useage
12
+
13
+ There are various sample code snippets in the examples folder.
14
+
15
+ ## Async
16
+
17
+ ```ruby
18
+ CloudXLS.api_key = "YOUR-API-KEY"
19
+
20
+ response = CloudXLS.async({
21
+ :data => {
22
+ :text => "Greeting,Greetee\nHello,World"
23
+ }
24
+ })
25
+
26
+ redirect_to response.url
27
+ ```
28
+
29
+ ## Inline
30
+
31
+ ```ruby
32
+ CloudXLS.api_key = "YOUR-API-KEY"
33
+
34
+ response = CloudXLS.inline(:data => {
35
+ :text => "Greeting,Greetee\nHello,World"
36
+ })
37
+
38
+ File.open("report.xls", 'wb') {|f| f << response }
39
+ ```
data/Rakefile CHANGED
@@ -7,3 +7,11 @@ task :test do
7
7
  end
8
8
  exit(ret)
9
9
  end
10
+
11
+ task :cloudxls_console do
12
+ require 'irb'
13
+ require 'irb/completion'
14
+ require './lib/cloudxls' # You know what to do.
15
+ ARGV.clear
16
+ IRB.start
17
+ end
data/cloudxls.gemspec CHANGED
@@ -16,7 +16,6 @@ Gem::Specification.new do |gem|
16
16
  gem.version = CloudXLS::VERSION
17
17
 
18
18
  gem.add_dependency('rest-client', '~> 1.4')
19
- gem.add_dependency('multi_json', '>= 1.0.4', '< 2')
20
19
 
21
20
  gem.add_development_dependency "minitest"
22
21
  gem.add_development_dependency "rake"
data/examples/async.rb ADDED
@@ -0,0 +1,24 @@
1
+ # ruby examples/async.rb
2
+ #
3
+ # Use this in a Rails/Sinatra action to redirect user
4
+ # directly to the file download (expires after 10min).
5
+
6
+ require_relative '../lib/cloudxls'
7
+
8
+ unless ENV["CLOUDXLS_API_KEY"]
9
+ puts "--- WARNING ---"
10
+ puts "Please add environment variable CLOUDXLS_API_KEY"
11
+ puts "export CLOUDXLS_API_KEY=YOUR_API_KEY"
12
+ puts "---------------"
13
+ exit
14
+ end
15
+
16
+ CloudXLS.api_key = ENV["CLOUDXLS_API_KEY"];
17
+
18
+ resp = CloudXLS.async({
19
+ data: { text: "Greeting,Greetee\nHello,World" },
20
+ sheet: { name: 'Hello World' },
21
+ doc: { filename: 'hello-world' }
22
+ })
23
+
24
+ puts "Download file from: #{resp.url}"
data/examples/data.csv ADDED
@@ -0,0 +1,2 @@
1
+ greeting,greetee
2
+ hello,world
data/examples/files.rb ADDED
@@ -0,0 +1,19 @@
1
+ # ruby examples/files.rb
2
+
3
+ require_relative '../lib/cloudxls'
4
+
5
+ unless ENV["CLOUDXLS_API_KEY"]
6
+ puts "--- WARNING ---"
7
+ puts "Please add environment variable CLOUDXLS_API_KEY"
8
+ puts "export CLOUDXLS_API_KEY=YOUR_API_KEY"
9
+ puts "---------------"
10
+ exit
11
+ end
12
+
13
+ CloudXLS.api_key = ENV["CLOUDXLS_API_KEY"];
14
+
15
+ resp = CloudXLS.inline({
16
+ data: { file: File.new("./examples/data.csv") }
17
+ })
18
+
19
+ File.open("out-file.xls", "wb") { |f| f.write resp }
data/examples/full.rb ADDED
@@ -0,0 +1,42 @@
1
+ # ruby examples/full.rb
2
+ #
3
+ # With all the options
4
+
5
+ require_relative '../lib/cloudxls'
6
+
7
+ unless ENV["CLOUDXLS_API_KEY"]
8
+ puts "--- WARNING ---"
9
+ puts "Please add environment variable CLOUDXLS_API_KEY"
10
+ puts "export CLOUDXLS_API_KEY=YOUR_API_KEY"
11
+ puts "---------------"
12
+ exit
13
+ end
14
+
15
+ CloudXLS.api_key = ENV["CLOUDXLS_API_KEY"];
16
+
17
+ resp = CloudXLS.inline({
18
+ sheets: {
19
+ "Sheet1" => {
20
+ data: {
21
+ text: "Greeting;Greetee;Date\nHello;World;2011-01-02",
22
+ separator: ";",
23
+ date_format: "YYYY-MM-DD", # is default
24
+ encoding: "UTF-8", # is default
25
+ },
26
+ sheet: {
27
+ cell: "C3", # define cell
28
+ filters: true, # adds filter boxes
29
+ auto_size_columns: true, # adjust column width (experimental)
30
+ cell_formats: "@,@,dd-mmm-yyyy"
31
+ }
32
+ },
33
+ "Sheet3!B2" => {data: {file: File.new("./examples/data.csv") }},
34
+ },
35
+ doc: {
36
+ filename: "output",
37
+ template: File.new("./examples/template.xls")
38
+ }
39
+ })
40
+
41
+ File.open("out-full.xls", "wb") { |f| f.write resp }
42
+ puts "File saved: ./out-full.xls"
@@ -0,0 +1,25 @@
1
+ # ruby examples/inline.rb
2
+ #
3
+ # Use to directly download file.
4
+
5
+ require_relative '../lib/cloudxls'
6
+
7
+ unless ENV["CLOUDXLS_API_KEY"]
8
+ puts "--- WARNING ---"
9
+ puts "Please add environment variable CLOUDXLS_API_KEY"
10
+ puts "export CLOUDXLS_API_KEY=YOUR_API_KEY"
11
+ puts "---------------"
12
+ exit
13
+ end
14
+
15
+ CloudXLS.api_key = ENV["CLOUDXLS_API_KEY"];
16
+
17
+ resp = CloudXLS.inline({
18
+ data: { text: "Greeting,Greetee\nHello,World" },
19
+ sheet: { name: 'Hello World' },
20
+ doc: { filename: 'hello-world' }
21
+ })
22
+
23
+
24
+ File.open("out.xls", "wb") { |f| f.write resp }
25
+ puts "File saved"
@@ -0,0 +1,28 @@
1
+ # ruby examples/multi_sheet.rb
2
+
3
+ require_relative '../lib/cloudxls'
4
+
5
+ unless ENV["CLOUDXLS_API_KEY"]
6
+ puts "--- WARNING ---"
7
+ puts "Please add environment variable CLOUDXLS_API_KEY"
8
+ puts "export CLOUDXLS_API_KEY=YOUR_API_KEY"
9
+ puts "---------------"
10
+ exit
11
+ end
12
+
13
+ CloudXLS.api_key = ENV["CLOUDXLS_API_KEY"];
14
+
15
+ resp = CloudXLS.inline({
16
+ sheets: {
17
+ "Sheet1" => {
18
+ data: {text: "Greeting,Greetee\nHello,World" },
19
+ sheet: {cell: "C3" }
20
+ },
21
+ "Sheet2!D4" => {data: {text: "Greeting,Greetee\nHello,World" }},
22
+ "Sheet3!B2" => {data: {file: File.new("./examples/data.csv") }},
23
+ }
24
+ })
25
+
26
+
27
+ File.open("out-multi_sheet.xls", "wb") { |f| f.write resp }
28
+ puts "File saved"
Binary file
Binary file
@@ -0,0 +1,34 @@
1
+ # ruby examples/templates.rb
2
+ #
3
+ # Merge data into excel files.
4
+
5
+ require_relative '../lib/cloudxls'
6
+
7
+ unless ENV["CLOUDXLS_API_KEY"]
8
+ puts "--- WARNING ---"
9
+ puts "Please add environment variable CLOUDXLS_API_KEY"
10
+ puts "export CLOUDXLS_API_KEY=YOUR_API_KEY"
11
+ puts "---------------"
12
+ exit
13
+ end
14
+
15
+ CloudXLS.api_key = ENV["CLOUDXLS_API_KEY"];
16
+
17
+ resp = CloudXLS.inline({
18
+ data: { text: "Greeting,Greetee\nHello,World" },
19
+ sheet: { name: 'Hello World' },
20
+ doc: { template: File.new("./examples/template.xls") }
21
+ })
22
+
23
+
24
+ File.open("out-template.xls", "wb") { |f| f.write resp }
25
+ puts "File saved: ./out-template.xls"
26
+
27
+ resp = CloudXLS.inline({
28
+ data: { text: "Greeting,Greetee\nHello,World" },
29
+ sheet: { name: 'Hello World' },
30
+ doc: { template: File.new("./examples/template.xlsx") }
31
+ })
32
+
33
+ File.open("out-template.xlsx", "wb") { |f| f.write resp }
34
+ puts "File saved: ./out-template.xlsx"
data/lib/cloudxls.rb CHANGED
@@ -4,21 +4,17 @@ require 'openssl'
4
4
  require 'json'
5
5
  require 'date'
6
6
  require 'rest_client'
7
- require 'multi_json'
7
+ require 'json'
8
8
 
9
- require 'cloudxls/version'
10
- require 'cloudxls/core_ext'
11
- require 'cloudxls/csv_writer'
9
+ require_relative 'cloudxls/version'
12
10
 
13
- module CloudXLS
11
+ class CloudXLS
14
12
  @https = true
15
13
  @api_base = 'api.cloudxls.com'.freeze
16
14
  @api_key = ENV["CLOUDXLS_API_KEY"]
17
- # @ssl_bundle_path = File.dirname(__FILE__) + '/data/ca-certificates.crt'
18
- @verify_ssl_certs = true
19
15
 
20
16
  class << self
21
- attr_accessor :api_key, :api_base, :verify_ssl_certs, :api_version, :https
17
+ attr_accessor :api_key, :api_base, :api_version, :https
22
18
  end
23
19
 
24
20
  def self.api_url(path = '')
@@ -26,7 +22,8 @@ module CloudXLS
26
22
  "http#{@https ? 's' : ''}://#{@api_key}:@#{@api_base}/v1/#{path}"
27
23
  end
28
24
 
29
- class XpipeResponse
25
+
26
+ class CloudXLSResponse
30
27
  attr_reader :url, :uuid, :response
31
28
 
32
29
  def initialize(response)
@@ -37,10 +34,32 @@ module CloudXLS
37
34
  end
38
35
  end
39
36
 
40
- # CloudXLS.xpipe :data => File.new('/path/to/data.csv', 'r')
41
- # CloudXLS.xpipe :data => File.new("foo,bar\nlorem,ipsum")
42
- # CloudXLS.xpipe :data_url => "https://example.com/data.csv"
43
- # CloudXLS.xpipe :data_url => "https://username:password@example.com/data.csv"
37
+
38
+ def self.async(params = {})
39
+ if params["mode"]
40
+ params["mode"] = "async"
41
+ else
42
+ params[:mode] = "async"
43
+ end
44
+ CloudXLSResponse.new(convert(params))
45
+ end
46
+
47
+
48
+ def self.inline(params = {})
49
+ if params["mode"]
50
+ params["mode"] = "inline"
51
+ else
52
+ params[:mode] = "inline"
53
+ end
54
+ convert(params)
55
+ end
56
+
57
+
58
+ # @example
59
+ # CloudXLS.convert :data => {:file => File.new('/path/to/data.csv', 'r')}
60
+ # CloudXLS.convert :data => {:file => File.new("foo,bar\nlorem,ipsum") }
61
+ # CloudXLS.convert :data => {:url => "https://example.com/data.csv"}
62
+ # CloudXLS.convert :data => {:url => "https://username:password@example.com/data.csv"}
44
63
  #
45
64
  def self.convert(params = {})
46
65
  check_api_key!
@@ -48,24 +67,17 @@ module CloudXLS
48
67
  headers = {}
49
68
 
50
69
  response = execute_request do
51
- RestClient.post(api_url("xpipe"), params, headers)
70
+ RestClient.post(api_url("convert"), params, headers)
52
71
  end
53
72
 
54
- if params[:mode].to_s == 'inline'
55
- response
56
- else
57
- XpipeResponse.new(response)
58
- end
73
+ response
59
74
  end
60
75
 
76
+ # @deprecated
61
77
  def self.xpipe(params = {})
62
78
  convert(params)
63
79
  end
64
80
 
65
- def validate_params(params)
66
- # complain if excel_format together with template
67
- end
68
-
69
81
  def self.execute_request
70
82
  begin
71
83
  return yield
@@ -93,8 +105,8 @@ module CloudXLS
93
105
  end
94
106
 
95
107
  def self.parse_response(response)
96
- json = MultiJson.load(response.body)
97
- rescue MultiJson::DecodeError => e
108
+ json = JSON.parse(response.body)
109
+ rescue => e
98
110
  raise general_api_error(response.code, response.body)
99
111
  end
100
112
 
@@ -111,20 +123,16 @@ private
111
123
  when RestClient::ServerBrokeConnection, RestClient::RequestTimeout
112
124
  message = "Could not connect to CloudXLS (#{@api_base}). " +
113
125
  "Please check your internet connection and try again. "
114
-
115
126
  when RestClient::SSLCertificateNotVerified
116
127
  message = "Could not verify CloudXLS's SSL certificate. " +
117
128
  "Please make sure that your network is not intercepting certificates. "
118
-
119
129
  when SocketError
120
130
  message = "Unexpected error communicating when trying to connect to CloudXLS. " +
121
131
  "You may be seeing this message because your DNS is not working. " +
122
132
  "To check, try running 'host cloudxls.com' from the command line."
123
-
124
133
  else
125
134
  message = "Unexpected error communicating with CloudXLS. " +
126
135
  "If this problem persists, let us know at support@cloudxls.com."
127
-
128
136
  end
129
137
 
130
138
  raise StandardError.new(message + "\n\n(Network error: #{e.message})")
@@ -1,3 +1,3 @@
1
- module CloudXLS
2
- VERSION = '0.6.2'
1
+ class CloudXLS
2
+ VERSION = '0.7.0'
3
3
  end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ describe "CloudXLS" do
4
+ before do
5
+
6
+ end
7
+
8
+ describe "CloudXLS.api_key" do
9
+ it "should not register api_key" do
10
+ CloudXLS.api_key = "FOO"
11
+ expect( CloudXLS.api_key ).to eq("FOO")
12
+ end
13
+
14
+ it "should not register api_key" do
15
+ CloudXLS.api_key = "FOO"
16
+ CloudXLS.api_key = "BAR"
17
+ expect( CloudXLS.api_key ).to eq("BAR")
18
+ end
19
+ end
20
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cloudxls
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.2
4
+ version: 0.7.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-01-16 00:00:00.000000000 Z
12
+ date: 2014-02-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rest-client
@@ -27,28 +27,6 @@ dependencies:
27
27
  - - ~>
28
28
  - !ruby/object:Gem::Version
29
29
  version: '1.4'
30
- - !ruby/object:Gem::Dependency
31
- name: multi_json
32
- requirement: !ruby/object:Gem::Requirement
33
- none: false
34
- requirements:
35
- - - ! '>='
36
- - !ruby/object:Gem::Version
37
- version: 1.0.4
38
- - - <
39
- - !ruby/object:Gem::Version
40
- version: '2'
41
- type: :runtime
42
- prerelease: false
43
- version_requirements: !ruby/object:Gem::Requirement
44
- none: false
45
- requirements:
46
- - - ! '>='
47
- - !ruby/object:Gem::Version
48
- version: 1.0.4
49
- - - <
50
- - !ruby/object:Gem::Version
51
- version: '2'
52
30
  - !ruby/object:Gem::Dependency
53
31
  name: minitest
54
32
  requirement: !ruby/object:Gem::Requirement
@@ -109,13 +87,19 @@ files:
109
87
  - README.md
110
88
  - Rakefile
111
89
  - cloudxls.gemspec
90
+ - examples/async.rb
91
+ - examples/data.csv
92
+ - examples/files.rb
93
+ - examples/full.rb
94
+ - examples/inline.rb
95
+ - examples/multi_sheet.rb
96
+ - examples/template.xls
97
+ - examples/template.xlsx
98
+ - examples/templates.rb
112
99
  - lib/cloudxls.rb
113
- - lib/cloudxls/core_ext.rb
114
- - lib/cloudxls/csv_writer.rb
115
100
  - lib/cloudxls/version.rb
116
101
  - lib/data/ca-certificates.txt
117
- - spec/core_ext_spec.rb
118
- - spec/csv_writer_spec.rb
102
+ - spec/cloudxls_spec.rb
119
103
  - spec/spec_helper.rb
120
104
  homepage: https://cloudxls.com
121
105
  licenses: []
@@ -142,6 +126,5 @@ signing_key:
142
126
  specification_version: 3
143
127
  summary: Ruby wrapper for the CloudXLS xpipe API
144
128
  test_files:
145
- - spec/core_ext_spec.rb
146
- - spec/csv_writer_spec.rb
129
+ - spec/cloudxls_spec.rb
147
130
  - spec/spec_helper.rb
@@ -1,122 +0,0 @@
1
- # Object#as_csv ensures that object formats are written the same across ruby
2
- # versions.
3
- #
4
- # If an object is known to have issues cross-platform #as_json returns the
5
- # desired string.
6
- #
7
- # Example:
8
- #
9
- # DateTime.now.as_csv # => "2012-12-24T12:30:01.000+0000"
10
- # 5.as_csv # => 5
11
- # (0.0/0.0).as_csv # => "#DIV/0!"
12
- #
13
-
14
- class Time
15
- def as_csv(options = nil)
16
- strftime(CloudXLS::DATETIME_FORMAT)
17
- end
18
- end
19
-
20
- class DateTime
21
- def as_csv(options = nil)
22
- strftime(CloudXLS::DATETIME_FORMAT)
23
- end
24
- end
25
-
26
- class String
27
- def as_csv(options = nil)
28
- self
29
- end
30
- end
31
-
32
- class Date
33
- def as_csv(options = nil)
34
- strftime(CloudXLS::DATE_FORMAT)
35
- end
36
- end
37
-
38
- class NilClass
39
- def as_csv(options = nil)
40
- nil
41
- end
42
- end
43
-
44
- class FalseClass
45
- def as_csv(options = nil)
46
- false
47
- end
48
- end
49
-
50
- class TrueClass
51
- def as_csv(options = nil)
52
- true
53
- end
54
- end
55
-
56
- class Symbol
57
- def as_csv(options = nil)
58
- to_s
59
- end
60
- end
61
-
62
- class Numeric
63
- def as_csv(options = nil)
64
- self
65
- end
66
- end
67
-
68
- class Float
69
- # Encoding Infinity or NaN to JSON should return "null". The default returns
70
- # "Infinity" or "NaN" which breaks parsing the JSON. E.g. JSON.parse('[NaN]').
71
- def as_csv(options = nil) #:nodoc:
72
- finite? ? self : "#DIV/0!"
73
- end
74
- end
75
-
76
- class Regexp
77
- def as_csv(options = nil)
78
- to_s
79
- end
80
- end
81
-
82
- module Enumerable
83
- def as_csv(options = nil)
84
- to_a.as_json(options)
85
- end
86
- end
87
-
88
- class Range
89
- def as_csv(options = nil)
90
- to_s
91
- end
92
- end
93
-
94
- class Hash
95
- def as_csv(options = {})
96
- attribute_names = keys
97
-
98
- if (only = options[:only])
99
- attribute_names = Array(only)
100
- elsif (except = options[:except])
101
- attribute_names -= Array(except)
102
- end
103
-
104
- attribute_names.map do |key|
105
- self[key].as_csv
106
- end
107
- end
108
- end
109
-
110
- class Array
111
- def as_csv(options = nil)
112
- map do |val|
113
- val.as_csv(options)
114
- end
115
- end
116
- end
117
-
118
- class Object
119
- def as_csv(options = nil)
120
- to_s
121
- end
122
- end
@@ -1,137 +0,0 @@
1
- require 'csv'
2
-
3
- module CloudXLS
4
- DATETIME_FORMAT = "%FT%T.%L%z".freeze
5
- DATE_FORMAT = "%F".freeze
6
-
7
- # Wrapper around stdlib CSV methods.
8
- #
9
- class CSV
10
- def self.generate_line(arr, options = nil)
11
- ::CSV.generate_line(arr.as_csv, options)
12
- end
13
- end
14
-
15
-
16
- class CSVWriter
17
- # Generates CSV string.
18
- #
19
- # @param [Enumerable] scope
20
- # Method/attribute keys to for the export.
21
- #
22
- # @option opts [String] :encoding ("UTF-8")
23
- # Charset encoding of output.
24
- #
25
- # @option opts [Boolean] :skip_headers (false)
26
- # Do not output headers if first element is an ActiveRecord object.
27
- #
28
- # @option opts [Array] :only same as #as_json
29
- # @option opts [Array] :except same as #as_json
30
- # @option opts [Array] :methods same as #as_json
31
- #
32
- # @return [String]
33
- # The full CSV as a string. Titleizes *columns* for the header.
34
- #
35
- def self.text(scope, opts = {})
36
- encoding = opts.delete(:encoding) || "UTF-8"
37
- skip_headers = opts.delete(:skip_headers) || false
38
-
39
- str = ::CSV.generate(:encoding => encoding) do |csv|
40
-
41
- enum_method = scope_enumerator(scope)
42
- scope.send(enum_method) do |record|
43
-
44
- if skip_headers == false && !record.is_a?(Array)
45
- titles = CloudXLS::Util.titles_for_serialize_options(record, opts)
46
- csv << titles.map(&:titleize)
47
- skip_headers = true
48
- end
49
-
50
- csv << record.as_csv(opts)
51
- end
52
- end
53
- str.strip!
54
- str
55
- end
56
-
57
-
58
- # Generates Enumerator for streaming response.
59
- #
60
- # Example
61
- #
62
- # def index
63
- # # setup headers...
64
- # stream = CloudXLS::CSVWriter.csv_enumerator(Post.all, only: [:title, :author])
65
- # self.response_body = stream
66
- # end
67
- #
68
- # Same options and parameters as #text.
69
- #
70
- # @return [Enumerator] enumerator to use for streaming response.
71
- #
72
- def self.enumerator(scope, options = {})
73
- encoding = options.delete(:encoding) || "UTF-8"
74
- skip_headers = options.delete(:skip_headers) || false
75
-
76
- Enumerator.new do |stream|
77
- enum_method = scope_enumerator(scope)
78
-
79
- scope.send(enum_method) do |record|
80
- if !skip_headers && !record.is_a?(Array)
81
- titles = CloudXLS::Util.titles_for_serialize_options(record, options)
82
- stream << titles.map(&:titleize).to_csv
83
- skip_headers = true
84
- end
85
-
86
- stream << record.as_csv(options).to_csv
87
- end
88
- end
89
- end
90
-
91
-
92
- def self.scope_enumerator(scope)
93
- if scope.respond_to?(:arel) &&
94
- scope.arel.orders.blank? &&
95
- scope.arel.taken.blank?
96
- :find_each
97
- else
98
- :each
99
- end
100
- end
101
- end
102
- end
103
-
104
- module CloudXLS
105
- class Util
106
- # Column and method-names of a model that correspond to the values from
107
- # a #as_json/#as_csv call. In the same order.
108
- #
109
- # Example
110
- #
111
- # CloudXLS::Util.titles_for_serialize_options(Post.new, only: [:author, :title], method: [:slug])
112
- # # => ['title', 'author', 'slug']
113
- #
114
- def self.titles_for_serialize_options(record, options = {})
115
- attribute_names = record.attributes.keys
116
- if only = options[:only]
117
- arr = []
118
- Array(only).map(&:to_s).each do |key|
119
- arr.push(key) if attribute_names.include?(key)
120
- end
121
- attribute_names = arr
122
- elsif except = options[:except]
123
- attribute_names -= Array(except).map(&:to_s)
124
- end
125
-
126
- Array(options[:methods]).each do |m|
127
- m = m.to_s
128
- if record.respond_to?(m)
129
- unless attribute_names.include?(m)
130
- attribute_names.push(val)
131
- end
132
- end
133
- end
134
- attribute_names
135
- end
136
- end
137
- end
@@ -1,58 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "as_csv" do
4
- it "should handle Hash" do
5
- expect( {:foo => 1, :bar => Date.new(2013,12,24)}.as_csv ).to eq([1,'2013-12-24'])
6
- end
7
-
8
- it "should handle Hash with :only" do
9
- hash = {:foo => "foo", :bar => "bar"}
10
- expect( hash.as_csv(:only => :foo) ).to eq(["foo"])
11
- expect( hash.as_csv(:only => [:foo]) ).to eq(["foo"])
12
- expect( hash.as_csv(:only => [:bar]) ).to eq(["bar"])
13
- expect( hash.as_csv(:only => [:foo, :bar]) ).to eq(["foo", "bar"])
14
- expect( hash.as_csv(:only => [:bar, :foo]) ).to eq(["bar", "foo"])
15
- #expect( hash.as_csv(:only => [:bar, :baz, :foo]) ).to eq(["foo", nil, "bar"])
16
- end
17
-
18
- it "should handle Array" do
19
- expect( [1, Date.new(2013,12,24)].as_csv ).to eq([1,'2013-12-24'])
20
- end
21
-
22
- it "should handle Symbol" do
23
- expect( :foo.as_csv ).to eq('foo')
24
- end
25
-
26
- it "should handle Symbol" do
27
- expect( :foo.as_csv ).to eq('foo')
28
- end
29
-
30
- it "should handle nil" do
31
- expect( nil.as_csv ).to eq(nil)
32
- end
33
-
34
- it "should handle boolean" do
35
- expect( false.as_csv ).to eq(false)
36
- expect( true.as_csv ).to eq(true)
37
- end
38
-
39
- it "should handle float" do
40
- expect( (1.123).as_csv ).to eq(1.123)
41
- expect( (1.0/0.0).as_csv ).to eq("#DIV/0!")
42
- expect( (-1.0/0.0).as_csv ).to eq("#DIV/0!")
43
- expect( (0.0/0.0).as_csv ).to eq("#DIV/0!")
44
- end
45
-
46
- it "should handle Time" do
47
- expect( Time.new(2012,12,24,18,30,5,'+00:00').as_csv ).to eq("2012-12-24T18:30:05.000+0000")
48
- end
49
-
50
- it "should handle DateTime" do
51
- expect( DateTime.new(2012,12,24,18,30,5,'+00:00').as_csv ).to eq("2012-12-24T18:30:05.000+0000")
52
- expect( DateTime.new(2012,12,24).as_csv ).to eq("2012-12-24T00:00:00.000+0000")
53
- end
54
-
55
- it "should handle DateTime" do
56
- expect( Date.new(2012,12,24).as_csv ).to eq("2012-12-24")
57
- end
58
- end
@@ -1,47 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "CloudXLS::CSVWriter" do
4
- before do
5
- @writer = CloudXLS::CSVWriter
6
- end
7
-
8
- describe "with array" do
9
- it "should not titleize" do
10
- expect( @writer.text([['foo','bar'],[1,2]]) ).to eq("foo,bar\n1,2")
11
- end
12
-
13
- it "should escape titles" do
14
- expect( @writer.text([['bar"baz']]) ).to eq("\"bar\"\"baz\"")
15
- end
16
-
17
- it "should escape rows" do
18
- expect( @writer.text([['title'],['bar"baz']]) ).to eq("title\n\"bar\"\"baz\"")
19
- end
20
-
21
- it "should write YYYY-MM-DD for Date" do
22
- expect( @writer.text([[Date.new(2012,12,24)]]) ).to eq("2012-12-24")
23
- end
24
-
25
- it "should write xmlschema for DateTime" do
26
- # TODO: make UTC consistent
27
- expect( @writer.text([[DateTime.new(2012,12,24,18,30,5,'+0000')]]) ).to eq("2012-12-24T18:30:05.000+0000")
28
- expect( @writer.text([[DateTime.new(2012,12,24,18,30,5,'+0000').to_time.utc]]) ).to eq("2012-12-24T18:30:05.000+0000")
29
- end
30
-
31
- it "should write nothing for nil" do
32
- expect( @writer.text([[nil,nil]]) ).to eq(",")
33
- end
34
-
35
- it "should write \"\" for empty string" do
36
- expect( @writer.text([["",""]]) ).to eq('"",""')
37
- end
38
-
39
- it "should write integers" do
40
- expect( @writer.text([[-1,0,1,1_000_000]]) ).to eq('-1,0,1,1000000')
41
- end
42
-
43
- it "should write floats" do
44
- expect( @writer.text([[-1.0,0.0,1.0,1_000_000.0,1.234567]]) ).to eq('-1.0,0.0,1.0,1000000.0,1.234567')
45
- end
46
- end
47
- end