quiz_api_client 2.9.0 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/.dockerignore +3 -0
  3. data/.gitignore +1 -0
  4. data/.rspec +1 -0
  5. data/.rubocop.yml +6 -5
  6. data/Dockerfile +7 -15
  7. data/Jenkinsfile +86 -0
  8. data/README.md +4 -0
  9. data/Rakefile +1 -1
  10. data/bin/contracts-generate +3 -4
  11. data/docker-compose.dev.override.yml +7 -15
  12. data/docker-compose.yml +2 -7
  13. data/lib/quiz_api_client/config.rb +38 -0
  14. data/lib/quiz_api_client/http_client.rb +56 -7
  15. data/lib/quiz_api_client/services/base_api_service.rb +5 -11
  16. data/lib/quiz_api_client/services/item_analyses_service.rb +2 -0
  17. data/lib/quiz_api_client/services/items_service.rb +1 -0
  18. data/lib/quiz_api_client/services/jwt_service.rb +7 -8
  19. data/lib/quiz_api_client/services/qti_imports_service.rb +15 -5
  20. data/lib/quiz_api_client/services/quiz_analyses_service.rb +1 -0
  21. data/lib/quiz_api_client/services/quiz_clone_job_service.rb +1 -0
  22. data/lib/quiz_api_client/services/quiz_entries_service.rb +3 -0
  23. data/lib/quiz_api_client/services/quiz_session_events_service.rb +1 -0
  24. data/lib/quiz_api_client/services/quiz_session_result_service.rb +1 -0
  25. data/lib/quiz_api_client/services/quiz_session_service.rb +1 -0
  26. data/lib/quiz_api_client/services/quiz_sessions_service.rb +2 -0
  27. data/lib/quiz_api_client/services/session_item_results_service.rb +1 -0
  28. data/lib/quiz_api_client/services/session_items_service.rb +1 -0
  29. data/lib/quiz_api_client/services/shared_banks.rb +3 -0
  30. data/lib/quiz_api_client/version.rb +1 -1
  31. data/lib/quiz_api_client.rb +33 -36
  32. data/quiz_api_client.gemspec +12 -10
  33. metadata +37 -42
  34. data/Dockerfile.contracts +0 -19
  35. data/build.sh +0 -49
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b8e9117e1b2cc22ef6f530c9ffdc08bc0660c068a51b808b53db9e6cb7e4bd53
4
- data.tar.gz: 880060748ab051cf51ea29e7b568c30ae49aac9577bb81c7c6eb55aba2e74f23
3
+ metadata.gz: 48279a4ca7eeb3d7fc50e493733f5718c2960b2267d70db68b2956b0b11c99c1
4
+ data.tar.gz: cbd66f799b72273b23b2e7a208fc10336bee5cf2cb93656987d0fdc5d1c173a7
5
5
  SHA512:
6
- metadata.gz: f5312c786cdd9e0e5a30f5adc487989fdd7fb65d4e3a6dc8c2dc3e44eb150bbdf9e692722deff4716637b88d00c13dc8fabb7b3e196c3518b431341f62fe4d9d
7
- data.tar.gz: 3900c41dd19f1c7991f213629d771df77073ab3094e9a7209e0bfd150b40ecff4ac2d7ce822f7c3f3a16b150295a6c68921ba378a725598f3e81e0f74e744fb6
6
+ metadata.gz: d448acbf4ac471f2c8f55cda52191d35ade2d0e107546946e9cee8f6712556ac402160150555d8e3f978034843240deeeb4cec0a658a5fdf8ce2b2b8d3e1a452
7
+ data.tar.gz: c73951b3bc89f5ff17b08ac1199aff03f3fd2a7e9cf701d5b2d9fffcc31d4bc76ddd2cc4384622584479ab32f2abf85abc3993554fb8a872a4b961eb8b23b4a3
data/.dockerignore CHANGED
@@ -1,4 +1,7 @@
1
+ /.gitignore
2
+ /.ruby-version
1
3
  /coverage
2
4
  /docker-compose.*
3
5
  /Dockerfile*
6
+ /Gemfile.lock
4
7
  /**/*.gem
data/.gitignore CHANGED
@@ -1,5 +1,6 @@
1
1
  /.bundle/
2
2
  /.yardoc
3
+ /.ruby-version
3
4
  /_yardoc/
4
5
  /coverage/
5
6
  /doc/
data/.rspec CHANGED
@@ -1,2 +1,3 @@
1
+ --require spec_helper
1
2
  --format documentation
2
3
  --color
data/.rubocop.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  AllCops:
2
- TargetRubyVersion: 2.3
2
+ TargetRubyVersion: 2.6
3
3
 
4
4
  Metrics/ClassLength:
5
5
  Max: 200 # Default: 100
@@ -16,6 +16,9 @@ Metrics/BlockLength:
16
16
  - quiz_api_client.gemspec
17
17
  - spec/**/*.rb
18
18
 
19
+ Naming/MemoizedInstanceVariableName:
20
+ EnforcedStyleForLeadingUnderscores: required
21
+
19
22
  Layout/AlignParameters:
20
23
  # Alignment of parameters in multi-line method calls.
21
24
  #
@@ -29,7 +32,7 @@ Layout/AlignParameters:
29
32
  Layout/CaseIndentation:
30
33
  EnforcedStyle: end
31
34
 
32
- Lint/EndAlignment:
35
+ Layout/EndAlignment:
33
36
  EnforcedStyleAlignWith: variable
34
37
 
35
38
  Style/ClassAndModuleChildren:
@@ -59,13 +62,11 @@ Style/Documentation:
59
62
  Enabled: false
60
63
 
61
64
  Style/FrozenStringLiteralComment:
62
- # `when_needed` will add the frozen string literal comment to files
63
- # only when the `TargetRubyVersion` is set to 2.3+.
64
65
  # `always` will always add the frozen string literal comment to a file
65
66
  # regardless of the Ruby version or if `freeze` or `<<` are called on a
66
67
  # string literal. If you run code against multiple versions of Ruby, it is
67
68
  # possible that this will create errors in Ruby 2.3.0+.
68
69
  #
69
70
  # See: https://wyeworks.com/blog/2015/12/1/immutable-strings-in-ruby-2-dot-3
70
- EnforcedStyle: when_needed
71
+ EnforcedStyle: always
71
72
  Enabled: false
data/Dockerfile CHANGED
@@ -1,20 +1,12 @@
1
1
  FROM instructure/rvm
2
2
 
3
- WORKDIR /app
3
+ RUN mkdir -p coverage log pacts
4
4
 
5
- COPY quiz_api_client.gemspec Gemfile /app/
6
- COPY lib/quiz_api_client/version.rb /app/lib/quiz_api_client/version.rb
5
+ COPY --chown=docker:docker quiz_api_client.gemspec Gemfile ./
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.6 gem install bundler -v 2.1.4"
8
+ RUN /bin/bash -l -c "rvm-exec 2.6 bundle install --jobs 5"
7
9
 
8
- USER root
9
- RUN chown -R docker:docker /app
10
+ COPY --chown=docker:docker . .
10
11
 
11
- USER docker
12
- RUN /bin/bash -l -c "rvm-exec 2.4 bundle install --jobs 5"
13
- COPY . /app
14
- RUN rm -f Gemfile.lock
15
-
16
- USER root
17
- RUN chown -R docker:docker /app
18
- USER docker
19
-
20
- 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 ADDED
@@ -0,0 +1,86 @@
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
+
10
+ pipeline {
11
+ agent {
12
+ label 'docker'
13
+ }
14
+ options {
15
+ buildDiscarder(logRotator(numToKeepStr: '50'))
16
+ timeout(time: 20, unit: 'MINUTES')
17
+ }
18
+ stages {
19
+ stage('Build') {
20
+ steps {
21
+ sh 'docker-compose build --pull'
22
+ }
23
+ }
24
+ stage('Lint') {
25
+ steps {
26
+ sh '''
27
+ docker-compose run --rm app /bin/bash -lc \
28
+ "rvm-exec 2.6 bundle exec rubocop --fail-level autocorrect"
29
+ '''
30
+ }
31
+ }
32
+ stage('Unit Tests') {
33
+ steps { script { parallel buildMatrix } }
34
+ }
35
+ stage('Contract Tests') {
36
+ steps {
37
+ sh 'docker-compose run app /bin/bash -l -c "rvm-exec 2.6 bundle exec rspec -t pact"'
38
+ }
39
+ }
40
+ stage ('Publish') {
41
+ when { environment name: "GERRIT_EVENT_TYPE", value: "change-merged"}
42
+ environment {
43
+ PACT_BROKER_PASSWORD = credentials('pact_broker_password')
44
+ JENKINS_URL = "${env.JENKINS_URL}"
45
+ PACT_CONSUMER_TAG = 'master'
46
+ PACT_BROKER_USERNAME = 'quizzes'
47
+ PACT_BROKER_HOST = 'inst-pact-broker.inseng.net'
48
+ }
49
+ steps {
50
+ script {
51
+ sh '''
52
+ sha="$(git rev-parse --short HEAD)"
53
+
54
+ docker-compose run --rm \
55
+ -e JENKINS_URL="${JENKINS_URL}" \
56
+ -e PACT_BROKER_HOST="${PACT_BROKER_HOST}" \
57
+ -e PACT_BROKER_USERNAME="${PACT_BROKER_USERNAME}" \
58
+ -e PACT_BROKER_PASSWORD="${PACT_BROKER_PASSWORD}" \
59
+ -e PACT_CONSUMER_TAG="${PACT_CONSUMER_TAG}" \
60
+ -e SHA="${sha}" \
61
+ app /bin/bash -l -c "rvm-exec 2.6 bundle exec rake broker:pact:publish:jenkins_post_merge"
62
+ '''
63
+ }
64
+ }
65
+ }
66
+ }
67
+
68
+ post {
69
+ success {
70
+ sh "docker cp \"${env.BUILD_ID}-ruby-2.6:/usr/src/app/coverage\" ."
71
+ publishHTML target: [
72
+ allowMissing: false,
73
+ alwaysLinkToLastBuild: false,
74
+ keepAll: true,
75
+ reportDir: "coverage",
76
+ reportFiles: 'index.html',
77
+ reportName: 'Coverage Report'
78
+ ]
79
+ }
80
+ cleanup { // Always runs after all other post conditions=
81
+ sh 'docker-compose kill'
82
+ sh 'docker-compose rm -f'
83
+ sh 'docker images -qf "dangling=true" | xargs docker rmi -f &>/dev/null'
84
+ }
85
+ }
86
+ }
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.
data/Rakefile CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'bundler/gem_tasks'
2
2
  require 'pact_broker/client/tasks'
3
3
  require 'rspec/core/rake_task'
4
- require_relative './spec/contracts/pact_config'
4
+ require_relative './spec/support/pact_config'
5
5
 
6
6
  RSpec::Core::RakeTask.new(:spec)
7
7
 
@@ -14,7 +14,7 @@ function print_results() {
14
14
  docker cp contracts:/usr/src/app/pacts . &> /dev/null
15
15
  docker rm -f contracts &> /dev/null
16
16
 
17
- docker-compose rm -fv contracts-testrunner &> /dev/null
17
+ docker-compose rm -fv app &> /dev/null
18
18
  }
19
19
  trap print_results INT TERM EXIT
20
20
  set -e
@@ -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}" contracts-testrunner 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"
@@ -1,19 +1,11 @@
1
- version: '2'
1
+ version: '3.5'
2
2
 
3
3
  services:
4
- testrunner:
5
- volumes:
6
- - .:/app
7
- - bundler-config:/home/docker/.rvm/gems/ruby-2.4.0
8
-
9
- contracts-testrunner:
10
- #external_links: # linux
11
- # - dory_dinghy_http_proxy:pact-broker.docker # linux
4
+ app:
5
+ # This port doesn't exist, but doing this tricks Dory proxy into hooking up
6
+ # the container so it can actually talk to the Pact Broker.
7
+ expose: [8080]
8
+ external_links:
9
+ - ${PROXY_CONTAINER:-dinghy_http_proxy}:pact-broker.docker
12
10
  volumes:
13
11
  - .:/usr/src/app
14
- #- api-logs:/usr/src/app/log # linux:fs
15
- - bundler-config:/home/docker/.rvm/gems/ruby-2.4.0
16
-
17
- volumes:
18
- bundler-config: {}
19
- api-logs: {}
data/docker-compose.yml CHANGED
@@ -1,13 +1,8 @@
1
- version: '2'
1
+ version: '3.5'
2
2
 
3
3
  services:
4
- testrunner:
4
+ app:
5
5
  build: .
6
-
7
- contracts-testrunner:
8
- build:
9
- context: .
10
- dockerfile: Dockerfile.contracts
11
6
  volumes:
12
7
  - pacts:/usr/src/app/pacts
13
8
 
@@ -0,0 +1,38 @@
1
+ module QuizApiClient
2
+ class Config
3
+ DEFAULT_PROTOCOL = 'https'.freeze
4
+ ERROR_HANDLERS = %i[sentry_raven].freeze
5
+
6
+ class InvalidErrorHandler < StandardError; end
7
+
8
+ attr_reader :error_handler
9
+ attr_writer :protocol
10
+ attr_accessor :consumer_key, :consumer_request_id, :host, :shared_secret
11
+
12
+ def initialize
13
+ yield(self) if block_given?
14
+ end
15
+
16
+ def protocol
17
+ @protocol || DEFAULT_PROTOCOL
18
+ end
19
+
20
+ def error_handler=(handler)
21
+ validate_error_hander!(handler)
22
+
23
+ @error_handler = handler
24
+ end
25
+
26
+ private
27
+
28
+ def validate_error_hander!(handler)
29
+ return unless handler
30
+
31
+ unless ERROR_HANDLERS.include?(handler)
32
+ raise InvalidErrorHandler, "It must be one of the following: #{ERROR_HANDLERS.inspect}"
33
+ end
34
+
35
+ @error_handler = handler.to_sym
36
+ end
37
+ end
38
+ end
@@ -6,12 +6,12 @@ module QuizApiClient
6
6
 
7
7
  class RequestFailed < StandardError; end
8
8
 
9
- attr_reader :jwt, :uri
9
+ attr_reader :jwt, :uri, :config
10
10
 
11
- def initialize(uri:, jwt:, consumer_request_id: nil, logging: true, log_level: :info)
11
+ def initialize(uri:, jwt:, config:, logging: true, log_level: :info)
12
12
  @uri = uri
13
13
  @jwt = jwt
14
- @consumer_request_id = consumer_request_id
14
+ @config = config
15
15
  initialize_logger(log_level) if logging
16
16
  end
17
17
 
@@ -23,6 +23,7 @@ module QuizApiClient
23
23
 
24
24
  def get(path, all: false, query: {})
25
25
  return make_request :get, url_for(path), query: query unless all
26
+
26
27
  make_paginated_request :get, url_for(path), query: query
27
28
  end
28
29
 
@@ -48,7 +49,7 @@ module QuizApiClient
48
49
  HTTParty::Logger.add_formatter('quiz_api_client_json_formatter', QuizApiClient::JSONFormatter)
49
50
  @logger = ::Logger.new(
50
51
  STDOUT,
51
- formatter: proc { |_, _, _, msg| msg.merge(consumer_request_id: @consumer_request_id).to_json },
52
+ formatter: proc { |_, _, _, msg| msg.merge(consumer_request_id: config.consumer_request_id).to_json },
52
53
  level: unfriendly_logger_level(log_level)
53
54
  )
54
55
  @logger_config = {
@@ -80,7 +81,7 @@ module QuizApiClient
80
81
  default_request_data.merge(request_options)
81
82
  )
82
83
  rescue HTTParty::Error, Errno::ECONNREFUSED, Net::ReadTimeout => e
83
- raise RequestFailed, e.message
84
+ raise_error(method, url, current_error: e)
84
85
  end
85
86
 
86
87
  def make_paginated_request(method, url, options)
@@ -90,7 +91,8 @@ module QuizApiClient
90
91
 
91
92
  until request_url.nil?
92
93
  resp = make_request(method, request_url, request_options)
93
- raise RequestFailed, "#{url} responded #{resp.body} (#{resp.code})" unless resp.code == 200
94
+ raise_error(method, url, response: resp) unless resp.code == 200
95
+
94
96
  entities.concat(resp.parsed_response)
95
97
  request_url, request_options = next_page(resp, url, options)
96
98
  end
@@ -107,7 +109,7 @@ module QuizApiClient
107
109
  }
108
110
  }
109
111
 
110
- initial_hash[:headers]['X-Consumer-Request-Id'] = @consumer_request_id if @consumer_request_id
112
+ initial_hash[:headers]['X-Consumer-Request-Id'] = config.consumer_request_id if config.consumer_request_id
111
113
 
112
114
  initial_hash.merge!(@logger_config) if @logger_config
113
115
  initial_hash
@@ -119,6 +121,7 @@ module QuizApiClient
119
121
 
120
122
  def next_page_link(response, options)
121
123
  return if response.headers['link'].blank?
124
+
122
125
  links = LinkHeader.parse(response.headers['link']).links
123
126
  next_link = links.find { |link| link['rel'] == 'next' }
124
127
  [next_link.href, options] if next_link
@@ -135,5 +138,51 @@ module QuizApiClient
135
138
  )
136
139
  [url, options.merge(query: query)]
137
140
  end
141
+
142
+ def generate_error_context(method, url, response = nil)
143
+ context = {
144
+ quiz_api_client: {
145
+ request: {
146
+ method: method,
147
+ url: url
148
+ }
149
+ }
150
+ }
151
+
152
+ if response
153
+ context[:quiz_api_client][:response] = {
154
+ body: response.body,
155
+ code: response.code
156
+ }
157
+ end
158
+
159
+ context
160
+ end
161
+
162
+ def record_error_context(context)
163
+ case config.error_handler
164
+ when :sentry_raven
165
+ require 'sentry-raven'
166
+ Raven.extra_context(context)
167
+ end
168
+ end
169
+
170
+ def error_message(current_error, url, response)
171
+ if current_error && response
172
+ "#{current_error.message}: #{url} responded #{response.body} (#{response.code})"
173
+ elsif current_error
174
+ current_error.message
175
+ elsif response
176
+ "#{url} responded #{response.body} (#{response.code})"
177
+ end
178
+ end
179
+
180
+ def raise_error(method, url, response: nil, current_error: nil, error_class: RequestFailed)
181
+ context = generate_error_context(method, url, response)
182
+
183
+ record_error_context(context)
184
+
185
+ raise error_class, error_message(current_error, url, response)
186
+ end
138
187
  end
139
188
  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
@@ -2,6 +2,7 @@ module QuizApiClient::Services
2
2
  class ItemAnalysesService < BaseApiService
3
3
  def list(params:, token: nil, all: false)
4
4
  raise 'Quiz Id Required' unless params.key?(:quiz_id)
5
+
5
6
  client(token: token).get(
6
7
  "/api/quizzes/#{params[:quiz_id]}/stats/item_analyses",
7
8
  all: all
@@ -10,6 +11,7 @@ module QuizApiClient::Services
10
11
 
11
12
  def get(params:, token: nil)
12
13
  raise 'Quiz Id and Item Id are Required' unless params.key?(:id) && params.key?(:quiz_id)
14
+
13
15
  client(token: token).get(
14
16
  "/api/quizzes/#{params[:quiz_id]}/stats/item_analyses/#{params[:id]}"
15
17
  )
@@ -2,6 +2,7 @@ module QuizApiClient::Services
2
2
  class ItemsService < BaseApiService
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
7
  end
7
8
 
@@ -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
@@ -2,16 +2,26 @@ module QuizApiClient::Services
2
2
  class QtiImportsService < BaseApiService
3
3
  def create(params:, token: nil)
4
4
  raise 'Quiz Id Required' unless params && params[:quiz_id]
5
- post_to_quiz_api(params: params, token: token)
6
- end
7
-
8
- private
9
5
 
10
- def post_to_quiz_api(params:, token:)
11
6
  client(token: token).post(
12
7
  "/api/quizzes/#{params[:quiz_id]}/qti_imports",
13
8
  qti_import: params
14
9
  )
15
10
  end
11
+
12
+ def banks(params:, token: nil)
13
+ client(token: token).post(
14
+ '/api/qti_imports/banks',
15
+ qti_import: params
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
16
26
  end
17
27
  end
@@ -2,6 +2,7 @@ module QuizApiClient::Services
2
2
  class QuizAnalysesService < BaseApiService
3
3
  def get(params:, token: nil)
4
4
  raise 'Quiz Id Required' unless params.key?(:quiz_id)
5
+
5
6
  get_from_quiz_api(params: params, token: token)
6
7
  end
7
8
 
@@ -2,6 +2,7 @@ module QuizApiClient::Services
2
2
  class QuizCloneJobService < BaseApiService
3
3
  def show(params:, token: nil)
4
4
  raise 'Quiz Clone Job Id Required' unless params && params[:id]
5
+
5
6
  get_from_quiz_api(params: params, token: token)
6
7
  end
7
8
 
@@ -2,17 +2,20 @@ module QuizApiClient::Services
2
2
  class QuizEntriesService < BaseApiService
3
3
  def create(params:, token: nil)
4
4
  raise 'Quiz Id Required' unless params && params[:id]
5
+
5
6
  post_to_quiz_api(params: params, token: token)
6
7
  end
7
8
 
8
9
  def list(params:, token: nil, all: false)
9
10
  raise 'Quiz Id Required' unless params && params[:id]
11
+
10
12
  get_from_quiz_api(params: params, token: token, all: all)
11
13
  end
12
14
 
13
15
  def destroy(params:, token: nil)
14
16
  raise 'Quiz Id Required' unless params && params[:quiz_id]
15
17
  raise 'Item Id Required' unless params && params[:id]
18
+
16
19
  delete_from_quiz_api(params, token)
17
20
  end
18
21
 
@@ -2,6 +2,7 @@ module QuizApiClient::Services
2
2
  class QuizSessionEventsService < BaseApiService
3
3
  def list(params:, token: nil, all: false)
4
4
  raise 'Quiz Session Id Required' unless params.key?(:quiz_session_id)
5
+
5
6
  get_from_quiz_api(params: params, token: token, all: all)
6
7
  end
7
8
 
@@ -2,6 +2,7 @@ module QuizApiClient::Services
2
2
  class QuizSessionResultService < BaseApiService
3
3
  def show(params:, token: nil)
4
4
  raise 'Quiz Session Result Id Required' unless params && params[:id]
5
+
5
6
  get_from_quiz_api(params: params, token: token)
6
7
  end
7
8
 
@@ -6,6 +6,7 @@ module QuizApiClient::Services
6
6
 
7
7
  def show(params:, token: nil)
8
8
  raise 'Quiz Session Id Required' unless params && params[:id]
9
+
9
10
  get_from_quiz_api(params: params, token: token)
10
11
  end
11
12
 
@@ -3,6 +3,7 @@ module QuizApiClient::Services
3
3
  def list(params:, token: nil)
4
4
  raise 'Quiz Id Required' unless params && params[:quiz_id]
5
5
  raise 'Quiz Session Ids Required' unless params && params[:ids]
6
+
6
7
  client(token: token).get(
7
8
  "/api/quizzes/#{params[:quiz_id]}/quiz_sessions",
8
9
  query: params[:ids].to_query('ids')
@@ -11,6 +12,7 @@ module QuizApiClient::Services
11
12
 
12
13
  def create(params:, token: nil)
13
14
  raise 'Quiz Id Required' unless params && params[:quiz_id]
15
+
14
16
  post_to_quiz_api(params: params, token: token)
15
17
  end
16
18
 
@@ -3,6 +3,7 @@ module QuizApiClient::Services
3
3
  def list(params:, token: nil, all: false)
4
4
  raise 'QuizSession Id Required' unless params && params[:quiz_session_id]
5
5
  raise 'QuizSessionResult Id Required' unless params && params[:quiz_session_result_id]
6
+
6
7
  get_from_quiz_api(params: params, token: token, all: all)
7
8
  end
8
9
 
@@ -2,6 +2,7 @@ module QuizApiClient::Services
2
2
  class SessionItemsService < BaseApiService
3
3
  def list(params:, token: nil, all: false)
4
4
  raise 'QuizSession Id Required' unless params && params[:quiz_session_id]
5
+
5
6
  get_from_quiz_api(params: params, token: token, all: all)
6
7
  end
7
8
 
@@ -2,6 +2,7 @@ module QuizApiClient::Services
2
2
  class SharedBanks < BaseApiService
3
3
  def list(params:, token: nil, all: false)
4
4
  raise 'Bank Id Required' unless params && params[:bank_id]
5
+
5
6
  client(token: token).get(
6
7
  "/api/banks/#{params[:bank_id]}/shared_banks",
7
8
  all: all
@@ -10,6 +11,7 @@ module QuizApiClient::Services
10
11
 
11
12
  def create(params:, token: nil)
12
13
  raise 'Bank Id Required' unless params && params[:bank_id]
14
+
13
15
  client(token: token).post(
14
16
  "/api/banks/#{params[:bank_id]}/shared_banks",
15
17
  params
@@ -19,6 +21,7 @@ module QuizApiClient::Services
19
21
  def update(params:, token: nil)
20
22
  raise 'Bank Id Required' unless params && params[:bank_id]
21
23
  raise 'Shared Bank Id Required' unless params && params[:shared_bank_id]
24
+
22
25
  shared_bank_id = params.delete(:shared_bank_id)
23
26
  client(token: token).put(
24
27
  "/api/banks/#{params[:bank_id]}/shared_banks/#{shared_bank_id}",
@@ -1,3 +1,3 @@
1
1
  module QuizApiClient
2
- VERSION = '2.9.0'.freeze
2
+ VERSION = '4.0.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'
@@ -1,4 +1,4 @@
1
- lib = File.expand_path('../lib', __FILE__)
1
+ lib = File.expand_path('lib', __dir__)
2
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
3
  require 'quiz_api_client/version'
4
4
 
@@ -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.3'
45
+ spec.required_ruby_version = '>= 2.6'
44
46
 
45
- spec.add_dependency 'httparty', '~> 0.14.0'
46
- spec.add_dependency 'jwt', '>= 1.5', '< 3.0'
47
+ spec.add_dependency 'httparty', '~> 0.17'
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.15'
50
- spec.add_development_dependency 'pact', '~> 1.20.1'
51
- spec.add_development_dependency 'pact_broker-client', '~> 1.14.0'
52
- spec.add_development_dependency 'rake', '~> 12.0'
53
- spec.add_development_dependency 'rspec', '~> 3.7'
54
- spec.add_development_dependency 'rubocop', '~> 0.52.1'
51
+ spec.add_development_dependency 'pact', '~> 1.41'
52
+ spec.add_development_dependency 'pact_broker-client', '~> 1.19'
53
+ spec.add_development_dependency 'rake', '~> 12.3'
54
+ spec.add_development_dependency 'rspec', '~> 3.8'
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: 2.9.0
4
+ version: 4.0.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-03-05 00:00:00.000000000 Z
23
+ date: 2021-10-18 00:00:00.000000000 Z
23
24
  dependencies:
24
25
  - !ruby/object:Gem::Dependency
25
26
  name: httparty
@@ -27,34 +28,28 @@ dependencies:
27
28
  requirements:
28
29
  - - "~>"
29
30
  - !ruby/object:Gem::Version
30
- version: 0.14.0
31
+ version: '0.17'
31
32
  type: :runtime
32
33
  prerelease: false
33
34
  version_requirements: !ruby/object:Gem::Requirement
34
35
  requirements:
35
36
  - - "~>"
36
37
  - !ruby/object:Gem::Version
37
- version: 0.14.0
38
+ version: '0.17'
38
39
  - !ruby/object:Gem::Dependency
39
40
  name: jwt
40
41
  requirement: !ruby/object:Gem::Requirement
41
42
  requirements:
42
- - - ">="
43
- - !ruby/object:Gem::Version
44
- version: '1.5'
45
- - - "<"
43
+ - - "~>"
46
44
  - !ruby/object:Gem::Version
47
- version: '3.0'
45
+ version: '2.2'
48
46
  type: :runtime
49
47
  prerelease: false
50
48
  version_requirements: !ruby/object:Gem::Requirement
51
49
  requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '1.5'
55
- - - "<"
50
+ - - "~>"
56
51
  - !ruby/object:Gem::Version
57
- version: '3.0'
52
+ version: '2.2'
58
53
  - !ruby/object:Gem::Dependency
59
54
  name: link_header
60
55
  requirement: !ruby/object:Gem::Requirement
@@ -70,89 +65,89 @@ dependencies:
70
65
  - !ruby/object:Gem::Version
71
66
  version: '0.0'
72
67
  - !ruby/object:Gem::Dependency
73
- name: bundler
68
+ name: pact
74
69
  requirement: !ruby/object:Gem::Requirement
75
70
  requirements:
76
71
  - - "~>"
77
72
  - !ruby/object:Gem::Version
78
- version: '1.15'
73
+ version: '1.41'
79
74
  type: :development
80
75
  prerelease: false
81
76
  version_requirements: !ruby/object:Gem::Requirement
82
77
  requirements:
83
78
  - - "~>"
84
79
  - !ruby/object:Gem::Version
85
- version: '1.15'
80
+ version: '1.41'
86
81
  - !ruby/object:Gem::Dependency
87
- name: pact
82
+ name: pact_broker-client
88
83
  requirement: !ruby/object:Gem::Requirement
89
84
  requirements:
90
85
  - - "~>"
91
86
  - !ruby/object:Gem::Version
92
- version: 1.20.1
87
+ version: '1.19'
93
88
  type: :development
94
89
  prerelease: false
95
90
  version_requirements: !ruby/object:Gem::Requirement
96
91
  requirements:
97
92
  - - "~>"
98
93
  - !ruby/object:Gem::Version
99
- version: 1.20.1
94
+ version: '1.19'
100
95
  - !ruby/object:Gem::Dependency
101
- name: pact_broker-client
96
+ name: rake
102
97
  requirement: !ruby/object:Gem::Requirement
103
98
  requirements:
104
99
  - - "~>"
105
100
  - !ruby/object:Gem::Version
106
- version: 1.14.0
101
+ version: '12.3'
107
102
  type: :development
108
103
  prerelease: false
109
104
  version_requirements: !ruby/object:Gem::Requirement
110
105
  requirements:
111
106
  - - "~>"
112
107
  - !ruby/object:Gem::Version
113
- version: 1.14.0
108
+ version: '12.3'
114
109
  - !ruby/object:Gem::Dependency
115
- name: rake
110
+ name: rspec
116
111
  requirement: !ruby/object:Gem::Requirement
117
112
  requirements:
118
113
  - - "~>"
119
114
  - !ruby/object:Gem::Version
120
- version: '12.0'
115
+ version: '3.8'
121
116
  type: :development
122
117
  prerelease: false
123
118
  version_requirements: !ruby/object:Gem::Requirement
124
119
  requirements:
125
120
  - - "~>"
126
121
  - !ruby/object:Gem::Version
127
- version: '12.0'
122
+ version: '3.8'
128
123
  - !ruby/object:Gem::Dependency
129
- name: rspec
124
+ name: rubocop
130
125
  requirement: !ruby/object:Gem::Requirement
131
126
  requirements:
132
127
  - - "~>"
133
128
  - !ruby/object:Gem::Version
134
- version: '3.7'
129
+ version: 0.74.0
135
130
  type: :development
136
131
  prerelease: false
137
132
  version_requirements: !ruby/object:Gem::Requirement
138
133
  requirements:
139
134
  - - "~>"
140
135
  - !ruby/object:Gem::Version
141
- version: '3.7'
136
+ version: 0.74.0
142
137
  - !ruby/object:Gem::Dependency
143
- name: rubocop
138
+ name: sentry-raven
144
139
  requirement: !ruby/object:Gem::Requirement
145
140
  requirements:
146
141
  - - "~>"
147
142
  - !ruby/object:Gem::Version
148
- version: 0.52.1
143
+ version: '3.1'
149
144
  type: :development
150
145
  prerelease: false
151
146
  version_requirements: !ruby/object:Gem::Requirement
152
147
  requirements:
153
148
  - - "~>"
154
149
  - !ruby/object:Gem::Version
155
- version: 0.52.1
150
+ version: '3.1'
156
151
  - !ruby/object:Gem::Dependency
157
152
  name: simplecov
158
153
  requirement: !ruby/object:Gem::Requirement
@@ -181,7 +176,7 @@ dependencies:
181
176
  - - ">="
182
177
  - !ruby/object:Gem::Version
183
178
  version: '0'
184
- description:
179
+ description:
185
180
  email:
186
181
  - acallejas@instructure.com
187
182
  - bpetty@instructure.com
@@ -189,6 +184,7 @@ email:
189
184
  - hyan@instructure.com
190
185
  - jhiggins@instructure.com
191
186
  - mphillips@instructure.com
187
+ - mark.starkman@instructure.com
192
188
  - mbd@instructure.com
193
189
  - mhargiss@instructure.com
194
190
  - okhan@instructure.com
@@ -205,17 +201,17 @@ files:
205
201
  - ".rspec"
206
202
  - ".rubocop.yml"
207
203
  - Dockerfile
208
- - Dockerfile.contracts
209
204
  - Gemfile
205
+ - Jenkinsfile
210
206
  - README.md
211
207
  - Rakefile
212
208
  - bin/console
213
209
  - bin/contracts-generate
214
210
  - bin/setup
215
- - build.sh
216
211
  - docker-compose.dev.override.yml
217
212
  - docker-compose.yml
218
213
  - lib/quiz_api_client.rb
214
+ - lib/quiz_api_client/config.rb
219
215
  - lib/quiz_api_client/http_client.rb
220
216
  - lib/quiz_api_client/json_formatter.rb
221
217
  - lib/quiz_api_client/services/base_api_service.rb
@@ -239,10 +235,10 @@ files:
239
235
  - lib/quiz_api_client/services/shared_banks.rb
240
236
  - lib/quiz_api_client/version.rb
241
237
  - quiz_api_client.gemspec
242
- homepage:
238
+ homepage:
243
239
  licenses: []
244
240
  metadata: {}
245
- post_install_message:
241
+ post_install_message:
246
242
  rdoc_options: []
247
243
  require_paths:
248
244
  - lib
@@ -250,16 +246,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
250
246
  requirements:
251
247
  - - ">="
252
248
  - !ruby/object:Gem::Version
253
- version: '2.3'
249
+ version: '2.6'
254
250
  required_rubygems_version: !ruby/object:Gem::Requirement
255
251
  requirements:
256
252
  - - ">="
257
253
  - !ruby/object:Gem::Version
258
254
  version: '0'
259
255
  requirements: []
260
- rubyforge_project:
261
- rubygems_version: 2.7.8
262
- signing_key:
256
+ rubygems_version: 3.1.6
257
+ signing_key:
263
258
  specification_version: 4
264
259
  summary: Ruby client for quiz_api
265
260
  test_files: []
data/Dockerfile.contracts DELETED
@@ -1,19 +0,0 @@
1
- FROM instructure/ruby:2.3
2
-
3
- USER root
4
-
5
- ENV APP_HOME /usr/src/app
6
- RUN mkdir -p $APP_HOME/log
7
- RUN mkdir -p $APP_HOME/pacts
8
-
9
- COPY quiz_api_client.gemspec Gemfile $APP_HOME/
10
- COPY lib/quiz_api_client/version.rb $APP_HOME/lib/quiz_api_client/version.rb
11
-
12
- USER docker
13
- RUN bundle install --quiet --jobs 8
14
-
15
- USER root
16
- COPY . $APP_HOME
17
- RUN chown -R docker:docker $APP_HOME
18
-
19
- USER docker
data/build.sh DELETED
@@ -1,49 +0,0 @@
1
- #!/usr/bin/env bash
2
-
3
- set -ex
4
-
5
- function publish_pact_file_to_pact_broker()
6
- {
7
- echo "Publishing pact file to Pact Broker..."
8
-
9
- sha="$(git rev-parse --short HEAD)"
10
-
11
- docker-compose run --rm \
12
- -e JENKINS_URL="${JENKINS_URL}" \
13
- -e PACT_BROKER_HOST="${PACT_BROKER_HOST}" \
14
- -e PACT_BROKER_USERNAME="${PACT_BROKER_USERNAME}" \
15
- -e PACT_BROKER_PASSWORD="${PACT_BROKER_PASSWORD}" \
16
- -e PACT_CONSUMER_TAG="${PACT_CONSUMER_TAG}" \
17
- -e SHA="${sha}" \
18
- contracts-testrunner bundle exec rake broker:pact:publish:jenkins_post_merge
19
- }
20
-
21
- function cleanup() {
22
- exit_code=$?
23
- set +e
24
- docker cp coverage:/app/coverage .
25
- docker-compose kill
26
- docker-compose rm -f
27
- exit $exit_code
28
- }
29
- trap cleanup INT TERM EXIT
30
-
31
- docker-compose build --pull
32
-
33
- echo "Running Rubocop..."
34
- docker-compose run --rm testrunner /bin/bash -lc \
35
- "rvm-exec 2.4 bundle exec rubocop --fail-level autocorrect"
36
-
37
- echo "Running test suite..."
38
- docker-compose run --name coverage testrunner $@
39
-
40
- echo
41
- echo "Running contract tests..."
42
- docker-compose run --name contracts -T contracts-testrunner bundle exec rspec spec/contracts
43
- docker cp contracts:/usr/src/app/pacts .
44
- docker cp contracts:/usr/src/app/log .
45
- echo
46
-
47
- if [[ "${GERRIT_EVENT_TYPE}" == "change-merged" ]]; then
48
- publish_pact_file_to_pact_broker
49
- fi