quandl 0.2.22
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +16 -0
- data/.travis.yml +20 -0
- data/Gemfile +14 -0
- data/Guardfile +8 -0
- data/LICENSE +7 -0
- data/README.md +316 -0
- data/Rakefile +39 -0
- data/UPGRADE.md +143 -0
- data/bin/quandl +26 -0
- data/dist/resources/pkg/Distribution.erb +15 -0
- data/dist/resources/pkg/PackageInfo.erb +6 -0
- data/dist/resources/pkg/postinstall +45 -0
- data/dist/resources/pkg/quandl +25 -0
- data/dist/resources/ruby/PackageInfo +3 -0
- data/lib/commander/command/quandl_ext.rb +21 -0
- data/lib/quandl/command.rb +45 -0
- data/lib/quandl/command/client_ext.rb +1 -0
- data/lib/quandl/command/client_ext/user.rb +11 -0
- data/lib/quandl/command/compatibility_check.rb +11 -0
- data/lib/quandl/command/qconfig.rb +76 -0
- data/lib/quandl/command/tasks.rb +15 -0
- data/lib/quandl/command/tasks/base.rb +263 -0
- data/lib/quandl/command/tasks/delete.rb +58 -0
- data/lib/quandl/command/tasks/download.rb +111 -0
- data/lib/quandl/command/tasks/info.rb +46 -0
- data/lib/quandl/command/tasks/list.rb +40 -0
- data/lib/quandl/command/tasks/login.rb +46 -0
- data/lib/quandl/command/tasks/update.rb +205 -0
- data/lib/quandl/command/tasks/upload.rb +69 -0
- data/lib/quandl/command/version.rb +5 -0
- data/lib/quandl/utility.rb +2 -0
- data/lib/quandl/utility/config.rb +43 -0
- data/lib/quandl/utility/ruby_version.rb +143 -0
- data/quandl.gemspec +39 -0
- data/scripts/compile_ruby_pkg.sh +34 -0
- data/scripts/install.sh +51 -0
- data/scripts/win/quandl_toolbelt.iss +82 -0
- data/spec/lib/quandl/command/delete_spec.rb +31 -0
- data/spec/lib/quandl/command/download_spec.rb +42 -0
- data/spec/lib/quandl/command/upload_spec.rb +39 -0
- data/spec/lib/quandl/command_spec.rb +46 -0
- data/spec/spec_helper.rb +20 -0
- data/tasks/toolbelt.rake +133 -0
- data/tasks/toolbelt.rb +92 -0
- data/tasks/toolbelt/build.rb +2 -0
- data/tasks/toolbelt/build/darwin.rb +71 -0
- data/tasks/toolbelt/build/ruby.rb +105 -0
- data/tasks/toolbelt/build/tarball.rb +73 -0
- data/tasks/toolbelt/build/windows.rb +25 -0
- data/tasks/toolbelt/push.rb +15 -0
- data/tasks/toolbelt/storage.rb +28 -0
- data/tasks/toolbelt/tar.rb +21 -0
- metadata +354 -0
data/UPGRADE.md
ADDED
@@ -0,0 +1,143 @@
|
|
1
|
+
## 0.2.22
|
2
|
+
|
3
|
+
* update permits adding new folders
|
4
|
+
|
5
|
+
|
6
|
+
|
7
|
+
## 0.2.21
|
8
|
+
|
9
|
+
* QUGC-75 darwin build process will compile ruby if its missing
|
10
|
+
* QUGC-71 Add failing spec for "quandl list not working v 20"
|
11
|
+
* QUGC-65 Check for updates once every 24 hour period
|
12
|
+
* QUGC-65 Add QConfig that stores configuration information in ~/.quandl/config
|
13
|
+
* QUGC-60 add compatibility check
|
14
|
+
|
15
|
+
|
16
|
+
## 0.2.20
|
17
|
+
|
18
|
+
* QUGC-57 move data validation from Quandl::Format into Quandl::Client.
|
19
|
+
* QUGC-54 write failing spec for input with nil row value
|
20
|
+
* QUGC-53 numeric codes require the full code
|
21
|
+
|
22
|
+
|
23
|
+
## 0.2.19
|
24
|
+
|
25
|
+
* many bugfixes
|
26
|
+
|
27
|
+
|
28
|
+
## 0.2.18
|
29
|
+
|
30
|
+
* QUGC-49 Revise installer to use bash shell for [[ bashism
|
31
|
+
* QUGC-48 rename to toolbelt
|
32
|
+
* uniform table stdout for consistent parsing
|
33
|
+
* dont export bin/quandl as an executable. If you want to use quandl cli install the package
|
34
|
+
|
35
|
+
|
36
|
+
## 0.2.17
|
37
|
+
|
38
|
+
* QUGC-42 Write failing specs for should not have to include data
|
39
|
+
* QUGC-45 quandl info package versions are sent to debug instead of info. remove user id
|
40
|
+
* QUGC-44 quandl delete should delete the datasets or raise an error
|
41
|
+
* QUGC-44 Write failing spec that checks whether delete has succeeeded.
|
42
|
+
* rake package:release takes an argument for building pre releases
|
43
|
+
* quandl update has an option called --revision
|
44
|
+
|
45
|
+
|
46
|
+
## 0.2.16
|
47
|
+
|
48
|
+
* Add quandl update
|
49
|
+
|
50
|
+
|
51
|
+
## 0.2.15
|
52
|
+
|
53
|
+
* QUGC-37 quandl info: report my username not just my token
|
54
|
+
* QUGC-37 reject unauthenticated requests
|
55
|
+
* QUGC-39 Download. added validation for trim_start, trim_end, order, collapse, transform.
|
56
|
+
|
57
|
+
|
58
|
+
## 0.2.14
|
59
|
+
|
60
|
+
* QUGC-38 Add spec for download with column option failing
|
61
|
+
|
62
|
+
|
63
|
+
## 0.2.13
|
64
|
+
|
65
|
+
* QUGC-36 Should except null entry in 2 column dataset
|
66
|
+
* QUGC-35 Pure Meta Data Send or Update
|
67
|
+
|
68
|
+
|
69
|
+
## 0.2.12
|
70
|
+
|
71
|
+
* add quandl list
|
72
|
+
|
73
|
+
|
74
|
+
## 0.2.10
|
75
|
+
|
76
|
+
* add specific version requirements
|
77
|
+
* add info command for displaying quandl package information
|
78
|
+
|
79
|
+
|
80
|
+
## 0.2.9
|
81
|
+
|
82
|
+
* replace full_code regexp with Quandl::Pattern
|
83
|
+
* remove --url global option
|
84
|
+
* add validations
|
85
|
+
* update token env var
|
86
|
+
* add shortcuts to global options
|
87
|
+
|
88
|
+
|
89
|
+
## 0.2.8
|
90
|
+
|
91
|
+
* use updated Quandl::Format::Dataset.each_line to upload dataset's line by line as they become availabe from whichever interface. Allows ruby GC to operate and avoid having 20k datasets in memory ...
|
92
|
+
|
93
|
+
|
94
|
+
## 0.2.7
|
95
|
+
|
96
|
+
* refactor delete, download, upload
|
97
|
+
* add convience methods for outputting info
|
98
|
+
* remove command logger
|
99
|
+
|
100
|
+
|
101
|
+
## 0.2.6
|
102
|
+
|
103
|
+
* add quandl delete quandl delete (SOURCE_CODE/)CODE
|
104
|
+
* dont try to load from STDIN if file_path was provided.
|
105
|
+
|
106
|
+
|
107
|
+
## 0.2.4
|
108
|
+
|
109
|
+
* refactor authorize to: quandl login login accepts username or email and password login outputs error or auth_token to ~/.quandl
|
110
|
+
|
111
|
+
|
112
|
+
## 0.2.0
|
113
|
+
|
114
|
+
* update gemspec to only require quandl_format
|
115
|
+
* use Quandl::Commmand::Logger to log messages
|
116
|
+
* update local gems
|
117
|
+
* add Quandl::Command::Logger that writes to STDOUT and STDERR
|
118
|
+
* display dataset.human_errors
|
119
|
+
* refactor Action#upload into Command::Upload
|
120
|
+
* refactor download to inherit from Action::Base
|
121
|
+
* refactor action into Quandl::Command::Download
|
122
|
+
* add options to download. extend Commander::Command::Options to support #each, #to_a, #[], #to_h
|
123
|
+
|
124
|
+
|
125
|
+
## 0.1.2
|
126
|
+
|
127
|
+
* use quandl_format instead of QDFormat
|
128
|
+
|
129
|
+
## 0.1.1
|
130
|
+
|
131
|
+
* bump quandl_operation to support revised QDFormat
|
132
|
+
* refactor examples
|
133
|
+
* improve log messages
|
134
|
+
|
135
|
+
|
136
|
+
## 0.1.0
|
137
|
+
|
138
|
+
* refactor commands to be more human friendly
|
139
|
+
|
140
|
+
|
141
|
+
## 0.0.1
|
142
|
+
|
143
|
+
* init
|
data/bin/quandl
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
require "pathname"
|
5
|
+
bin_file = Pathname.new(__FILE__).realpath
|
6
|
+
|
7
|
+
# vendored gems path
|
8
|
+
gem_dir = File.expand_path("../../vendor/gems", bin_file)
|
9
|
+
# vendored gems?
|
10
|
+
if Dir.exists?(gem_dir)
|
11
|
+
Dir["#{gem_dir}/**/lib"].each do |libdir|
|
12
|
+
$:.unshift libdir
|
13
|
+
end
|
14
|
+
else
|
15
|
+
require 'rubygems'
|
16
|
+
end
|
17
|
+
|
18
|
+
# add self to libpath
|
19
|
+
$:.unshift File.expand_path("../../lib", bin_file)
|
20
|
+
|
21
|
+
require 'quandl/command/compatibility_check'
|
22
|
+
require 'quandl/command'
|
23
|
+
require 'commander/import'
|
24
|
+
require 'commander/command/quandl_ext'
|
25
|
+
|
26
|
+
include Quandl::Command
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<installer-script minSpecVersion="1.000000" authoringTool="org.ruby-lang.rake" authoringToolVersion="10.1.1">
|
3
|
+
<title>Quandl Toolbelt <%= version %></title>
|
4
|
+
<options customize="allow" allow-external-scripts="no"/>
|
5
|
+
<domains enable_localSystem="true"/>
|
6
|
+
<choices-outline>
|
7
|
+
<line choice="quandl-toolbelt"/>
|
8
|
+
</choices-outline>
|
9
|
+
<choice id="quandl-toolbelt" title="Quandl Toolbelt <%= version %>">
|
10
|
+
<pkg-ref id="com.quandl.toolbelt"/>
|
11
|
+
<pkg-ref id="org.ruby-lang.installer"/>
|
12
|
+
</choice>
|
13
|
+
<pkg-ref id="com.quandl.toolbelt" installKBytes="<%= kbytes %>" version="<%= version %>" auth="Root">#quandl-toolbelt.pkg</pkg-ref>
|
14
|
+
<pkg-ref id="org.ruby-lang.installer" installKBytes="9132" auth="Root">#ruby.pkg</pkg-ref>
|
15
|
+
</installer-script>
|
@@ -0,0 +1,6 @@
|
|
1
|
+
<pkg-info format-version="2" identifier="com.quandl.toolbelt" version="<%= version %>" install-location="/usr/local/quandl" auth="root">
|
2
|
+
<payload installKBytes="<%= kbytes %>" numberOfFiles="<%= num_files %>"/>
|
3
|
+
<scripts>
|
4
|
+
<postinstall file="./postinstall"/>
|
5
|
+
</scripts>
|
6
|
+
</pkg-info>
|
@@ -0,0 +1,45 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
|
3
|
+
usershell=$(dscl localhost -read /Local/Default/Users/$USER shell | sed -e 's/[^ ]* //')
|
4
|
+
|
5
|
+
startup_files() {
|
6
|
+
case $(basename $usershell) in
|
7
|
+
zsh)
|
8
|
+
echo ".zlogin .zshrc .zprofile .zshenv"
|
9
|
+
;;
|
10
|
+
bash)
|
11
|
+
echo ".bashrc .bash_profile .bash_login .profile"
|
12
|
+
;;
|
13
|
+
*)
|
14
|
+
echo ".bash_profile .zshrc .profile"
|
15
|
+
;;
|
16
|
+
esac
|
17
|
+
}
|
18
|
+
|
19
|
+
install_path() {
|
20
|
+
for file in $(startup_files); do
|
21
|
+
[ -f $HOME/$file ] || continue
|
22
|
+
(grep "Added by the Quandl" $HOME/$file >/dev/null) && break
|
23
|
+
|
24
|
+
cat <<MESSAGE >>$HOME/$file
|
25
|
+
|
26
|
+
### Added by the Quandl Toolbelt
|
27
|
+
export PATH="/usr/local/quandl/bin:\$PATH"
|
28
|
+
MESSAGE
|
29
|
+
|
30
|
+
# done after we add to one file
|
31
|
+
break
|
32
|
+
done
|
33
|
+
}
|
34
|
+
|
35
|
+
# if the toolbelt is not returned by `which`, let's add to the PATH
|
36
|
+
case $(which quandl) in
|
37
|
+
/usr/bin/quandl|/usr/local/quandl/bin/quandl)
|
38
|
+
;;
|
39
|
+
*)
|
40
|
+
install_path
|
41
|
+
;;
|
42
|
+
esac
|
43
|
+
|
44
|
+
# symlink binary to /usr/bin/quandl
|
45
|
+
ln -sf /usr/local/quandl/bin/quandl /usr/bin/quandl
|
@@ -0,0 +1,25 @@
|
|
1
|
+
#!/usr/local/quandl/ruby/bin/ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
require "pathname"
|
5
|
+
bin_file = Pathname.new(__FILE__).realpath
|
6
|
+
|
7
|
+
# vendored gems path
|
8
|
+
gem_dir = File.expand_path("../../vendor/gems", bin_file)
|
9
|
+
# vendored gems?
|
10
|
+
if Dir.exists?(gem_dir)
|
11
|
+
Dir["#{gem_dir}/**/lib"].each do |libdir|
|
12
|
+
$:.unshift libdir
|
13
|
+
end
|
14
|
+
else
|
15
|
+
require 'rubygems'
|
16
|
+
end
|
17
|
+
|
18
|
+
# add self to libpath
|
19
|
+
$:.unshift File.expand_path("../../lib", bin_file)
|
20
|
+
|
21
|
+
require 'quandl/command'
|
22
|
+
require 'commander/import'
|
23
|
+
require 'commander/command/quandl_ext'
|
24
|
+
|
25
|
+
include Quandl::Command
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Commander
|
2
|
+
class Command
|
3
|
+
class Options
|
4
|
+
|
5
|
+
delegate :each, :to_a, :[], to: :to_h
|
6
|
+
|
7
|
+
def class
|
8
|
+
Commander::Command::Options
|
9
|
+
end
|
10
|
+
|
11
|
+
def try(key)
|
12
|
+
self.to_h[key.to_sym]
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_h
|
16
|
+
__hash__
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'pry' if ENV['BUNDLE_LOCAL_GEMS']
|
2
|
+
|
3
|
+
require "quandl/command/version"
|
4
|
+
require 'quandl/format'
|
5
|
+
require 'quandl/command/qconfig'
|
6
|
+
require 'quandl/command/tasks'
|
7
|
+
require 'quandl/command/client_ext'
|
8
|
+
|
9
|
+
# update tracking information
|
10
|
+
Quandl::Client.request_source = 'quandl_command'
|
11
|
+
Quandl::Client.request_version = Quandl::Command::VERSION
|
12
|
+
|
13
|
+
Quandl::Logger.use(Quandl::Logger::Outputs)
|
14
|
+
|
15
|
+
module Quandl::Command
|
16
|
+
|
17
|
+
extend ActiveSupport::Concern
|
18
|
+
|
19
|
+
included do
|
20
|
+
|
21
|
+
program :name, 'Quandl Toolbelt'
|
22
|
+
program :description, 'http://quandl.com/ command line interface.'
|
23
|
+
program :version, Quandl::Command::VERSION
|
24
|
+
|
25
|
+
default_command :help
|
26
|
+
|
27
|
+
global_option '-T', '--token STRING', 'secret token used to authenticate requests.'
|
28
|
+
global_option '-V', '--verbose', 'display detailed log messages'
|
29
|
+
global_option '-U', '--url STRING', 'API url.'
|
30
|
+
global_option '--force-yes', 'force y/n with yes'
|
31
|
+
|
32
|
+
[
|
33
|
+
Tasks::Delete,
|
34
|
+
Tasks::Download,
|
35
|
+
Tasks::Info,
|
36
|
+
Tasks::List,
|
37
|
+
Tasks::Login,
|
38
|
+
Tasks::Update,
|
39
|
+
Tasks::Upload,
|
40
|
+
# register each task
|
41
|
+
].each{|task| task.configure(self) }
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'quandl/command/client_ext/user'
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'quandl/utility/ruby_version'
|
2
|
+
|
3
|
+
err = "UNSUPPORTED ruby version (#{Quandl::Utility::RubyVersion.full_version}) Quandl Toolbelt requires ruby >="
|
4
|
+
|
5
|
+
if Quandl::Utility::RubyVersion <= '1.9.2'
|
6
|
+
puts "#{err} 1.9.3"
|
7
|
+
raise LoadError, "#{err} 1.9.3"
|
8
|
+
elsif Quandl::Utility::RubyVersion.is?(2.0) && Quandl::Utility::RubyVersion.patchlevel < 353
|
9
|
+
puts "#{err} 2.0.0-p353"
|
10
|
+
raise LoadError, "#{err} 2.0.0-p353"
|
11
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
module Quandl
|
5
|
+
module Command
|
6
|
+
class QConfig
|
7
|
+
|
8
|
+
class << self
|
9
|
+
|
10
|
+
def configuration
|
11
|
+
@configuration ||= self.new( config_file: config_file )
|
12
|
+
end
|
13
|
+
|
14
|
+
def convert_legacy_config
|
15
|
+
return if File.directory?(root_path)
|
16
|
+
# otherwise move the old .quandl into .quandl/config
|
17
|
+
FileUtils.mv(root_path, "#{root_path}.old")
|
18
|
+
FileUtils.mkdir(root_path)
|
19
|
+
token = File.read("#{root_path}.old")
|
20
|
+
File.write(config_file, "token: #{token}")
|
21
|
+
end
|
22
|
+
|
23
|
+
def config_file
|
24
|
+
convert_legacy_config
|
25
|
+
@config_file ||= File.join(root_path, 'config')
|
26
|
+
end
|
27
|
+
|
28
|
+
def root_path
|
29
|
+
@root_path ||= File.join(ENV['HOME'], '.quandl')
|
30
|
+
end
|
31
|
+
|
32
|
+
protected
|
33
|
+
|
34
|
+
def define_attributes(*attr_names)
|
35
|
+
attr_names.each do |attr_name|
|
36
|
+
define_attribute(attr_name)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def define_attribute(name)
|
41
|
+
define_method(name){ read_attribute(name) }
|
42
|
+
define_method("#{name}="){|v| write_attribute(name, v) }
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
attr_accessor :options
|
48
|
+
|
49
|
+
define_attributes :token, :quandl_url, :last_checked_for_update
|
50
|
+
|
51
|
+
def initialize(*args)
|
52
|
+
self.options = OpenStruct.new(args.extract_options!)
|
53
|
+
end
|
54
|
+
|
55
|
+
def config
|
56
|
+
@config ||= OpenStruct.new(YAML.load(File.read(options.config_file)))
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
def read_attribute(name)
|
62
|
+
config.send(name)
|
63
|
+
end
|
64
|
+
|
65
|
+
def write_attribute(name, value)
|
66
|
+
config.send("#{name}=", value)
|
67
|
+
commit_config
|
68
|
+
end
|
69
|
+
|
70
|
+
def commit_config
|
71
|
+
File.write( options.config_file, YAML.dump(config.marshal_dump) )
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|