quiz_api_client 3.0.0 → 4.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 0002646bbd669ca217b0ccaf7efb17c3c4cfd71c
4
- data.tar.gz: 89fd9e51d2c4ef12392f8d8d6e726365133d20ef
2
+ SHA256:
3
+ metadata.gz: f901bb687e405ab11127e8cbbe476f38c3578d122d838b25438cc106287b4d83
4
+ data.tar.gz: 6bae389bad7c912f709747a00a562e42cd10e4b85d1d72f5a7c5ffff6564ae61
5
5
  SHA512:
6
- metadata.gz: d9046f4bd68c290d8131afcb57b9410812b3283d9a18190b59772c8cbf46a2da16ff0b6d66687a76df5321c832c1a9e6de495687a72852ba0c329f81dd115b9c
7
- data.tar.gz: 93ffc9705ec2df78a76bbce0e66aebb3c1e1f2f28e662cf8de2839296ce2e81388a90a7863746cbc4b48ca587fb9d606ee9f79b65e650513026d9c011d3ff070
6
+ metadata.gz: 519030cead9c1d820cf40bb489029433f751ce41e6488dcddfd7a8520ea2c47c5fa7a8a96e0aaea59640793f0efcc7fcd825c3d5e2fbe026533cb9d18208fd18
7
+ data.tar.gz: b906985f27f6e78e734f248685ae071efde9414cc3198d5a214caf9d54d8c1d2f29e6cc7d9e53677eac2c1c1d4d9bbd3016f3cea210173c1cf00628784d18507
data/.rubocop.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  AllCops:
2
- TargetRubyVersion: 2.4
2
+ TargetRubyVersion: 2.6
3
3
 
4
4
  Metrics/ClassLength:
5
5
  Max: 200 # Default: 100
data/CHANGELOG.md ADDED
@@ -0,0 +1,28 @@
1
+ CHANGELOG
2
+ =========
3
+
4
+ All notable changes to this project will be documented in this file. This
5
+ project adheres to [Semantic Versioning](http://semver.org/).
6
+
7
+ [TOC]
8
+
9
+ ## 4.1.0 (2021-10-27)
10
+
11
+ ### Breaking changes (potentially)
12
+
13
+ * All non-successful (2xx) responses will raise `QuizApiClient::HttpClient::RequestFailed` error except for 401 and 422
14
+ * Can be overridden in `allowable_response_codes` config
15
+
16
+ ## 4.0.0 (2021-10-18)
17
+
18
+ ### Breaking changes
19
+
20
+ * Ruby 2.4.x is no longer supported
21
+ * Ruby 2.5.x is no longer supported
22
+
23
+ ### Changed
24
+ * Minimum Ruby version to 2.6.x
25
+ * Internal classes use a configuration object instead parameters on instantiation
26
+ * Instantiating `QuizApiClient::Client` remains the same
27
+ * Added `error_handler` configuration to work with Sentry Raven gem
28
+
data/Dockerfile CHANGED
@@ -4,8 +4,9 @@ RUN mkdir -p coverage log pacts
4
4
 
5
5
  COPY --chown=docker:docker quiz_api_client.gemspec Gemfile ./
6
6
  COPY --chown=docker:docker lib/quiz_api_client/version.rb lib/quiz_api_client/version.rb
7
- RUN /bin/bash -l -c "rvm-exec 2.4 bundle install --jobs 5"
7
+ RUN /bin/bash -l -c "rvm-exec 2.6 gem install bundler -v 2.1.4"
8
+ RUN /bin/bash -l -c "rvm-exec 2.6 bundle install --jobs 5"
8
9
 
9
10
  COPY --chown=docker:docker . .
10
11
 
11
- CMD /bin/bash -l -c "rvm-exec 2.4 bundle exec rspec"
12
+ CMD /bin/bash -l -c "rvm-exec 2.6 bundle exec rspec"
data/Jenkinsfile CHANGED
@@ -1,7 +1,20 @@
1
+ def buildMatrix = ['2.6', '2.7'].collectEntries { ruby ->
2
+ ["Ruby ${ruby}": {
3
+ sh """
4
+ docker-compose run --name "${env.BUILD_ID}-ruby-${ruby}" \
5
+ app /bin/bash -lc "rvm-exec ${ruby} bundle install --jobs 5 && rvm-exec ${ruby} bundle exec rspec"
6
+ """
7
+ }]
8
+ }
9
+
1
10
  pipeline {
2
11
  agent {
3
12
  label 'docker'
4
13
  }
14
+ options {
15
+ buildDiscarder(logRotator(numToKeepStr: '50'))
16
+ timeout(time: 20, unit: 'MINUTES')
17
+ }
5
18
  stages {
6
19
  stage('Build') {
7
20
  steps {
@@ -12,14 +25,16 @@ pipeline {
12
25
  steps {
13
26
  sh '''
14
27
  docker-compose run --rm app /bin/bash -lc \
15
- "rvm-exec 2.4 bundle exec rubocop --fail-level autocorrect"
28
+ "rvm-exec 2.6 bundle exec rubocop --fail-level autocorrect"
16
29
  '''
17
30
  }
18
31
  }
19
- stage('Test') {
32
+ stage('Unit Tests') {
33
+ steps { script { parallel buildMatrix } }
34
+ }
35
+ stage('Contract Tests') {
20
36
  steps {
21
- sh 'docker-compose run --name coverage app'
22
- sh 'docker-compose run app /bin/bash -l -c "rvm-exec 2.4 bundle exec rspec -t pact"'
37
+ sh 'docker-compose run app /bin/bash -l -c "rvm-exec 2.6 bundle exec rspec -t pact"'
23
38
  }
24
39
  }
25
40
  stage ('Publish') {
@@ -43,7 +58,7 @@ pipeline {
43
58
  -e PACT_BROKER_PASSWORD="${PACT_BROKER_PASSWORD}" \
44
59
  -e PACT_CONSUMER_TAG="${PACT_CONSUMER_TAG}" \
45
60
  -e SHA="${sha}" \
46
- app /bin/bash -l -c "rvm-exec 2.4 bundle exec rake broker:pact:publish:jenkins_post_merge"
61
+ app /bin/bash -l -c "rvm-exec 2.6 bundle exec rake broker:pact:publish:jenkins_post_merge"
47
62
  '''
48
63
  }
49
64
  }
@@ -52,7 +67,7 @@ pipeline {
52
67
 
53
68
  post {
54
69
  success {
55
- sh 'docker cp coverage:/usr/src/app/coverage .'
70
+ sh "docker cp \"${env.BUILD_ID}-ruby-2.6:/usr/src/app/coverage\" ."
56
71
  publishHTML target: [
57
72
  allowMissing: false,
58
73
  alwaysLinkToLastBuild: false,
data/README.md CHANGED
@@ -37,6 +37,10 @@ client = QuizApiClient::Client.new(
37
37
  )
38
38
  ```
39
39
 
40
+ ### Error Handler
41
+
42
+ In order to set addition error information in your error handling system, you can set the `error_hander` property of the config. The list of valid values can be found in the `QuizApiClient::Config::ERROR_HANDLERS` constant.
43
+
40
44
  ### Creation of Tokens
41
45
 
42
46
  JWTs are created without hitting quiz_api and and they are validated on quiz_api. Tokens are created for a given scope, expiration, and an optional resource_id.
@@ -22,6 +22,5 @@ set -e
22
22
  rm -rf pacts
23
23
  sha="$(git rev-parse --short HEAD)"
24
24
 
25
-
26
- docker-compose run --name contracts -e SHA="${sha}" app bash -c \
27
- "bundle && bundle exec rspec spec/contracts && bundle exec rake broker:pact:publish:local"
25
+ docker-compose run --name contracts -e SHA="${sha}" app bash -l -c \
26
+ "bundle && bundle exec rspec --tag pact && bundle exec rake broker:pact:publish:local"
@@ -0,0 +1,43 @@
1
+ module QuizApiClient
2
+ class Config
3
+ DEFAULT_ALLOWABLE_RESPONSE_CODES = [401, 422].freeze
4
+ DEFAULT_PROTOCOL = 'https'.freeze
5
+ ERROR_HANDLERS = %i[sentry_raven].freeze
6
+
7
+ class InvalidErrorHandler < StandardError; end
8
+
9
+ attr_reader :error_handler
10
+ attr_writer :protocol, :allowable_response_codes
11
+ attr_accessor :consumer_key, :consumer_request_id, :host, :shared_secret
12
+
13
+ def initialize
14
+ yield(self) if block_given?
15
+ end
16
+
17
+ def protocol
18
+ @protocol || DEFAULT_PROTOCOL
19
+ end
20
+
21
+ def error_handler=(handler)
22
+ validate_error_hander!(handler)
23
+
24
+ @error_handler = handler
25
+ end
26
+
27
+ def allowable_response_codes
28
+ @allowable_response_codes || DEFAULT_ALLOWABLE_RESPONSE_CODES
29
+ end
30
+
31
+ private
32
+
33
+ def validate_error_hander!(handler)
34
+ return unless handler
35
+
36
+ unless ERROR_HANDLERS.include?(handler)
37
+ raise InvalidErrorHandler, "It must be one of the following: #{ERROR_HANDLERS.inspect}"
38
+ end
39
+
40
+ @error_handler = handler.to_sym
41
+ end
42
+ end
43
+ end
@@ -4,14 +4,21 @@ module QuizApiClient
4
4
  class HttpClient
5
5
  include HTTParty
6
6
 
7
- class RequestFailed < StandardError; end
7
+ class RequestFailed < StandardError
8
+ attr_reader :context
8
9
 
9
- attr_reader :jwt, :uri
10
+ def initialize(context)
11
+ @context = context
12
+ super(context)
13
+ end
14
+ end
15
+
16
+ attr_reader :jwt, :uri, :config
10
17
 
11
- def initialize(uri:, jwt:, consumer_request_id: nil, logging: true, log_level: :info)
18
+ def initialize(uri:, jwt:, config:, logging: true, log_level: :info)
12
19
  @uri = uri
13
20
  @jwt = jwt
14
- @consumer_request_id = consumer_request_id
21
+ @config = config
15
22
  initialize_logger(log_level) if logging
16
23
  end
17
24
 
@@ -49,7 +56,7 @@ module QuizApiClient
49
56
  HTTParty::Logger.add_formatter('quiz_api_client_json_formatter', QuizApiClient::JSONFormatter)
50
57
  @logger = ::Logger.new(
51
58
  STDOUT,
52
- formatter: proc { |_, _, _, msg| msg.merge(consumer_request_id: @consumer_request_id).to_json },
59
+ formatter: proc { |_, _, _, msg| msg.merge(consumer_request_id: config.consumer_request_id).to_json },
53
60
  level: unfriendly_logger_level(log_level)
54
61
  )
55
62
  @logger_config = {
@@ -75,13 +82,15 @@ module QuizApiClient
75
82
  end
76
83
 
77
84
  def make_request(method, url, request_options = {})
78
- self.class.send(
85
+ resp = self.class.send(
79
86
  method,
80
87
  url,
81
88
  default_request_data.merge(request_options)
82
89
  )
90
+ raise_error(method, url, response: resp) unless successful_response?(resp)
91
+ resp
83
92
  rescue HTTParty::Error, Errno::ECONNREFUSED, Net::ReadTimeout => e
84
- raise RequestFailed, e.message
93
+ raise_error(method, url, current_error: e)
85
94
  end
86
95
 
87
96
  def make_paginated_request(method, url, options)
@@ -91,8 +100,6 @@ module QuizApiClient
91
100
 
92
101
  until request_url.nil?
93
102
  resp = make_request(method, request_url, request_options)
94
- raise RequestFailed, "#{url} responded #{resp.body} (#{resp.code})" unless resp.code == 200
95
-
96
103
  entities.concat(resp.parsed_response)
97
104
  request_url, request_options = next_page(resp, url, options)
98
105
  end
@@ -109,7 +116,7 @@ module QuizApiClient
109
116
  }
110
117
  }
111
118
 
112
- initial_hash[:headers]['X-Consumer-Request-Id'] = @consumer_request_id if @consumer_request_id
119
+ initial_hash[:headers]['X-Consumer-Request-Id'] = config.consumer_request_id if config.consumer_request_id
113
120
 
114
121
  initial_hash.merge!(@logger_config) if @logger_config
115
122
  initial_hash
@@ -138,5 +145,55 @@ module QuizApiClient
138
145
  )
139
146
  [url, options.merge(query: query)]
140
147
  end
148
+
149
+ def generate_error_context(method, url, response = nil)
150
+ context = {
151
+ quiz_api_client: {
152
+ request: {
153
+ method: method,
154
+ url: url
155
+ }
156
+ }
157
+ }
158
+
159
+ if response
160
+ context[:quiz_api_client][:response] = {
161
+ body: response.body,
162
+ code: response.code
163
+ }
164
+ end
165
+
166
+ context
167
+ end
168
+
169
+ def record_error_context(context)
170
+ case config.error_handler
171
+ when :sentry_raven
172
+ require 'sentry-raven'
173
+ Raven.extra_context(context)
174
+ end
175
+ end
176
+
177
+ def error_message(current_error, url, response)
178
+ if current_error && response
179
+ "#{current_error.message}: #{url} responded #{response.body} (#{response.code})"
180
+ elsif current_error
181
+ current_error.message
182
+ elsif response
183
+ "#{url} responded #{response.body} (#{response.code})"
184
+ end
185
+ end
186
+
187
+ def raise_error(method, url, response: nil, current_error: nil, error_class: RequestFailed)
188
+ context = generate_error_context(method, url, response)
189
+
190
+ record_error_context(context)
191
+
192
+ raise error_class.new(context), error_message(current_error, url, response)
193
+ end
194
+
195
+ def successful_response?(resp)
196
+ resp.success? || config.allowable_response_codes.include?(resp.code)
197
+ end
141
198
  end
142
199
  end
@@ -1,29 +1,23 @@
1
1
  module QuizApiClient::Services
2
2
  class BaseApiService
3
- attr_reader :consumer_key, :errors, :host, :protocol, :shared_secret
3
+ attr_reader :config
4
4
 
5
- def initialize(
6
- consumer_key:, consumer_request_id: nil, host:, protocol: 'https', shared_secret:
7
- )
8
- @consumer_key = consumer_key
9
- @consumer_request_id = consumer_request_id
10
- @host = host
11
- @protocol = protocol
12
- @shared_secret = shared_secret
5
+ def initialize(config)
6
+ @config = config
13
7
  @errors = []
14
8
  end
15
9
 
16
10
  private
17
11
 
18
12
  def uri
19
- URI.parse("#{protocol}://#{host}").to_s
13
+ URI.parse("#{config.protocol}://#{config.host}").to_s
20
14
  end
21
15
 
22
16
  def client(token:)
23
17
  QuizApiClient::HttpClient.new(
24
18
  uri: uri,
25
19
  jwt: token,
26
- consumer_request_id: @consumer_request_id
20
+ config: config
27
21
  )
28
22
  end
29
23
  end
@@ -1,15 +1,14 @@
1
1
  module QuizApiClient::Services
2
2
  class JwtService
3
+ extend Forwardable
4
+
3
5
  HASHING_ALGORITHM = 'HS512'.freeze
4
6
 
5
- attr_reader :consumer_key, :host, :shared_secret, :protocol
7
+ attr_reader :config
8
+ def_delegators :config, :host, :protocol, :consumer_key
6
9
 
7
- def initialize(consumer_key: nil, consumer_request_id: nil, shared_secret:, host:, protocol: 'https')
8
- @consumer_key = consumer_key
9
- @host = host
10
- @shared_secret = shared_secret
11
- @protocol = protocol
12
- @consumer_request_id = consumer_request_id
10
+ def initialize(config)
11
+ @config = config
13
12
  end
14
13
 
15
14
  def grant_permission(scope:, exp: nil, uuid: nil, **additional_fields)
@@ -26,7 +25,7 @@ module QuizApiClient::Services
26
25
  payload[:user][:uuid] = uuid
27
26
  end
28
27
 
29
- JWT.encode(payload, shared_secret, HASHING_ALGORITHM)
28
+ JWT.encode(payload, config.shared_secret, HASHING_ALGORITHM)
30
29
  end
31
30
  end
32
31
  end
@@ -3,16 +3,25 @@ module QuizApiClient::Services
3
3
  def create(params:, token: nil)
4
4
  raise 'Quiz Id Required' unless params && params[:quiz_id]
5
5
 
6
- post_to_quiz_api(params: params, token: token)
6
+ client(token: token).post(
7
+ "/api/quizzes/#{params[:quiz_id]}/qti_imports",
8
+ qti_import: params
9
+ )
7
10
  end
8
11
 
9
- private
10
-
11
- def post_to_quiz_api(params:, token:)
12
+ def banks(params:, token: nil)
12
13
  client(token: token).post(
13
- "/api/quizzes/#{params[:quiz_id]}/qti_imports",
14
+ '/api/qti_imports/banks',
14
15
  qti_import: params
15
16
  )
16
17
  end
18
+
19
+ def get_imported_consumer_settings(params:, token: nil)
20
+ raise 'Quiz Id Required' unless params && params[:quiz_id]
21
+
22
+ client(token: token).get(
23
+ "/api/quizzes/#{params[:quiz_id]}/qti_imports/imported_consumer_settings"
24
+ )
25
+ end
17
26
  end
18
27
  end
@@ -1,3 +1,3 @@
1
1
  module QuizApiClient
2
- VERSION = '3.0.0'.freeze
2
+ VERSION = '4.1.0'.freeze
3
3
  end
@@ -4,104 +4,101 @@ require 'link_header'
4
4
 
5
5
  module QuizApiClient
6
6
  class Client
7
- attr_reader :consumer_key, :consumer_request_id, :host, :protocol, :shared_secret
7
+ extend Forwardable
8
+
9
+ def_delegators :config, :consumer_key, :consumer_request_id, :host, :protocol, :shared_secret
8
10
 
9
11
  def initialize(consumer_key:, host:, shared_secret:, protocol: 'https', consumer_request_id: nil)
10
- @consumer_key = consumer_key
11
- @host = host
12
- @shared_secret = shared_secret
13
- @protocol = protocol
14
- @consumer_request_id = consumer_request_id
12
+ config.consumer_key = consumer_key
13
+ config.host = host
14
+ config.shared_secret = shared_secret
15
+ config.protocol = protocol
16
+ config.consumer_request_id = consumer_request_id
17
+
18
+ yield(config) if block_given?
19
+ end
20
+
21
+ def config
22
+ @_config ||= QuizApiClient::Config.new
15
23
  end
16
24
 
17
25
  def jwt_service
18
- @_jwt_service ||= QuizApiClient::Services::JwtService.new(service_params)
26
+ @_jwt_service ||= QuizApiClient::Services::JwtService.new(config)
19
27
  end
20
28
 
21
29
  def quiz_service
22
- @_quiz_service ||= Services::QuizService.new(service_params)
30
+ @_quiz_service ||= Services::QuizService.new(config)
23
31
  end
24
32
 
25
33
  def quizzes_service
26
- @_quizzes_service ||= Services::QuizzesService.new(service_params)
34
+ @_quizzes_service ||= Services::QuizzesService.new(config)
27
35
  end
28
36
 
29
37
  def quiz_session_service
30
- @_quiz_session_service ||= Services::QuizSessionService.new(service_params)
38
+ @_quiz_session_service ||= Services::QuizSessionService.new(config)
31
39
  end
32
40
 
33
41
  def quiz_sessions_service
34
- @_quiz_sessions_service ||= Services::QuizSessionsService.new(service_params)
42
+ @_quiz_sessions_service ||= Services::QuizSessionsService.new(config)
35
43
  end
36
44
 
37
45
  def quiz_clone_job_service
38
- @_quiz_clone_job_service ||= Services::QuizCloneJobService.new(service_params)
46
+ @_quiz_clone_job_service ||= Services::QuizCloneJobService.new(config)
39
47
  end
40
48
 
41
49
  def quiz_clone_jobs_service
42
- @_quiz_clone_jobs_service ||= Services::QuizCloneJobsService.new(service_params)
50
+ @_quiz_clone_jobs_service ||= Services::QuizCloneJobsService.new(config)
43
51
  end
44
52
 
45
53
  def qti_imports_service
46
- @_qti_imports_service ||= Services::QtiImportsService.new(service_params)
54
+ @_qti_imports_service ||= Services::QtiImportsService.new(config)
47
55
  end
48
56
 
49
57
  def item_analyses_service
50
- @_item_analyses_service ||= Services::ItemAnalysesService.new(service_params)
58
+ @_item_analyses_service ||= Services::ItemAnalysesService.new(config)
51
59
  end
52
60
 
53
61
  def quiz_analyses_service
54
- @_quiz_analyses_service ||= Services::QuizAnalysesService.new(service_params)
62
+ @_quiz_analyses_service ||= Services::QuizAnalysesService.new(config)
55
63
  end
56
64
 
57
65
  def quiz_session_events_service
58
- @_quiz_session_events_service ||= Services::QuizSessionEventsService.new(service_params)
66
+ @_quiz_session_events_service ||= Services::QuizSessionEventsService.new(config)
59
67
  end
60
68
 
61
69
  def quiz_session_result_service
62
- @_quiz_session_result_service ||= Services::QuizSessionResultService.new(service_params)
70
+ @_quiz_session_result_service ||= Services::QuizSessionResultService.new(config)
63
71
  end
64
72
 
65
73
  def quiz_entries_service
66
- @_quiz_entries_service ||= Services::QuizEntriesService.new(service_params)
74
+ @_quiz_entries_service ||= Services::QuizEntriesService.new(config)
67
75
  end
68
76
 
69
77
  def session_items_service
70
- @_session_items_service ||= Services::SessionItemsService.new(service_params)
78
+ @_session_items_service ||= Services::SessionItemsService.new(config)
71
79
  end
72
80
 
73
81
  def session_item_results_service
74
- @_session_item_results_service ||= Services::SessionItemResultsService.new(service_params)
82
+ @_session_item_results_service ||= Services::SessionItemResultsService.new(config)
75
83
  end
76
84
 
77
85
  def items_service
78
- @_items_service ||= QuizApiClient::Services::ItemsService.new(service_params)
86
+ @_items_service ||= QuizApiClient::Services::ItemsService.new(config)
79
87
  end
80
88
 
81
89
  def interaction_types_service
82
- @_interaction_types_service ||= QuizApiClient::Services::InteractionTypesService.new(service_params)
90
+ @_interaction_types_service ||= QuizApiClient::Services::InteractionTypesService.new(config)
83
91
  end
84
92
 
85
93
  def shared_banks
86
- @_shared_banks ||= QuizApiClient::Services::SharedBanks.new(service_params)
87
- end
88
-
89
- private
90
-
91
- def service_params
92
- {
93
- consumer_key: consumer_key,
94
- consumer_request_id: consumer_request_id,
95
- host: host,
96
- protocol: protocol,
97
- shared_secret: shared_secret
98
- }
94
+ @_shared_banks ||= QuizApiClient::Services::SharedBanks.new(config)
99
95
  end
100
96
  end
101
97
  end
102
98
 
103
99
  require 'quiz_api_client/version'
104
100
 
101
+ require 'quiz_api_client/config'
105
102
  require 'quiz_api_client/http_client'
106
103
  require 'quiz_api_client/json_formatter'
107
104
  require 'quiz_api_client/services/jwt_service'
@@ -13,6 +13,7 @@ Gem::Specification.new do |spec|
13
13
  'Han Yan',
14
14
  'Jayce Higgins',
15
15
  'Marc Alan Phillips',
16
+ 'Mark Starkman',
16
17
  'Michael Brewer-Davis',
17
18
  'Michael Hargiss',
18
19
  'Omar Khan',
@@ -26,6 +27,7 @@ Gem::Specification.new do |spec|
26
27
  'hyan@instructure.com',
27
28
  'jhiggins@instructure.com',
28
29
  'mphillips@instructure.com',
30
+ 'mark.starkman@instructure.com',
29
31
  'mbd@instructure.com',
30
32
  'mhargiss@instructure.com',
31
33
  'okhan@instructure.com',
@@ -40,18 +42,18 @@ Gem::Specification.new do |spec|
40
42
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
41
43
  spec.require_paths = ['lib']
42
44
 
43
- spec.required_ruby_version = '>= 2.4'
45
+ spec.required_ruby_version = '>= 2.6'
44
46
 
45
47
  spec.add_dependency 'httparty', '~> 0.17'
46
48
  spec.add_dependency 'jwt', '~> 2.2'
47
49
  spec.add_dependency 'link_header', '~> 0.0'
48
50
 
49
- spec.add_development_dependency 'bundler', '~> 1.17'
50
51
  spec.add_development_dependency 'pact', '~> 1.41'
51
52
  spec.add_development_dependency 'pact_broker-client', '~> 1.19'
52
53
  spec.add_development_dependency 'rake', '~> 12.3'
53
54
  spec.add_development_dependency 'rspec', '~> 3.8'
54
55
  spec.add_development_dependency 'rubocop', '~> 0.74.0'
56
+ spec.add_development_dependency 'sentry-raven', '~> 3.1'
55
57
  spec.add_development_dependency 'simplecov'
56
58
  spec.add_development_dependency 'webmock'
57
59
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: quiz_api_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0
4
+ version: 4.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Wang
@@ -11,15 +11,16 @@ authors:
11
11
  - Han Yan
12
12
  - Jayce Higgins
13
13
  - Marc Alan Phillips
14
+ - Mark Starkman
14
15
  - Michael Brewer-Davis
15
16
  - Michael Hargiss
16
17
  - Omar Khan
17
18
  - Robin Kuss
18
19
  - Ryan Taylor
19
- autorequire:
20
+ autorequire:
20
21
  bindir: exe
21
22
  cert_chain: []
22
- date: 2019-08-27 00:00:00.000000000 Z
23
+ date: 2021-10-27 00:00:00.000000000 Z
23
24
  dependencies:
24
25
  - !ruby/object:Gem::Dependency
25
26
  name: httparty
@@ -63,20 +64,6 @@ dependencies:
63
64
  - - "~>"
64
65
  - !ruby/object:Gem::Version
65
66
  version: '0.0'
66
- - !ruby/object:Gem::Dependency
67
- name: bundler
68
- requirement: !ruby/object:Gem::Requirement
69
- requirements:
70
- - - "~>"
71
- - !ruby/object:Gem::Version
72
- version: '1.17'
73
- type: :development
74
- prerelease: false
75
- version_requirements: !ruby/object:Gem::Requirement
76
- requirements:
77
- - - "~>"
78
- - !ruby/object:Gem::Version
79
- version: '1.17'
80
67
  - !ruby/object:Gem::Dependency
81
68
  name: pact
82
69
  requirement: !ruby/object:Gem::Requirement
@@ -147,6 +134,20 @@ dependencies:
147
134
  - - "~>"
148
135
  - !ruby/object:Gem::Version
149
136
  version: 0.74.0
137
+ - !ruby/object:Gem::Dependency
138
+ name: sentry-raven
139
+ requirement: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - "~>"
142
+ - !ruby/object:Gem::Version
143
+ version: '3.1'
144
+ type: :development
145
+ prerelease: false
146
+ version_requirements: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - "~>"
149
+ - !ruby/object:Gem::Version
150
+ version: '3.1'
150
151
  - !ruby/object:Gem::Dependency
151
152
  name: simplecov
152
153
  requirement: !ruby/object:Gem::Requirement
@@ -175,7 +176,7 @@ dependencies:
175
176
  - - ">="
176
177
  - !ruby/object:Gem::Version
177
178
  version: '0'
178
- description:
179
+ description:
179
180
  email:
180
181
  - acallejas@instructure.com
181
182
  - bpetty@instructure.com
@@ -183,6 +184,7 @@ email:
183
184
  - hyan@instructure.com
184
185
  - jhiggins@instructure.com
185
186
  - mphillips@instructure.com
187
+ - mark.starkman@instructure.com
186
188
  - mbd@instructure.com
187
189
  - mhargiss@instructure.com
188
190
  - okhan@instructure.com
@@ -198,6 +200,7 @@ files:
198
200
  - ".gitignore"
199
201
  - ".rspec"
200
202
  - ".rubocop.yml"
203
+ - CHANGELOG.md
201
204
  - Dockerfile
202
205
  - Gemfile
203
206
  - Jenkinsfile
@@ -209,6 +212,7 @@ files:
209
212
  - docker-compose.dev.override.yml
210
213
  - docker-compose.yml
211
214
  - lib/quiz_api_client.rb
215
+ - lib/quiz_api_client/config.rb
212
216
  - lib/quiz_api_client/http_client.rb
213
217
  - lib/quiz_api_client/json_formatter.rb
214
218
  - lib/quiz_api_client/services/base_api_service.rb
@@ -232,10 +236,10 @@ files:
232
236
  - lib/quiz_api_client/services/shared_banks.rb
233
237
  - lib/quiz_api_client/version.rb
234
238
  - quiz_api_client.gemspec
235
- homepage:
239
+ homepage:
236
240
  licenses: []
237
241
  metadata: {}
238
- post_install_message:
242
+ post_install_message:
239
243
  rdoc_options: []
240
244
  require_paths:
241
245
  - lib
@@ -243,16 +247,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
243
247
  requirements:
244
248
  - - ">="
245
249
  - !ruby/object:Gem::Version
246
- version: '2.4'
250
+ version: '2.6'
247
251
  required_rubygems_version: !ruby/object:Gem::Requirement
248
252
  requirements:
249
253
  - - ">="
250
254
  - !ruby/object:Gem::Version
251
255
  version: '0'
252
256
  requirements: []
253
- rubyforge_project:
254
- rubygems_version: 2.6.14.4
255
- signing_key:
257
+ rubygems_version: 3.1.6
258
+ signing_key:
256
259
  specification_version: 4
257
260
  summary: Ruby client for quiz_api
258
261
  test_files: []