quandl_format 0.0.2 → 0.1.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.
- checksums.yaml +4 -4
- data/.gitignore +2 -1
- data/Guardfile +10 -0
- data/UPGRADE.md +12 -0
- data/lib/quandl/client/dataset/to_qdf.rb +20 -0
- data/lib/quandl/format/dataset/attributes.rb +105 -0
- data/lib/quandl/format/dataset/client.rb +66 -0
- data/lib/quandl/format/{dump.rb → dataset/dump.rb} +11 -17
- data/lib/quandl/format/{load.rb → dataset/load.rb} +36 -17
- data/lib/quandl/format/dataset.rb +36 -0
- data/lib/quandl/format/errors.rb +7 -0
- data/lib/quandl/format/version.rb +1 -1
- data/lib/quandl/format.rb +4 -21
- data/quandl_format.gemspec +3 -1
- data/spec/config/client.rb +2 -0
- data/spec/config/logger.rb +25 -0
- data/spec/fixtures/data/invalid_data.qdf +24 -0
- data/spec/fixtures/data/unknown_attribute.qdf +11 -0
- data/spec/fixtures/data/valid.qdf +24 -0
- data/spec/fixtures/format.rb +65 -0
- data/spec/lib/quandl/client/dataset_spec.rb +24 -0
- data/spec/lib/quandl/format/dataset/attributes_spec.rb +10 -0
- data/spec/lib/quandl/format/dataset/client_spec.rb +34 -0
- data/spec/lib/quandl/format/dataset/errors_spec.rb +32 -0
- data/spec/lib/quandl/format/dataset/load_spec.rb +33 -0
- data/spec/lib/quandl/format/dataset_spec.rb +21 -0
- data/spec/spec_helper.rb +8 -1
- metadata +65 -12
- data/lib/quandl/format/node.rb +0 -73
- data/spec/lib/quandl/format/load_spec.rb +0 -54
- data/spec/lib/quandl/format/node_spec.rb +0 -44
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 321907cc4f59730ec0c37fd9bf0c5e67cd80fdc8
|
4
|
+
data.tar.gz: 8b272a1c2699e966ad6f96394725ea902cdcfce8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 156bd0b3ed9d48abcb2639c67cb1492359dd88119e45575b95d97c64d6c55936ce73a67402258254a67aa2d646c6b97e1eb3b8c9a3db2ae44f1121167123b860
|
7
|
+
data.tar.gz: 6e046e36bf08aa9e8ee08089ad72b6cdde1c4673c87d9f6ef28fb3ee9c0a0709a5b63e360cf0b942dfb2dfd54b67249ccbc51644d98f14ccc3ed915e72efc86c
|
data/.gitignore
CHANGED
data/Guardfile
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
# A sample Guardfile
|
2
|
+
# More info at https://github.com/guard/guard#readme
|
3
|
+
|
4
|
+
group :specs do
|
5
|
+
guard :rspec, cmd: 'bundle exec rspec --fail-fast -f doc --color' do
|
6
|
+
watch(%r{^spec/.+_spec\.rb$})
|
7
|
+
watch(%r{^(lib/.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
8
|
+
watch('spec/spec_helper.rb') { 'spec' }
|
9
|
+
end
|
10
|
+
end
|
data/UPGRADE.md
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
## 0.1.0
|
2
|
+
|
3
|
+
* only update client attrs before upload
|
4
|
+
* dataset/client.rb client.assign_attributes(attributes) before upload human_errors revised
|
5
|
+
* load rescues and raises contextual errors
|
6
|
+
* add Dataset#human_errors, #full_url
|
7
|
+
* add fixtures/data/*.qdf that gets loaded into fixtures_data
|
8
|
+
* refactor spec format and qdf_attributes to fixtures
|
9
|
+
* add quandl/client/dataset/to_qdf extension Dataset#to_qdf Dataset#qdf_attributes
|
10
|
+
* refactor node/dump/load to Dataset Dataset::Load, Dataset::Dump
|
11
|
+
|
12
|
+
|
1
13
|
## 0.0.2
|
2
14
|
|
3
15
|
* add support for meta attributes: private, display_url
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Quandl
|
2
|
+
module Client
|
3
|
+
|
4
|
+
class Dataset
|
5
|
+
|
6
|
+
def to_qdf
|
7
|
+
Quandl::Format::Dataset.new( qdf_attributes ).to_qdf
|
8
|
+
end
|
9
|
+
|
10
|
+
def qdf_attributes
|
11
|
+
Quandl::Format::Dataset.attribute_names.inject({}) do |memo, name|
|
12
|
+
memo[name] = self.send(name) if self.respond_to?(name)
|
13
|
+
memo
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
module Quandl
|
2
|
+
module Format
|
3
|
+
class Dataset
|
4
|
+
|
5
|
+
module Attributes
|
6
|
+
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
|
11
|
+
META_ATTRIBUTES = :source_code, :code, :name, :description, :private, :display_url
|
12
|
+
DATA_ATTRIBUTES = :column_names, :data
|
13
|
+
|
14
|
+
def attribute_names
|
15
|
+
@attribute_names ||= meta_attribute_names + data_attribute_names
|
16
|
+
end
|
17
|
+
|
18
|
+
def meta_attribute_names
|
19
|
+
META_ATTRIBUTES
|
20
|
+
end
|
21
|
+
|
22
|
+
def data_attribute_names
|
23
|
+
DATA_ATTRIBUTES
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
included do
|
29
|
+
attribute_names.each do |name|
|
30
|
+
attr_reader name unless method_defined?(name)
|
31
|
+
attr_writer name unless method_defined?("#{name}=")
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def initialize(*args)
|
36
|
+
attrs = args.extract_options!
|
37
|
+
assign_attributes(attrs) if attrs.is_a?(Hash)
|
38
|
+
end
|
39
|
+
|
40
|
+
def assign_attributes(attrs)
|
41
|
+
attrs.each do |key, value|
|
42
|
+
raise_unknown_attribute_error!(key) unless respond_to?(key)
|
43
|
+
self.send("#{key}=", value)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def full_code=(value)
|
48
|
+
value = value.split('/')
|
49
|
+
self.source_code = value[0]
|
50
|
+
self.code = value[1]
|
51
|
+
end
|
52
|
+
|
53
|
+
def full_code
|
54
|
+
[source_code, code].join('/')
|
55
|
+
end
|
56
|
+
|
57
|
+
def description=(value)
|
58
|
+
@description = value.to_s.gsub('\n', "\n")
|
59
|
+
end
|
60
|
+
|
61
|
+
def data=(rows)
|
62
|
+
self.column_names = rows.shift unless rows.first.collect{|r| r.to_s.numeric? }.include?(true)
|
63
|
+
@data = Quandl::Data.new(rows).to_date
|
64
|
+
end
|
65
|
+
|
66
|
+
def column_names=(names)
|
67
|
+
@column_names = Array(names).flatten.collect{|n| n.strip.rstrip }
|
68
|
+
end
|
69
|
+
|
70
|
+
def to_qdf
|
71
|
+
Dump.record(self)
|
72
|
+
end
|
73
|
+
|
74
|
+
def meta_attributes
|
75
|
+
self.class.meta_attribute_names.inject({}){|m,k| m[k] = self.send(k); m }
|
76
|
+
end
|
77
|
+
|
78
|
+
def attributes
|
79
|
+
self.class.attribute_names.inject({}){|m,k| m[k] = self.send(k); m }
|
80
|
+
end
|
81
|
+
|
82
|
+
def inspect
|
83
|
+
attrs = attributes.collect do |key, value|
|
84
|
+
if value.is_a?(String)
|
85
|
+
value = "#{value[0..20]}..." if value.length > 20
|
86
|
+
value = "'#{value}'"
|
87
|
+
end
|
88
|
+
"#{key}: #{value}"
|
89
|
+
end
|
90
|
+
%Q{<##{self.class.name} #{attrs.join(', ')}>}
|
91
|
+
end
|
92
|
+
|
93
|
+
private
|
94
|
+
|
95
|
+
def raise_unknown_attribute_error!(key)
|
96
|
+
m = "UnknownAttribute #{key} recognized attributes are: #{self.class.attribute_names}"
|
97
|
+
raise Quandl::Format::Errors::UnknownAttribute, m
|
98
|
+
end
|
99
|
+
|
100
|
+
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module Quandl
|
2
|
+
module Format
|
3
|
+
class Dataset
|
4
|
+
|
5
|
+
module Client
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
def human_errors
|
9
|
+
return if errors.blank?
|
10
|
+
puts errors
|
11
|
+
m = "#{client.full_url} #{client.status}\n"
|
12
|
+
m += " errors: \n"
|
13
|
+
m += errors.collect do |error_type, messages|
|
14
|
+
next human_error(error_type, messages) unless messages.is_a?(Hash)
|
15
|
+
messages.collect{|n,m| human_error(n, m) }
|
16
|
+
end.flatten.compact.join
|
17
|
+
end
|
18
|
+
|
19
|
+
def human_error(name, message)
|
20
|
+
message = message.join(', ') if message.respond_to?(:join)
|
21
|
+
" #{name}: #{message}\n"
|
22
|
+
end
|
23
|
+
|
24
|
+
def full_url
|
25
|
+
client.full_url
|
26
|
+
end
|
27
|
+
|
28
|
+
def upload
|
29
|
+
client.save if valid?
|
30
|
+
end
|
31
|
+
|
32
|
+
def errors
|
33
|
+
client.error_messages
|
34
|
+
end
|
35
|
+
|
36
|
+
def valid?
|
37
|
+
assign_client_attributes
|
38
|
+
client.valid_with_server?
|
39
|
+
end
|
40
|
+
|
41
|
+
def client
|
42
|
+
@client ||= find_or_build_client
|
43
|
+
end
|
44
|
+
def client=(value)
|
45
|
+
raise ArgumentError, "Expected Quandl::Client::Dataset received #{value.class}" unless value.is_a?(Quandl::Client::Dataset)
|
46
|
+
@client = value
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
protected
|
51
|
+
|
52
|
+
def assign_client_attributes
|
53
|
+
client.assign_attributes(attributes)
|
54
|
+
end
|
55
|
+
|
56
|
+
def find_or_build_client
|
57
|
+
@client = Quandl::Client::Dataset.find(full_code)
|
58
|
+
@client = Quandl::Client::Dataset.new unless @client.exists?
|
59
|
+
@client
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -1,24 +1,21 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
class Dump
|
5
|
-
|
1
|
+
class Quandl::Format::Dataset::Dump
|
2
|
+
|
6
3
|
class << self
|
7
4
|
|
8
|
-
def
|
9
|
-
Array(args).flatten.collect{|r|
|
5
|
+
def collection(*args)
|
6
|
+
Array(args).flatten.collect{|r| record(r) }.join("\n")
|
10
7
|
end
|
11
8
|
|
12
|
-
def
|
13
|
-
self.new(
|
9
|
+
def record(record)
|
10
|
+
self.new(record).to_qdf
|
14
11
|
end
|
15
12
|
|
16
13
|
end
|
17
14
|
|
18
|
-
attr_accessor :
|
15
|
+
attr_accessor :record
|
19
16
|
|
20
17
|
def initialize(r)
|
21
|
-
self.
|
18
|
+
self.record = r
|
22
19
|
end
|
23
20
|
|
24
21
|
def to_qdf
|
@@ -30,21 +27,18 @@ class Dump
|
|
30
27
|
end
|
31
28
|
|
32
29
|
def meta_attributes
|
33
|
-
|
30
|
+
record.meta_attributes.stringify_keys.to_yaml[4..-1] + "-\n"
|
34
31
|
end
|
35
32
|
|
36
33
|
def data
|
37
|
-
data =
|
34
|
+
data = record.data
|
38
35
|
data = data.collect(&:to_csv).join if data.is_a?(Array) && data.first.respond_to?(:to_csv)
|
39
36
|
data = data.to_csv if data.respond_to?(:to_csv)
|
40
37
|
data
|
41
38
|
end
|
42
39
|
|
43
40
|
def column_names
|
44
|
-
|
41
|
+
record.column_names.to_csv if record.column_names.present?
|
45
42
|
end
|
46
43
|
|
47
|
-
end
|
48
|
-
|
49
|
-
end
|
50
44
|
end
|
@@ -1,14 +1,23 @@
|
|
1
|
-
class Quandl::Format::Load
|
1
|
+
class Quandl::Format::Dataset::Load
|
2
2
|
|
3
3
|
SECTION_DELIMITER = '-'
|
4
4
|
|
5
5
|
class << self
|
6
|
-
|
7
|
-
def
|
8
|
-
|
6
|
+
|
7
|
+
def file(path)
|
8
|
+
string(File.read(path).strip)
|
9
9
|
end
|
10
10
|
|
11
|
-
def
|
11
|
+
def string(input)
|
12
|
+
nodes = parse_string(input)
|
13
|
+
nodes = parse_yaml_and_csv(nodes)
|
14
|
+
nodes = nodes_to_datasets(nodes)
|
15
|
+
nodes
|
16
|
+
end
|
17
|
+
|
18
|
+
protected
|
19
|
+
|
20
|
+
def parse_string(input)
|
12
21
|
nodes = []
|
13
22
|
section_type = :data
|
14
23
|
input.each_line do |rline|
|
@@ -25,7 +34,7 @@ class Quandl::Format::Load
|
|
25
34
|
# update the section to attributes
|
26
35
|
section_type = :attributes
|
27
36
|
|
28
|
-
|
37
|
+
# have we reached the end of the attributes?
|
29
38
|
elsif line[0] == '-'
|
30
39
|
# update the section to data
|
31
40
|
section_type = :data
|
@@ -36,29 +45,39 @@ class Quandl::Format::Load
|
|
36
45
|
# YAML must include whitespace
|
37
46
|
nodes[-1][section_type] += (section_type == :data) ? "#{line}\n" : rline
|
38
47
|
end
|
39
|
-
# append the current node
|
40
|
-
nodes = parse_nodes(nodes)
|
41
|
-
nodes = initialize_nodes(nodes)
|
42
48
|
nodes
|
43
49
|
end
|
44
50
|
|
45
|
-
|
46
|
-
protected
|
47
|
-
|
48
|
-
def parse_nodes(nodes)
|
51
|
+
def parse_yaml_and_csv(nodes)
|
49
52
|
nodes.collect do |node|
|
50
53
|
# parse attrs as yaml
|
51
|
-
node[:attributes] = YAML.load( node[:attributes] )
|
54
|
+
node[:attributes] = YAML.load( node[:attributes] ).symbolize_keys!
|
52
55
|
# parse data as csv
|
53
56
|
node[:attributes][:data] = CSV.parse(node[:data])
|
54
57
|
node
|
55
58
|
end
|
56
59
|
end
|
57
60
|
|
58
|
-
def
|
59
|
-
|
60
|
-
|
61
|
+
def nodes_to_datasets(nodes)
|
62
|
+
datasets = []
|
63
|
+
nodes.each_with_index do |node, index|
|
64
|
+
dataset = node_to_dataset(node, index)
|
65
|
+
datasets << dataset if dataset
|
61
66
|
end
|
67
|
+
datasets
|
68
|
+
end
|
69
|
+
|
70
|
+
def node_to_dataset(node, index)
|
71
|
+
Quandl::Format::Dataset.new( node[:attributes] )
|
72
|
+
rescue => e# Quandl::Format::Errors::UnknownAttribute => e
|
73
|
+
message = "Error: Dataset #{index + 1}\n"
|
74
|
+
message += node[:attributes][:source_code] + '/' if node[:attributes][:source_code].present?
|
75
|
+
message += node[:attributes][:code] + "\n"
|
76
|
+
message += "#{$!}\n"
|
77
|
+
message += "--"
|
78
|
+
Quandl::Logger.error(message, e)
|
79
|
+
nil
|
80
|
+
# raise $!, message, $!.backtrace
|
62
81
|
end
|
63
82
|
|
64
83
|
def attribute_format
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Quandl
|
2
|
+
module Format
|
3
|
+
|
4
|
+
class Dataset
|
5
|
+
|
6
|
+
# classes
|
7
|
+
require_relative 'dataset/load'
|
8
|
+
require_relative 'dataset/dump'
|
9
|
+
|
10
|
+
# concerns
|
11
|
+
require_relative 'dataset/attributes'
|
12
|
+
require_relative 'dataset/client'
|
13
|
+
|
14
|
+
include Quandl::Format::Dataset::Attributes
|
15
|
+
include Quandl::Format::Dataset::Client
|
16
|
+
|
17
|
+
class << self
|
18
|
+
|
19
|
+
def load(input)
|
20
|
+
Load.string(input)
|
21
|
+
end
|
22
|
+
|
23
|
+
def load_from_file(path)
|
24
|
+
Load.file(path)
|
25
|
+
end
|
26
|
+
|
27
|
+
def dump(datasets)
|
28
|
+
Dump.collection(datasets)
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/quandl/format.rb
CHANGED
@@ -4,35 +4,18 @@ require "quandl/format/version"
|
|
4
4
|
|
5
5
|
require 'csv'
|
6
6
|
|
7
|
-
require 'quandl/
|
7
|
+
require 'quandl/client'
|
8
8
|
|
9
9
|
require "active_support"
|
10
10
|
require "active_support/inflector"
|
11
11
|
require "active_support/core_ext/hash"
|
12
12
|
require "active_support/core_ext/object"
|
13
13
|
|
14
|
-
require 'quandl/format/
|
15
|
-
require 'quandl/format/
|
16
|
-
require 'quandl/
|
14
|
+
require 'quandl/format/errors'
|
15
|
+
require 'quandl/format/dataset'
|
16
|
+
require 'quandl/client/dataset/to_qdf'
|
17
17
|
|
18
18
|
module Quandl
|
19
19
|
module Format
|
20
|
-
|
21
|
-
class << self
|
22
|
-
|
23
|
-
def load(input)
|
24
|
-
Quandl::Format::Load.from_string(input)
|
25
|
-
end
|
26
|
-
|
27
|
-
def load_file(file_path)
|
28
|
-
Quandl::Format::Load.from_file(file_path)
|
29
|
-
end
|
30
|
-
|
31
|
-
def dump(nodes)
|
32
|
-
Quandl::Format::Dump.nodes(nodes)
|
33
|
-
end
|
34
|
-
|
35
|
-
end
|
36
|
-
|
37
20
|
end
|
38
21
|
end
|
data/quandl_format.gemspec
CHANGED
@@ -22,7 +22,9 @@ Gem::Specification.new do |s|
|
|
22
22
|
s.add_development_dependency "fivemat", "~> 1.2"
|
23
23
|
s.add_development_dependency "pry"
|
24
24
|
s.add_development_dependency "simplecov"
|
25
|
+
s.add_development_dependency "guard"
|
26
|
+
s.add_development_dependency "guard-rspec"
|
25
27
|
|
26
|
-
s.add_runtime_dependency "
|
28
|
+
s.add_runtime_dependency "quandl_client", "~> 2.2"
|
27
29
|
|
28
30
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Spec
|
2
|
+
class Logger
|
3
|
+
|
4
|
+
class << self
|
5
|
+
|
6
|
+
def info(*args)
|
7
|
+
log(*args)
|
8
|
+
end
|
9
|
+
|
10
|
+
def debug(*args)
|
11
|
+
log(*args)
|
12
|
+
end
|
13
|
+
|
14
|
+
def error(*args)
|
15
|
+
raise args[1] if args[1].kind_of?(StandardError)
|
16
|
+
end
|
17
|
+
|
18
|
+
def log(*args)
|
19
|
+
STDOUT << args.collect(&:to_s).join(', ') + "\n"
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
code: "BLAKE_TEST_1"
|
2
|
+
name: "A new title"
|
3
|
+
description: "The description Date, Open, High"
|
4
|
+
private: false
|
5
|
+
-
|
6
|
+
2013-11-22,1252.0,454.95,448.2,450.0,450.0,1354405.0,6099.41
|
7
|
+
Date,Open,High,Low,Last,Close,Total Trade Quantity,Turnover (Lacs)
|
8
|
+
2013-11-21,452.25,457.75,449.1,451.2,451.0,218881.0,992.94
|
9
|
+
|
10
|
+
code: "BLAKE_TEST_2"
|
11
|
+
name: "A new title"
|
12
|
+
description: "The description Date, Open, High"
|
13
|
+
-
|
14
|
+
2013-11-22,1252.0,454.95,448.2,450.0,450.0,1354405.0,6099.41
|
15
|
+
2013-11-21,452.25,457.75,449.1,451.2,451.0,218881.0,992.94
|
16
|
+
Date,Open,High,Low,Last,Close,Total Trade Quantity,Turnover (Lacs)
|
17
|
+
|
18
|
+
code: "BLAKE_TEST_3"
|
19
|
+
name: "A new title"
|
20
|
+
description: "The description Date, Open, High"
|
21
|
+
-
|
22
|
+
Date,Open,High,Low,Last,Close,Total Trade Quantity,Turnover (Lacs)
|
23
|
+
2013-11-22,1252.0,454.95,448.2,450.0,Low,1354405.0,6099.41
|
24
|
+
2013-11-21,452.25,457.75,449.1,451.2,451.0,218881.0,992.94
|
@@ -0,0 +1,11 @@
|
|
1
|
+
code: "BLAKE_TEST_1"
|
2
|
+
name: "A new title"
|
3
|
+
this_attribute_does_not_exist: "Why is this here?"
|
4
|
+
description: "The description Date, Open, High"
|
5
|
+
private: false
|
6
|
+
-
|
7
|
+
Date, Column 1, Column 2, Column 3, Column 4
|
8
|
+
2013-11-30,,11.003235294117646,13.948117647058822,19.038
|
9
|
+
2013-11-29,9.953796020761246,10.886730449826988,13.957142899653979,19.10407305882353
|
10
|
+
2013-11-28,10.031669836688378,10.89889797209444,13.954679874436392,19.20858357614533
|
11
|
+
2013-11-25,10.07474700716357,10.876459064504834,13.923487060599417,19.139658658607395
|
@@ -0,0 +1,24 @@
|
|
1
|
+
code: "BLAKE_TEST_1"
|
2
|
+
name: "A new title"
|
3
|
+
description: "The description Date, Open, High"
|
4
|
+
private: false
|
5
|
+
-
|
6
|
+
Date,Open,High,Low,Last,Close,Total Trade Quantity,Turnover (Lacs)
|
7
|
+
2013-11-22,1252.0,454.95,448.2,450.0,450.0,1354405.0,6099.41
|
8
|
+
2013-11-21,452.25,457.75,449.1,451.2,451.0,218881.0,992.94
|
9
|
+
|
10
|
+
code: "BLAKE_TEST_2"
|
11
|
+
name: "A new title"
|
12
|
+
description: "The description Date, Open, High"
|
13
|
+
-
|
14
|
+
Date,Open,High,Low,Last,Close,Total Trade Quantity,Turnover (Lacs)
|
15
|
+
2013-11-22,1252.0,454.95,448.2,450.0,450.0,1354405.0,6099.41
|
16
|
+
2013-11-21,452.25,457.75,449.1,451.2,451.0,218881.0,992.94
|
17
|
+
|
18
|
+
code: "BLAKE_TEST_3"
|
19
|
+
name: "A new title"
|
20
|
+
description: "The description Date, Open, High"
|
21
|
+
-
|
22
|
+
Date,Open,High,Low,Last,Close,Total Trade Quantity,Turnover (Lacs)
|
23
|
+
2013-11-22,1252.0,454.95,448.2,450.0,450.0,1354405.0,6099.41
|
24
|
+
2013-11-21,452.25,457.75,449.1,451.2,451.0,218881.0,992.94
|
@@ -0,0 +1,65 @@
|
|
1
|
+
def fixtures_data
|
2
|
+
return @fixtures_data if @fixtures_data
|
3
|
+
@fixtures_data = {}
|
4
|
+
Dir.glob( File.join( File.dirname(__FILE__), 'data/**/*.qdf' ) ).each{|f|
|
5
|
+
name = File.basename(f, '.qdf').to_s
|
6
|
+
@fixtures_data[name] = File.read(f)
|
7
|
+
}
|
8
|
+
@fixtures_data
|
9
|
+
end
|
10
|
+
|
11
|
+
def qdf_format
|
12
|
+
%Q{
|
13
|
+
# first dataset
|
14
|
+
source_code: NSE
|
15
|
+
code: OIL
|
16
|
+
name: Oil India Limited
|
17
|
+
description: |-
|
18
|
+
Here is a description with multiple lines.
|
19
|
+
This is the second line.
|
20
|
+
-
|
21
|
+
Date, Value, High, Low
|
22
|
+
2013-11-20,9.99470588235294,11.003235294117646,14.00164705882353
|
23
|
+
2013-11-19,10.039388096885814,,14.09718770934256
|
24
|
+
|
25
|
+
# Second dataset
|
26
|
+
code: DATASET_CODE_2
|
27
|
+
source_code: SOURCE_CODE_2
|
28
|
+
name: Test Dataset Name 2
|
29
|
+
description: Here is a description with multiple lines.
|
30
|
+
-
|
31
|
+
Date, Value, High, Low
|
32
|
+
2013-11-20,9.99470588235294,11.003235294117646,14.00164705882353
|
33
|
+
2013-11-19,10.039388096885814,,14.09718770934256
|
34
|
+
2013-11-18,11.039388096885814,,15.09718770934256
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
def qdf_attributes
|
39
|
+
{
|
40
|
+
code: 'DATASET_CODE_2',
|
41
|
+
source_code: 'SOURCE_CODE',
|
42
|
+
name: 'Test Dataset Name 2',
|
43
|
+
description: "Here is a description with multiple lines.\n This is the second line.",
|
44
|
+
column_names: ['Date', 'Value', 'High', 'Low'],
|
45
|
+
private: false,
|
46
|
+
display_url: 'http://test.com/',
|
47
|
+
data: Quandl::Data.new([["2013-11-20", "9.99470588235294", "11.003235294117646", "14.00164705882353"],["2013-11-19", "10.039388096885814", nil, "14.09718770934256"]]),
|
48
|
+
}
|
49
|
+
end
|
50
|
+
|
51
|
+
def qdf_attributes_to_format
|
52
|
+
%Q{source_code: SOURCE_CODE
|
53
|
+
code: DATASET_CODE_2
|
54
|
+
name: Test Dataset Name 2
|
55
|
+
description: |-
|
56
|
+
Here is a description with multiple lines.
|
57
|
+
This is the second line.
|
58
|
+
private: false
|
59
|
+
display_url: http://test.com/
|
60
|
+
-
|
61
|
+
Date,Value,High,Low
|
62
|
+
2013-11-20,9.99470588235294,11.003235294117646,14.00164705882353
|
63
|
+
2013-11-19,10.039388096885814,,14.09718770934256
|
64
|
+
}
|
65
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Quandl::Client::Dataset do
|
5
|
+
|
6
|
+
let(:attributes) { {
|
7
|
+
code: 'DATASET_CODE_2',
|
8
|
+
source_code: 'SOURCE_CODE',
|
9
|
+
name: 'Test Dataset Name 2',
|
10
|
+
description: "Here is a description with multiple lines.\n This is the second line.",
|
11
|
+
column_names: ['Date', 'Value', 'High', 'Low'],
|
12
|
+
private: false,
|
13
|
+
display_url: 'http://test.com/',
|
14
|
+
data: [["2013-11-20", "9.99470588235294", "11.003235294117646", "14.00164705882353"],
|
15
|
+
["2013-11-19", "10.039388096885814", nil, "14.09718770934256"]],
|
16
|
+
}}
|
17
|
+
|
18
|
+
subject{ Quandl::Client::Dataset.new( attributes ) }
|
19
|
+
|
20
|
+
it{ should respond_to :to_qdf }
|
21
|
+
|
22
|
+
its(:to_qdf){ should eq Quandl::Format::Dataset.new(attributes).to_qdf }
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Quandl::Format::Dataset::Client do
|
5
|
+
|
6
|
+
context "without attributes" do
|
7
|
+
subject{ Quandl::Format::Dataset.new }
|
8
|
+
its(:valid?){ should be_false }
|
9
|
+
its(:upload){ should be_false }
|
10
|
+
end
|
11
|
+
|
12
|
+
let(:attributes) { qdf_attributes }
|
13
|
+
let(:dataset){ Quandl::Format::Dataset.new( attributes ) }
|
14
|
+
subject{ dataset }
|
15
|
+
|
16
|
+
it{ should respond_to :valid? }
|
17
|
+
it{ should respond_to :upload }
|
18
|
+
|
19
|
+
its(:valid?){ should be_true }
|
20
|
+
its(:client){ should be_a Quandl::Client::Dataset }
|
21
|
+
|
22
|
+
["string", 10, Date.today, [1,2,3], {hash: 'test'} ].each do |value|
|
23
|
+
it "#client= #{value.class} should raise_error ArgumentError" do
|
24
|
+
expect{ subject.client = value }.to raise_error ArgumentError
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
it "#client= Quandl::Client::Dataset should return client" do
|
29
|
+
d = Quandl::Client::Dataset.new
|
30
|
+
subject.client = d
|
31
|
+
subject.client.should eq d
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Quandl::Format::Dataset do
|
5
|
+
subject{ data }
|
6
|
+
context "valid.qdf" do
|
7
|
+
let(:data){ Quandl::Format::Dataset.load( fixtures_data['valid'] ) }
|
8
|
+
|
9
|
+
it{ should be_a Array }
|
10
|
+
its(:count){ should eq 3 }
|
11
|
+
|
12
|
+
describe "#first" do
|
13
|
+
subject{ data.first }
|
14
|
+
its(:code){ should eq 'BLAKE_TEST_1' }
|
15
|
+
its(:name){ should eq 'A new title' }
|
16
|
+
its(:description){ should eq 'The description Date, Open, High'}
|
17
|
+
its(:column_names){ should eq ['Date','Open','High','Low','Last','Close','Total Trade Quantity','Turnover (Lacs)']}
|
18
|
+
its(:data){ should eq Quandl::Data.new([['2013-11-22','1252.0','454.95','448.2','450.0','450.0','1354405.0','6099.41'],['2013-11-21','452.25','457.75','449.1','451.2','451.0','218881.0','992.94']]) }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context "invalid_data.qdf" do
|
23
|
+
let(:data){ Quandl::Format::Dataset.load( fixtures_data['invalid_data'] ) }
|
24
|
+
it{ expect{data}.to raise_error Quandl::Operation::Errors::UnknownDateFormat, /Date/ }
|
25
|
+
end
|
26
|
+
|
27
|
+
context "unknown_attribute.qdf" do
|
28
|
+
let(:data){ Quandl::Format::Dataset.load( fixtures_data['unknown_attribute'] ) }
|
29
|
+
it{ expect{data}.to raise_error Quandl::Format::Errors::UnknownAttribute, /this_attribute_does_not_exist/ }
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Quandl::Format::Dataset::Load do
|
5
|
+
|
6
|
+
let(:format){ qdf_format }
|
7
|
+
|
8
|
+
describe ".file" do
|
9
|
+
subject{ Quandl::Format::Dataset::Load.file("spec/fixtures/data/valid.qdf") }
|
10
|
+
its(:count){ should eq 3 }
|
11
|
+
end
|
12
|
+
|
13
|
+
describe ".string" do
|
14
|
+
|
15
|
+
let(:collection){ Quandl::Format::Dataset::Load.string(format) }
|
16
|
+
subject{ collection }
|
17
|
+
|
18
|
+
its(:count){ should eq 2 }
|
19
|
+
|
20
|
+
describe "#first" do
|
21
|
+
subject{ collection.first }
|
22
|
+
|
23
|
+
it{ should be_a Quandl::Format::Dataset }
|
24
|
+
its(:source_code){ should eq 'NSE' }
|
25
|
+
its(:code){ should eq 'OIL' }
|
26
|
+
its(:name){ should eq 'Oil India Limited' }
|
27
|
+
its(:description){ should eq "Here is a description with multiple lines.\nThis is the second line." }
|
28
|
+
its(:column_names){ should eq ['Date', 'Value', 'High', 'Low'] }
|
29
|
+
its(:data){ should eq Quandl::Data.new([["2013-11-20", "9.99470588235294", "11.003235294117646", "14.00164705882353"],["2013-11-19", "10.039388096885814", nil, "14.09718770934256"]]) }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Quandl::Format::Dataset do
|
5
|
+
|
6
|
+
let(:attributes) { qdf_attributes }
|
7
|
+
|
8
|
+
subject{ Quandl::Format::Dataset.new(attributes) }
|
9
|
+
|
10
|
+
its(:code){ should eq 'DATASET_CODE_2' }
|
11
|
+
its(:source_code){ should eq 'SOURCE_CODE' }
|
12
|
+
its(:name){ should eq 'Test Dataset Name 2' }
|
13
|
+
its(:description){ should eq "Here is a description with multiple lines.\n This is the second line." }
|
14
|
+
its(:column_names){ should eq ['Date', 'Value', 'High', 'Low'] }
|
15
|
+
its(:data){ should eq Quandl::Data.new([["2013-11-20", "9.99470588235294", "11.003235294117646", "14.00164705882353"], ["2013-11-19", "10.039388096885814", nil, "14.09718770934256"]]) }
|
16
|
+
|
17
|
+
its(:attributes){ should eq attributes }
|
18
|
+
|
19
|
+
its(:to_qdf){ should eq qdf_attributes_to_format }
|
20
|
+
|
21
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -3,8 +3,15 @@ if ENV['COVERAGE']
|
|
3
3
|
SimpleCov.start
|
4
4
|
end
|
5
5
|
|
6
|
+
Dir.glob( File.join( File.dirname(__FILE__), 'fixtures/**/*.rb' ) ).each{|f| require(f) }
|
6
7
|
$:.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
|
7
8
|
|
8
9
|
require "rspec"
|
9
10
|
require "quandl/format"
|
10
|
-
require
|
11
|
+
require "config/client"
|
12
|
+
require "config/logger"
|
13
|
+
require 'pry'
|
14
|
+
|
15
|
+
# Replace Quandl::Logger with Spec::Logger that will raise errors sent to #error
|
16
|
+
# This allows us to easily test error assertions in spec/lib/quandl/format/errors_spec.rb
|
17
|
+
Quandl::Logger.use(Spec::Logger)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: quandl_format
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Blake Hilscher
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-11-
|
11
|
+
date: 2013-11-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -81,19 +81,47 @@ dependencies:
|
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
84
|
+
name: guard
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: guard-rspec
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: quandl_client
|
85
113
|
requirement: !ruby/object:Gem::Requirement
|
86
114
|
requirements:
|
87
115
|
- - ~>
|
88
116
|
- !ruby/object:Gem::Version
|
89
|
-
version: '
|
117
|
+
version: '2.2'
|
90
118
|
type: :runtime
|
91
119
|
prerelease: false
|
92
120
|
version_requirements: !ruby/object:Gem::Requirement
|
93
121
|
requirements:
|
94
122
|
- - ~>
|
95
123
|
- !ruby/object:Gem::Version
|
96
|
-
version: '
|
124
|
+
version: '2.2'
|
97
125
|
description: Data will be loaded and dumped.
|
98
126
|
email:
|
99
127
|
- blake@hilscher.ca
|
@@ -103,18 +131,33 @@ extra_rdoc_files: []
|
|
103
131
|
files:
|
104
132
|
- .gitignore
|
105
133
|
- Gemfile
|
134
|
+
- Guardfile
|
106
135
|
- LICENSE
|
107
136
|
- README.md
|
108
137
|
- Rakefile
|
109
138
|
- UPGRADE.md
|
139
|
+
- lib/quandl/client/dataset/to_qdf.rb
|
110
140
|
- lib/quandl/format.rb
|
111
|
-
- lib/quandl/format/
|
112
|
-
- lib/quandl/format/
|
113
|
-
- lib/quandl/format/
|
141
|
+
- lib/quandl/format/dataset.rb
|
142
|
+
- lib/quandl/format/dataset/attributes.rb
|
143
|
+
- lib/quandl/format/dataset/client.rb
|
144
|
+
- lib/quandl/format/dataset/dump.rb
|
145
|
+
- lib/quandl/format/dataset/load.rb
|
146
|
+
- lib/quandl/format/errors.rb
|
114
147
|
- lib/quandl/format/version.rb
|
115
148
|
- quandl_format.gemspec
|
116
|
-
- spec/
|
117
|
-
- spec/
|
149
|
+
- spec/config/client.rb
|
150
|
+
- spec/config/logger.rb
|
151
|
+
- spec/fixtures/data/invalid_data.qdf
|
152
|
+
- spec/fixtures/data/unknown_attribute.qdf
|
153
|
+
- spec/fixtures/data/valid.qdf
|
154
|
+
- spec/fixtures/format.rb
|
155
|
+
- spec/lib/quandl/client/dataset_spec.rb
|
156
|
+
- spec/lib/quandl/format/dataset/attributes_spec.rb
|
157
|
+
- spec/lib/quandl/format/dataset/client_spec.rb
|
158
|
+
- spec/lib/quandl/format/dataset/errors_spec.rb
|
159
|
+
- spec/lib/quandl/format/dataset/load_spec.rb
|
160
|
+
- spec/lib/quandl/format/dataset_spec.rb
|
118
161
|
- spec/spec_helper.rb
|
119
162
|
homepage: http://blake.hilscher.ca/
|
120
163
|
licenses:
|
@@ -141,6 +184,16 @@ signing_key:
|
|
141
184
|
specification_version: 4
|
142
185
|
summary: Quandl Data Format
|
143
186
|
test_files:
|
144
|
-
- spec/
|
145
|
-
- spec/
|
187
|
+
- spec/config/client.rb
|
188
|
+
- spec/config/logger.rb
|
189
|
+
- spec/fixtures/data/invalid_data.qdf
|
190
|
+
- spec/fixtures/data/unknown_attribute.qdf
|
191
|
+
- spec/fixtures/data/valid.qdf
|
192
|
+
- spec/fixtures/format.rb
|
193
|
+
- spec/lib/quandl/client/dataset_spec.rb
|
194
|
+
- spec/lib/quandl/format/dataset/attributes_spec.rb
|
195
|
+
- spec/lib/quandl/format/dataset/client_spec.rb
|
196
|
+
- spec/lib/quandl/format/dataset/errors_spec.rb
|
197
|
+
- spec/lib/quandl/format/dataset/load_spec.rb
|
198
|
+
- spec/lib/quandl/format/dataset_spec.rb
|
146
199
|
- spec/spec_helper.rb
|
data/lib/quandl/format/node.rb
DELETED
@@ -1,73 +0,0 @@
|
|
1
|
-
class Quandl::Format::Node
|
2
|
-
|
3
|
-
META_ATTRIBUTES = :source_code, :code, :name, :description, :private, :display_url
|
4
|
-
DATA_ATTRIBUTES = :column_names, :data
|
5
|
-
|
6
|
-
attr_accessor *( META_ATTRIBUTES + DATA_ATTRIBUTES )
|
7
|
-
|
8
|
-
class << self
|
9
|
-
|
10
|
-
def attribute_names
|
11
|
-
@attribute_names ||= meta_attribute_names + data_attribute_names
|
12
|
-
end
|
13
|
-
|
14
|
-
def meta_attribute_names
|
15
|
-
META_ATTRIBUTES
|
16
|
-
end
|
17
|
-
|
18
|
-
def data_attribute_names
|
19
|
-
DATA_ATTRIBUTES
|
20
|
-
end
|
21
|
-
|
22
|
-
end
|
23
|
-
|
24
|
-
def initialize(attrs)
|
25
|
-
assign_attributes(attrs)
|
26
|
-
end
|
27
|
-
|
28
|
-
def assign_attributes(attrs)
|
29
|
-
attrs.each do |key, value|
|
30
|
-
self.send("#{key}=", value) if self.respond_to?(key)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def full_code=(value)
|
35
|
-
value = value.split('/')
|
36
|
-
self.source_code = value[0]
|
37
|
-
self.code = value[1]
|
38
|
-
end
|
39
|
-
|
40
|
-
def full_code
|
41
|
-
[source_code, code].join('/')
|
42
|
-
end
|
43
|
-
|
44
|
-
def description=(value)
|
45
|
-
@description = value.to_s.gsub('\n', "\n")
|
46
|
-
end
|
47
|
-
|
48
|
-
def data=(rows)
|
49
|
-
self.column_names = rows.shift unless rows.first.collect{|r| r.to_s.numeric? }.include?(true)
|
50
|
-
@data = rows
|
51
|
-
end
|
52
|
-
|
53
|
-
def column_names=(names)
|
54
|
-
@column_names = Array(names).flatten.collect{|n| n.strip.rstrip }
|
55
|
-
end
|
56
|
-
|
57
|
-
def to_qdf
|
58
|
-
Quandl::Format::Dump.node(self)
|
59
|
-
end
|
60
|
-
|
61
|
-
def meta_attributes
|
62
|
-
self.class.meta_attribute_names.inject({}){|m,k| m[k] = self.send(k); m }
|
63
|
-
end
|
64
|
-
|
65
|
-
def attributes
|
66
|
-
self.class.attribute_names.inject({}){|m,k| m[k] = self.send(k); m }
|
67
|
-
end
|
68
|
-
|
69
|
-
def inspect
|
70
|
-
"<##{self.class.name} #{meta_attributes.to_s} >"
|
71
|
-
end
|
72
|
-
|
73
|
-
end
|
@@ -1,54 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
require 'spec_helper'
|
3
|
-
|
4
|
-
describe Quandl::Format::Load do
|
5
|
-
|
6
|
-
let(:qdf_dataset){
|
7
|
-
%Q{
|
8
|
-
# first dataset
|
9
|
-
source_code: NSE
|
10
|
-
code: OIL
|
11
|
-
name: Oil India Limited
|
12
|
-
description: |-
|
13
|
-
Here is a description with multiple lines.
|
14
|
-
This is the second line.
|
15
|
-
-
|
16
|
-
Date, Value, High, Low
|
17
|
-
2013-11-20,9.99470588235294,11.003235294117646,14.00164705882353
|
18
|
-
2013-11-19,10.039388096885814,,14.09718770934256
|
19
|
-
|
20
|
-
# Second dataset
|
21
|
-
code: DATASET_CODE_2
|
22
|
-
source_code: SOURCE_CODE_2
|
23
|
-
name: Test Dataset Name 2
|
24
|
-
description: Here is a description with multiple lines.
|
25
|
-
-
|
26
|
-
Date, Value, High, Low
|
27
|
-
2013-11-20,9.99470588235294,11.003235294117646,14.00164705882353
|
28
|
-
2013-11-19,10.039388096885814,,14.09718770934256
|
29
|
-
2013-11-18,11.039388096885814,,15.09718770934256
|
30
|
-
}
|
31
|
-
}
|
32
|
-
|
33
|
-
describe ".from_string" do
|
34
|
-
|
35
|
-
let(:collection){ Quandl::Format::Load.from_string(qdf_dataset) }
|
36
|
-
subject{ collection }
|
37
|
-
|
38
|
-
its(:count){ should eq 2 }
|
39
|
-
|
40
|
-
describe "#first" do
|
41
|
-
subject{ collection.first }
|
42
|
-
|
43
|
-
it{ should be_a Quandl::Format::Node }
|
44
|
-
its(:source_code){ should eq 'NSE' }
|
45
|
-
its(:code){ should eq 'OIL' }
|
46
|
-
its(:name){ should eq 'Oil India Limited' }
|
47
|
-
its(:description){ should eq "Here is a description with multiple lines.\nThis is the second line." }
|
48
|
-
its(:column_names){ should eq ['Date', 'Value', 'High', 'Low'] }
|
49
|
-
its(:data){ should eq [["2013-11-20", "9.99470588235294", "11.003235294117646", "14.00164705882353"],
|
50
|
-
["2013-11-19", "10.039388096885814", nil, "14.09718770934256"]] }
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
end
|
@@ -1,44 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
require 'spec_helper'
|
3
|
-
|
4
|
-
describe Quandl::Format::Node do
|
5
|
-
|
6
|
-
let(:attributes) { {
|
7
|
-
code: 'DATASET_CODE_2',
|
8
|
-
source_code: 'SOURCE_CODE',
|
9
|
-
name: 'Test Dataset Name 2',
|
10
|
-
description: "Here is a description with multiple lines.\n This is the second line.",
|
11
|
-
column_names: ['Date', 'Value', 'High', 'Low'],
|
12
|
-
private: false,
|
13
|
-
display_url: 'http://test.com/',
|
14
|
-
data: [["2013-11-20", "9.99470588235294", "11.003235294117646", "14.00164705882353"],
|
15
|
-
["2013-11-19", "10.039388096885814", nil, "14.09718770934256"]],
|
16
|
-
}}
|
17
|
-
|
18
|
-
subject{ Quandl::Format::Node.new(attributes) }
|
19
|
-
|
20
|
-
its(:code){ should eq 'DATASET_CODE_2' }
|
21
|
-
its(:source_code){ should eq 'SOURCE_CODE' }
|
22
|
-
its(:name){ should eq 'Test Dataset Name 2' }
|
23
|
-
its(:description){ should eq "Here is a description with multiple lines.\n This is the second line." }
|
24
|
-
its(:column_names){ should eq ['Date', 'Value', 'High', 'Low'] }
|
25
|
-
its(:data){ should eq [["2013-11-20", "9.99470588235294", "11.003235294117646", "14.00164705882353"],
|
26
|
-
["2013-11-19", "10.039388096885814", nil, "14.09718770934256"]] }
|
27
|
-
|
28
|
-
its(:attributes){ should eq attributes }
|
29
|
-
|
30
|
-
its(:to_qdf){ should eq %Q{source_code: SOURCE_CODE
|
31
|
-
code: DATASET_CODE_2
|
32
|
-
name: Test Dataset Name 2
|
33
|
-
description: |-
|
34
|
-
Here is a description with multiple lines.
|
35
|
-
This is the second line.
|
36
|
-
private: false
|
37
|
-
display_url: http://test.com/
|
38
|
-
-
|
39
|
-
Date,Value,High,Low
|
40
|
-
2013-11-20,9.99470588235294,11.003235294117646,14.00164705882353
|
41
|
-
2013-11-19,10.039388096885814,,14.09718770934256
|
42
|
-
}}
|
43
|
-
|
44
|
-
end
|