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.
- checksums.yaml +4 -4
- data/.dockerignore +3 -0
- data/.gitignore +1 -0
- data/.rspec +1 -0
- data/.rubocop.yml +6 -5
- data/Dockerfile +7 -15
- data/Jenkinsfile +86 -0
- data/README.md +4 -0
- data/Rakefile +1 -1
- data/bin/contracts-generate +3 -4
- data/docker-compose.dev.override.yml +7 -15
- data/docker-compose.yml +2 -7
- data/lib/quiz_api_client/config.rb +38 -0
- data/lib/quiz_api_client/http_client.rb +56 -7
- data/lib/quiz_api_client/services/base_api_service.rb +5 -11
- data/lib/quiz_api_client/services/item_analyses_service.rb +2 -0
- data/lib/quiz_api_client/services/items_service.rb +1 -0
- data/lib/quiz_api_client/services/jwt_service.rb +7 -8
- data/lib/quiz_api_client/services/qti_imports_service.rb +15 -5
- data/lib/quiz_api_client/services/quiz_analyses_service.rb +1 -0
- data/lib/quiz_api_client/services/quiz_clone_job_service.rb +1 -0
- data/lib/quiz_api_client/services/quiz_entries_service.rb +3 -0
- data/lib/quiz_api_client/services/quiz_session_events_service.rb +1 -0
- data/lib/quiz_api_client/services/quiz_session_result_service.rb +1 -0
- data/lib/quiz_api_client/services/quiz_session_service.rb +1 -0
- data/lib/quiz_api_client/services/quiz_sessions_service.rb +2 -0
- data/lib/quiz_api_client/services/session_item_results_service.rb +1 -0
- data/lib/quiz_api_client/services/session_items_service.rb +1 -0
- data/lib/quiz_api_client/services/shared_banks.rb +3 -0
- data/lib/quiz_api_client/version.rb +1 -1
- data/lib/quiz_api_client.rb +33 -36
- data/quiz_api_client.gemspec +12 -10
- metadata +37 -42
- data/Dockerfile.contracts +0 -19
- data/build.sh +0 -49
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 48279a4ca7eeb3d7fc50e493733f5718c2960b2267d70db68b2956b0b11c99c1
|
4
|
+
data.tar.gz: cbd66f799b72273b23b2e7a208fc10336bee5cf2cb93656987d0fdc5d1c173a7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d448acbf4ac471f2c8f55cda52191d35ade2d0e107546946e9cee8f6712556ac402160150555d8e3f978034843240deeeb4cec0a658a5fdf8ce2b2b8d3e1a452
|
7
|
+
data.tar.gz: c73951b3bc89f5ff17b08ac1199aff03f3fd2a7e9cf701d5b2d9fffcc31d4bc76ddd2cc4384622584479ab32f2abf85abc3993554fb8a872a4b961eb8b23b4a3
|
data/.dockerignore
CHANGED
data/.gitignore
CHANGED
data/.rspec
CHANGED
data/.rubocop.yml
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
AllCops:
|
2
|
-
TargetRubyVersion: 2.
|
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
|
-
|
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:
|
71
|
+
EnforcedStyle: always
|
71
72
|
Enabled: false
|
data/Dockerfile
CHANGED
@@ -1,20 +1,12 @@
|
|
1
1
|
FROM instructure/rvm
|
2
2
|
|
3
|
-
|
3
|
+
RUN mkdir -p coverage log pacts
|
4
4
|
|
5
|
-
COPY quiz_api_client.gemspec Gemfile
|
6
|
-
COPY 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
|
-
|
9
|
-
RUN chown -R docker:docker /app
|
10
|
+
COPY --chown=docker:docker . .
|
10
11
|
|
11
|
-
|
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
data/bin/contracts-generate
CHANGED
@@ -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
|
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
|
-
|
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: '
|
1
|
+
version: '3.5'
|
2
2
|
|
3
3
|
services:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
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
@@ -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:,
|
11
|
+
def initialize(uri:, jwt:, config:, logging: true, log_level: :info)
|
12
12
|
@uri = uri
|
13
13
|
@jwt = jwt
|
14
|
-
@
|
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:
|
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
|
-
|
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
|
-
|
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'] =
|
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 :
|
3
|
+
attr_reader :config
|
4
4
|
|
5
|
-
def initialize(
|
6
|
-
|
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
|
-
|
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
|
)
|
@@ -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 :
|
7
|
+
attr_reader :config
|
8
|
+
def_delegators :config, :host, :protocol, :consumer_key
|
6
9
|
|
7
|
-
def initialize(
|
8
|
-
@
|
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,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
|
|
@@ -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 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}",
|
data/lib/quiz_api_client.rb
CHANGED
@@ -4,104 +4,101 @@ require 'link_header'
|
|
4
4
|
|
5
5
|
module QuizApiClient
|
6
6
|
class Client
|
7
|
-
|
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
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
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(
|
26
|
+
@_jwt_service ||= QuizApiClient::Services::JwtService.new(config)
|
19
27
|
end
|
20
28
|
|
21
29
|
def quiz_service
|
22
|
-
@_quiz_service ||= Services::QuizService.new(
|
30
|
+
@_quiz_service ||= Services::QuizService.new(config)
|
23
31
|
end
|
24
32
|
|
25
33
|
def quizzes_service
|
26
|
-
@_quizzes_service ||= Services::QuizzesService.new(
|
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(
|
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(
|
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(
|
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(
|
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(
|
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(
|
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(
|
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(
|
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(
|
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(
|
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(
|
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(
|
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(
|
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(
|
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(
|
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'
|
data/quiz_api_client.gemspec
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
lib = File.expand_path('
|
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.
|
45
|
+
spec.required_ruby_version = '>= 2.6'
|
44
46
|
|
45
|
-
spec.add_dependency 'httparty', '~> 0.
|
46
|
-
spec.add_dependency 'jwt', '
|
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 '
|
50
|
-
spec.add_development_dependency '
|
51
|
-
spec.add_development_dependency '
|
52
|
-
spec.add_development_dependency '
|
53
|
-
spec.add_development_dependency '
|
54
|
-
spec.add_development_dependency '
|
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:
|
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:
|
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.
|
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.
|
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: '
|
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: '
|
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:
|
68
|
+
name: pact
|
74
69
|
requirement: !ruby/object:Gem::Requirement
|
75
70
|
requirements:
|
76
71
|
- - "~>"
|
77
72
|
- !ruby/object:Gem::Version
|
78
|
-
version: '1.
|
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.
|
80
|
+
version: '1.41'
|
86
81
|
- !ruby/object:Gem::Dependency
|
87
|
-
name:
|
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.
|
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.
|
94
|
+
version: '1.19'
|
100
95
|
- !ruby/object:Gem::Dependency
|
101
|
-
name:
|
96
|
+
name: rake
|
102
97
|
requirement: !ruby/object:Gem::Requirement
|
103
98
|
requirements:
|
104
99
|
- - "~>"
|
105
100
|
- !ruby/object:Gem::Version
|
106
|
-
version:
|
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:
|
108
|
+
version: '12.3'
|
114
109
|
- !ruby/object:Gem::Dependency
|
115
|
-
name:
|
110
|
+
name: rspec
|
116
111
|
requirement: !ruby/object:Gem::Requirement
|
117
112
|
requirements:
|
118
113
|
- - "~>"
|
119
114
|
- !ruby/object:Gem::Version
|
120
|
-
version: '
|
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: '
|
122
|
+
version: '3.8'
|
128
123
|
- !ruby/object:Gem::Dependency
|
129
|
-
name:
|
124
|
+
name: rubocop
|
130
125
|
requirement: !ruby/object:Gem::Requirement
|
131
126
|
requirements:
|
132
127
|
- - "~>"
|
133
128
|
- !ruby/object:Gem::Version
|
134
|
-
version:
|
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:
|
136
|
+
version: 0.74.0
|
142
137
|
- !ruby/object:Gem::Dependency
|
143
|
-
name:
|
138
|
+
name: sentry-raven
|
144
139
|
requirement: !ruby/object:Gem::Requirement
|
145
140
|
requirements:
|
146
141
|
- - "~>"
|
147
142
|
- !ruby/object:Gem::Version
|
148
|
-
version:
|
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:
|
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.
|
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
|
-
|
261
|
-
|
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
|