chimps 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. data/Gemfile +3 -9
  2. data/Gemfile.lock +14 -10
  3. data/README.rdoc +146 -240
  4. data/Rakefile +4 -33
  5. data/VERSION +1 -1
  6. data/lib/chimps/config.rb +35 -21
  7. data/lib/chimps/{utils/error.rb → error.rb} +1 -12
  8. data/lib/chimps/query_request.rb +67 -0
  9. data/lib/chimps/request.rb +82 -108
  10. data/lib/chimps/response.rb +62 -22
  11. data/lib/chimps/utils/typewriter.rb +90 -0
  12. data/lib/chimps/utils/uses_curl.rb +22 -12
  13. data/lib/chimps/utils.rb +50 -6
  14. data/lib/chimps/workflows/download.rb +72 -0
  15. data/lib/chimps/workflows/upload.rb +113 -0
  16. data/lib/chimps.rb +12 -12
  17. data/spec/chimps/query_request_spec.rb +44 -0
  18. data/spec/chimps/request_spec.rb +92 -0
  19. data/spec/chimps/response_spec.rb +0 -1
  20. data/spec/chimps/workflows/download_spec.rb +48 -0
  21. data/spec/spec_helper.rb +2 -19
  22. metadata +46 -91
  23. data/.document +0 -5
  24. data/.gitignore +0 -32
  25. data/CHANGELOG.textile +0 -4
  26. data/bin/chimps +0 -5
  27. data/lib/chimps/cli.rb +0 -28
  28. data/lib/chimps/commands/base.rb +0 -65
  29. data/lib/chimps/commands/batch.rb +0 -40
  30. data/lib/chimps/commands/create.rb +0 -31
  31. data/lib/chimps/commands/destroy.rb +0 -26
  32. data/lib/chimps/commands/download.rb +0 -46
  33. data/lib/chimps/commands/help.rb +0 -100
  34. data/lib/chimps/commands/list.rb +0 -41
  35. data/lib/chimps/commands/query.rb +0 -82
  36. data/lib/chimps/commands/search.rb +0 -48
  37. data/lib/chimps/commands/show.rb +0 -30
  38. data/lib/chimps/commands/test.rb +0 -39
  39. data/lib/chimps/commands/update.rb +0 -34
  40. data/lib/chimps/commands/upload.rb +0 -50
  41. data/lib/chimps/commands.rb +0 -125
  42. data/lib/chimps/typewriter.rb +0 -349
  43. data/lib/chimps/utils/log.rb +0 -48
  44. data/lib/chimps/utils/uses_model.rb +0 -34
  45. data/lib/chimps/utils/uses_yaml_data.rb +0 -93
  46. data/lib/chimps/workflows/batch.rb +0 -127
  47. data/lib/chimps/workflows/downloader.rb +0 -102
  48. data/lib/chimps/workflows/up.rb +0 -149
  49. data/lib/chimps/workflows/upload/bundler.rb +0 -249
  50. data/lib/chimps/workflows/upload/notifier.rb +0 -59
  51. data/lib/chimps/workflows/upload/token.rb +0 -77
  52. data/lib/chimps/workflows/upload/uploader.rb +0 -51
  53. data/lib/chimps/workflows.rb +0 -12
  54. data/spec/chimps/typewriter_spec.rb +0 -114
  55. data/spec/chimps/workflows/upload/bundler_spec.rb +0 -75
  56. data/spec/chimps/workflows/upload/token_spec.rb +0 -6
@@ -1,82 +0,0 @@
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
- USAGE = "usage: chimps query [OPTIONS] DATASET [PROP=VALUE] ..."
9
- HELP = <<EOF
10
-
11
- Make a query of the given DATASET on the Infochimps paid query API
12
- (not the main Infochimps site).
13
-
14
- Properties and values can be supplied directly on the command line,
15
- from an input YAML file, or multiple YAML documents streamed in via
16
- STDIN, in order of decreasing precedence.
17
-
18
- You can learn more about the Infochimps query API, discover datasets
19
- to query, and look up the available parameters at
20
-
21
- http://api.infochimps.com
22
-
23
- You can learn about the main Infochimps site API at
24
-
25
- http://infochimps.org/api
26
- EOF
27
-
28
- include Chimps::Utils::UsesYamlData
29
- def ignore_first_arg_on_command_line
30
- true
31
- end
32
-
33
- # The dataset to query.
34
- #
35
- # @return [String]
36
- def dataset
37
- raise CLIError.new("Must provide a dataset to query.") if config.argv.first.blank?
38
- config.argv.first
39
- end
40
-
41
- # The path on the Infochimps query API to query.
42
- #
43
- # @return [String]
44
- def path
45
- dataset + ".json"
46
- end
47
-
48
- # Should the query output be pretty-printed?
49
- #
50
- # @return [true, nil]
51
- def pretty_print?
52
- config[:pretty_print]
53
- end
54
-
55
- # The requests that will be sent to the server.
56
- #
57
- # @return [Array<Chimps::QueryRequest>]
58
- def requests
59
- ensure_data_is_present!
60
- if data.is_a?(Hash)
61
- [QueryRequest.new(path, :query_params => data, :authenticate => true)]
62
- else # it's an Array, see Chimps::Utils::UsesYamlData
63
- data.map { |params| QueryRequest.new(path, :query_params => params, :authenticate => true) }
64
- end
65
- end
66
-
67
- # Issue the GET request.
68
- def execute!
69
- requests.each do |request|
70
- response = request.get
71
- if response.error?
72
- response.print :to => $stderr
73
- else
74
- puts pretty_print? ? JSON.pretty_generate(response.data) : response.body
75
- end
76
- end
77
- end
78
-
79
- end
80
- end
81
- end
82
-
@@ -1,48 +0,0 @@
1
- module Chimps
2
- module Commands
3
-
4
- # A command to issue a GET request to create a search at
5
- # Infochimps.
6
- class Search < Chimps::Command
7
-
8
- # Describes usage of search command.
9
- USAGE = "usage: chimps search [OPTIONS] QUERY"
10
-
11
- # Default number of search results returned.
12
- # DEFAULT_LIMIT = 20
13
-
14
- HELP = <<EOF
15
-
16
- Perform a search on Infochimps. By default the search will be of
17
- datasets and will return all matches for the given QUERY.
18
- EOF
19
-
20
- # Path to search resource
21
- PATH = 'search.json'
22
-
23
- include Chimps::Utils::UsesModel
24
-
25
- # FIXME have to implement this on the server side.
26
- # def limit
27
- # @limit ||= DEFAULT_LIMIT
28
- # end
29
-
30
- def query
31
- raise CLIError.new("Must provide a query to search for") if config.argv.blank?
32
- config.argv.join(' ')
33
- end
34
-
35
- def params
36
- {
37
- :query => query,
38
- :model => model
39
- }
40
- end
41
-
42
- def execute!
43
- Chimps::Request.new(PATH, :params => params).get.print(:skip_column_names => config[:skip_column_names])
44
- end
45
- end
46
- end
47
- end
48
-
@@ -1,30 +0,0 @@
1
- module Chimps
2
- module Commands
3
-
4
- class Show < Chimps::Command
5
-
6
- USAGE = "usage: chimps show [OPTIONS] ID_OR_HANDLE"
7
- HELP = <<EOF
8
-
9
- Return a description of the resource (defaults to dataset) with the
10
- given ID or HANDLE
11
- EOF
12
-
13
- include Chimps::Utils::UsesModel
14
-
15
- # The path of the URL to send a Request to.
16
- #
17
- # This is different from Chimps::Commands::UsesModel in that it
18
- # submits to the YAML path.
19
- def model_path
20
- "#{plural_model}/#{model_identifier}.yaml"
21
- end
22
-
23
- def execute!
24
- puts Chimps::Request.new(model_path).get.body
25
- end
26
-
27
- end
28
- end
29
- end
30
-
@@ -1,39 +0,0 @@
1
- module Chimps
2
- module Commands
3
-
4
- # A command to test whether API authentication with Infochimps is
5
- # working.
6
- class Test < Chimps::Command
7
-
8
- USAGE = "usage: chimps test"
9
- HELP = <<EOF
10
-
11
- Print diagnostic information on the API credentials being used by chimps
12
- and send a test request to Infochimps to make sure the API credentials
13
- work.
14
-
15
- EOF
16
-
17
- # Path to submit test requests to.
18
- def path
19
- "api_accounts/#{Chimps::Config[:site][:key]}"
20
- end
21
-
22
- # Issue the request.
23
- def execute!
24
- response = Chimps::Request.new(path, :sign => true).get
25
- if response.error?
26
- case
27
- when response.code == 404 then puts "ERROR Unrecognized API key" # record not found
28
- when response.code == 401 then puts "ERROR Signature does not match API key and query. Is your secret key correct?" # unauthorized
29
- else
30
- nil # response gets printed anyway
31
- end
32
- end
33
- response.print
34
- end
35
-
36
- end
37
- end
38
- end
39
-
@@ -1,34 +0,0 @@
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
- USAGE = "usage: chimps update [OPTIONS] ID_OR_HANDLE [PROP=VALUE] ..."
9
- HELP = <<EOF
10
-
11
- Updates a single resource of a given type (defaults to dataset)
12
- identified by ID_OR_HANDLE using the properties and values supplied.
13
-
14
- Properties and values can be supplied directly on the command line,
15
- from an input YAML file, or multiple YAML documents streamed in via
16
- STDIN, in order of decreasing precedence.
17
- EOF
18
-
19
- include Chimps::Utils::UsesModel
20
- include Chimps::Utils::UsesYamlData
21
- def ignore_first_arg_on_command_line
22
- true
23
- end
24
-
25
- # Issue the PUT request.
26
- def execute!
27
- ensure_data_is_present!
28
- Request.new(model_path, :data => {model.to_sym => data } , :authenticate => true).put.print
29
- end
30
-
31
- end
32
- end
33
- end
34
-
@@ -1,50 +0,0 @@
1
- module Chimps
2
- module Commands
3
-
4
- # A command for uploading data to Infochimps.
5
- class Upload < Chimps::Command
6
-
7
- USAGE = "usage: chimps upload [OPTIONS] ID_OR_HANDLE PATH [PATH] ..."
8
- HELP = <<EOF
9
-
10
- Upload data from your local machine for an existing dataset identified
11
- by ID_OR_HANDLE on Infochimps.
12
-
13
- chimps will package all paths supplied into a local archive and then
14
- upload this archive to Infochimps. The local archive defaults to a
15
- sensible name in the current directory but can also be customized.
16
-
17
- If the only file to be packaged is already a package (.zip, .tar,
18
- .tar.gz, &c.) then it will not be packaged again.
19
-
20
- Supplied paths are allowed to be remote files so someting like
21
-
22
- chimps upload my-dataset path/to/local/file.txt http://my-site.com/path/to/remote/file.txt
23
-
24
- will work.
25
- EOF
26
-
27
- # The ID or handle of the dataset to upload data for.
28
- #
29
- # @return [String]
30
- def dataset
31
- raise CLIError.new("Must provide an ID or URL-escaped handle as the first argument") if config.argv.first.blank?
32
- config.argv.first
33
- end
34
-
35
- # A list of paths to upload.
36
- #
37
- # @return [Array<String>]
38
- def paths
39
- raise CLIError.new("Must provide some paths to upload") if config.argv.length < 2
40
- config.argv[1..-1]
41
- end
42
-
43
- # Upload the data.
44
- def execute!
45
- Chimps::Workflows::Up.new(:dataset => dataset, :archive => config[:archive], :paths => paths, :fmt => config[:format]).execute!.print
46
- end
47
- end
48
- end
49
- end
50
-
@@ -1,125 +0,0 @@
1
- require 'configliere'
2
-
3
- module Chimps
4
-
5
- Config.use :commands
6
-
7
- # A namespace to hold the various commands Chimps defines.
8
- module Commands
9
-
10
- def self.class_for name
11
- "Chimps::Commands::#{name.to_s.capitalize}".constantize
12
- end
13
-
14
- def self.included obj
15
- obj.extend(ClassMethods)
16
- end
17
-
18
- module ClassMethods
19
- # Create a new command from the given +command_name+. The
20
- # resulting command will be initialized but will not have been
21
- # executed.
22
- #
23
- # @return [Chimps::Command]
24
- def command
25
- raise Chimps::CLIError.new("Must specify a command. Try `chimps help'.") unless Chimps::Config.command
26
- Chimps::Config.command_settings.resolve!
27
- Chimps::Commands.class_for(Chimps::Config.command_name).new(Chimps::Config.command_settings)
28
- end
29
- end
30
-
31
- protected
32
-
33
- def self.define_skip_column_names command
34
- command.define :skip_column_names, :description => "Don't print column names in output", :flag => :s, :type => :boolean
35
- end
36
-
37
- def self.define_model command, models=%w[dataset collection source license]
38
- models_string = models[0..-2].map { |m| "'#{m}'" }.join(', ') + ", or '#{models.last}'"
39
- command.define :model, :description => "Model to search (one of #{models_string})", :flag => :m, :default => models.first, :type => String
40
- end
41
-
42
- def self.define_data_file command
43
- command.define :data_file, :description => "Path to a file containing YAML data.", :flag => :d
44
- end
45
-
46
- #
47
- # Core REST actions
48
- #
49
-
50
- Chimps::Config.define_command :list, :description => "List resources" do |command|
51
- define_skip_column_names(command)
52
- define_model(command)
53
- command.define :all, :description => "List all resources, not just those owned by you", :flag => :a
54
- end
55
-
56
- Chimps::Config.define_command :show, :description => "Show a resource in detail" do |command|
57
- define_model(command, %w[dataset collection source license category tag])
58
- end
59
-
60
- Chimps::Config.define_command :create, :description => "Create a new resource" do |command|
61
- define_model(command, %w[dataset source license])
62
- define_data_file(command)
63
- end
64
-
65
- Chimps::Config.define_command :update, :description => "Update an existing resource" do |command|
66
- define_model(command, %w[dataset source license])
67
- define_data_file(command)
68
- end
69
-
70
- Chimps::Config.define_command :destroy, :description => "Destroy an existing resource" do |command|
71
- define_model(command, %w[dataset package source license])
72
- end
73
-
74
- #
75
- # Workflows
76
- #
77
-
78
- Chimps::Config.define_command :download, :description => "Download a dataset" do |command|
79
- command.define :output, :description => "Path to output file (defaults to sensible path in current directory)", :flag => :o, :type => String
80
- command.define :format, :description => "Preferred data-format (csv, tsv, xls, &c.)", :flag => :f, :type => String
81
- command.define :pkg_fmt, :description => "Preferred package-format (zip, tar.bz2, &c.)", :flag => :p, :type => String
82
- end
83
-
84
- Chimps::Config.define_command :upload, :description => "Upload a dataset" do |command|
85
- command.define :archive, :description => "Path to the local archive that will be created (defaults to a sensibly named ZIP file in the current directory)", :type => String, :flag => :a
86
- command.define :format, :description => "Data format (tsv, csv, xls, &c.) of the uploaded data (will guess if not given)", :type => String, :flag => :f
87
- end
88
-
89
- Chimps::Config.define_command :batch, :description => "Perform a batch processing request" do |command|
90
- command.define :output, :description => "Path to store the server's response", :type => String, :flag => :o
91
- command.define :force, :description => "Force upload of data even if there were errors in the batch request.", :flag => :F
92
- command.define :format, :description => "Data format to annotate each upload with (will guess if not given)", :type => String, :flag => :f
93
- define_data_file(command)
94
- end
95
-
96
- #
97
- # Miscellaneous
98
- #
99
-
100
- Chimps::Config.define_help_command!
101
-
102
- Chimps::Config.define_command :search, :description => 'Search resources' do |command|
103
- define_skip_column_names(command)
104
- define_model(command)
105
- end
106
-
107
- Chimps::Config.define_command :query, :description => "Get a response from the Query API" do |command|
108
- command.define :pretty_print, :description => "Pretty-print output", :flag => :p
109
- define_data_file(command)
110
- end
111
-
112
- Chimps::Config.define_command :test, :description => "Test your authentication credentials with Infochimps"
113
-
114
-
115
- # A list of all the commmand names defined by Chimps. Each name
116
- # maps to a corresponding subclass of Chimps::Command living in
117
- # the Chimps::Commands module.
118
- #Configliere::COMMANDS += %w[search help test create show update destroy upload list download batch query]
119
-
120
- Chimps::Config.commands.keys.each do |command|
121
- autoload command.to_s.capitalize.to_sym, "chimps/commands/#{command}"
122
- end
123
-
124
- end
125
- end