datacatalog 0.1.0 → 0.2.3
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/.gitignore +4 -4
- data/CHANGES.md +2 -2
- data/LICENSE.md +11 -11
- data/README.md +34 -31
- data/Rakefile +51 -49
- data/VERSION +1 -1
- data/datacatalog.gemspec +29 -13
- data/lib/base.rb +77 -0
- data/lib/datacatalog.rb +8 -28
- data/lib/main.rb +41 -0
- data/lib/resources/about.rb +11 -0
- data/lib/resources/api_key.rb +38 -0
- data/lib/resources/source.rb +31 -0
- data/lib/resources/user.rb +73 -0
- data/sandbox_api.yml.example +2 -2
- data/spec/about_spec.rb +21 -0
- data/spec/api_key_spec.rb +145 -1
- data/spec/base_spec.rb +129 -184
- data/spec/datacatalog_spec.rb +36 -0
- data/spec/source_spec.rb +162 -101
- data/spec/spec.opts +4 -4
- data/spec/spec_helper.rb +48 -48
- data/spec/user_spec.rb +278 -208
- metadata +54 -11
- data/doc/api_key_spec_for_rest_api.txt +0 -54
- data/doc/api_key_spec_for_ruby_api.rb +0 -26
- data/doc/mocking_options.md +0 -20
- data/lib/datacatalog/api_key.rb +0 -7
- data/lib/datacatalog/base.rb +0 -68
- data/lib/datacatalog/source.rb +0 -30
- data/lib/datacatalog/user.rb +0 -94
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: datacatalog
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luigi Montanez
|
@@ -10,9 +10,49 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2009-10-
|
13
|
+
date: 2009-10-09 00:00:00 -04:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: activesupport
|
18
|
+
type: :runtime
|
19
|
+
version_requirement:
|
20
|
+
version_requirements: !ruby/object:Gem::Requirement
|
21
|
+
requirements:
|
22
|
+
- - ">="
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: 2.3.4
|
25
|
+
version:
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: httparty
|
28
|
+
type: :runtime
|
29
|
+
version_requirement:
|
30
|
+
version_requirements: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: 0.4.5
|
35
|
+
version:
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: mash
|
38
|
+
type: :runtime
|
39
|
+
version_requirement:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
requirements:
|
42
|
+
- - ">="
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: 0.0.3
|
45
|
+
version:
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: jeweler
|
48
|
+
type: :development
|
49
|
+
version_requirement:
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.2.1
|
55
|
+
version:
|
16
56
|
- !ruby/object:Gem::Dependency
|
17
57
|
name: rspec
|
18
58
|
type: :development
|
@@ -21,7 +61,7 @@ dependencies:
|
|
21
61
|
requirements:
|
22
62
|
- - ">="
|
23
63
|
- !ruby/object:Gem::Version
|
24
|
-
version:
|
64
|
+
version: 1.2.8
|
25
65
|
version:
|
26
66
|
description: Ruby library that wraps the National Data Catalog API
|
27
67
|
email: luigi@sunlightfoundation.com
|
@@ -40,17 +80,18 @@ files:
|
|
40
80
|
- Rakefile
|
41
81
|
- VERSION
|
42
82
|
- datacatalog.gemspec
|
43
|
-
-
|
44
|
-
- doc/api_key_spec_for_ruby_api.rb
|
45
|
-
- doc/mocking_options.md
|
83
|
+
- lib/base.rb
|
46
84
|
- lib/datacatalog.rb
|
47
|
-
- lib/
|
48
|
-
- lib/
|
49
|
-
- lib/
|
50
|
-
- lib/
|
85
|
+
- lib/main.rb
|
86
|
+
- lib/resources/about.rb
|
87
|
+
- lib/resources/api_key.rb
|
88
|
+
- lib/resources/source.rb
|
89
|
+
- lib/resources/user.rb
|
51
90
|
- sandbox_api.yml.example
|
91
|
+
- spec/about_spec.rb
|
52
92
|
- spec/api_key_spec.rb
|
53
93
|
- spec/base_spec.rb
|
94
|
+
- spec/datacatalog_spec.rb
|
54
95
|
- spec/source_spec.rb
|
55
96
|
- spec/spec.opts
|
56
97
|
- spec/spec_helper.rb
|
@@ -78,14 +119,16 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
78
119
|
version:
|
79
120
|
requirements: []
|
80
121
|
|
81
|
-
rubyforge_project:
|
122
|
+
rubyforge_project: datacatalog
|
82
123
|
rubygems_version: 1.3.5
|
83
124
|
signing_key:
|
84
125
|
specification_version: 3
|
85
126
|
summary: Wrapper for the National Data Catalog API
|
86
127
|
test_files:
|
128
|
+
- spec/about_spec.rb
|
87
129
|
- spec/api_key_spec.rb
|
88
130
|
- spec/base_spec.rb
|
131
|
+
- spec/datacatalog_spec.rb
|
89
132
|
- spec/source_spec.rb
|
90
133
|
- spec/spec_helper.rb
|
91
134
|
- spec/user_spec.rb
|
@@ -1,54 +0,0 @@
|
|
1
|
-
A user has a built-in, primary API key.
|
2
|
-
A user also has secondary API keys.
|
3
|
-
|
4
|
-
API keys fall into these categories:
|
5
|
-
1. "primary" API key
|
6
|
-
- created and controlled by system
|
7
|
-
- cannot be deleted by users
|
8
|
-
- used by the Data Catalog Web Application
|
9
|
-
- can be rekeyed by user
|
10
|
-
2. application keys
|
11
|
-
- created and controlled by users
|
12
|
-
- can be rekeyed by user
|
13
|
-
- do not provide user-specific credentials:
|
14
|
-
- favorites
|
15
|
-
- comments
|
16
|
-
3. valet keys
|
17
|
-
- created and controlled by users
|
18
|
-
- can be rekeyed by user
|
19
|
-
- provide user-specific credentials
|
20
|
-
- favorites
|
21
|
-
- comments
|
22
|
-
|
23
|
-
GET /users/1/api_keys
|
24
|
-
# get all API keys
|
25
|
-
:type => :primary
|
26
|
-
:type => :application
|
27
|
-
:type => :valet
|
28
|
-
|
29
|
-
GET /users/1/api_keys?type=primary
|
30
|
-
# just returns the primary key
|
31
|
-
|
32
|
-
GET /users/1/api_keys?type=application
|
33
|
-
# returns an array of application keys. [] if none.
|
34
|
-
|
35
|
-
GET /users/1/api_keys?type=valet
|
36
|
-
# returns an array of the valet keys. [] if none.
|
37
|
-
|
38
|
-
POST /users/1/api_keys
|
39
|
-
# create a new API key
|
40
|
-
|
41
|
-
PUT /users/1/api_keys/12345
|
42
|
-
# update an existing API key
|
43
|
-
|
44
|
-
PUT /users/1/api_keys/12345?regenerate_api_key=true
|
45
|
-
# rekey an API key
|
46
|
-
|
47
|
-
DELETE /users/1/api_keys/12345
|
48
|
-
# delete an existing API key
|
49
|
-
# return 403 Forbidden if attempting to delete a primary key
|
50
|
-
|
51
|
-
# -----
|
52
|
-
|
53
|
-
POST /users
|
54
|
-
A a primary key API should be generated automatically.
|
@@ -1,26 +0,0 @@
|
|
1
|
-
# I want to get a user's primary API key
|
2
|
-
user = DataCatalog::User.find(user_id)
|
3
|
-
user.primary_api_key
|
4
|
-
user.application_api_keys
|
5
|
-
user.valet_api_keys
|
6
|
-
|
7
|
-
# I want to generate a new API key for a user
|
8
|
-
user.generate_api_key!(:type => "application", :purpose => "To be awesome.") # sets user to the updated object
|
9
|
-
|
10
|
-
# I want to update an API key
|
11
|
-
user.update_api_key!("173f938237a93e9393b365c3",
|
12
|
-
:type => "application",
|
13
|
-
:purpose => "To be more awesome.") # sets user to the updated object
|
14
|
-
|
15
|
-
# I want to delete an API key of a user
|
16
|
-
user.delete_api_key!("173f938237a93e9393b365c3") # returns: true / exception
|
17
|
-
|
18
|
-
# I want to get all API keys of a single user
|
19
|
-
user.api_keys # returns: array of keys
|
20
|
-
|
21
|
-
# ^^^^^^^^^^^^ DONE ^^^^^^^^^^^^^^^
|
22
|
-
|
23
|
-
# vvvvvvvvvv NOT DONE vvvvvvvvvvvvv
|
24
|
-
|
25
|
-
# Given an API key, I want to see what user it corresponds to, if any.
|
26
|
-
DataCatalog::User.find_by_api_key("7a93e93b365ca93e9393b365c3") # returns: User object
|
data/doc/mocking_options.md
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
# Ruby wrapper API mocking options
|
2
|
-
|
3
|
-
## 1. Machinist
|
4
|
-
|
5
|
-
* Use Machinist as an object factory for HTTParty::Response and DataCatalog::* objects.
|
6
|
-
* Big question: Can HTTParty::Response object methods be appropriately mocked out by Machinist?
|
7
|
-
* Will need to keep objects in sync with the live API
|
8
|
-
|
9
|
-
## 2. FakeWeb
|
10
|
-
|
11
|
-
* Use FakeWeb to fake out the HTTP responses
|
12
|
-
* Will need to know the details of the JSON bodies, but HTTParty wraps all that for us.
|
13
|
-
* Will need to keep the JSON output (and headers + status codes) in sync with the live API
|
14
|
-
|
15
|
-
## 3. Local Sandbox API
|
16
|
-
|
17
|
-
* Use a locally running sandbox API that mocks out the real API
|
18
|
-
* Each spec will need to build up needed objects in the API, then tear them down at the end.
|
19
|
-
* Much slower than in-memory solutions above.
|
20
|
-
* To keep in sync with live API, just need to refresh API codebase.
|
data/lib/datacatalog/api_key.rb
DELETED
data/lib/datacatalog/base.rb
DELETED
@@ -1,68 +0,0 @@
|
|
1
|
-
module DataCatalog
|
2
|
-
|
3
|
-
class Base < Mash
|
4
|
-
|
5
|
-
include HTTParty
|
6
|
-
format :json
|
7
|
-
|
8
|
-
def self.set_base_uri
|
9
|
-
default_options[:base_uri] = HTTParty.normalize_base_uri(DataCatalog.base_uri || 'api.nationaldatacatalog.com')
|
10
|
-
end
|
11
|
-
|
12
|
-
def self.set_api_key
|
13
|
-
if DataCatalog.api_key.blank?
|
14
|
-
raise ApiKeyNotConfigured, "Use DataCatalog.api_key = '...'"
|
15
|
-
end
|
16
|
-
default_options[:default_params] = {} if default_options[:default_params].nil?
|
17
|
-
default_options[:default_params].merge!({ :api_key => DataCatalog.api_key })
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.set_up!
|
21
|
-
set_base_uri
|
22
|
-
set_api_key
|
23
|
-
end
|
24
|
-
|
25
|
-
def self.check_status_code(response)
|
26
|
-
case response.code
|
27
|
-
when 400: raise BadRequest, error_message(response)
|
28
|
-
when 401: raise Unauthorized, error_message(response)
|
29
|
-
when 403: raise Forbidden, error_message(response)
|
30
|
-
when 404: raise NotFound, error_message(response)
|
31
|
-
when 409: raise Conflict, error_message(response)
|
32
|
-
when 500: raise InternalServerError, error_message(response)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def self.error_message(response)
|
37
|
-
parsed_body = JSON.parse(response.body)
|
38
|
-
if parsed_body.empty?
|
39
|
-
"Response was empty"
|
40
|
-
elsif parsed_body["errors"]
|
41
|
-
parsed_body["errors"].inspect
|
42
|
-
else
|
43
|
-
response.body
|
44
|
-
end
|
45
|
-
rescue JSON::ParserError
|
46
|
-
"Unable to parse: #{response.body.inspect}"
|
47
|
-
end
|
48
|
-
|
49
|
-
def self.response_for
|
50
|
-
response = yield
|
51
|
-
check_status_code(response)
|
52
|
-
response
|
53
|
-
end
|
54
|
-
|
55
|
-
def self.build_object(response)
|
56
|
-
return nil if response.nil? || response.empty?
|
57
|
-
new(response)
|
58
|
-
end
|
59
|
-
|
60
|
-
def self.about
|
61
|
-
default_options[:default_params] = {}
|
62
|
-
set_base_uri
|
63
|
-
build_object(response_for { get('/') })
|
64
|
-
end
|
65
|
-
|
66
|
-
end # class Base
|
67
|
-
|
68
|
-
end # module DataCatalog
|
data/lib/datacatalog/source.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
module DataCatalog
|
2
|
-
|
3
|
-
class Source < DataCatalog::Base
|
4
|
-
|
5
|
-
def self.create(params={})
|
6
|
-
set_up!
|
7
|
-
build_object(response_for { post("/sources", :query => params) })
|
8
|
-
end
|
9
|
-
|
10
|
-
def self.all
|
11
|
-
set_up!
|
12
|
-
response_for{ get("/sources") }.map do |source|
|
13
|
-
build_object(source)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def self.update(source_id, params={})
|
18
|
-
set_up!
|
19
|
-
build_object(response_for { put("/sources/#{source_id}", :query => params) })
|
20
|
-
end
|
21
|
-
|
22
|
-
def self.destroy(source_id)
|
23
|
-
set_up!
|
24
|
-
response = response_for { delete("/sources/#{source_id}") }
|
25
|
-
true
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|
29
|
-
|
30
|
-
end
|
data/lib/datacatalog/user.rb
DELETED
@@ -1,94 +0,0 @@
|
|
1
|
-
module DataCatalog
|
2
|
-
|
3
|
-
class User < DataCatalog::Base
|
4
|
-
|
5
|
-
def self.all
|
6
|
-
set_up!
|
7
|
-
response_for{ get("/users") }.map do |user|
|
8
|
-
build_object(user)
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
def self.find(id)
|
13
|
-
set_up!
|
14
|
-
user = build_object(response_for { get("/users/#{id}") })
|
15
|
-
user.api_keys = response_for { get("/users/#{id}/keys") }.map do |key|
|
16
|
-
DataCatalog::ApiKey.build_object(key)
|
17
|
-
end if user
|
18
|
-
user
|
19
|
-
end
|
20
|
-
|
21
|
-
def self.find_by_api_key(api_key)
|
22
|
-
user = nil
|
23
|
-
DataCatalog.with_key(api_key) do
|
24
|
-
set_up!
|
25
|
-
checkup = build_object(response_for { get("/checkup") })
|
26
|
-
user = find(checkup.user_id)
|
27
|
-
end
|
28
|
-
user
|
29
|
-
end
|
30
|
-
|
31
|
-
def self.create(params={})
|
32
|
-
set_up!
|
33
|
-
user = build_object(response_for { post("/users", :query => params) })
|
34
|
-
user.api_keys = response_for { get("/users/#{user.id}/keys") }.map do |key|
|
35
|
-
DataCatalog::ApiKey.build_object(key)
|
36
|
-
end if user
|
37
|
-
user
|
38
|
-
end
|
39
|
-
|
40
|
-
def self.update(user_id, params)
|
41
|
-
set_up!
|
42
|
-
build_object(response_for { put("/users/#{user_id}", :query => params) })
|
43
|
-
end
|
44
|
-
|
45
|
-
def self.destroy(user_id)
|
46
|
-
set_up!
|
47
|
-
response = response_for { delete("/users/#{user_id}") }
|
48
|
-
true
|
49
|
-
end
|
50
|
-
|
51
|
-
def generate_api_key!(params)
|
52
|
-
self.class.set_up!
|
53
|
-
|
54
|
-
response = self.class.response_for do
|
55
|
-
self.class.post("/users/#{self.id}/keys", :query => params )
|
56
|
-
end
|
57
|
-
update_api_keys
|
58
|
-
true
|
59
|
-
end
|
60
|
-
|
61
|
-
def delete_api_key!(api_key_id)
|
62
|
-
self.class.set_up!
|
63
|
-
|
64
|
-
response = self.class.response_for do
|
65
|
-
self.class.delete("/users/#{self.id}/keys/#{api_key_id}")
|
66
|
-
end
|
67
|
-
update_api_keys
|
68
|
-
true
|
69
|
-
end
|
70
|
-
|
71
|
-
def update_api_key!(api_key_id, params)
|
72
|
-
self.class.set_up!
|
73
|
-
|
74
|
-
response = self.class.response_for do
|
75
|
-
self.class.put("/users/#{self.id}/keys/#{api_key_id}", :query => params)
|
76
|
-
end
|
77
|
-
update_api_keys
|
78
|
-
true
|
79
|
-
end
|
80
|
-
|
81
|
-
private
|
82
|
-
|
83
|
-
def update_api_keys
|
84
|
-
self.api_keys = self.class.response_for { self.class.get("/users/#{self.id}/keys") }.map do |key|
|
85
|
-
DataCatalog::ApiKey.build_object(key)
|
86
|
-
end
|
87
|
-
updated_user = DataCatalog::User.find(self.id)
|
88
|
-
self.application_api_keys = updated_user.application_api_keys
|
89
|
-
self.valet_api_keys = updated_user.valet_api_keys
|
90
|
-
end
|
91
|
-
|
92
|
-
end # class User
|
93
|
-
|
94
|
-
end # module DataCatalog
|