quandl 0.2.27 → 0.3.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.
Files changed (54) hide show
  1. checksums.yaml +8 -8
  2. data/README.md +70 -17
  3. data/Rakefile +7 -86
  4. data/UPGRADE.md +23 -0
  5. data/VERSION +1 -0
  6. data/lib/quandl/command.rb +11 -3
  7. data/lib/quandl/command/config.rb +88 -0
  8. data/lib/quandl/command/presenter.rb +74 -0
  9. data/lib/quandl/command/presenter/record.rb +121 -0
  10. data/lib/quandl/command/presenters/dataset_presenter.rb +19 -0
  11. data/lib/quandl/command/presenters/error_presenter.rb +31 -0
  12. data/lib/quandl/command/presenters/nil_class_presenter.rb +10 -0
  13. data/lib/quandl/command/presenters/scraper_presenter.rb +25 -0
  14. data/lib/quandl/command/presenters/superset_presenter.rb +10 -0
  15. data/lib/quandl/command/task.rb +40 -0
  16. data/lib/quandl/command/task/callbacks.rb +47 -0
  17. data/lib/quandl/command/task/clientable.rb +65 -0
  18. data/lib/quandl/command/task/commandable.rb +104 -0
  19. data/lib/quandl/command/task/configurable.rb +79 -0
  20. data/lib/quandl/command/task/inputable.rb +37 -0
  21. data/lib/quandl/command/task/logging.rb +83 -0
  22. data/lib/quandl/command/task/presentation.rb +37 -0
  23. data/lib/quandl/command/task/reportable.rb +35 -0
  24. data/lib/quandl/command/task/threading.rb +117 -0
  25. data/lib/quandl/command/task/translations.rb +37 -0
  26. data/lib/quandl/command/task/updatable.rb +77 -0
  27. data/lib/quandl/command/tasks.rb +6 -5
  28. data/lib/quandl/command/tasks/delete.rb +10 -67
  29. data/lib/quandl/command/tasks/download.rb +11 -78
  30. data/lib/quandl/command/tasks/info.rb +2 -2
  31. data/lib/quandl/command/tasks/list.rb +12 -24
  32. data/lib/quandl/command/tasks/login.rb +4 -4
  33. data/lib/quandl/command/tasks/replace.rb +58 -0
  34. data/lib/quandl/command/tasks/schedule.rb +106 -0
  35. data/lib/quandl/command/tasks/search.rb +39 -0
  36. data/lib/quandl/command/tasks/superset.rb +59 -0
  37. data/lib/quandl/command/tasks/uninstall.rb +1 -1
  38. data/lib/quandl/command/tasks/update.rb +2 -2
  39. data/lib/quandl/command/tasks/upload.rb +13 -26
  40. data/lib/quandl/command/version.rb +1 -1
  41. data/quandl.gemspec +5 -3
  42. data/spec/fixtures/scraper.rb +6 -0
  43. data/spec/lib/quandl/command/delete_spec.rb +19 -11
  44. data/spec/lib/quandl/command/download_spec.rb +11 -4
  45. data/spec/lib/quandl/command/replace_spec.rb +23 -0
  46. data/spec/lib/quandl/command/schedule_spec.rb +53 -0
  47. data/spec/lib/quandl/command/superset_spec.rb +28 -0
  48. data/spec/lib/quandl/command/upload_spec.rb +71 -24
  49. data/spec/lib/quandl/command_spec.rb +1 -9
  50. data/spec/spec_helper.rb +36 -1
  51. data/tasks/toolbelt/build/tarball.rb +2 -2
  52. metadata +55 -10
  53. data/lib/quandl/command/qconfig.rb +0 -86
  54. data/lib/quandl/command/tasks/base.rb +0 -314
@@ -0,0 +1,28 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+ require 'open3'
4
+ require 'quandl/client'
5
+ require 'quandl/format'
6
+
7
+ describe "./bin/quandl superset" do
8
+
9
+ let(:command){ self.class.superclass.description }
10
+ subject{ quandl("superset #{command}") }
11
+
12
+ context "new" do
13
+ its(:stdout){ should match Quandl::Client::Superset.example.to_qdf }
14
+ end
15
+
16
+ context "upload spec/fixtures/superset.qdf" do
17
+ its(:stdout){ should match /Created|OK/ }
18
+ end
19
+
20
+ context "download SUPERSET_EXAMPLE" do
21
+ its(:stdout){ should match /SUPERSET_EXAMPLE/ }
22
+ end
23
+
24
+ context "delete SUPERSET_EXAMPLE" do
25
+ its(:stdout){ should match /OK/ }
26
+ end
27
+
28
+ end
@@ -1,39 +1,86 @@
1
1
  # encoding: utf-8
2
2
  require 'spec_helper'
3
3
 
4
- describe Quandl::Command::Tasks::Upload do
4
+ describe "./bin/quandl upload" do
5
5
 
6
- it "should upload spec/fixtures/data/datasets.qdf" do
7
- Quandl::Logger.should_receive(:info).with(/OK|Created/).exactly(4).times
8
- Quandl::Command::Tasks::Upload.call( 'spec/fixtures/data/datasets.qdf' )
6
+ let(:prefix){ "upload" }
7
+ let(:command){ self.class.superclass.description }
8
+ subject{ quandl( [prefix, command].flatten.join(" ") ) }
9
+
10
+ context data_path("datasets.qdf") do
11
+ its(:stdout){ should match /OK|Created/ }
12
+ its(:stderr){ should be_blank }
9
13
  end
10
14
 
11
- it "should upload spec/fixtures/data/metadata.qdf" do
12
- Quandl::Logger.should_receive(:info).with(/OK|Created/).exactly(3).times
13
- Quandl::Command::Tasks::Upload.call( 'spec/fixtures/data/metadata.qdf' )
15
+ context data_path("metadata.qdf") do
16
+ its(:stdout){ should match /OK|Created/ }
17
+ its(:stderr){ should be_blank }
14
18
  end
15
19
 
16
- it "should upload spec/fixtures/data/QUGC-42.qdf" do
17
- Quandl::Logger.should_receive(:info).with(/OK|Created/).exactly(1).times
18
- Quandl::Command::Tasks::Upload.call( 'spec/fixtures/data/QUGC-42.qdf' )
20
+ context data_path("QUGC-42.qdf") do
21
+ its(:stdout){ should match /OK|Created/ }
22
+ its(:stderr){ should be_blank }
19
23
  end
20
24
 
21
- def self.it_should_expect_error(file, error)
22
- it "#{file}.qdf should error with #{error}" do
23
- Quandl::Logger.should_receive(:error).with(error).exactly(1).times
24
- Quandl::Command::Tasks::Upload.call( "spec/fixtures/data/errors/#{file}.qdf" )
25
- end
25
+ context error_path("invalid_code.qdf") do
26
+ its(:stdout){ should match /Unprocessable Entity/ }
27
+ end
28
+
29
+ context error_path("column_count_mismatch.qdf") do
30
+ its(:stdout){ should match /Found 4 but expected 3 based on/ }
31
+ end
32
+
33
+ context error_path("date_parse_error.qdf") do
34
+ its(:stdout){ should match /Invalid date segments/ }
35
+ end
36
+
37
+ context error_path("invalid_date.qdf") do
38
+ its(:stdout){ should match /Invalid date/ }
39
+ end
40
+
41
+ context error_path("invalid_dash.qdf") do
42
+ its(:stdout){ should match /Unprocessable Entity | Error | Psych::SyntaxError | Error parsing metadata. Could not find expected ':' on line 3./ }
26
43
  end
27
44
 
28
- it_should_expect_error :invalid_code, /code is invalid/
29
- it_should_expect_error :column_count_mismatch, /Expected 4 but found 5 based/
30
- it_should_expect_error :date_parse_error, /DateParseError/
31
- it_should_expect_error :invalid_date, /InvalidDate/
32
- it_should_expect_error :psych, /Could not find expected ':'/
33
- it_should_expect_error :unknown_attribute, /UnknownAttribute/
45
+ context error_path("psych.qdf") do
46
+ its(:stdout){ should match /Could not find expected ':'/ }
47
+ end
48
+
49
+ context error_path("unknown_attribute.qdf") do
50
+ its(:stdout){ should match /UnknownAttribute/ }
51
+ end
52
+
53
+ context "json" do
54
+
55
+ let(:prefix){ "upload" }
56
+ let(:command){ self.class.superclass.description }
57
+ subject{
58
+ result = quandl( [prefix, command, "-F json"].flatten.join(" ") )
59
+ OpenStruct.new(
60
+ stdout: result.stdout,
61
+ stderr: result.stderr,
62
+ stdout_json: result.stdout.split("\n").collect{|l| JSON.parse(l) },
63
+ )
64
+ }
34
65
 
35
- # delete test data after run
36
- after(:all){ Quandl::Format::Dataset.load_from_file('spec/fixtures/data/datasets.qdf')
37
- .collect(&:client).each(&:destroy) }
66
+ context data_path("metadata.qdf") do
67
+ its(:stderr){ should be_blank }
68
+ its(:stdout_json){ should be_a Array }
69
+ its('stdout_json.first'){ should have_key 'status' }
70
+ its('stdout_json.first'){ should have_key 'id' }
71
+ its('stdout_json.first'){ should have_key 'detail' }
72
+ its('stdout_json.first'){ should have_key 'message' }
73
+ its('stdout_json.first'){ should have_key 'attributes' }
74
+ end
75
+
76
+ context error_path("unknown_attribute.qdf") do
77
+ its('stdout_json.first'){ should have_key 'status' }
78
+ its('stdout_json.first'){ should have_key 'id' }
79
+ its('stdout_json.first'){ should have_key 'detail' }
80
+ its('stdout_json.first'){ should have_key 'message' }
81
+ its(:stdout_json){ should eq([{"status"=>"Unprocessable Entity", "id"=>"Error", "detail"=>"Quandl::Error::UnknownAttribute", "message"=>"UNKNOWN_ATTRIBUTE_CODE_2 error around line 13\nUnknown Field 'this_attribute_does_not_exist' valid fields are: source_code, code, name, description, private, reference_url, frequency (Quandl::Error::UnknownAttribute)\n"}, {"status"=>"Unprocessable Entity", "id"=>"Error", "detail"=>"Quandl::Error::UnknownAttribute", "message"=>"UNKNOWN_ATTRIBUTE_CODE_3 error around line 25\nUnknown Field 'horse' valid fields are: source_code, code, name, description, private, reference_url, frequency (Quandl::Error::UnknownAttribute)\n"}, {"status"=>"Unprocessable Entity", "id"=>"Error", "detail"=>"Quandl::Error::UnknownAttribute", "message"=>"UNKNOWN_ATTRIBUTE_CODE_4 error around line 37\nUnknown Field 'mouse' valid fields are: source_code, code, name, description, private, reference_url, frequency (Quandl::Error::UnknownAttribute)\n"}]) }
82
+ end
83
+
84
+ end
38
85
 
39
86
  end
@@ -2,14 +2,6 @@
2
2
  require 'spec_helper'
3
3
  require 'open3'
4
4
 
5
- def quandl(statement)
6
- version = "#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}"
7
- path = File.join(Quandl::Command::Tasks.root, 'bin/quandl')
8
- command = "rvm #{version} do bundle exec #{path} #{statement} --token #{ENV['QUANDL_TEST_TOKEN']} --url #{ENV['QUANDL_TEST_URL']} "
9
- stdin, stdout, stderr = Open3.popen3(command)
10
- OpenStruct.new( stderr: stderr.read, stdout: stdout.read )
11
- end
12
-
13
5
  describe "./bin/quandl" do
14
6
 
15
7
  let(:command){ self.class.superclass.description }
@@ -31,7 +23,7 @@ describe "./bin/quandl" do
31
23
  end
32
24
 
33
25
  context "delete TEST_1 TEST_5 TEST_15 --force-yes" do
34
- its(:stdout){ should match 'Deleted' }
26
+ its(:stdout){ should match 'OK' }
35
27
  end
36
28
 
37
29
  context "info" do
data/spec/spec_helper.rb CHANGED
@@ -8,13 +8,48 @@ require 'factory_girl'
8
8
  require 'pry'
9
9
  require 'commander'
10
10
  require 'quandl/command'
11
+ require 'open3'
11
12
 
12
13
  # disable log output
13
- Quandl::Logger.use(Quandl::Logger::Outputs)
14
+ class TestOutput
15
+
16
+ class << self
17
+ def info(*args)
18
+ puts(*args)
19
+ end
20
+ def fatal(*args)
21
+ puts(*args)
22
+ end
23
+ def error(*args)
24
+ puts(*args)
25
+ end
26
+ def debug(*args)
27
+ puts(*args)
28
+ end
29
+ end
30
+
31
+ end
32
+ Quandl::Logger.use(TestOutput)
14
33
 
15
34
  factory_dir = File.join( File.dirname(__FILE__), 'factories/**/*.rb' )
16
35
  Dir.glob( factory_dir ).each{|f| require(f); puts f }
17
36
 
18
37
  RSpec.configure do |config|
19
38
  config.include FactoryGirl::Syntax::Methods
39
+ end
40
+
41
+ def quandl(statement)
42
+ version = "#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}"
43
+ path = File.join(Quandl::Command::Tasks.root, 'bin/quandl')
44
+ command = "bundle exec #{path} #{statement} --token #{ENV['QUANDL_TEST_TOKEN']} --url #{ENV['QUANDL_TEST_URL']} --force-yes --trace"
45
+ stdin, stdout, stderr = Open3.popen3(command)
46
+ OpenStruct.new( stderr: stderr.read, stdout: stdout.read )
47
+ end
48
+
49
+ def data_path(path)
50
+ File.join("spec/fixtures/data/", path)
51
+ end
52
+
53
+ def error_path(path)
54
+ File.join("spec/fixtures/data/errors/", path)
20
55
  end
@@ -28,7 +28,7 @@ class Tasks::Toolbelt::Build::Tarball < Tasks::Toolbelt
28
28
 
29
29
  def copy_files_into_release
30
30
  # for each path
31
- ['lib', 'bin', 'config'].each do |path|
31
+ ['lib', 'bin', 'config', 'VERSION'].each do |path|
32
32
  # recursively copy into release
33
33
  cp_r File.join( root_path, path ), File.join( release_path, path )
34
34
  end
@@ -41,7 +41,7 @@ class Tasks::Toolbelt::Build::Tarball < Tasks::Toolbelt
41
41
  end
42
42
 
43
43
  def append_revision_to_release_version
44
- version_file = File.join( release_path, 'lib/quandl/command/version.rb')
44
+ version_file = File.join( release_path, 'VERSION')
45
45
  IO.write(version_file, File.open(version_file) do |f|
46
46
  f.read.gsub(version, "#{version}-#{revision}")
47
47
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: quandl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.27
4
+ version: 0.3.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: 2014-02-28 00:00:00.000000000 Z
11
+ date: 2014-04-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: commander
@@ -30,42 +30,42 @@ dependencies:
30
30
  requirements:
31
31
  - - '='
32
32
  - !ruby/object:Gem::Version
33
- version: 0.2.8
33
+ version: 0.4.2
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - '='
39
39
  - !ruby/object:Gem::Version
40
- version: 0.2.8
40
+ version: 0.4.2
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: quandl_client
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - '='
46
46
  - !ruby/object:Gem::Version
47
- version: 2.5.1
47
+ version: 2.7.4
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - '='
53
53
  - !ruby/object:Gem::Version
54
- version: 2.5.1
54
+ version: 2.7.4
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: quandl_data
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - '='
60
60
  - !ruby/object:Gem::Version
61
- version: 1.3.9
61
+ version: 1.4.1
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - '='
67
67
  - !ruby/object:Gem::Version
68
- version: 1.3.9
68
+ version: 1.4.1
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: quandl_operation
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -262,6 +262,20 @@ dependencies:
262
262
  - - ~>
263
263
  - !ruby/object:Gem::Version
264
264
  version: '4.2'
265
+ - !ruby/object:Gem::Dependency
266
+ name: quandl_utility
267
+ requirement: !ruby/object:Gem::Requirement
268
+ requirements:
269
+ - - ! '>='
270
+ - !ruby/object:Gem::Version
271
+ version: '0'
272
+ type: :development
273
+ prerelease: false
274
+ version_requirements: !ruby/object:Gem::Requirement
275
+ requirements:
276
+ - - ! '>='
277
+ - !ruby/object:Gem::Version
278
+ version: '0'
265
279
  description: http://quandl.com/help/toolbelt
266
280
  email:
267
281
  - blake@hilscher.ca
@@ -278,6 +292,7 @@ files:
278
292
  - README.md
279
293
  - Rakefile
280
294
  - UPGRADE.md
295
+ - VERSION
281
296
  - bin/quandl
282
297
  - config/locales/en.yml
283
298
  - dist/resources/pkg/Distribution.erb
@@ -290,14 +305,36 @@ files:
290
305
  - lib/quandl/command/client_ext.rb
291
306
  - lib/quandl/command/client_ext/user.rb
292
307
  - lib/quandl/command/compatibility_check.rb
293
- - lib/quandl/command/qconfig.rb
308
+ - lib/quandl/command/config.rb
309
+ - lib/quandl/command/presenter.rb
310
+ - lib/quandl/command/presenter/record.rb
311
+ - lib/quandl/command/presenters/dataset_presenter.rb
312
+ - lib/quandl/command/presenters/error_presenter.rb
313
+ - lib/quandl/command/presenters/nil_class_presenter.rb
314
+ - lib/quandl/command/presenters/scraper_presenter.rb
315
+ - lib/quandl/command/presenters/superset_presenter.rb
316
+ - lib/quandl/command/task.rb
317
+ - lib/quandl/command/task/callbacks.rb
318
+ - lib/quandl/command/task/clientable.rb
319
+ - lib/quandl/command/task/commandable.rb
320
+ - lib/quandl/command/task/configurable.rb
321
+ - lib/quandl/command/task/inputable.rb
322
+ - lib/quandl/command/task/logging.rb
323
+ - lib/quandl/command/task/presentation.rb
324
+ - lib/quandl/command/task/reportable.rb
325
+ - lib/quandl/command/task/threading.rb
326
+ - lib/quandl/command/task/translations.rb
327
+ - lib/quandl/command/task/updatable.rb
294
328
  - lib/quandl/command/tasks.rb
295
- - lib/quandl/command/tasks/base.rb
296
329
  - lib/quandl/command/tasks/delete.rb
297
330
  - lib/quandl/command/tasks/download.rb
298
331
  - lib/quandl/command/tasks/info.rb
299
332
  - lib/quandl/command/tasks/list.rb
300
333
  - lib/quandl/command/tasks/login.rb
334
+ - lib/quandl/command/tasks/replace.rb
335
+ - lib/quandl/command/tasks/schedule.rb
336
+ - lib/quandl/command/tasks/search.rb
337
+ - lib/quandl/command/tasks/superset.rb
301
338
  - lib/quandl/command/tasks/uninstall.rb
302
339
  - lib/quandl/command/tasks/update.rb
303
340
  - lib/quandl/command/tasks/upload.rb
@@ -310,8 +347,12 @@ files:
310
347
  - scripts/compile_ruby_pkg.sh
311
348
  - scripts/install.sh
312
349
  - scripts/win/quandl_toolbelt.iss
350
+ - spec/fixtures/scraper.rb
313
351
  - spec/lib/quandl/command/delete_spec.rb
314
352
  - spec/lib/quandl/command/download_spec.rb
353
+ - spec/lib/quandl/command/replace_spec.rb
354
+ - spec/lib/quandl/command/schedule_spec.rb
355
+ - spec/lib/quandl/command/superset_spec.rb
315
356
  - spec/lib/quandl/command/upload_spec.rb
316
357
  - spec/lib/quandl/command_spec.rb
317
358
  - spec/spec_helper.rb
@@ -350,8 +391,12 @@ signing_key:
350
391
  specification_version: 4
351
392
  summary: Quandl Toolbelt
352
393
  test_files:
394
+ - spec/fixtures/scraper.rb
353
395
  - spec/lib/quandl/command/delete_spec.rb
354
396
  - spec/lib/quandl/command/download_spec.rb
397
+ - spec/lib/quandl/command/replace_spec.rb
398
+ - spec/lib/quandl/command/schedule_spec.rb
399
+ - spec/lib/quandl/command/superset_spec.rb
355
400
  - spec/lib/quandl/command/upload_spec.rb
356
401
  - spec/lib/quandl/command_spec.rb
357
402
  - spec/spec_helper.rb
@@ -1,86 +0,0 @@
1
- require 'fileutils'
2
- require 'yaml'
3
- require 'ostruct'
4
-
5
- module Quandl
6
- module Command
7
- class QConfig
8
-
9
- class << self
10
-
11
- def configuration
12
- @configuration ||= self.new( config_file: config_file )
13
- end
14
-
15
- def config_file
16
- return @config_file if defined?(@config_file)
17
- @config_file = File.join(root_path, 'config')
18
- convert_legacy_config
19
- ensure_directory_is_present
20
- @config_file
21
- end
22
-
23
- def root_path
24
- @root_path ||= File.join(ENV['HOME'], '.quandl')
25
- end
26
-
27
- protected
28
-
29
- def ensure_directory_is_present
30
- return if File.exists?(config_file)
31
- FileUtils.mkdir(root_path) unless Dir.exists?(root_path)
32
- File.write( config_file, YAML.dump({}) )
33
- end
34
-
35
- def convert_legacy_config
36
- return if File.directory?(root_path) || !File.exists?(root_path)
37
- # otherwise move the old .quandl into .quandl/config
38
- FileUtils.mv(root_path, "#{root_path}.old")
39
- FileUtils.mkdir(root_path)
40
- token = File.read("#{root_path}.old")
41
- File.write(config_file, "token: #{token}")
42
- end
43
-
44
- def define_attributes(*attr_names)
45
- attr_names.each do |attr_name|
46
- define_attribute(attr_name)
47
- end
48
- end
49
-
50
- def define_attribute(name)
51
- define_method(name){ read_attribute(name) }
52
- define_method("#{name}="){|v| write_attribute(name, v) }
53
- end
54
-
55
- end
56
-
57
- attr_accessor :options
58
-
59
- define_attributes :token, :quandl_url, :last_checked_for_update
60
-
61
- def initialize(*args)
62
- self.options = OpenStruct.new(args.extract_options!)
63
- end
64
-
65
- def config
66
- @config ||= OpenStruct.new(YAML.load(File.read(options.config_file)))
67
- end
68
-
69
- private
70
-
71
- def read_attribute(name)
72
- config.send(name)
73
- end
74
-
75
- def write_attribute(name, value)
76
- config.send("#{name}=", value)
77
- commit_config
78
- end
79
-
80
- def commit_config
81
- File.write( options.config_file, YAML.dump(config.marshal_dump) )
82
- end
83
-
84
- end
85
- end
86
- end