talis 0.12.0

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 (46) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.rspec +2 -0
  4. data/.rubocop.yml +2 -0
  5. data/.travis.yml +24 -0
  6. data/.yardopts +1 -0
  7. data/CONTRIBUTING.md +28 -0
  8. data/Gemfile +4 -0
  9. data/Guardfile +5 -0
  10. data/README.md +76 -0
  11. data/Rakefile +8 -0
  12. data/bin/console +14 -0
  13. data/bin/setup +8 -0
  14. data/lib/talis.rb +25 -0
  15. data/lib/talis/analytics.rb +31 -0
  16. data/lib/talis/analytics/event.rb +67 -0
  17. data/lib/talis/authentication.rb +14 -0
  18. data/lib/talis/authentication/client.rb +82 -0
  19. data/lib/talis/authentication/login.rb +169 -0
  20. data/lib/talis/authentication/public_key.rb +53 -0
  21. data/lib/talis/authentication/token.rb +172 -0
  22. data/lib/talis/bibliography.rb +52 -0
  23. data/lib/talis/bibliography/ebook.rb +50 -0
  24. data/lib/talis/bibliography/manifestation.rb +141 -0
  25. data/lib/talis/bibliography/result_set.rb +34 -0
  26. data/lib/talis/bibliography/work.rb +164 -0
  27. data/lib/talis/constants.rb +9 -0
  28. data/lib/talis/errors.rb +10 -0
  29. data/lib/talis/errors/authentication_failed_error.rb +4 -0
  30. data/lib/talis/errors/client_errors.rb +19 -0
  31. data/lib/talis/errors/server_communication_error.rb +4 -0
  32. data/lib/talis/errors/server_error.rb +4 -0
  33. data/lib/talis/extensions/object.rb +11 -0
  34. data/lib/talis/feeds.rb +8 -0
  35. data/lib/talis/feeds/annotation.rb +129 -0
  36. data/lib/talis/feeds/feed.rb +58 -0
  37. data/lib/talis/hierarchy.rb +9 -0
  38. data/lib/talis/hierarchy/asset.rb +265 -0
  39. data/lib/talis/hierarchy/node.rb +200 -0
  40. data/lib/talis/hierarchy/resource.rb +159 -0
  41. data/lib/talis/oauth_service.rb +18 -0
  42. data/lib/talis/resource.rb +68 -0
  43. data/lib/talis/user.rb +112 -0
  44. data/lib/talis/version.rb +3 -0
  45. data/talis.gemspec +39 -0
  46. metadata +327 -0
@@ -0,0 +1,159 @@
1
+ module Talis
2
+ module Hierarchy
3
+ # Common functionality to Hierarchy resources (Node, Asset)
4
+ module Resource
5
+ # The methods defined within this module are available to instances of,
6
+ # and the class itself that extends Talis::Hierarchy::Resource.
7
+ module Helpers
8
+ # @return [String] The hierarchy namespace.
9
+ attr_accessor :namespace
10
+ # @return [String] The ID of the resource.
11
+ attr_reader :id
12
+ # @return [String] The type of resource.
13
+ attr_reader :type
14
+ # @return [Hash] key-value pair attributes belonging to the resource.
15
+ attr_accessor :attributes
16
+
17
+ @new_resource = false
18
+ @deleted = false
19
+
20
+ # Manages the current & stored resource type so resources can be edited/
21
+ # deleted properly
22
+ # @param resource_type [String] the new type of the hierarchy resource
23
+ def type=(resource_type)
24
+ @original_type = type if persisted?
25
+ @type = resource_type
26
+ end
27
+
28
+ # Manages the current & stored resource id so resources can be edited/
29
+ # deleted properly
30
+ # @param resource_id [String] the new id of the hierarchy resource
31
+ def id=(resource_id)
32
+ @original_id = id if persisted?
33
+ @id = resource_id
34
+ end
35
+
36
+ # The resource type the API thinks the resource has
37
+ # (if it has been saved)
38
+ # @return [String]
39
+ def stored_type
40
+ persisted? ? @original_type || type : type
41
+ end
42
+
43
+ # The resource id the API thinks the resource has (if it has been saved)
44
+ # @return [String]
45
+ def stored_id
46
+ persisted? ? @original_id || id : id
47
+ end
48
+
49
+ # A boolean indicating if the resource exists in the remote Blueprint
50
+ # instance
51
+ # @return [Boolean]
52
+ def persisted?
53
+ !(@new_resource || @deleted)
54
+ end
55
+
56
+ protected
57
+
58
+ # Query for assets using HTTParty and not blueprint_rb in order to get
59
+ # around the Swagger limitation of not being able to choose between
60
+ # AND and IN queries.
61
+ # @param request_id [String] unique ID for the remote request.
62
+ # @param namespace [String] the namespace of the hierarchy.
63
+ # @param opts [Hash] ({}) optional filter and pagination criteria.
64
+ # @return [Array<Talis::Hierarchy::Asset>] or an empty array if no
65
+ # assets are found.
66
+ # @raise [Talis::ClientError] if the request was invalid.
67
+ # @raise [Talis::ServerError] if the search failed on the server.
68
+ # @raise [Talis::ServerCommunicationError] for network issues.
69
+ def search_assets(request_id, namespace, opts)
70
+ response = get("/1/#{namespace}/assets",
71
+ query: build_query(opts),
72
+ headers: {
73
+ 'X-Request-Id' => request_id,
74
+ 'Authorization' => "Bearer #{token}"
75
+ })
76
+ convert_to_blueprint_api_client_model(handle_response(response))
77
+ rescue SocketError
78
+ raise Talis::ServerCommunicationError
79
+ end
80
+
81
+ def mark_persisted
82
+ @new_resource = false
83
+ @deleted = false
84
+ @original_id = id
85
+ @original_type = type
86
+ end
87
+
88
+ def mark_deleted
89
+ @deleted = true
90
+ @original_id = id
91
+ @original_type = type
92
+ end
93
+
94
+ private
95
+
96
+ def build_query(opts)
97
+ query = []
98
+ opts.each do |key, value|
99
+ if key.to_s.start_with?('filter')
100
+ filter = key.to_s.gsub('filter_', '')
101
+ build_collection_query(query, filter, value)
102
+ else
103
+ query << [key, value]
104
+ end
105
+ end
106
+ URI.encode_www_form(query)
107
+ end
108
+
109
+ def build_collection_query(params, key, value)
110
+ filter_key = "filter[#{key.camelize(:lower)}]"
111
+ if value.is_a? Array
112
+ value.each do |item|
113
+ params << [filter_key, item]
114
+ end
115
+ elsif value.is_a? Hash
116
+ build_collection_query_from_hash(params, filter_key, value)
117
+ else
118
+ raise ArgumentError, 'filter value must be an array or hash'
119
+ end
120
+ end
121
+
122
+ def build_collection_query_from_hash(params, key, hash)
123
+ mode = hash.keys.first
124
+ values = hash.values.first
125
+ if mode == :all
126
+ values.each do |item|
127
+ params << [key, item]
128
+ end
129
+ else
130
+ params << [key, values.join(',')]
131
+ end
132
+ end
133
+
134
+ def convert_to_blueprint_api_client_model(response)
135
+ response['data'].map! do |item|
136
+ OpenStruct.new(type: item['type'], id: item['id'],
137
+ attributes: item.fetch('attributes', {}))
138
+ end
139
+ end
140
+
141
+ def configure_blueprint
142
+ BlueprintClient.configure do |config|
143
+ config.scheme = base_uri[/https?/]
144
+ config.host = base_uri
145
+ config.access_token = token
146
+ end
147
+ end
148
+ end
149
+
150
+ # Callback invoked whenever the receiver is included in another module or
151
+ # class. Receiver here is whoever includes Resource
152
+ def self.included(base)
153
+ base.extend(Helpers)
154
+ end
155
+
156
+ include Helpers
157
+ end
158
+ end
159
+ end
@@ -0,0 +1,18 @@
1
+ module Talis
2
+ # Allows an individual primitive service to set its own Persona environment
3
+ module OAuthService
4
+ attr_accessor :oauth_host, :client_id, :client_secret
5
+
6
+ protected
7
+
8
+ # Overrides Talis::Resource.token
9
+ def token
10
+ options = {
11
+ client_id: client_id || Talis::Authentication.client_id,
12
+ client_secret: client_secret || Talis::Authentication.client_secret
13
+ }
14
+ options[:host] = oauth_host if oauth_host
15
+ Talis::Authentication::Token.generate(options)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,68 @@
1
+ require 'httparty'
2
+ require 'ostruct'
3
+ require 'securerandom'
4
+
5
+ module Talis
6
+ # Extend this class when in order to interact with Talis HTTP APIs.
7
+ # Each sub class should set base_uri to whatever Talis primitive it needs
8
+ # to talk to.
9
+ class Resource
10
+ include HTTParty
11
+ format :json
12
+ headers 'User-Agent' => "talis-ruby-client/#{Talis::VERSION} "\
13
+ "ruby/#{RUBY_VERSION}"
14
+
15
+ class << self
16
+ def handle_response(response, expected_status_code = 200)
17
+ if response.code == expected_status_code
18
+ response.parsed_response
19
+ elsif response.code >= 400 && response.code < 500
20
+ build_client_error(response)
21
+ elsif response.code >= 500
22
+ raise Talis::ServerError
23
+ else
24
+ raise Talis::ServerCommunicationError
25
+ end
26
+ end
27
+
28
+ def new_req_id
29
+ SecureRandom.hex(13)
30
+ end
31
+
32
+ protected
33
+
34
+ def token
35
+ options = {
36
+ client_id: Talis::Authentication.client_id,
37
+ client_secret: Talis::Authentication.client_secret
38
+ }
39
+ Talis::Authentication::Token.generate(options)
40
+ end
41
+
42
+ private
43
+
44
+ def build_client_error(response)
45
+ raise client_errors[response.code], safe_error_description(response)
46
+ end
47
+
48
+ def client_errors
49
+ errors = {
50
+ 400 => Talis::BadRequestError,
51
+ 401 => Talis::UnauthorizedError,
52
+ 403 => Talis::ForbiddenError,
53
+ 404 => Talis::NotFoundError,
54
+ 409 => Talis::ConflictError
55
+ }
56
+ errors.default = Talis::ClientError
57
+ errors
58
+ end
59
+
60
+ def safe_error_description(response)
61
+ if response.respond_to? :parsed_response
62
+ parsed_response = response.parsed_response
63
+ end
64
+ parsed_response['error_description'] if parsed_response.present?
65
+ end
66
+ end
67
+ end
68
+ end
data/lib/talis/user.rb ADDED
@@ -0,0 +1,112 @@
1
+ require 'active_support'
2
+ require 'talis/authentication/token'
3
+
4
+ module Talis
5
+ # Represents a user known by Talis.
6
+ class User < Talis::Resource
7
+ base_uri Talis::PERSONA_HOST
8
+ # @return [String] the globally unique identifier for the user.
9
+ attr_reader :guid
10
+ # @return [String] the user's first name.
11
+ attr_reader :first_name
12
+ # @return [String] the user's surname.
13
+ attr_reader :surname
14
+ # @return [String] the user's E-mail address.
15
+ attr_reader :email
16
+ # @return [Talis::Authentication::Token] to use for user authentication
17
+ # with other Talis primitive services.
18
+ attr_reader :token
19
+
20
+ private_class_method :new
21
+
22
+ # Creates a new user object. For internal use only, use {User.build}.
23
+ # @param guid [String] the globally unique identifier for the user.
24
+ # @param first_name [String] the user's first name.
25
+ # @param surname [String] the user's surname.
26
+ # @param email [String] the user's E-mail address.
27
+ # @param token [Talis::Authentication::Token] (nil) valid user token.
28
+ def initialize(guid:, first_name:, surname:, email:, token: nil)
29
+ @guid = guid
30
+ @first_name = first_name
31
+ @surname = surname
32
+ @email = email
33
+ @token = token
34
+ end
35
+
36
+ # Return the combination of the user's first and surname.
37
+ # @return [String] the user's full name
38
+ def full_name
39
+ "#{@first_name} #{@surname}"
40
+ end
41
+
42
+ # Returns a URL that will resolve to an avatar image belonging to the
43
+ # user when fetched. This URL is cached by browsers when called.
44
+ # @param size [Integer] (nil) size in pixels (defaults to 70x70).
45
+ # @param colour [String] (nil) background hex colour (defaults to 000000).
46
+ # @return [String] the URL of the user's avatar.
47
+ def avatar_url(size: nil, colour: nil)
48
+ if size.present? && colour.present?
49
+ params = "?#{URI.encode_www_form(size: size, colour: colour)}"
50
+ elsif size.present?
51
+ params = "?#{URI.encode_www_form(size: size)}"
52
+ elsif colour.present?
53
+ params = "?#{URI.encode_www_form(colour: colour)}"
54
+ end
55
+ "#{self.class.base_uri}/users/#{guid}/avatar#{params}"
56
+ end
57
+
58
+ class << self
59
+ # Find a single user given the search criterion.
60
+ # In order to perform this search, the client must be configured with a
61
+ # valid OAuth client that is allowed to search for users:
62
+ #
63
+ # Talis::Authentication.client_id = 'client_id'
64
+ # Talis::Authentication.client_secret = 'client_secret'
65
+ #
66
+ # @param request_id [String] ('uuid') unique ID for the remote request.
67
+ # @param guid [String] the globally unique ID of the user to find.
68
+ # @return [User]
69
+ def find(request_id: new_req_id, guid:)
70
+ response = get("/users/#{guid}",
71
+ headers: {
72
+ 'X-Request-Id' => request_id,
73
+ 'Authorization' => "Bearer #{token}"
74
+ })
75
+ new(extract_user_data(handle_response(response)))
76
+ rescue Talis::NotFoundError
77
+ nil
78
+ end
79
+
80
+ # Builds a new user object. This is for creating user objects as a
81
+ # result of a successful login request.
82
+ # @param guid [String] the globally unique identifier for the user.
83
+ # @param first_name [String] the user's first name.
84
+ # @param surname [String] the user's surname.
85
+ # @param email [String] the user's E-mail address.
86
+ # @param access_token [String] (nil) valid user JWT.
87
+ # @return [User]
88
+ def build(guid:, first_name:, surname:, email:, access_token: nil)
89
+ options = {
90
+ guid: guid,
91
+ first_name: first_name,
92
+ surname: surname,
93
+ email: email,
94
+ token: Talis::Authentication::Token.new(jwt: access_token)
95
+ }
96
+ new(options)
97
+ end
98
+
99
+ private
100
+
101
+ def extract_user_data(data)
102
+ profile = data.fetch('profile', {})
103
+ {
104
+ guid: data['guid'],
105
+ first_name: profile['first_name'],
106
+ surname: profile['surname'],
107
+ email: profile['email']
108
+ }
109
+ end
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,3 @@
1
+ module Talis
2
+ VERSION = '0.12.0'.freeze
3
+ end
data/talis.gemspec ADDED
@@ -0,0 +1,39 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'talis/version'
5
+
6
+ # rubocop:disable Metrics/LineLength
7
+ Gem::Specification.new do |spec|
8
+ spec.name = 'talis'
9
+ spec.version = Talis::VERSION
10
+ spec.authors = ['Omar Qureshi', 'Ben Paddock']
11
+ spec.email = ['oq@talis.com', 'bp@talis.com']
12
+
13
+ spec.summary = 'Ruby client to utilise Talis primitive services'
14
+ spec.homepage = 'https://github.com/talis/talis_rb'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
+ spec.bindir = 'exe'
18
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_dependency 'uuid', '2.3.8'
22
+ spec.add_dependency 'jwt', '1.5.4'
23
+ spec.add_dependency 'activesupport', '~> 4.2.6'
24
+ spec.add_dependency 'httparty', '0.13.7'
25
+ spec.add_dependency 'multi_json', '1.11.2'
26
+ spec.add_dependency 'blueprint_ruby_client', '~> 0.5.2'
27
+ spec.add_dependency 'metatron_ruby_client', '~> 0.1.3'
28
+
29
+ spec.add_development_dependency 'cucumber'
30
+ spec.add_development_dependency 'dotenv'
31
+ spec.add_development_dependency 'bundler', '~> 1.11'
32
+ spec.add_development_dependency 'guard'
33
+ spec.add_development_dependency 'guard-rspec'
34
+ spec.add_development_dependency 'rake', '~> 10.0'
35
+ spec.add_development_dependency 'rspec', '~> 3.0'
36
+ spec.add_development_dependency 'rspec-wait'
37
+ spec.add_development_dependency 'rubocop', '~> 0.39.0'
38
+ spec.add_development_dependency 'webmock', '~> 1.24.2'
39
+ end
metadata ADDED
@@ -0,0 +1,327 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: talis
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.12.0
5
+ platform: ruby
6
+ authors:
7
+ - Omar Qureshi
8
+ - Ben Paddock
9
+ autorequire:
10
+ bindir: exe
11
+ cert_chain: []
12
+ date: 2017-08-23 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: uuid
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - '='
19
+ - !ruby/object:Gem::Version
20
+ version: 2.3.8
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - '='
26
+ - !ruby/object:Gem::Version
27
+ version: 2.3.8
28
+ - !ruby/object:Gem::Dependency
29
+ name: jwt
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - '='
33
+ - !ruby/object:Gem::Version
34
+ version: 1.5.4
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - '='
40
+ - !ruby/object:Gem::Version
41
+ version: 1.5.4
42
+ - !ruby/object:Gem::Dependency
43
+ name: activesupport
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: 4.2.6
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: 4.2.6
56
+ - !ruby/object:Gem::Dependency
57
+ name: httparty
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - '='
61
+ - !ruby/object:Gem::Version
62
+ version: 0.13.7
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - '='
68
+ - !ruby/object:Gem::Version
69
+ version: 0.13.7
70
+ - !ruby/object:Gem::Dependency
71
+ name: multi_json
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - '='
75
+ - !ruby/object:Gem::Version
76
+ version: 1.11.2
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - '='
82
+ - !ruby/object:Gem::Version
83
+ version: 1.11.2
84
+ - !ruby/object:Gem::Dependency
85
+ name: blueprint_ruby_client
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - "~>"
89
+ - !ruby/object:Gem::Version
90
+ version: 0.5.2
91
+ type: :runtime
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: 0.5.2
98
+ - !ruby/object:Gem::Dependency
99
+ name: metatron_ruby_client
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: 0.1.3
105
+ type: :runtime
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - "~>"
110
+ - !ruby/object:Gem::Version
111
+ version: 0.1.3
112
+ - !ruby/object:Gem::Dependency
113
+ name: cucumber
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: dotenv
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ - !ruby/object:Gem::Dependency
141
+ name: bundler
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - "~>"
145
+ - !ruby/object:Gem::Version
146
+ version: '1.11'
147
+ type: :development
148
+ prerelease: false
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - "~>"
152
+ - !ruby/object:Gem::Version
153
+ version: '1.11'
154
+ - !ruby/object:Gem::Dependency
155
+ name: guard
156
+ requirement: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ version: '0'
161
+ type: :development
162
+ prerelease: false
163
+ version_requirements: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - ">="
166
+ - !ruby/object:Gem::Version
167
+ version: '0'
168
+ - !ruby/object:Gem::Dependency
169
+ name: guard-rspec
170
+ requirement: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - ">="
173
+ - !ruby/object:Gem::Version
174
+ version: '0'
175
+ type: :development
176
+ prerelease: false
177
+ version_requirements: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - ">="
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
182
+ - !ruby/object:Gem::Dependency
183
+ name: rake
184
+ requirement: !ruby/object:Gem::Requirement
185
+ requirements:
186
+ - - "~>"
187
+ - !ruby/object:Gem::Version
188
+ version: '10.0'
189
+ type: :development
190
+ prerelease: false
191
+ version_requirements: !ruby/object:Gem::Requirement
192
+ requirements:
193
+ - - "~>"
194
+ - !ruby/object:Gem::Version
195
+ version: '10.0'
196
+ - !ruby/object:Gem::Dependency
197
+ name: rspec
198
+ requirement: !ruby/object:Gem::Requirement
199
+ requirements:
200
+ - - "~>"
201
+ - !ruby/object:Gem::Version
202
+ version: '3.0'
203
+ type: :development
204
+ prerelease: false
205
+ version_requirements: !ruby/object:Gem::Requirement
206
+ requirements:
207
+ - - "~>"
208
+ - !ruby/object:Gem::Version
209
+ version: '3.0'
210
+ - !ruby/object:Gem::Dependency
211
+ name: rspec-wait
212
+ requirement: !ruby/object:Gem::Requirement
213
+ requirements:
214
+ - - ">="
215
+ - !ruby/object:Gem::Version
216
+ version: '0'
217
+ type: :development
218
+ prerelease: false
219
+ version_requirements: !ruby/object:Gem::Requirement
220
+ requirements:
221
+ - - ">="
222
+ - !ruby/object:Gem::Version
223
+ version: '0'
224
+ - !ruby/object:Gem::Dependency
225
+ name: rubocop
226
+ requirement: !ruby/object:Gem::Requirement
227
+ requirements:
228
+ - - "~>"
229
+ - !ruby/object:Gem::Version
230
+ version: 0.39.0
231
+ type: :development
232
+ prerelease: false
233
+ version_requirements: !ruby/object:Gem::Requirement
234
+ requirements:
235
+ - - "~>"
236
+ - !ruby/object:Gem::Version
237
+ version: 0.39.0
238
+ - !ruby/object:Gem::Dependency
239
+ name: webmock
240
+ requirement: !ruby/object:Gem::Requirement
241
+ requirements:
242
+ - - "~>"
243
+ - !ruby/object:Gem::Version
244
+ version: 1.24.2
245
+ type: :development
246
+ prerelease: false
247
+ version_requirements: !ruby/object:Gem::Requirement
248
+ requirements:
249
+ - - "~>"
250
+ - !ruby/object:Gem::Version
251
+ version: 1.24.2
252
+ description:
253
+ email:
254
+ - oq@talis.com
255
+ - bp@talis.com
256
+ executables: []
257
+ extensions: []
258
+ extra_rdoc_files: []
259
+ files:
260
+ - ".gitignore"
261
+ - ".rspec"
262
+ - ".rubocop.yml"
263
+ - ".travis.yml"
264
+ - ".yardopts"
265
+ - CONTRIBUTING.md
266
+ - Gemfile
267
+ - Guardfile
268
+ - README.md
269
+ - Rakefile
270
+ - bin/console
271
+ - bin/setup
272
+ - lib/talis.rb
273
+ - lib/talis/analytics.rb
274
+ - lib/talis/analytics/event.rb
275
+ - lib/talis/authentication.rb
276
+ - lib/talis/authentication/client.rb
277
+ - lib/talis/authentication/login.rb
278
+ - lib/talis/authentication/public_key.rb
279
+ - lib/talis/authentication/token.rb
280
+ - lib/talis/bibliography.rb
281
+ - lib/talis/bibliography/ebook.rb
282
+ - lib/talis/bibliography/manifestation.rb
283
+ - lib/talis/bibliography/result_set.rb
284
+ - lib/talis/bibliography/work.rb
285
+ - lib/talis/constants.rb
286
+ - lib/talis/errors.rb
287
+ - lib/talis/errors/authentication_failed_error.rb
288
+ - lib/talis/errors/client_errors.rb
289
+ - lib/talis/errors/server_communication_error.rb
290
+ - lib/talis/errors/server_error.rb
291
+ - lib/talis/extensions/object.rb
292
+ - lib/talis/feeds.rb
293
+ - lib/talis/feeds/annotation.rb
294
+ - lib/talis/feeds/feed.rb
295
+ - lib/talis/hierarchy.rb
296
+ - lib/talis/hierarchy/asset.rb
297
+ - lib/talis/hierarchy/node.rb
298
+ - lib/talis/hierarchy/resource.rb
299
+ - lib/talis/oauth_service.rb
300
+ - lib/talis/resource.rb
301
+ - lib/talis/user.rb
302
+ - lib/talis/version.rb
303
+ - talis.gemspec
304
+ homepage: https://github.com/talis/talis_rb
305
+ licenses: []
306
+ metadata: {}
307
+ post_install_message:
308
+ rdoc_options: []
309
+ require_paths:
310
+ - lib
311
+ required_ruby_version: !ruby/object:Gem::Requirement
312
+ requirements:
313
+ - - ">="
314
+ - !ruby/object:Gem::Version
315
+ version: '0'
316
+ required_rubygems_version: !ruby/object:Gem::Requirement
317
+ requirements:
318
+ - - ">="
319
+ - !ruby/object:Gem::Version
320
+ version: '0'
321
+ requirements: []
322
+ rubyforge_project:
323
+ rubygems_version: 2.5.2
324
+ signing_key:
325
+ specification_version: 4
326
+ summary: Ruby client to utilise Talis primitive services
327
+ test_files: []