datacentred 0.1.0pre

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 (66) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +4 -0
  3. data/Gemfile.lock +35 -0
  4. data/README.md +2 -0
  5. data/Rakefile +10 -0
  6. data/circle.yml +5 -0
  7. data/datacentred.gemspec +23 -0
  8. data/lib/datacentred/error.rb +28 -0
  9. data/lib/datacentred/model/project.rb +44 -0
  10. data/lib/datacentred/model/role.rb +44 -0
  11. data/lib/datacentred/model/usage.rb +15 -0
  12. data/lib/datacentred/model/user.rb +32 -0
  13. data/lib/datacentred/model/version.rb +14 -0
  14. data/lib/datacentred/request/base.rb +46 -0
  15. data/lib/datacentred/request/projects.rb +38 -0
  16. data/lib/datacentred/request/roles.rb +38 -0
  17. data/lib/datacentred/request/usage.rb +10 -0
  18. data/lib/datacentred/request/users.rb +26 -0
  19. data/lib/datacentred/request/versions.rb +10 -0
  20. data/lib/datacentred/response.rb +12 -0
  21. data/lib/datacentred.rb +40 -0
  22. data/test/integration/projects_test.rb +117 -0
  23. data/test/integration/roles_test.rb +128 -0
  24. data/test/integration/usage_test.rb +24 -0
  25. data/test/integration/users_test.rb +128 -0
  26. data/test/integration/versions_test.rb +15 -0
  27. data/test/test_helper.rb +14 -0
  28. data/test/vcr_cassettes/add_user_to_project.yml +140 -0
  29. data/test/vcr_cassettes/add_user_to_role.yml +187 -0
  30. data/test/vcr_cassettes/create_project.yml +58 -0
  31. data/test/vcr_cassettes/create_role_with_invalid_permissions.yml +51 -0
  32. data/test/vcr_cassettes/create_role_with_permissions.yml +51 -0
  33. data/test/vcr_cassettes/create_role_without_permissions.yml +50 -0
  34. data/test/vcr_cassettes/create_user.yml +50 -0
  35. data/test/vcr_cassettes/delete_project.yml +103 -0
  36. data/test/vcr_cassettes/delete_role.yml +183 -0
  37. data/test/vcr_cassettes/delete_user.yml +136 -0
  38. data/test/vcr_cassettes/find_role.yml +97 -0
  39. data/test/vcr_cassettes/list_project_users.yml +58 -0
  40. data/test/vcr_cassettes/list_projects.yml +58 -0
  41. data/test/vcr_cassettes/list_role_users.yml +97 -0
  42. data/test/vcr_cassettes/list_roles.yml +50 -0
  43. data/test/vcr_cassettes/list_users.yml +58 -0
  44. data/test/vcr_cassettes/project_create_failed_validation.yml +56 -0
  45. data/test/vcr_cassettes/project_not_found.yml +54 -0
  46. data/test/vcr_cassettes/project_update_failed_validation.yml +55 -0
  47. data/test/vcr_cassettes/project_update_not_found.yml +54 -0
  48. data/test/vcr_cassettes/remove_user_from_project.yml +138 -0
  49. data/test/vcr_cassettes/remove_user_from_role.yml +228 -0
  50. data/test/vcr_cassettes/remove_user_from_role_not_found.yml +95 -0
  51. data/test/vcr_cassettes/show_project.yml +58 -0
  52. data/test/vcr_cassettes/show_usage.yml +51 -0
  53. data/test/vcr_cassettes/show_user.yml +97 -0
  54. data/test/vcr_cassettes/show_version.yml +50 -0
  55. data/test/vcr_cassettes/update_project.yml +58 -0
  56. data/test/vcr_cassettes/update_role.yml +98 -0
  57. data/test/vcr_cassettes/update_role_with_invalid_permissions.yml +98 -0
  58. data/test/vcr_cassettes/update_user.yml +97 -0
  59. data/test/vcr_cassettes/usage_not_found.yml +54 -0
  60. data/test/vcr_cassettes/user_create_failed_validation.yml +54 -0
  61. data/test/vcr_cassettes/user_delete_failed_validation.yml +54 -0
  62. data/test/vcr_cassettes/user_delete_not_found.yml +54 -0
  63. data/test/vcr_cassettes/user_show_not_found.yml +54 -0
  64. data/test/vcr_cassettes/user_update_failed_validation.yml +96 -0
  65. data/test/vcr_cassettes/user_update_not_found.yml +48 -0
  66. metadata +165 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 45b1b54675b4997ad636db5f4187e369216dec7b
4
+ data.tar.gz: 1c56568e101427d1b354bcc7511476a60640b826
5
+ SHA512:
6
+ metadata.gz: 576873f9b1b66463e9643ff2ba5ccd844aeb4e48d071cbf23224c04ec27d1f7dad235ae871aa2796b629fd93f04586d75ebbb5bb02d046a91ed4e7435f2f346e
7
+ data.tar.gz: ef8bbc569d77ff1c2f644ee1452f75475cc90a0854250326edda3fb82606dbf17325c0acacda4eabba798e8f23eb6ccd879e61f74e30bd13f7f1c1ec1c608966
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in datacentred.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,35 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ datacentred (0.1.0)
5
+ faraday (~> 0.9.1)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ addressable (2.5.2)
11
+ public_suffix (>= 2.0.2, < 4.0)
12
+ crack (0.4.3)
13
+ safe_yaml (~> 1.0.0)
14
+ faraday (0.9.2)
15
+ multipart-post (>= 1.2, < 3)
16
+ minitest (5.3.5)
17
+ multipart-post (2.0.0)
18
+ public_suffix (3.0.0)
19
+ safe_yaml (1.0.4)
20
+ vcr (2.8.0)
21
+ webmock (1.8.11)
22
+ addressable (>= 2.2.7)
23
+ crack (>= 0.1.7)
24
+
25
+ PLATFORMS
26
+ ruby
27
+
28
+ DEPENDENCIES
29
+ datacentred!
30
+ minitest (~> 5.3.1)
31
+ vcr (~> 2.8.0)
32
+ webmock (~> 1.8.0)
33
+
34
+ BUNDLED WITH
35
+ 1.15.1
data/README.md ADDED
@@ -0,0 +1,2 @@
1
+ # datacentred-api-ruby
2
+ Gem wrapper for Datacentred API.
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "test"
6
+ t.libs << "lib"
7
+ t.test_files = FileList["test/**/*_test.rb"]
8
+ end
9
+
10
+ task :default => :test
data/circle.yml ADDED
@@ -0,0 +1,5 @@
1
+ machine:
2
+ timezone:
3
+ Europe/London
4
+ ruby:
5
+ version: 2.3.1
@@ -0,0 +1,23 @@
1
+ Gem::Specification.new do |gem|
2
+ gem.name = 'datacentred'
3
+ gem.version = '0.1.0pre'
4
+ gem.date = '2017-08-10'
5
+ gem.summary = 'datacentred'
6
+ gem.description = 'Gem wrapper for Datacentred API'
7
+ gem.authors = [ 'Eugenia Grieff', 'Sean Handley' ]
8
+ gem.email = 'megrieff@gmail.com'
9
+ gem.files = `git ls-files`.split("\n")
10
+ gem.homepage = 'https://github.com/datacentred/datacentred-api-ruby'
11
+ gem.license = 'BSD-3-Clause'
12
+
13
+ gem.required_ruby_version = '> 2.3'
14
+
15
+ # Runtime Dependencies
16
+ gem.add_runtime_dependency 'faraday', '~> 0.9.1'
17
+
18
+ # Development Dependencies
19
+ gem.add_development_dependency 'vcr', '~> 2.8.0'
20
+ gem.add_development_dependency 'webmock', '~> 1.8.0'
21
+ gem.add_development_dependency 'minitest', '~> 5.3.1'
22
+
23
+ end
@@ -0,0 +1,28 @@
1
+ module Datacentred
2
+ class Error < StandardError
3
+ def self.raise_unless_successful(status, body)
4
+ return if status.to_s.start_with? "2" # 2xx
5
+ err = Datacentred::errors[status]
6
+ message = body&.fetch("errors")&.first&.fetch("detail")
7
+ if err
8
+ raise err, message
9
+ else
10
+ raise Datacentred::Error, "Error #{status}: #{message}"
11
+ end
12
+ end
13
+ end
14
+
15
+ class NotFoundError < StandardError; end
16
+ class UnprocessableEntity < StandardError; end
17
+ class Unauthorized < StandardError; end
18
+
19
+ private
20
+
21
+ def self.errors
22
+ {
23
+ 401 => Unauthorized,
24
+ 404 => NotFoundError,
25
+ 422 => UnprocessableEntity
26
+ }
27
+ end
28
+ end
@@ -0,0 +1,44 @@
1
+ module Datacentred
2
+ module Model
3
+ class Project < OpenStruct
4
+ def initialize(params)
5
+ params.delete("links") if params
6
+ params["created_at"] = Time.parse params["created_at"]
7
+ params["updated_at"] = Time.parse params["updated_at"]
8
+ super(params)
9
+ end
10
+
11
+ def self.all
12
+ Request::Projects.list.map{ |project| new(project) }
13
+ end
14
+
15
+ def self.find(id)
16
+ new Request::Projects.show(id)
17
+ end
18
+
19
+ def self.create(params)
20
+ new Request::Projects.create(params)
21
+ end
22
+
23
+ def self.update(id, params)
24
+ new Request::Projects.update(id, params)
25
+ end
26
+
27
+ def self.remove(id)
28
+ Request::Projects.destroy(id)
29
+ end
30
+
31
+ def self.users(id)
32
+ Request::Projects.list_users(id).map{ |user| new(user) }
33
+ end
34
+
35
+ def self.add_user(project_id, user_id)
36
+ Request::Projects.add_user(project_id, user_id)
37
+ end
38
+
39
+ def self.remove_user(project_id, user_id)
40
+ Request::Projects.remove_user(project_id, user_id)
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,44 @@
1
+ module Datacentred
2
+ module Model
3
+ class Role < OpenStruct
4
+ def initialize(params)
5
+ params.delete("links")
6
+ params["created_at"] = Time.parse params["created_at"]
7
+ params["updated_at"] = Time.parse params["updated_at"]
8
+ super(params)
9
+ end
10
+
11
+ def self.all
12
+ Request::Roles.list.map{|role| new(role) }
13
+ end
14
+
15
+ def self.find(id)
16
+ new Request::Roles.show(id)
17
+ end
18
+
19
+ def self.create(params)
20
+ new Request::Roles.create(params)
21
+ end
22
+
23
+ def self.update(id, params)
24
+ new Request::Roles.update(id, params)
25
+ end
26
+
27
+ def self.delete(id)
28
+ Request::Roles.destroy(id)
29
+ end
30
+
31
+ def self.users(id)
32
+ Request::Roles.list_users(id).map{|user| new(user) }
33
+ end
34
+
35
+ def self.add_user(role_id, user_id)
36
+ Request::Roles.add_user(role_id, user_id)
37
+ end
38
+
39
+ def self.remove_user(role_id, user_id)
40
+ Request::Roles.remove_user(role_id, user_id)
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,15 @@
1
+ module Datacentred
2
+ module Model
3
+ class Usage < OpenStruct
4
+ def initialize(params)
5
+ params.delete("links")
6
+ # params["last_updated_at"] = Time.parse params["last_updated_at"]
7
+ super(params)
8
+ end
9
+
10
+ def self.show(year, month)
11
+ Request::Usage.show(year, month)["projects"].map{ |project| new(project) }
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,32 @@
1
+ module Datacentred
2
+ module Model
3
+ class User < OpenStruct
4
+ def initialize(params)
5
+ params.delete("links")
6
+ params["created_at"] = Time.parse params["created_at"]
7
+ params["updated_at"] = Time.parse params["updated_at"]
8
+ super(params)
9
+ end
10
+
11
+ def self.all
12
+ Request::Users.list.map { |user| new(user) }
13
+ end
14
+
15
+ def self.find(id)
16
+ new Request::Users.show(id)
17
+ end
18
+
19
+ def self.create(params)
20
+ new Request::Users.create(params)
21
+ end
22
+
23
+ def self.update(id, params)
24
+ new Request::Users.update(id, params)
25
+ end
26
+
27
+ def self.delete(id)
28
+ Request::Users.destroy(id)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,14 @@
1
+ module Datacentred
2
+ module Model
3
+ class Version < OpenStruct
4
+ def initialize(params)
5
+ params.delete("links")
6
+ super(params)
7
+ end
8
+
9
+ def self.show
10
+ Request::Versions.list.map { |version| new(version) }
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,46 @@
1
+ module Datacentred
2
+ module Request
3
+ API_BASE_URL = 'https://my.datacentred.io'
4
+
5
+ class Base
6
+
7
+ def self.get(url, payload=nil)
8
+ response = Datacentred::Response.new(conn.get(url, payload))
9
+ response.body
10
+ end
11
+
12
+ def self.post(url, payload=nil)
13
+ response = Datacentred::Response.new(conn.post(url, payload))
14
+ response.body
15
+ end
16
+
17
+ def self.put(url, payload=nil)
18
+ response = Datacentred::Response.new(conn.put(url, payload))
19
+ response.body
20
+ end
21
+
22
+ def self.delete(url, payload=nil)
23
+ response = Datacentred::Response.new(conn.delete(url, payload))
24
+ response.body
25
+ end
26
+
27
+ private
28
+
29
+ def self.conn
30
+ Faraday.new(:url => API_BASE_URL) do |faraday|
31
+ faraday.path_prefix = "/api/"
32
+ faraday.request :url_encoded
33
+ faraday.headers['Accept'] = "application/vnd.datacentred.api+json; version=1"
34
+ faraday.headers['Authorization'] = "Token token=#{credentials}"
35
+ faraday.headers['Content-Type'] = 'application/json'
36
+ faraday.adapter Faraday.default_adapter
37
+ end
38
+ end
39
+
40
+ def self.credentials
41
+ "#{Datacentred.access_key}:#{Datacentred.secret_key}"
42
+ end
43
+
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,38 @@
1
+ module Datacentred
2
+ module Request
3
+ class Projects < Base
4
+
5
+ def self.create(payload={})
6
+ post('projects', payload.to_json)['project']
7
+ end
8
+
9
+ def self.list
10
+ get('projects')['projects']
11
+ end
12
+
13
+ def self.show(id)
14
+ get("projects/#{id}")['project']
15
+ end
16
+
17
+ def self.update(id, payload={})
18
+ put("projects/#{id}", payload.to_json)['project']
19
+ end
20
+
21
+ def self.destroy(id)
22
+ delete("projects/#{id}")
23
+ end
24
+
25
+ def self.list_users(id)
26
+ get("projects/#{id}/users")['users']
27
+ end
28
+
29
+ def self.add_user(project_id, user_id)
30
+ put("projects/#{project_id}/users/#{user_id}")
31
+ end
32
+
33
+ def self.remove_user(project_id, user_id)
34
+ delete("projects/#{project_id}/users/#{user_id}")
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,38 @@
1
+ module Datacentred
2
+ module Request
3
+ class Roles < Base
4
+
5
+ def self.create(payload={})
6
+ post('roles', payload.to_json)['role']
7
+ end
8
+
9
+ def self.list
10
+ get('roles')['roles']
11
+ end
12
+
13
+ def self.show(id)
14
+ get("roles/#{id}")['role']
15
+ end
16
+
17
+ def self.update(id, payload={})
18
+ put("roles/#{id}", payload.to_json)['role']
19
+ end
20
+
21
+ def self.destroy(id)
22
+ delete("roles/#{id}")
23
+ end
24
+
25
+ def self.list_users(role_id)
26
+ get("roles/#{role_id}/users")['users']
27
+ end
28
+
29
+ def self.add_user(role_id, user_id)
30
+ put("roles/#{role_id}/users/#{user_id}")
31
+ end
32
+
33
+ def self.remove_user(role_id, user_id)
34
+ delete("roles/#{role_id}/users/#{user_id}")
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,10 @@
1
+ module Datacentred
2
+ module Request
3
+ class Usage < Base
4
+
5
+ def self.show(year, month)
6
+ get("usage/#{year}/#{month}")
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,26 @@
1
+ module Datacentred
2
+ module Request
3
+ class Users < Base
4
+
5
+ def self.create(payload={})
6
+ post('users', payload.to_json)['user']
7
+ end
8
+
9
+ def self.list
10
+ get('users')['users']
11
+ end
12
+
13
+ def self.show(id)
14
+ get("users/#{id}")['user']
15
+ end
16
+
17
+ def self.update(id, payload)
18
+ put("users/#{id}", payload.to_json)['user']
19
+ end
20
+
21
+ def self.destroy(id)
22
+ delete("users/#{id}")
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,10 @@
1
+ module Datacentred
2
+ module Request
3
+ class Versions < Base
4
+
5
+ def self.list
6
+ get("/api")['versions']
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,12 @@
1
+ module Datacentred
2
+ class Response
3
+
4
+ attr_reader :body, :status
5
+
6
+ def initialize(server_response)
7
+ @body = JSON.parse server_response.body rescue nil
8
+ @status = server_response.status
9
+ Error.raise_unless_successful(status, @body)
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,40 @@
1
+ require 'faraday'
2
+ require 'json'
3
+
4
+ module Datacentred
5
+ require_relative 'datacentred/response'
6
+ require_relative 'datacentred/error'
7
+ require_relative 'datacentred/model/user'
8
+ require_relative 'datacentred/model/project'
9
+ require_relative 'datacentred/model/role'
10
+ require_relative 'datacentred/model/usage'
11
+ require_relative 'datacentred/model/version'
12
+ require_relative 'datacentred/request/base'
13
+ require_relative 'datacentred/request/projects'
14
+ require_relative 'datacentred/request/users'
15
+ require_relative 'datacentred/request/roles'
16
+ require_relative 'datacentred/request/usage'
17
+ require_relative 'datacentred/request/versions'
18
+
19
+ def self.access_key
20
+ @@access_key ||= ENV['DATACENTRED_ACCESS']
21
+ end
22
+
23
+ def self.access_key=(val)
24
+ @@access_key = val
25
+ end
26
+
27
+ def self.secret_key
28
+ @@secret_key ||= ENV['DATACENTRED_SECRET']
29
+ end
30
+
31
+ def self.secret_key=(val)
32
+ @@secret_key = val
33
+ end
34
+
35
+ User = Model::User
36
+ Project = Model::Project
37
+ Role = Model::Role
38
+ Usage = Model::Usage
39
+ Version = Model::Version
40
+ end
@@ -0,0 +1,117 @@
1
+ require_relative '../test_helper'
2
+
3
+ module Datacentred
4
+ class ProjectsIntegrationTest < Minitest::Test
5
+ def setup
6
+ @params_with_new_name = {"project" =>{"name" => "new_project_name"}}
7
+ @create_params = {"project" => {"name" => "test_new_project"}}
8
+ @user_id = "user_id"
9
+ @project_id = 'project_id1'
10
+ @project_id2 = 'project_id2'
11
+ end
12
+
13
+ def test_list_projects
14
+ VCR.use_cassette('list_projects') do
15
+ @projects = Datacentred::Project.all
16
+ assert_equal 1, @projects.count
17
+ @project = @projects.first
18
+ assert @project.id
19
+ end
20
+ end
21
+
22
+ def test_show_project
23
+ VCR.use_cassette('show_project') do
24
+ @project = Datacentred::Project.find(@project_id)
25
+ assert_equal @project.name, "foo_bar_primary"
26
+ end
27
+ end
28
+
29
+ def test_raises_not_found_if_project_doesnt_exist
30
+ VCR.use_cassette('project_not_found') do
31
+ assert_raises(Datacentred::NotFoundError) do
32
+ @project = Datacentred::Project.find("unknown")
33
+ end
34
+ end
35
+ end
36
+
37
+ def test_create_project
38
+ VCR.use_cassette('create_project') do
39
+ @new_project = Datacentred::Project.create(@create_params)
40
+ assert_equal @new_project.name, "test_new_project"
41
+ end
42
+ end
43
+
44
+ def test_raises_unprocessable_entity_if_failed_validation_for_create
45
+ VCR.use_cassette('project_create_failed_validation') do
46
+ assert_raises(Datacentred::UnprocessableEntity) do
47
+ Datacentred::Project.create(@create_params)
48
+ end
49
+ end
50
+ end
51
+
52
+ def test_update_project
53
+ VCR.use_cassette('update_project') do
54
+ @updated_project = Datacentred::Project.update(@project_id2, @params_with_new_name)
55
+ assert_equal @updated_project.name, "test_new_project_name"
56
+ end
57
+ end
58
+
59
+ def test_raises_unprocessable_entity_if_failed_validation_for_update
60
+ VCR.use_cassette('project_update_failed_validation') do
61
+ @params_with_used_name = {"project" => {"name" => "foo"}}
62
+ assert_raises(Datacentred::UnprocessableEntity) do
63
+ @project = Datacentred::Project.update(@project_id2, @params_with_used_name)
64
+ end
65
+ end
66
+ end
67
+
68
+ def test_raises_not_found_if_cant_find_project_for_update
69
+ VCR.use_cassette('project_update_not_found') do
70
+ assert_raises(Datacentred::NotFoundError) do
71
+ @project = Datacentred::Project.update("unknown", @params_with_new_name)
72
+ end
73
+ end
74
+ end
75
+
76
+ def test_delete_project
77
+ VCR.use_cassette('delete_project') do
78
+ Datacentred::Project.remove(@project_id2)
79
+ assert_raises(Datacentred::NotFoundError) do
80
+ @project = Datacentred::Project.find(@project_id2)
81
+ end
82
+ end
83
+ end
84
+
85
+ def test_list_project_users
86
+ VCR.use_cassette('list_project_users') do
87
+ @user_list = Datacentred::Project.users(@project_id)
88
+ assert_equal @user_list.count, 2
89
+ @user = @user_list.first
90
+ assert @user.id
91
+ assert @user.first_name
92
+ assert @user.last_name
93
+ assert @user.email
94
+ end
95
+ end
96
+
97
+ def test_add_user_to_project
98
+ VCR.use_cassette('add_user_to_project') do
99
+ @user_list = Datacentred::Project.users(@project_id)
100
+ assert_equal @user_list.count, 1
101
+ Datacentred::Project.add_user(@project_id, @user_id)
102
+ @user_list = Datacentred::Project.users(@project_id)
103
+ assert_equal @user_list.count, 2
104
+ end
105
+ end
106
+
107
+ def test_remove_user_from_project
108
+ VCR.use_cassette('remove_user_from_project') do
109
+ @user_list = Datacentred::Project.users(@project_id)
110
+ assert_equal @user_list.count, 2
111
+ Datacentred::Project.remove_user(@project_id, @user_id)
112
+ @user_list = Datacentred::Project.users(@project_id)
113
+ assert_equal @user_list.count, 1
114
+ end
115
+ end
116
+ end
117
+ end