chimps-cli 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +8 -0
- data/Gemfile.lock +32 -0
- data/LICENSE +20 -0
- data/README.rdoc +322 -0
- data/Rakefile +24 -0
- data/VERSION +1 -0
- data/bin/chimps +4 -0
- data/lib/chimps-cli.rb +46 -0
- data/lib/chimps-cli/commands.rb +179 -0
- data/lib/chimps-cli/commands/base.rb +65 -0
- data/lib/chimps-cli/commands/create.rb +38 -0
- data/lib/chimps-cli/commands/delete.rb +29 -0
- data/lib/chimps-cli/commands/destroy.rb +36 -0
- data/lib/chimps-cli/commands/download.rb +40 -0
- data/lib/chimps-cli/commands/get.rb +30 -0
- data/lib/chimps-cli/commands/help.rb +100 -0
- data/lib/chimps-cli/commands/list.rb +48 -0
- data/lib/chimps-cli/commands/me.rb +30 -0
- data/lib/chimps-cli/commands/post.rb +33 -0
- data/lib/chimps-cli/commands/put.rb +33 -0
- data/lib/chimps-cli/commands/query.rb +58 -0
- data/lib/chimps-cli/commands/search.rb +54 -0
- data/lib/chimps-cli/commands/show.rb +40 -0
- data/lib/chimps-cli/commands/test.rb +37 -0
- data/lib/chimps-cli/commands/update.rb +38 -0
- data/lib/chimps-cli/commands/upload.rb +86 -0
- data/lib/chimps-cli/utils.rb +13 -0
- data/lib/chimps-cli/utils/acts_on_resource.rb +93 -0
- data/lib/chimps-cli/utils/explicit_path.rb +30 -0
- data/lib/chimps-cli/utils/http_format.rb +51 -0
- data/lib/chimps-cli/utils/uses_param_value_data.rb +90 -0
- data/spec/chimps-cli/commands/delete_spec.rb +9 -0
- data/spec/chimps-cli/commands/get_spec.rb +8 -0
- data/spec/chimps-cli/commands/help_spec.rb +18 -0
- data/spec/chimps-cli/commands/list_spec.rb +7 -0
- data/spec/chimps-cli/commands/post_spec.rb +10 -0
- data/spec/chimps-cli/commands/put_spec.rb +10 -0
- data/spec/chimps-cli/commands/show_spec.rb +7 -0
- data/spec/spec_helper.rb +52 -0
- data/spec/support/acts_on_resource.rb +22 -0
- data/spec/support/explicit_path.rb +42 -0
- data/spec/support/http_format.rb +23 -0
- data/spec/support/uses_param_value_data.rb +88 -0
- metadata +166 -0
@@ -0,0 +1,48 @@
|
|
1
|
+
module Chimps
|
2
|
+
module Commands
|
3
|
+
|
4
|
+
# A command to issue a GET request against an index of resources
|
5
|
+
# at Infochimps.
|
6
|
+
class List < Chimps::Command
|
7
|
+
|
8
|
+
include Chimps::Utils::HttpFormat
|
9
|
+
include Chimps::Utils::ActsOnResource
|
10
|
+
|
11
|
+
def self.default_response_fmt
|
12
|
+
'tsv'
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.allowed_response_fmts
|
16
|
+
super().concat(['tsv'])
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.allowed_resources
|
20
|
+
%w[collection dataset source license]
|
21
|
+
end
|
22
|
+
|
23
|
+
USAGE = "usage: chimps [OPTIONS] list [RESOURCE]"
|
24
|
+
HELP = <<EOF
|
25
|
+
|
26
|
+
List #{default_resources_type} on Infochimps.
|
27
|
+
|
28
|
+
#{resources_listing}
|
29
|
+
|
30
|
+
Examples:
|
31
|
+
|
32
|
+
$ chimps list # list all datasets
|
33
|
+
$ chimps list --my # list your datasets
|
34
|
+
$ chimps list licenses # list licenses
|
35
|
+
$ chimps list --my sources # list your sources
|
36
|
+
EOF
|
37
|
+
|
38
|
+
# Issue the GET request.
|
39
|
+
def execute!
|
40
|
+
query_params = {}
|
41
|
+
query_params[:skip_header] = true if config[:skip_column_names]
|
42
|
+
Request.new(resources_path, :query_params => query_params, :sign => config[:my]).get(headers).print(config)
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Chimps
|
2
|
+
module Commands
|
3
|
+
|
4
|
+
class Me < Chimps::Command
|
5
|
+
|
6
|
+
include Chimps::Utils::HttpFormat
|
7
|
+
|
8
|
+
def self.default_response_fmt
|
9
|
+
'yaml'
|
10
|
+
end
|
11
|
+
|
12
|
+
USAGE = "usage: chimps me [OPTIONS]"
|
13
|
+
HELP = <<EOF
|
14
|
+
|
15
|
+
Show a summary of your account.
|
16
|
+
|
17
|
+
Examples:
|
18
|
+
|
19
|
+
$ chimps me
|
20
|
+
$ chimps me --response_format=json
|
21
|
+
EOF
|
22
|
+
|
23
|
+
def execute!
|
24
|
+
Chimps::Request.new("/me" + ".#{response_fmt}", :sign => true).get.print
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Chimps
|
2
|
+
module Commands
|
3
|
+
|
4
|
+
class Post < Chimps::Command
|
5
|
+
|
6
|
+
include Chimps::Utils::HttpFormat
|
7
|
+
include Chimps::Utils::ExplicitPath
|
8
|
+
include Chimps::Utils::UsesParamValueData
|
9
|
+
|
10
|
+
USAGE = "usage: chimps post [OPTIONS] PATH [PARAM=VALUE] ..."
|
11
|
+
HELP = <<EOF
|
12
|
+
|
13
|
+
Send a GET request to the given PATH at Infochimps.
|
14
|
+
|
15
|
+
Examples:
|
16
|
+
|
17
|
+
# create a dataset
|
18
|
+
$ chimps post /datasets title="List of Chimps" description="Awesome..."
|
19
|
+
|
20
|
+
# create a source
|
21
|
+
$ chimps post /sources --data=/path/to/some/metadata.json
|
22
|
+
EOF
|
23
|
+
|
24
|
+
def execute!
|
25
|
+
response = Chimps::Request.new(path, :query_params => query_params, :data => (data || true), :sign => config[:sign]).post(headers)
|
26
|
+
response.print_headers if config[:headers]
|
27
|
+
response.print
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Chimps
|
2
|
+
module Commands
|
3
|
+
|
4
|
+
class Put < Chimps::Command
|
5
|
+
|
6
|
+
include Chimps::Utils::HttpFormat
|
7
|
+
include Chimps::Utils::ExplicitPath
|
8
|
+
include Chimps::Utils::UsesParamValueData
|
9
|
+
|
10
|
+
USAGE = "usage: chimps put [OPTIONS] PATH [PARAM=VALUE] ..."
|
11
|
+
HELP = <<EOF
|
12
|
+
|
13
|
+
Send a GET request to the given PATH at Infochimps.
|
14
|
+
|
15
|
+
Examples:
|
16
|
+
|
17
|
+
# update a dataset
|
18
|
+
$ chimps put /datasets/my-dataset title="A new title"
|
19
|
+
|
20
|
+
# update a source
|
21
|
+
$ chimps put /sources/my-source --data=/path/to/new/metadata.yaml
|
22
|
+
EOF
|
23
|
+
|
24
|
+
def execute!
|
25
|
+
response = Chimps::Request.new(path, :query_params => query_params, :data => (data || true), :sign => config[:sign]).put(headers)
|
26
|
+
response.print_headers if config[:headers]
|
27
|
+
response.print
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Chimps
|
2
|
+
module Commands
|
3
|
+
|
4
|
+
# A command to issue a GET request against the Infochimps paid
|
5
|
+
# query API.
|
6
|
+
class Query < Chimps::Command
|
7
|
+
|
8
|
+
include Chimps::Utils::UsesParamValueData
|
9
|
+
|
10
|
+
USAGE = "usage: chimps query [OPTIONS] ENDPOINT [PROP=VALUE] ..."
|
11
|
+
HELP = <<EOF
|
12
|
+
|
13
|
+
Send a query to the given ENDPOINT on the Infochimps Query API with the
|
14
|
+
given parameters.
|
15
|
+
|
16
|
+
#{how_to_input_data}
|
17
|
+
You can learn more about the Infochimps query API, discover datasets
|
18
|
+
to query, and look up the available parameters at
|
19
|
+
|
20
|
+
http://api.infochimps.com
|
21
|
+
|
22
|
+
Examples:
|
23
|
+
|
24
|
+
$ chimps query soc/net/tw/trstrank screen_name=infochimps
|
25
|
+
$ chimps query soc/net/tw/trstrank?screen_name=infochimps
|
26
|
+
$ chimps query web/an/de/demographics ip=146.6.180.1
|
27
|
+
$ chimps query soc/net/tw/trstrank --data=trstrank_queries.yml
|
28
|
+
EOF
|
29
|
+
|
30
|
+
def endpoint
|
31
|
+
raise CLIError.new(self.class::USAGE) unless config.argv.size > 1 && (! config.argv[1].empty?)
|
32
|
+
config.argv[1]
|
33
|
+
end
|
34
|
+
|
35
|
+
def requests
|
36
|
+
# ensure_data_is_present! unless endpoint.include?("?")
|
37
|
+
if data.is_a?(Hash)
|
38
|
+
[QueryRequest.new(endpoint, :query_params => data, :sign => true)]
|
39
|
+
else
|
40
|
+
data.map { |params| QueryRequest.new(endpoint, :query_params => params, :sign => true) }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def execute!
|
45
|
+
requests.each do |request|
|
46
|
+
response = request.get
|
47
|
+
if response.error?
|
48
|
+
response.print :to => $stderr
|
49
|
+
else
|
50
|
+
puts(config[:pretty] ? JSON.pretty_generate(JSON.parse(response.body)) : response.body)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Chimps
|
2
|
+
module Commands
|
3
|
+
|
4
|
+
class Search < Chimps::Command
|
5
|
+
|
6
|
+
include Chimps::Utils::HttpFormat
|
7
|
+
include Chimps::Utils::ActsOnResource
|
8
|
+
|
9
|
+
def self.allowed_resources
|
10
|
+
%w[dataset]
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.allowed_response_fmts
|
14
|
+
super().concat(['tsv'])
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.default_response_fmt
|
18
|
+
'tsv'
|
19
|
+
end
|
20
|
+
|
21
|
+
USAGE = "usage: chimps search [OPTIONS] QUERY"
|
22
|
+
HELP = <<EOF
|
23
|
+
|
24
|
+
Search for #{default_resources_type} on Infochimps for the given
|
25
|
+
QUERY.
|
26
|
+
|
27
|
+
Examples:
|
28
|
+
|
29
|
+
$ chimps search music # search all datasets for 'music'
|
30
|
+
$ chimps search --my 'finance AND nyse' # search your datasets for 'finance' and 'nyse'
|
31
|
+
EOF
|
32
|
+
|
33
|
+
def query
|
34
|
+
raise CLIError.new(self.class::USAGE) if config.rest.size < 2
|
35
|
+
config.rest[1..-1].join(' ')
|
36
|
+
end
|
37
|
+
|
38
|
+
def query_params
|
39
|
+
{:query => query}.tap do |qp|
|
40
|
+
qp[:skip_header] = true if config[:skip_column_names]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def path
|
45
|
+
config[:my] ? "/my/search.#{response_fmt}" : "/search.#{response_fmt}"
|
46
|
+
end
|
47
|
+
|
48
|
+
def execute!
|
49
|
+
Request.new(path, :query_params => query_params, :sign => config[:my]).get(headers).print(config)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Chimps
|
2
|
+
module Commands
|
3
|
+
|
4
|
+
class Show < Chimps::Command
|
5
|
+
|
6
|
+
include Chimps::Utils::ActsOnResource
|
7
|
+
include Chimps::Utils::HttpFormat
|
8
|
+
|
9
|
+
def self.default_response_fmt
|
10
|
+
'yaml'
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.allowed_resources
|
14
|
+
%w[dataset collection source license user]
|
15
|
+
end
|
16
|
+
|
17
|
+
USAGE = "usage: chimps show [OPTIONS] [RESOURCE] SLUG_OR_ID"
|
18
|
+
HELP = <<EOF
|
19
|
+
|
20
|
+
Return a description of the #{default_resource_type} with the given
|
21
|
+
ID or or slug.
|
22
|
+
|
23
|
+
#{resources_listing}
|
24
|
+
|
25
|
+
Examples:
|
26
|
+
|
27
|
+
$ chimps show musicbrainz # show musicbrainz dataset
|
28
|
+
$ chimps show 11598 # show musicbrainz dataset
|
29
|
+
$ chimps show source musicbrainzorg # show musicbrainz.org source page
|
30
|
+
$ chimps show user Infochimps # show Infochimps' user page
|
31
|
+
EOF
|
32
|
+
|
33
|
+
def execute!
|
34
|
+
puts Chimps::Request.new(resource_path + ".#{response_fmt}").get.body
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Chimps
|
2
|
+
module Commands
|
3
|
+
|
4
|
+
class Test < Chimps::Command
|
5
|
+
|
6
|
+
USAGE = "usage: chimps [OPTIONS] test"
|
7
|
+
HELP = <<EOF
|
8
|
+
|
9
|
+
Print diagnostic information on the API credentials being used by chimps
|
10
|
+
and send a test request to Infochimps to make sure the API credentials
|
11
|
+
work.
|
12
|
+
EOF
|
13
|
+
|
14
|
+
def execute!
|
15
|
+
dataset_response = Chimps::Request.new("/me", :sign => true).get
|
16
|
+
query_response = Chimps::QueryRequest.new("soc/net/tw/trstrank", :query => {:screen_name => :infochimps}).get
|
17
|
+
|
18
|
+
if dataset_response.error?
|
19
|
+
puts "Could not authenticate with Infochimps Dataset API."
|
20
|
+
else
|
21
|
+
|
22
|
+
dataset_response.parse!
|
23
|
+
username = dataset_response['user']['username']
|
24
|
+
puts "Authenticated as user '#{username}' for Infochimps Dataset API at http://www.infochimps.com"
|
25
|
+
end
|
26
|
+
|
27
|
+
if query_response.error?
|
28
|
+
puts "Could not authenticate with Infochimps Query API."
|
29
|
+
else
|
30
|
+
puts "Authenticated for Infochimps Query API at http://api.infochimps.com"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Chimps
|
2
|
+
module Commands
|
3
|
+
|
4
|
+
# A command to issue a PUT request to update a resource at
|
5
|
+
# Infochimps.
|
6
|
+
class Update < Chimps::Command
|
7
|
+
|
8
|
+
include Chimps::Utils::ActsOnResource
|
9
|
+
include Chimps::Utils::UsesParamValueData
|
10
|
+
|
11
|
+
def self.allowed_models
|
12
|
+
%w[dataset source license]
|
13
|
+
end
|
14
|
+
|
15
|
+
USAGE = "usage: chimps update [OPTIONS] [RESOURCE] ID_OR_SLUG [PROP=VALUE] ..."
|
16
|
+
HELP = <<EOF
|
17
|
+
|
18
|
+
Updates a #{default_resource_type} identified by the given ID or slug using the properties
|
19
|
+
and values supplied.
|
20
|
+
|
21
|
+
#{how_to_input_data}
|
22
|
+
#{resources_listing}
|
23
|
+
|
24
|
+
Examples:
|
25
|
+
|
26
|
+
$ chimps update my-awesome-dataset title='Yet More Awesome Dataset' description="It is even cooler"
|
27
|
+
$ chimps update source my-source -d my_source.yml
|
28
|
+
EOF
|
29
|
+
|
30
|
+
def execute!
|
31
|
+
ensure_data_is_present!
|
32
|
+
Request.new(resource_path, :body => {resource_type => data } , :sign => true).put.print
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module Chimps
|
2
|
+
module Commands
|
3
|
+
|
4
|
+
class Upload < Chimps::Command
|
5
|
+
|
6
|
+
USAGE = "usage: chimps upload [OPTIONS] ID_OR_SLUG [PATH|LINK] ..."
|
7
|
+
HELP = <<EOF
|
8
|
+
|
9
|
+
Create, modify, inspect, or submit an upload for the dataset with the
|
10
|
+
given ID or slug on Infochimps.
|
11
|
+
|
12
|
+
Check the status of the current upload for 'my-dataset'
|
13
|
+
|
14
|
+
$ chimps upload my-dataset
|
15
|
+
|
16
|
+
If this returns a "404" then it just means that the upload does not
|
17
|
+
exist yet. You will also see whether the upload has started or not.
|
18
|
+
|
19
|
+
Assuming the upload hasn't started, you can add files from your local
|
20
|
+
machine or links that you want Infochimps to scrape:
|
21
|
+
|
22
|
+
$ chimps upload my-dataset /path/to/some/data.tsv
|
23
|
+
$ chimps upload my-dataset http://www.cooldata.com/some/great/data.html
|
24
|
+
$ chimps upload my-dataset s3://mybucket/some/open/data.xls
|
25
|
+
|
26
|
+
You can also pass more than one local file or link in each call to
|
27
|
+
`chimps upload' if you wish.
|
28
|
+
|
29
|
+
When you're ready to have Infochimps start processing the upload run
|
30
|
+
|
31
|
+
$ chimps upload --start my-dataset
|
32
|
+
|
33
|
+
You can watch your upload's status by running
|
34
|
+
|
35
|
+
$ chimps upload my-dataset
|
36
|
+
|
37
|
+
at any time.
|
38
|
+
EOF
|
39
|
+
|
40
|
+
def upload
|
41
|
+
return @upload if @upload
|
42
|
+
raise CLIError.new(self.class::USAGE) if config.argv.size < 2 or config.argv[1].blank?
|
43
|
+
@upload = Chimps::Upload.new(config.argv[1])
|
44
|
+
end
|
45
|
+
|
46
|
+
def objs_to_upload
|
47
|
+
config.argv[2..-1] if config.argv.size > 2
|
48
|
+
end
|
49
|
+
|
50
|
+
def execute!
|
51
|
+
case
|
52
|
+
when config[:create]
|
53
|
+
upload.create # don't print b/c output is messy
|
54
|
+
when config[:start]
|
55
|
+
upload.start.print
|
56
|
+
when config[:restart]
|
57
|
+
upload.restart.print
|
58
|
+
when config[:destroy]
|
59
|
+
upload.destroy.print
|
60
|
+
when objs_to_upload
|
61
|
+
links = []
|
62
|
+
upload.create if upload.show.error?
|
63
|
+
objs_to_upload.each do |obj|
|
64
|
+
if File.exist?(obj)
|
65
|
+
tok = upload.upload_token
|
66
|
+
upload.upload_file(obj, tok)
|
67
|
+
else
|
68
|
+
validate_link(obj)
|
69
|
+
links << obj
|
70
|
+
end
|
71
|
+
upload.create_links(*links) unless links.empty?
|
72
|
+
end
|
73
|
+
else
|
74
|
+
upload.show.print
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def validate_link link
|
79
|
+
scheme = link.split("://").first
|
80
|
+
raise UploadError.new("Infochimps only accepts links with a URI scheme (prefix) of http, https, ftp, or s3 -- you gave #{scheme}") unless ['http', 'https', 's3','ftp'].include?(scheme)
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|