quandl_client 0.0.4 → 0.0.5

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
@@ -68,7 +68,7 @@ d.data_table
68
68
  ```ruby
69
69
 
70
70
  attributes = {
71
- code: "TEST_12345",
71
+ code: "TEST_#{Time.now.to_i}",
72
72
  source_code: 'OFDP',
73
73
  name: "Test Upload #{Time.now.to_i}",
74
74
  frequency: 'daily',
@@ -86,33 +86,51 @@ d = Dataset.create( attributes )
86
86
 
87
87
  ```
88
88
 
89
- ##### Errors
90
-
91
- ```ruby
92
-
93
- d = Dataset.create(code: 'TEST', source_code: 'OFDP', locations_attributes: [{ type: 'http', url: 'test.com' }] )
94
- d.errors
95
- => {"locations.post_data"=>["can't be blank"], "locations.cookie_url"=>["can't be blank"], "name"=>["can't be blank"], "frequency"=>["is not included in the list"]}
96
-
97
- ```
98
-
99
89
 
100
90
  #### Update
101
91
 
102
92
  ```ruby
103
93
 
104
- d = Dataset.find("OFDP/TEST_12345")
94
+ d = Dataset.find( d.full_code )
105
95
  d.name = 'New Name'
106
96
  d.data = Quandl::Data::Random.table.to_csv
107
97
  d.save
108
98
 
109
- d = Dataset.collapse(:weekly).find("OFDP/TEST_12345")
99
+ d = Dataset.collapse(:weekly).find( d.full_code )
110
100
  d.data
111
101
  => [[...],...]
112
102
 
113
103
  ```
114
104
 
115
105
 
106
+ #### Delete
107
+
108
+ ```ruby
109
+
110
+ Dataset.destroy_existing('SOME_SOURCE/SOME_CODE')
111
+ Dataset.destroy_existing(52352)
112
+
113
+ Dataset.find('SOME_SOURCE/SOME_CODE')
114
+ => nil
115
+
116
+ ```
117
+
118
+
119
+ #### Error Handling
120
+
121
+ ```ruby
122
+
123
+ d = Dataset.create(code: 'TEST', source_code: 'OFDP', locations: [{ type: 'http', url: 'test.com' }] )
124
+ d.error_messages
125
+ => {:name=>["can't be blank"]}
126
+
127
+ d = Dataset.create(name: 'asdfs', code: 'TEST', source_code: 'OFDP', locations: [{ type: 'http', url: 'test.com' }] )
128
+ d.error_messages
129
+ => {"code"=>["has already been taken"], "frequency"=>["is not included in the list"]}
130
+
131
+ ```
132
+
133
+
116
134
 
117
135
 
118
136
  ## Quandl::Client::Source
@@ -122,9 +140,9 @@ d.data
122
140
 
123
141
  ```ruby
124
142
 
125
- sources = Quandl::Client::Source.query('canada').page(2).all
143
+ sources = Quandl::Client::Source.query('can').all
126
144
 
127
- => [#<Quandl::Client::Source(sources) code="STATCAN1" title="Stat Can">,...]
145
+ => [#<Quandl::Client::Source(sources/413) code="STATSCAN5" datasets_count=1>...]
128
146
 
129
147
  ```
130
148
 
@@ -133,7 +151,45 @@ sources = Quandl::Client::Source.query('canada').page(2).all
133
151
 
134
152
  ```ruby
135
153
 
136
- sheet = Quandl::Client::Source.find('STATCAN1')
154
+ s = Quandl::Client::Source.find('STATSCAN5')
155
+
156
+ ```
157
+
158
+
159
+ #### Create
160
+
161
+ ```ruby
162
+
163
+ s = Source.create( code: 'test' )
164
+ s.valid?
165
+ s.error_messages
166
+ => {:code=>["is invalid"], :host=>["can't be blank"], :name=>["can't be blank"]}
167
+
168
+ s = Source.create(code: %Q{TEST_#{Time.now.to_i}}, name: 'asdf', host: "http://asdf#{Time.now}.com" )
169
+ s.saved?
170
+ => true
171
+
172
+ ```
173
+
174
+
175
+ #### Update
176
+
177
+ ```ruby
178
+
179
+ s = Source.find(s.code)
180
+ s.name = "Updated Name #{Time.now.to_i}"
181
+ s.code = "DATA_#{Time.now.to_i}"
182
+ s.save
183
+
184
+ ```
185
+
186
+
187
+ #### Delete
188
+
189
+ ```ruby
190
+
191
+ Source.destroy_existing('SOMESOURCE')
192
+ Source.destroy_existing(52352)
137
193
 
138
194
  ```
139
195
 
@@ -166,11 +222,12 @@ sheet = Quandl::Client::Sheet.find('housing/hood')
166
222
 
167
223
  ```ruby
168
224
 
169
- include Quandl::Client
225
+ s = Quandl::Client::Sheet.create( title: 'ocean' )
226
+ s = Quandl::Client::Sheet.create( full_url_title: 'ocean/river', title: 'River' )
227
+ s = Quandl::Client::Sheet.create( full_url_title: 'ocean/river/lake', title: 'Lake!' )
170
228
 
171
- s = Sheet.create( title: 'ocean' )
172
- s = Sheet.create( full_url_title: 'ocean/river', title: 'River' )
173
- s = Sheet.create( full_url_title: 'ocean/river/lake', title: 'Lake!' )
229
+ Sheet.find('ocean/river/lake').title
230
+ => 'Lake!'
174
231
 
175
232
  Sheet.find('ocean').children.first.title
176
233
  => River
@@ -182,15 +239,24 @@ Sheet.find('ocean').children.first.title
182
239
 
183
240
  ```ruby
184
241
 
185
- Quandl::Client.token = 'xyz'
186
-
187
- s = Quandl::Client::Sheet.find_by_url_title('hi_there')
188
- s.title = 'another title'
242
+ s = Quandl::Client::Sheet.find('ocean/river')
243
+ s.title = "River #{Time.now.to_i}"
189
244
  s.save
190
245
 
191
246
  ```
192
247
 
193
248
 
249
+ #### Delete
250
+
251
+ ```ruby
252
+
253
+ Quandl::Client::Sheet.destroy_existing('ocean/river/lake')
254
+
255
+ Quandl::Client::Sheet.destroy_existing(15252)
256
+
257
+ ```
258
+
259
+
194
260
 
195
261
 
196
262
  # Authentication
@@ -0,0 +1,12 @@
1
+ require 'scope_builder'
2
+ require "quandl/data"
3
+
4
+ module Quandl
5
+ module Client
6
+
7
+ class Base
8
+
9
+ end
10
+
11
+ end
12
+ end
@@ -0,0 +1,33 @@
1
+ module Quandl
2
+ module Client
3
+ module Concerns
4
+
5
+ module Properties
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+
10
+ include Her::Model
11
+ use_api Client.her_api
12
+
13
+ before_save :halt_unless_valid!
14
+
15
+ def error_messages
16
+ valid?
17
+ m = errors.messages.to_h || {}
18
+ e = self.attributes[:errors].to_h || {}
19
+ m.deep_merge(e)
20
+ end
21
+
22
+ protected
23
+
24
+ def halt_unless_valid!
25
+ return false unless valid?
26
+ end
27
+
28
+ end
29
+ end
30
+
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,26 @@
1
+ module Quandl
2
+ module Client
3
+ module Concerns
4
+
5
+ module Search
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+
10
+ include ScopeBuilder::Model
11
+
12
+ scope_builder_for :search
13
+
14
+ search_helper :all, ->{ connection.where(attributes).fetch }
15
+ search_helper :connection, -> { self.class.parent }
16
+
17
+ search_scope.class_eval do
18
+ delegate *Array.forwardable_methods, to: :all
19
+ end
20
+
21
+ end
22
+ end
23
+
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,17 @@
1
+ require "active_support"
2
+ require "active_support/inflector"
3
+ require "active_support/core_ext/hash"
4
+ require "active_support/core_ext/object"
5
+
6
+ require 'quandl/client/concerns/search'
7
+ require 'quandl/client/concerns/properties'
8
+
9
+ module Quandl
10
+ module Client
11
+
12
+ module Concerns
13
+
14
+ end
15
+
16
+ end
17
+ end
@@ -1,3 +1,6 @@
1
+ require 'her'
2
+ require 'quandl/her/patch'
3
+
1
4
  module Quandl
2
5
  module Client
3
6
  class << self
@@ -1,18 +1,71 @@
1
- require 'quandl/client/models/dataset/searchable'
2
- require 'quandl/client/models/dataset/properties'
3
-
4
1
  module Quandl
5
2
  module Client
6
3
 
7
4
  class Dataset
8
5
 
9
- include Properties
10
- include Searchable
6
+ include Concerns::Search
7
+ include Concerns::Properties
8
+
9
+
10
+ ##########
11
+ # SCOPES #
12
+ ##########
13
+
14
+ # SEARCH
15
+ search_scope :query, :rows
16
+ search_scope :page, ->(p){ where( page: p.to_i )}
17
+ search_scope :source_code, ->(c){ where( code: c.to_s.upcase )}
18
+
19
+ # SHOW
20
+ scope_builder_for :show
21
+ show_scope :rows, :exclude_data, :exclude_headers, :trim_start, :trim_end, :transform, :collapse
22
+ show_helper :find, ->(id){ connection.where(attributes).find( id ) }
23
+ show_helper :connection, -> { self.class.parent }
11
24
 
25
+
26
+ ###############
27
+ # ASSOCIATIONS #
28
+ ###############
29
+
12
30
  def source
13
31
  @source ||= Source.find(self.source_code)
14
32
  end
15
33
 
34
+
35
+ ###############
36
+ # VALIDATIONS #
37
+ ###############
38
+
39
+ validates :source_code, presence: true, length: { minimum: 2 }, format: { with: /^([A-Z][A-Z0-9_]+)$/ }
40
+ validates :code, presence: true, length: { minimum: 2 }, format: { with: /^([A-Z][A-Z0-9_]+)$/ }
41
+ validates :name, presence: true
42
+
43
+
44
+ ##############
45
+ # PROPERTIES #
46
+ ##############
47
+
48
+ attributes :data, :source_code, :code, :name, :urlize_name,
49
+ :description, :updated_at, :frequency, :from_date,
50
+ :to_date, :column_names, :private, :type
51
+
52
+ attributes :locations_attributes
53
+
54
+ alias_method :locations, :locations_attributes
55
+ alias_method :locations=, :locations_attributes=
56
+
57
+ def full_code
58
+ @full_code ||= File.join(self.source_code, self.code)
59
+ end
60
+
61
+ def data_table
62
+ Data::Table.new( raw_data )
63
+ end
64
+
65
+ def raw_data
66
+ @raw_data ||= (self.data || Dataset.find(full_code).data || [])
67
+ end
68
+
16
69
  end
17
70
 
18
71
  end
@@ -1,31 +1,22 @@
1
- require 'quandl/client/models/dataset/searchable'
2
- require 'quandl/client/models/dataset/properties'
3
-
4
1
  module Quandl
5
2
  module Client
6
3
 
7
4
  class Sheet
8
-
9
- include ScopeBuilder::Model
10
5
 
11
- scope_builder_for :search
6
+ include Concerns::Search
7
+ include Concerns::Properties
8
+
9
+
10
+ ##########
11
+ # SCOPES #
12
+ ##########
12
13
 
13
14
  search_scope :query, :page, :parent_url_title
14
- search_helper :all, ->{ connection.where(attributes).fetch.to_a }
15
- search_helper :connection, -> { self.class.parent }
16
-
17
- search_scope.class_eval do
18
- delegate *Array.forwardable_methods, to: :all
19
- end
20
15
 
21
- # ORM
22
- include Her::Model
23
- use_api Client.her_api
24
- attributes :title, :content, :url_title, :full_url_title
25
16
 
26
- def html
27
- @html ||= self.attributes[:html] || Sheet.find(full_url_title).attributes[:html]
28
- end
17
+ ###############
18
+ # ASSOCIATIONS #
19
+ ###############
29
20
 
30
21
  def parent
31
22
  @parent ||= Sheet.find(parent_url_title)
@@ -35,10 +26,29 @@ class Sheet
35
26
  Sheet.parent_url_title(self.full_url_title)
36
27
  end
37
28
 
29
+
30
+ ###############
31
+ # VALIDATIONS #
32
+ ###############
33
+
34
+ validates :title, presence: true
35
+
36
+
37
+ ##############
38
+ # PROPERTIES #
39
+ ##############
40
+
41
+ attributes :title, :content, :url_title, :full_url_title
42
+
43
+ def html
44
+ @html ||= self.attributes[:html] || Sheet.find(full_url_title).attributes[:html]
45
+ end
46
+
38
47
  def parent_url_title
39
48
  @parent_url_title ||= self.full_url_title.split('/')[0..-2].join()
40
49
  end
41
50
 
51
+
42
52
  end
43
53
 
44
54
  end
@@ -1,38 +1,42 @@
1
- require 'quandl/client/models/dataset/searchable'
2
- require 'quandl/client/models/dataset/properties'
3
-
4
1
  module Quandl
5
2
  module Client
6
3
 
7
4
  class Source
8
-
9
- include ScopeBuilder::Model
10
5
 
11
- scope_builder_for :search
6
+ include Concerns::Search
7
+ include Concerns::Properties
8
+
9
+ ##########
10
+ # SCOPES #
11
+ ##########
12
12
 
13
13
  search_scope :query
14
14
  search_scope :page, ->(p){ where( page: p.to_i )}
15
15
  search_scope :code, ->(c){ where( code: c.to_s.upcase )}
16
16
 
17
- search_helper :all, ->{ connection.where(attributes).fetch }
18
- search_helper :connection, -> { self.class.parent }
19
-
20
- search_scope.class_eval do
21
- delegate *Array.forwardable_methods, to: :all
22
- end
23
17
 
24
- # ORM
25
- include Her::Model
26
- use_api Client.her_api
27
- attributes :code, :datasets_count, :description, :name, :host
18
+ ###############
19
+ # ASSOCIATIONS #
20
+ ###############
28
21
 
29
22
  def datasets
30
23
  Dataset.source_code(code)
31
24
  end
32
25
 
33
- def id
34
- 'show'
35
- end
26
+
27
+ ###############
28
+ # VALIDATIONS #
29
+ ###############
30
+
31
+ validates :code, presence: true, length: { minimum: 2 }, format: { with: /^([A-Z][A-Z0-9_]+)$/ }
32
+ validates :host, :name, presence: true
33
+
34
+
35
+ ##############
36
+ # PROPERTIES #
37
+ ##############
38
+
39
+ attributes :code, :name, :host, :description, :datasets_count, :use_proxy, :type, :concurrency
36
40
 
37
41
  end
38
42
 
@@ -1,6 +1,6 @@
1
1
  module Quandl
2
2
  module Client
3
- VERSION = '0.0.4'
3
+ VERSION = '0.0.5'
4
4
  API_VERSION = 'v1'
5
5
 
6
6
  class << self
data/lib/quandl/client.rb CHANGED
@@ -5,12 +5,9 @@ require "active_support/inflector"
5
5
  require "active_support/core_ext/hash"
6
6
  require "active_support/core_ext/object"
7
7
 
8
- require 'her'
9
- require 'quandl/her/patch'
10
- require 'scope_builder'
11
- require "quandl/data"
12
-
13
8
  require 'quandl/client/her'
9
+ require 'quandl/client/concerns'
10
+ require 'quandl/client/base'
14
11
  require 'quandl/client/models'
15
12
 
16
13
  module Quandl
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: quandl_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
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: 2013-06-20 00:00:00.000000000 Z
12
+ date: 2013-06-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -188,11 +188,13 @@ files:
188
188
  - Rakefile
189
189
  - UPGRADE.md
190
190
  - lib/quandl/client.rb
191
+ - lib/quandl/client/base.rb
192
+ - lib/quandl/client/concerns.rb
193
+ - lib/quandl/client/concerns/properties.rb
194
+ - lib/quandl/client/concerns/search.rb
191
195
  - lib/quandl/client/her.rb
192
196
  - lib/quandl/client/models.rb
193
197
  - lib/quandl/client/models/dataset.rb
194
- - lib/quandl/client/models/dataset/properties.rb
195
- - lib/quandl/client/models/dataset/searchable.rb
196
198
  - lib/quandl/client/models/sheet.rb
197
199
  - lib/quandl/client/models/source.rb
198
200
  - lib/quandl/client/version.rb
@@ -1,46 +0,0 @@
1
- module Quandl
2
- module Client
3
-
4
- class Dataset
5
-
6
- module Properties
7
-
8
- extend ActiveSupport::Concern
9
-
10
- included do
11
-
12
- include Her::Model
13
- use_api Client.her_api
14
-
15
- attributes :data, :source_code, :code, :name, :urlize_name,
16
- :description, :updated_at, :frequency, :from_date,
17
- :to_date, :column_names, :private, :type
18
-
19
- attributes :locations_attributes
20
-
21
- alias_method :locations, :locations_attributes
22
- alias_method :locations=, :locations_attributes=
23
-
24
- def errors
25
- self.attributes[:errors]
26
- end
27
-
28
- def full_code
29
- @full_code ||= File.join(self.source_code, self.code)
30
- end
31
-
32
- def data_table
33
- Data::Table.new( raw_data )
34
- end
35
-
36
- def raw_data
37
- @raw_data ||= (self.data || Dataset.find(full_code).data || [])
38
- end
39
-
40
- end
41
-
42
- end
43
-
44
- end
45
- end
46
- end
@@ -1,39 +0,0 @@
1
- module Quandl
2
- module Client
3
-
4
- class Dataset
5
-
6
- module Searchable
7
-
8
- extend ActiveSupport::Concern
9
-
10
- included do
11
-
12
- include ScopeBuilder::Model
13
-
14
- scope_builder_for :search, :show
15
-
16
- # SEARCH
17
-
18
- search_scope :query, :rows
19
- search_scope :page, ->(p){ where( page: p.to_i )}
20
- search_scope :source_code, ->(c){ where( code: c.to_s.upcase )}
21
-
22
- search_helper :all, ->{ connection.where(attributes).fetch }
23
- search_helper :connection, -> { self.class.parent }
24
-
25
- search_scope.class_eval{ delegate *Array.forwardable_methods, to: :all }
26
-
27
- # SHOW
28
-
29
- show_scope :rows, :exclude_data, :exclude_headers, :trim_start, :trim_end, :transform, :collapse
30
- show_helper :find, ->(id){ connection.where(attributes).find( id ) }
31
- show_helper :connection, -> { self.class.parent }
32
-
33
- end
34
-
35
- end
36
-
37
- end
38
- end
39
- end