learnosity-sdk 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (100) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +5 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE +201 -0
  7. data/README.md +269 -0
  8. data/Rakefile +6 -0
  9. data/bin/console +14 -0
  10. data/bin/setup +8 -0
  11. data/examples/lrn-sdk-rails/.gitignore +21 -0
  12. data/examples/lrn-sdk-rails/Gemfile +57 -0
  13. data/examples/lrn-sdk-rails/README.md +24 -0
  14. data/examples/lrn-sdk-rails/Rakefile +6 -0
  15. data/examples/lrn-sdk-rails/app/assets/config/manifest.js +3 -0
  16. data/examples/lrn-sdk-rails/app/assets/images/.keep +0 -0
  17. data/examples/lrn-sdk-rails/app/assets/javascripts/application.js +16 -0
  18. data/examples/lrn-sdk-rails/app/assets/javascripts/cable.js +13 -0
  19. data/examples/lrn-sdk-rails/app/assets/javascripts/channels/.keep +0 -0
  20. data/examples/lrn-sdk-rails/app/assets/javascripts/index.coffee +3 -0
  21. data/examples/lrn-sdk-rails/app/assets/stylesheets/application.css +15 -0
  22. data/examples/lrn-sdk-rails/app/assets/stylesheets/index.scss +3 -0
  23. data/examples/lrn-sdk-rails/app/channels/application_cable/channel.rb +4 -0
  24. data/examples/lrn-sdk-rails/app/channels/application_cable/connection.rb +4 -0
  25. data/examples/lrn-sdk-rails/app/controllers/application_controller.rb +3 -0
  26. data/examples/lrn-sdk-rails/app/controllers/concerns/.keep +0 -0
  27. data/examples/lrn-sdk-rails/app/controllers/index_controller.rb +105 -0
  28. data/examples/lrn-sdk-rails/app/helpers/application_helper.rb +2 -0
  29. data/examples/lrn-sdk-rails/app/helpers/index_helper.rb +2 -0
  30. data/examples/lrn-sdk-rails/app/jobs/application_job.rb +2 -0
  31. data/examples/lrn-sdk-rails/app/mailers/application_mailer.rb +4 -0
  32. data/examples/lrn-sdk-rails/app/models/application_record.rb +3 -0
  33. data/examples/lrn-sdk-rails/app/models/concerns/.keep +0 -0
  34. data/examples/lrn-sdk-rails/app/views/index/index.html.erb +24 -0
  35. data/examples/lrn-sdk-rails/app/views/layouts/application.html.erb +14 -0
  36. data/examples/lrn-sdk-rails/app/views/layouts/mailer.html.erb +13 -0
  37. data/examples/lrn-sdk-rails/app/views/layouts/mailer.text.erb +1 -0
  38. data/examples/lrn-sdk-rails/bin/bundle +3 -0
  39. data/examples/lrn-sdk-rails/bin/rails +9 -0
  40. data/examples/lrn-sdk-rails/bin/rake +9 -0
  41. data/examples/lrn-sdk-rails/bin/setup +34 -0
  42. data/examples/lrn-sdk-rails/bin/spring +17 -0
  43. data/examples/lrn-sdk-rails/bin/update +29 -0
  44. data/examples/lrn-sdk-rails/config.ru +5 -0
  45. data/examples/lrn-sdk-rails/config/application.rb +15 -0
  46. data/examples/lrn-sdk-rails/config/boot.rb +3 -0
  47. data/examples/lrn-sdk-rails/config/cable.yml +9 -0
  48. data/examples/lrn-sdk-rails/config/database.yml +25 -0
  49. data/examples/lrn-sdk-rails/config/environment.rb +5 -0
  50. data/examples/lrn-sdk-rails/config/environments/development.rb +54 -0
  51. data/examples/lrn-sdk-rails/config/environments/production.rb +86 -0
  52. data/examples/lrn-sdk-rails/config/environments/test.rb +42 -0
  53. data/examples/lrn-sdk-rails/config/initializers/application_controller_renderer.rb +6 -0
  54. data/examples/lrn-sdk-rails/config/initializers/assets.rb +11 -0
  55. data/examples/lrn-sdk-rails/config/initializers/backtrace_silencers.rb +7 -0
  56. data/examples/lrn-sdk-rails/config/initializers/cookies_serializer.rb +5 -0
  57. data/examples/lrn-sdk-rails/config/initializers/filter_parameter_logging.rb +4 -0
  58. data/examples/lrn-sdk-rails/config/initializers/inflections.rb +16 -0
  59. data/examples/lrn-sdk-rails/config/initializers/mime_types.rb +4 -0
  60. data/examples/lrn-sdk-rails/config/initializers/new_framework_defaults.rb +24 -0
  61. data/examples/lrn-sdk-rails/config/initializers/session_store.rb +3 -0
  62. data/examples/lrn-sdk-rails/config/initializers/wrap_parameters.rb +14 -0
  63. data/examples/lrn-sdk-rails/config/locales/en.yml +23 -0
  64. data/examples/lrn-sdk-rails/config/puma.rb +47 -0
  65. data/examples/lrn-sdk-rails/config/routes.rb +5 -0
  66. data/examples/lrn-sdk-rails/config/secrets.yml +22 -0
  67. data/examples/lrn-sdk-rails/config/spring.rb +6 -0
  68. data/examples/lrn-sdk-rails/db/seeds.rb +7 -0
  69. data/examples/lrn-sdk-rails/lib/assets/.keep +0 -0
  70. data/examples/lrn-sdk-rails/lib/tasks/.keep +0 -0
  71. data/examples/lrn-sdk-rails/log/.keep +0 -0
  72. data/examples/lrn-sdk-rails/public/404.html +67 -0
  73. data/examples/lrn-sdk-rails/public/422.html +67 -0
  74. data/examples/lrn-sdk-rails/public/500.html +66 -0
  75. data/examples/lrn-sdk-rails/public/apple-touch-icon-precomposed.png +0 -0
  76. data/examples/lrn-sdk-rails/public/apple-touch-icon.png +0 -0
  77. data/examples/lrn-sdk-rails/public/favicon.ico +0 -0
  78. data/examples/lrn-sdk-rails/public/robots.txt +5 -0
  79. data/examples/lrn-sdk-rails/test/controllers/.keep +0 -0
  80. data/examples/lrn-sdk-rails/test/controllers/index_controller_test.rb +9 -0
  81. data/examples/lrn-sdk-rails/test/fixtures/.keep +0 -0
  82. data/examples/lrn-sdk-rails/test/fixtures/files/.keep +0 -0
  83. data/examples/lrn-sdk-rails/test/helpers/.keep +0 -0
  84. data/examples/lrn-sdk-rails/test/integration/.keep +0 -0
  85. data/examples/lrn-sdk-rails/test/mailers/.keep +0 -0
  86. data/examples/lrn-sdk-rails/test/models/.keep +0 -0
  87. data/examples/lrn-sdk-rails/test/test_helper.rb +10 -0
  88. data/examples/lrn-sdk-rails/tmp/.keep +0 -0
  89. data/examples/lrn-sdk-rails/vendor/assets/javascripts/.keep +0 -0
  90. data/examples/lrn-sdk-rails/vendor/assets/stylesheets/.keep +0 -0
  91. data/examples/simple/init_data.rb +34 -0
  92. data/examples/simple/init_items.rb +19 -0
  93. data/learnosity-sdk.gemspec +38 -0
  94. data/lib/learnosity/sdk.rb +9 -0
  95. data/lib/learnosity/sdk/exceptions.rb +10 -0
  96. data/lib/learnosity/sdk/request.rb +9 -0
  97. data/lib/learnosity/sdk/request/init.rb +232 -0
  98. data/lib/learnosity/sdk/utils.rb +4 -0
  99. data/lib/learnosity/sdk/version.rb +5 -0
  100. metadata +187 -0
@@ -0,0 +1,9 @@
1
+ require "learnosity/sdk/version"
2
+
3
+ module Learnosity
4
+ module Sdk
5
+ # Your code goes here...
6
+ end
7
+ end
8
+
9
+ # vim: sw=2
@@ -0,0 +1,10 @@
1
+ module Learnosity
2
+ module Sdk
3
+
4
+ class ValidationException < Exception
5
+ end
6
+
7
+ end
8
+ end
9
+
10
+ # vim: sw=2
@@ -0,0 +1,9 @@
1
+ module Learnosity
2
+ module Sdk
3
+ module Request
4
+ # Your code goes here...
5
+ end
6
+ end
7
+ end
8
+
9
+ # vim: sw=2
@@ -0,0 +1,232 @@
1
+ require 'digest'
2
+ require 'json'
3
+
4
+ require 'learnosity/sdk/exceptions'
5
+ require 'learnosity/sdk/utils'
6
+
7
+ module Learnosity
8
+ module Sdk
9
+ module Request
10
+
11
+ class Init
12
+ # XXX: Needs to be public for unit tests
13
+ attr_reader :security_packet, :request_string
14
+
15
+ # Keynames that are valid in the security_packet, they are also in
16
+ # the correct order for signature generation.
17
+ @@validSecurityKeys = ['consumer_key', 'domain', 'timestamp', 'expires', 'user_id'];
18
+
19
+ # Service names that are valid for `$service`
20
+ @@validServices = ['assess', 'author', 'data', 'events', 'items', 'questions', 'reports'];
21
+
22
+ def initialize(service, security_packet, secret, request_packet = nil, action = nil)
23
+ @sign_request_data = false
24
+ @service = service
25
+ @security_packet = security_packet.clone if ! security_packet.nil?
26
+ @secret = secret
27
+ @request_packet = request_packet.clone if ! request_packet.nil?
28
+ @action = action
29
+
30
+ self.validate()
31
+ self.set_service_options()
32
+
33
+ @request_string = self.generate_request_string()
34
+ @security_packet['signature'] = self.generate_signature()
35
+ end
36
+
37
+ def generate_signature()
38
+ signature_array = []
39
+ @@validSecurityKeys.each do |k|
40
+ if @security_packet.include? k
41
+ signature_array.<< @security_packet[k]
42
+ end
43
+ end
44
+
45
+ signature_array << @secret
46
+
47
+ if @sign_request_data and ! @request_string.nil?
48
+ signature_array << @request_string
49
+ end
50
+
51
+ if ! @action.nil?
52
+ signature_array << @action
53
+ end
54
+
55
+ return self.hash_signature(signature_array)
56
+ end
57
+
58
+ def generate(encode = true)
59
+ output = {}
60
+
61
+ case @service
62
+ when 'assess', 'author', 'data', 'items', 'reports'
63
+ output['security'] = @security_packet
64
+
65
+ if !@request_packet.nil?
66
+ output['request'] = @request_packet
67
+ end
68
+
69
+ case @service
70
+ when 'data'
71
+ dataOutput = { 'security' => JSON.generate(output['security']) }
72
+ if output.key?('request')
73
+ dataOutput['request'] = JSON.generate(output['request'])
74
+ end
75
+ if !@action.nil?
76
+ dataOutput['action'] = @action
77
+ end
78
+ return dataOutput
79
+
80
+ when 'assess'
81
+ output = output['request']
82
+ end
83
+
84
+ when 'questions'
85
+ output = hash_except(@security_packet, 'domain')
86
+ if !@request_packet.nil?
87
+ output = output.merge(@request_packet)
88
+ end
89
+
90
+ when 'events'
91
+ output['security'] = @security_packet
92
+ output['config'] = @request_packet
93
+ else
94
+ raise Exception, "generate() for #{@service} not implemented"
95
+ end
96
+
97
+ if !encode
98
+ return output
99
+ end
100
+ return JSON.generate(output)
101
+ end
102
+
103
+ protected
104
+
105
+ attr_accessor :service, :secret, :request_packet, :action, :sign_request_data
106
+ attr_writer :security_packet, :request_string
107
+
108
+ def validate()
109
+ if @service.nil?
110
+ raise Learnosity::Sdk::ValidationException, 'The `service` argument wasn\'t found or was empty'
111
+ elsif ! @@validServices.include? @service
112
+ raise Learnosity::Sdk::ValidationException, "The service provided (#{service}) is not valid"
113
+ end
114
+
115
+ # XXX we don't do JSON to native object conversion for now, as the PHP SDK does
116
+
117
+ if @security_packet.nil? or ! @security_packet.is_a? Hash
118
+ raise Learnosity::Sdk::ValidationException, 'The security packet must be a Hash'
119
+ else
120
+ @security_packet.each do |k, v|
121
+ if ! @@validSecurityKeys.include? k
122
+ raise ValidationException, "Invalid key found in the security packet: #{k}"
123
+ end
124
+ end
125
+
126
+ if @service == 'questions' and ! @security_packet.include? 'user_id'
127
+ raise ValidationException, 'Questions API requires a `user_id` in the security packet'
128
+ end
129
+
130
+ if ! @security_packet.include? 'timestamp'
131
+ @security_packet['timestamp'] = Time.now.gmtime.strftime('%Y%m%d-%H%m')
132
+ end
133
+ end
134
+
135
+ if @secret.nil? or ! @secret.is_a? String
136
+ raise ValidationException, 'The `secret` argument must be a valid string'
137
+ end
138
+
139
+ # XXX we don't do JSON to native object conversion for now, as the PHP SDK does
140
+
141
+ if ! @request_packet.nil? and ! @request_packet.is_a? Hash
142
+ raise ValidationException, 'The request packet must be a hash'
143
+ end
144
+
145
+ if ! @action.nil? and ! @action.is_a? String
146
+ raise ValidationException, 'The `action` argument must be a string'
147
+ end
148
+
149
+ end
150
+
151
+ def set_service_options()
152
+ case @service
153
+ when 'questions'
154
+ # nothing to do
155
+ when 'assess'
156
+ if @request_packet.key?('questionsApiActivity')
157
+ questionsApiActivity = @request_packet['questionsApiActivity']
158
+
159
+ signatureParts = {}
160
+ signatureParts['consumer_key'] \
161
+ = questionsApiActivity['consumer_key'] \
162
+ = @security_packet['consumer_key']
163
+
164
+ signatureParts['domain'] = @security_packet['domain'] \
165
+ || questionsApiActivity['domain'] \
166
+ || 'assess.learnosity.com'
167
+
168
+ signatureParts['timestamp'] \
169
+ = questionsApiActivity['timestamp'] \
170
+ = @security_packet['timestamp']
171
+
172
+ signatureParts['expires'] = \
173
+ questionsApiActivity['expires'] \
174
+ = @security_packet['expires'] if @security_packet.key?('expires')
175
+
176
+ signatureParts['user_id'] = \
177
+ questionsApiActivity['user_id'] = \
178
+ @security_packet['user_id']
179
+
180
+ signatureParts['secret'] = @security_packet['secret']
181
+
182
+ # Remove expires attribute if present but nil
183
+ questionsApiActivity = hash_except(questionsApiActivity, 'expires') if questionsApiActivity['expires'].nil?
184
+
185
+ @security_packet = signatureParts
186
+ questionsApiActivity['signature'] = self.generate_signature()
187
+ @request_packet['questionsApiActivity'] = questionsApiActivity
188
+
189
+ end
190
+ when 'items', 'reports'
191
+ @sign_request_data = true
192
+ if ! @request_packet.nil? and @request_packet.include? 'user_id' and
193
+ ! @security_packet.include? 'user_id'
194
+ @security_packet['user_id'] = @request_packet['user_id']
195
+ end
196
+ when 'events'
197
+ hashedUsers = {}
198
+ @request_packet['users'].each do |k, v|
199
+ hashedUsers[k] = self.hash_value(k + @secret)
200
+ end
201
+ @request_packet['users'] = hashedUsers
202
+ when 'author', 'data'
203
+ @sign_request_data = true
204
+ else
205
+ raise Exception, "set_service_options() for #{@service} not implemented"
206
+ end
207
+ end
208
+
209
+ def generate_request_string()
210
+ request_string = nil
211
+ if ! @request_packet.nil?
212
+ request_string = JSON.generate(@request_packet)
213
+ end
214
+
215
+ return request_string
216
+ end
217
+
218
+ def hash_value(value)
219
+ return Digest::SHA256.hexdigest value
220
+ end
221
+
222
+ def hash_signature(signature_array)
223
+ return self.hash_value(signature_array.join('_'))
224
+ end
225
+
226
+ end
227
+
228
+ end
229
+ end
230
+ end
231
+
232
+ # vim: sw=2
@@ -0,0 +1,4 @@
1
+ # Emulate Hash#except from Rails
2
+ def hash_except(h, k)
3
+ return h.reject { |kk,vv| kk == k }
4
+ end
@@ -0,0 +1,5 @@
1
+ module Learnosity
2
+ module Sdk
3
+ VERSION = "0.1.0"
4
+ end
5
+ end
metadata ADDED
@@ -0,0 +1,187 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: learnosity-sdk
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Olivier Mehani
8
+ - learnosity
9
+ autorequire:
10
+ bindir: exe
11
+ cert_chain: []
12
+ date: 2017-05-10 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '1.14'
21
+ type: :development
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '1.14'
28
+ - !ruby/object:Gem::Dependency
29
+ name: rake
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '10.0'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '10.0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: rspec
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '3.0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '3.0'
56
+ description:
57
+ email:
58
+ - olivier.mehani@learnosity.com
59
+ - licenses@learnosity.com
60
+ executables: []
61
+ extensions: []
62
+ extra_rdoc_files: []
63
+ files:
64
+ - ".gitignore"
65
+ - ".rspec"
66
+ - ".travis.yml"
67
+ - Gemfile
68
+ - LICENSE
69
+ - README.md
70
+ - Rakefile
71
+ - bin/console
72
+ - bin/setup
73
+ - examples/lrn-sdk-rails/.gitignore
74
+ - examples/lrn-sdk-rails/Gemfile
75
+ - examples/lrn-sdk-rails/README.md
76
+ - examples/lrn-sdk-rails/Rakefile
77
+ - examples/lrn-sdk-rails/app/assets/config/manifest.js
78
+ - examples/lrn-sdk-rails/app/assets/images/.keep
79
+ - examples/lrn-sdk-rails/app/assets/javascripts/application.js
80
+ - examples/lrn-sdk-rails/app/assets/javascripts/cable.js
81
+ - examples/lrn-sdk-rails/app/assets/javascripts/channels/.keep
82
+ - examples/lrn-sdk-rails/app/assets/javascripts/index.coffee
83
+ - examples/lrn-sdk-rails/app/assets/stylesheets/application.css
84
+ - examples/lrn-sdk-rails/app/assets/stylesheets/index.scss
85
+ - examples/lrn-sdk-rails/app/channels/application_cable/channel.rb
86
+ - examples/lrn-sdk-rails/app/channels/application_cable/connection.rb
87
+ - examples/lrn-sdk-rails/app/controllers/application_controller.rb
88
+ - examples/lrn-sdk-rails/app/controllers/concerns/.keep
89
+ - examples/lrn-sdk-rails/app/controllers/index_controller.rb
90
+ - examples/lrn-sdk-rails/app/helpers/application_helper.rb
91
+ - examples/lrn-sdk-rails/app/helpers/index_helper.rb
92
+ - examples/lrn-sdk-rails/app/jobs/application_job.rb
93
+ - examples/lrn-sdk-rails/app/mailers/application_mailer.rb
94
+ - examples/lrn-sdk-rails/app/models/application_record.rb
95
+ - examples/lrn-sdk-rails/app/models/concerns/.keep
96
+ - examples/lrn-sdk-rails/app/views/index/index.html.erb
97
+ - examples/lrn-sdk-rails/app/views/layouts/application.html.erb
98
+ - examples/lrn-sdk-rails/app/views/layouts/mailer.html.erb
99
+ - examples/lrn-sdk-rails/app/views/layouts/mailer.text.erb
100
+ - examples/lrn-sdk-rails/bin/bundle
101
+ - examples/lrn-sdk-rails/bin/rails
102
+ - examples/lrn-sdk-rails/bin/rake
103
+ - examples/lrn-sdk-rails/bin/setup
104
+ - examples/lrn-sdk-rails/bin/spring
105
+ - examples/lrn-sdk-rails/bin/update
106
+ - examples/lrn-sdk-rails/config.ru
107
+ - examples/lrn-sdk-rails/config/application.rb
108
+ - examples/lrn-sdk-rails/config/boot.rb
109
+ - examples/lrn-sdk-rails/config/cable.yml
110
+ - examples/lrn-sdk-rails/config/database.yml
111
+ - examples/lrn-sdk-rails/config/environment.rb
112
+ - examples/lrn-sdk-rails/config/environments/development.rb
113
+ - examples/lrn-sdk-rails/config/environments/production.rb
114
+ - examples/lrn-sdk-rails/config/environments/test.rb
115
+ - examples/lrn-sdk-rails/config/initializers/application_controller_renderer.rb
116
+ - examples/lrn-sdk-rails/config/initializers/assets.rb
117
+ - examples/lrn-sdk-rails/config/initializers/backtrace_silencers.rb
118
+ - examples/lrn-sdk-rails/config/initializers/cookies_serializer.rb
119
+ - examples/lrn-sdk-rails/config/initializers/filter_parameter_logging.rb
120
+ - examples/lrn-sdk-rails/config/initializers/inflections.rb
121
+ - examples/lrn-sdk-rails/config/initializers/mime_types.rb
122
+ - examples/lrn-sdk-rails/config/initializers/new_framework_defaults.rb
123
+ - examples/lrn-sdk-rails/config/initializers/session_store.rb
124
+ - examples/lrn-sdk-rails/config/initializers/wrap_parameters.rb
125
+ - examples/lrn-sdk-rails/config/locales/en.yml
126
+ - examples/lrn-sdk-rails/config/puma.rb
127
+ - examples/lrn-sdk-rails/config/routes.rb
128
+ - examples/lrn-sdk-rails/config/secrets.yml
129
+ - examples/lrn-sdk-rails/config/spring.rb
130
+ - examples/lrn-sdk-rails/db/seeds.rb
131
+ - examples/lrn-sdk-rails/lib/assets/.keep
132
+ - examples/lrn-sdk-rails/lib/tasks/.keep
133
+ - examples/lrn-sdk-rails/log/.keep
134
+ - examples/lrn-sdk-rails/public/404.html
135
+ - examples/lrn-sdk-rails/public/422.html
136
+ - examples/lrn-sdk-rails/public/500.html
137
+ - examples/lrn-sdk-rails/public/apple-touch-icon-precomposed.png
138
+ - examples/lrn-sdk-rails/public/apple-touch-icon.png
139
+ - examples/lrn-sdk-rails/public/favicon.ico
140
+ - examples/lrn-sdk-rails/public/robots.txt
141
+ - examples/lrn-sdk-rails/test/controllers/.keep
142
+ - examples/lrn-sdk-rails/test/controllers/index_controller_test.rb
143
+ - examples/lrn-sdk-rails/test/fixtures/.keep
144
+ - examples/lrn-sdk-rails/test/fixtures/files/.keep
145
+ - examples/lrn-sdk-rails/test/helpers/.keep
146
+ - examples/lrn-sdk-rails/test/integration/.keep
147
+ - examples/lrn-sdk-rails/test/mailers/.keep
148
+ - examples/lrn-sdk-rails/test/models/.keep
149
+ - examples/lrn-sdk-rails/test/test_helper.rb
150
+ - examples/lrn-sdk-rails/tmp/.keep
151
+ - examples/lrn-sdk-rails/vendor/assets/javascripts/.keep
152
+ - examples/lrn-sdk-rails/vendor/assets/stylesheets/.keep
153
+ - examples/simple/init_data.rb
154
+ - examples/simple/init_items.rb
155
+ - learnosity-sdk.gemspec
156
+ - lib/learnosity/sdk.rb
157
+ - lib/learnosity/sdk/exceptions.rb
158
+ - lib/learnosity/sdk/request.rb
159
+ - lib/learnosity/sdk/request/init.rb
160
+ - lib/learnosity/sdk/utils.rb
161
+ - lib/learnosity/sdk/version.rb
162
+ homepage: https://github.com/Learnosity/learnosity-sdk-ruby/
163
+ licenses:
164
+ - Apache-2.0
165
+ metadata:
166
+ allowed_push_host: https://rubygems.org
167
+ post_install_message:
168
+ rdoc_options: []
169
+ require_paths:
170
+ - lib
171
+ required_ruby_version: !ruby/object:Gem::Requirement
172
+ requirements:
173
+ - - ">="
174
+ - !ruby/object:Gem::Version
175
+ version: '0'
176
+ required_rubygems_version: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ requirements: []
182
+ rubyforge_project:
183
+ rubygems_version: 2.6.11
184
+ signing_key:
185
+ specification_version: 4
186
+ summary: SDK to interact with Learnosity APIs
187
+ test_files: []