quiz_api_client 2.9.0 → 4.0.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 (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