cloudxls 0.6.2 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
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