learnosity-sdk 0.1.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 (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: []