sequencescape-client-api 0.3.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (313) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +7 -0
  3. data/.rspec +1 -0
  4. data/.rvmrc +52 -0
  5. data/.yardoc/checksums +96 -0
  6. data/.yardoc/complete +0 -0
  7. data/.yardoc/object_types +0 -0
  8. data/.yardoc/objects/root.dat +0 -0
  9. data/.yardoc/proxy_types +0 -0
  10. data/Gemfile +4 -0
  11. data/README.markdown +4 -0
  12. data/Rakefile +2 -0
  13. data/doc/Array.html +192 -0
  14. data/doc/BaitLibrary.html +139 -0
  15. data/doc/Hash.html +242 -0
  16. data/doc/NilClass.html +214 -0
  17. data/doc/Sequencescape/Api/Actions/ClassActionHelpers.html +213 -0
  18. data/doc/Sequencescape/Api/Actions/InstanceActionHelpers.html +282 -0
  19. data/doc/Sequencescape/Api/Actions.html +197 -0
  20. data/doc/Sequencescape/Api/Associations/Base/InstanceMethods.html +352 -0
  21. data/doc/Sequencescape/Api/Associations/Base.html +237 -0
  22. data/doc/Sequencescape/Api/Associations/BelongsTo/AssociationProxy.html +332 -0
  23. data/doc/Sequencescape/Api/Associations/BelongsTo/CommonBehaviour/LoadHandler.html +279 -0
  24. data/doc/Sequencescape/Api/Associations/BelongsTo/CommonBehaviour.html +432 -0
  25. data/doc/Sequencescape/Api/Associations/BelongsTo/InlineAssociationProxy.html +173 -0
  26. data/doc/Sequencescape/Api/Associations/BelongsTo.html +212 -0
  27. data/doc/Sequencescape/Api/Associations/HasMany/AssociationProxy.html +366 -0
  28. data/doc/Sequencescape/Api/Associations/HasMany/InlineAssociationProxy.html +529 -0
  29. data/doc/Sequencescape/Api/Associations/HasMany/Json.html +250 -0
  30. data/doc/Sequencescape/Api/Associations/HasMany/Validation/CompositeErrors.html +493 -0
  31. data/doc/Sequencescape/Api/Associations/HasMany/Validation.html +245 -0
  32. data/doc/Sequencescape/Api/Associations/HasMany.html +212 -0
  33. data/doc/Sequencescape/Api/Associations/InstanceMethods/CompositeErrors.html +379 -0
  34. data/doc/Sequencescape/Api/Associations/InstanceMethods.html +496 -0
  35. data/doc/Sequencescape/Api/Associations.html +201 -0
  36. data/doc/Sequencescape/Api/BasicErrorHandling.html +371 -0
  37. data/doc/Sequencescape/Api/Composition/Target.html +262 -0
  38. data/doc/Sequencescape/Api/Composition.html +215 -0
  39. data/doc/Sequencescape/Api/ConnectionFactory/Actions.html +611 -0
  40. data/doc/Sequencescape/Api/ConnectionFactory/Helpers.html +233 -0
  41. data/doc/Sequencescape/Api/ConnectionFactory.html +321 -0
  42. data/doc/Sequencescape/Api/ErrorHandling/TurnOffValidationOfUuidOnlyRecords.html +189 -0
  43. data/doc/Sequencescape/Api/ErrorHandling.html +201 -0
  44. data/doc/Sequencescape/Api/FinderMethods/AllHandler.html +279 -0
  45. data/doc/Sequencescape/Api/FinderMethods/Caching.html +183 -0
  46. data/doc/Sequencescape/Api/FinderMethods/Delegation.html +189 -0
  47. data/doc/Sequencescape/Api/FinderMethods/FindByUuidHandler.html +279 -0
  48. data/doc/Sequencescape/Api/FinderMethods.html +364 -0
  49. data/doc/Sequencescape/Api/GeneralError.html +176 -0
  50. data/doc/Sequencescape/Api/JsonError.html +205 -0
  51. data/doc/Sequencescape/Api/ModifyingHandler.html +359 -0
  52. data/doc/Sequencescape/Api/PageOfResults/UpdateHandler.html +279 -0
  53. data/doc/Sequencescape/Api/PageOfResults.html +611 -0
  54. data/doc/Sequencescape/Api/Rails/ApplicationController.html +207 -0
  55. data/doc/Sequencescape/Api/Rails/Resourced.html +269 -0
  56. data/doc/Sequencescape/Api/Rails.html +117 -0
  57. data/doc/Sequencescape/Api/Resource/ActiveModel.html +287 -0
  58. data/doc/Sequencescape/Api/Resource/Attributes/InstanceMethods.html +272 -0
  59. data/doc/Sequencescape/Api/Resource/Attributes.html +199 -0
  60. data/doc/Sequencescape/Api/Resource/Groups/InstanceMethods.html +378 -0
  61. data/doc/Sequencescape/Api/Resource/Groups/Json.html +112 -0
  62. data/doc/Sequencescape/Api/Resource/Groups/Proxy/InstanceMethods.html +256 -0
  63. data/doc/Sequencescape/Api/Resource/Groups/Proxy.html +177 -0
  64. data/doc/Sequencescape/Api/Resource/Groups.html +270 -0
  65. data/doc/Sequencescape/Api/Resource/InstanceMethods.html +344 -0
  66. data/doc/Sequencescape/Api/Resource/Json/ClassMethods.html +243 -0
  67. data/doc/Sequencescape/Api/Resource/Json/CoercionHandler.html +279 -0
  68. data/doc/Sequencescape/Api/Resource/Json.html +405 -0
  69. data/doc/Sequencescape/Api/Resource/Modifications.html +295 -0
  70. data/doc/Sequencescape/Api/Resource.html +436 -0
  71. data/doc/Sequencescape/Api/ResourceInvalid.html +289 -0
  72. data/doc/Sequencescape/Api/ResourceModelProxy.html +444 -0
  73. data/doc/Sequencescape/Api/Version1.html +218 -0
  74. data/doc/Sequencescape/Api/Version2.html +222 -0
  75. data/doc/Sequencescape/Api.html +704 -0
  76. data/doc/Sequencescape/Asset.html +262 -0
  77. data/doc/Sequencescape/AssetAudit.html +258 -0
  78. data/doc/Sequencescape/AssetGroup.html +258 -0
  79. data/doc/Sequencescape/BaitLibraryLayout.html +258 -0
  80. data/doc/Sequencescape/BarcodePrinter.html +258 -0
  81. data/doc/Sequencescape/BarcodedAsset.html +293 -0
  82. data/doc/Sequencescape/Batch.html +327 -0
  83. data/doc/Sequencescape/Behaviour/Barcoded.html +195 -0
  84. data/doc/Sequencescape/Behaviour/Labeled.html +189 -0
  85. data/doc/Sequencescape/Behaviour/Qced/QcFile.html +244 -0
  86. data/doc/Sequencescape/Behaviour/Qced.html +199 -0
  87. data/doc/Sequencescape/Behaviour/Receptacle/Aliquot.html +258 -0
  88. data/doc/Sequencescape/Behaviour/Receptacle.html +195 -0
  89. data/doc/Sequencescape/Behaviour/StateDriven.html +205 -0
  90. data/doc/Sequencescape/Behaviour.html +130 -0
  91. data/doc/Sequencescape/BulkTransfer.html +258 -0
  92. data/doc/Sequencescape/Comment.html +258 -0
  93. data/doc/Sequencescape/Lane.html +282 -0
  94. data/doc/Sequencescape/LibraryEvent.html +258 -0
  95. data/doc/Sequencescape/LibraryTube.html +322 -0
  96. data/doc/Sequencescape/Lot.html +258 -0
  97. data/doc/Sequencescape/LotType/LotCreator.html +182 -0
  98. data/doc/Sequencescape/LotType.html +268 -0
  99. data/doc/Sequencescape/MultiplexedLibraryTube.html +326 -0
  100. data/doc/Sequencescape/Order.html +338 -0
  101. data/doc/Sequencescape/OrderTemplate/OrderCreator.html +182 -0
  102. data/doc/Sequencescape/OrderTemplate.html +268 -0
  103. data/doc/Sequencescape/Pipeline.html +258 -0
  104. data/doc/Sequencescape/Plate/CommentsCreation.html +184 -0
  105. data/doc/Sequencescape/Plate/CurrentVolumeSubstraction.html +236 -0
  106. data/doc/Sequencescape/Plate/Pooling.html +249 -0
  107. data/doc/Sequencescape/Plate/WellStructure.html +313 -0
  108. data/doc/Sequencescape/Plate.html +446 -0
  109. data/doc/Sequencescape/PlateConversion.html +258 -0
  110. data/doc/Sequencescape/PlateCreation.html +258 -0
  111. data/doc/Sequencescape/PlatePurpose/PlateCreation.html +186 -0
  112. data/doc/Sequencescape/PlatePurpose.html +268 -0
  113. data/doc/Sequencescape/PlateTemplate.html +282 -0
  114. data/doc/Sequencescape/PooledPlateCreation.html +258 -0
  115. data/doc/Sequencescape/Project.html +258 -0
  116. data/doc/Sequencescape/QcDecision.html +258 -0
  117. data/doc/Sequencescape/QcFile.html +327 -0
  118. data/doc/Sequencescape/Qcable.html +258 -0
  119. data/doc/Sequencescape/QcableCreator.html +258 -0
  120. data/doc/Sequencescape/Request.html +258 -0
  121. data/doc/Sequencescape/Robot.html +258 -0
  122. data/doc/Sequencescape/Sample.html +258 -0
  123. data/doc/Sequencescape/SampleTube.html +318 -0
  124. data/doc/Sequencescape/Search/BaseHandler.html +234 -0
  125. data/doc/Sequencescape/Search/MultipleResultHandler.html +276 -0
  126. data/doc/Sequencescape/Search/SingleResultHandler.html +303 -0
  127. data/doc/Sequencescape/Search.html +431 -0
  128. data/doc/Sequencescape/SpecificTubeCreation.html +258 -0
  129. data/doc/Sequencescape/Stamp.html +258 -0
  130. data/doc/Sequencescape/StateChange.html +258 -0
  131. data/doc/Sequencescape/Study.html +258 -0
  132. data/doc/Sequencescape/Submission.html +258 -0
  133. data/doc/Sequencescape/SubmissionPool.html +258 -0
  134. data/doc/Sequencescape/Tag/Group.html +219 -0
  135. data/doc/Sequencescape/Tag.html +149 -0
  136. data/doc/Sequencescape/Tag2Layout.html +258 -0
  137. data/doc/Sequencescape/Tag2LayoutTemplate.html +258 -0
  138. data/doc/Sequencescape/TagGroup.html +258 -0
  139. data/doc/Sequencescape/TagLayout.html +258 -0
  140. data/doc/Sequencescape/TagLayoutTemplate.html +258 -0
  141. data/doc/Sequencescape/Template.html +258 -0
  142. data/doc/Sequencescape/Transfer.html +258 -0
  143. data/doc/Sequencescape/TransferTemplate.html +258 -0
  144. data/doc/Sequencescape/Tube.html +319 -0
  145. data/doc/Sequencescape/TubeCreation.html +258 -0
  146. data/doc/Sequencescape/TubeFromTubeCreation.html +258 -0
  147. data/doc/Sequencescape/TubePurpose/TubeCreation.html +186 -0
  148. data/doc/Sequencescape/TubePurpose.html +268 -0
  149. data/doc/Sequencescape/User.html +258 -0
  150. data/doc/Sequencescape/VolumeUpdate.html +258 -0
  151. data/doc/Sequencescape/Well.html +362 -0
  152. data/doc/Sequencescape.html +121 -0
  153. data/doc/_index.html +1248 -0
  154. data/doc/class_list.html +51 -0
  155. data/doc/css/common.css +1 -0
  156. data/doc/css/full_list.css +58 -0
  157. data/doc/css/style.css +481 -0
  158. data/doc/file.README.html +76 -0
  159. data/doc/file_list.html +56 -0
  160. data/doc/frames.html +17 -0
  161. data/doc/index.html +76 -0
  162. data/doc/js/app.js +243 -0
  163. data/doc/js/full_list.js +216 -0
  164. data/doc/js/jquery.js +4 -0
  165. data/doc/method_list.html +1411 -0
  166. data/doc/top-level-namespace.html +114 -0
  167. data/lib/sequencescape/asset.rb +10 -0
  168. data/lib/sequencescape/asset_audit.rb +7 -0
  169. data/lib/sequencescape/asset_group.rb +9 -0
  170. data/lib/sequencescape/bait_library.rb +14 -0
  171. data/lib/sequencescape/bait_library_layout.rb +9 -0
  172. data/lib/sequencescape/barcode_printer.rb +13 -0
  173. data/lib/sequencescape/barcoded_asset.rb +12 -0
  174. data/lib/sequencescape/batch.rb +24 -0
  175. data/lib/sequencescape/behaviour/barcoded.rb +15 -0
  176. data/lib/sequencescape/behaviour/labeled.rb +14 -0
  177. data/lib/sequencescape/behaviour/qced.rb +31 -0
  178. data/lib/sequencescape/behaviour/receptacle.rb +21 -0
  179. data/lib/sequencescape/behaviour/state_driven.rb +19 -0
  180. data/lib/sequencescape/bulk_transfer.rb +8 -0
  181. data/lib/sequencescape/comment.rb +7 -0
  182. data/lib/sequencescape/custom_metadatum_collection.rb +8 -0
  183. data/lib/sequencescape/lane.rb +8 -0
  184. data/lib/sequencescape/library_event.rb +5 -0
  185. data/lib/sequencescape/library_tube.rb +7 -0
  186. data/lib/sequencescape/locale/en.yml +190 -0
  187. data/lib/sequencescape/lot.rb +11 -0
  188. data/lib/sequencescape/lot_type.rb +20 -0
  189. data/lib/sequencescape/multiplexed_library_tube.rb +6 -0
  190. data/lib/sequencescape/order.rb +13 -0
  191. data/lib/sequencescape/order_template.rb +19 -0
  192. data/lib/sequencescape/pipeline.rb +10 -0
  193. data/lib/sequencescape/plate/pooling.rb +23 -0
  194. data/lib/sequencescape/plate/well_structure.rb +27 -0
  195. data/lib/sequencescape/plate.rb +71 -0
  196. data/lib/sequencescape/plate_conversion.rb +8 -0
  197. data/lib/sequencescape/plate_creation.rb +8 -0
  198. data/lib/sequencescape/plate_purpose.rb +24 -0
  199. data/lib/sequencescape/plate_template.rb +13 -0
  200. data/lib/sequencescape/pooled_plate_creation.rb +8 -0
  201. data/lib/sequencescape/project.rb +11 -0
  202. data/lib/sequencescape/qc_decision.rb +9 -0
  203. data/lib/sequencescape/qc_file.rb +14 -0
  204. data/lib/sequencescape/qcable.rb +17 -0
  205. data/lib/sequencescape/qcable_creator.rb +13 -0
  206. data/lib/sequencescape/request.rb +16 -0
  207. data/lib/sequencescape/robot.rb +5 -0
  208. data/lib/sequencescape/sample.rb +51 -0
  209. data/lib/sequencescape/sample_tube.rb +7 -0
  210. data/lib/sequencescape/search.rb +80 -0
  211. data/lib/sequencescape/specific_tube_creation.rb +8 -0
  212. data/lib/sequencescape/stamp.rb +9 -0
  213. data/lib/sequencescape/state_change.rb +11 -0
  214. data/lib/sequencescape/study.rb +14 -0
  215. data/lib/sequencescape/submission.rb +16 -0
  216. data/lib/sequencescape/submission_pool.rb +7 -0
  217. data/lib/sequencescape/tag.rb +14 -0
  218. data/lib/sequencescape/tag2_layout.rb +10 -0
  219. data/lib/sequencescape/tag2_layout_template.rb +9 -0
  220. data/lib/sequencescape/tag_group.rb +4 -0
  221. data/lib/sequencescape/tag_layout.rb +10 -0
  222. data/lib/sequencescape/tag_layout_template.rb +15 -0
  223. data/lib/sequencescape/template.rb +6 -0
  224. data/lib/sequencescape/transfer.rb +9 -0
  225. data/lib/sequencescape/transfer_request.rb +12 -0
  226. data/lib/sequencescape/transfer_request_collection.rb +8 -0
  227. data/lib/sequencescape/transfer_template.rb +9 -0
  228. data/lib/sequencescape/tube.rb +26 -0
  229. data/lib/sequencescape/tube_creation.rb +8 -0
  230. data/lib/sequencescape/tube_from_tube_creation.rb +8 -0
  231. data/lib/sequencescape/tube_purpose.rb +24 -0
  232. data/lib/sequencescape/user.rb +13 -0
  233. data/lib/sequencescape/volume_update.rb +6 -0
  234. data/lib/sequencescape/well.rb +19 -0
  235. data/lib/sequencescape/work_completion.rb +10 -0
  236. data/lib/sequencescape-api/actions.rb +69 -0
  237. data/lib/sequencescape-api/associations/base/instance_methods.rb +57 -0
  238. data/lib/sequencescape-api/associations/base.rb +15 -0
  239. data/lib/sequencescape-api/associations/belongs_to.rb +127 -0
  240. data/lib/sequencescape-api/associations/has_many/json.rb +10 -0
  241. data/lib/sequencescape-api/associations/has_many/validation.rb +37 -0
  242. data/lib/sequencescape-api/associations/has_many.rb +123 -0
  243. data/lib/sequencescape-api/associations.rb +112 -0
  244. data/lib/sequencescape-api/capabilities.rb +11 -0
  245. data/lib/sequencescape-api/composition.rb +37 -0
  246. data/lib/sequencescape-api/connection_factory/actions.rb +154 -0
  247. data/lib/sequencescape-api/connection_factory/helpers.rb +9 -0
  248. data/lib/sequencescape-api/connection_factory.rb +40 -0
  249. data/lib/sequencescape-api/core.rb +63 -0
  250. data/lib/sequencescape-api/core_ext/array.rb +7 -0
  251. data/lib/sequencescape-api/core_ext/hash.rb +18 -0
  252. data/lib/sequencescape-api/core_ext.rb +2 -0
  253. data/lib/sequencescape-api/error_handling.rb +42 -0
  254. data/lib/sequencescape-api/errors.rb +38 -0
  255. data/lib/sequencescape-api/finder_methods.rb +184 -0
  256. data/lib/sequencescape-api/locale/en.yml +7 -0
  257. data/lib/sequencescape-api/rails.rb +88 -0
  258. data/lib/sequencescape-api/resource/active_model.rb +17 -0
  259. data/lib/sequencescape-api/resource/attribute_groups.rb +94 -0
  260. data/lib/sequencescape-api/resource/attributes.rb +87 -0
  261. data/lib/sequencescape-api/resource/instance_methods.rb +24 -0
  262. data/lib/sequencescape-api/resource/json.rb +114 -0
  263. data/lib/sequencescape-api/resource/modifications.rb +111 -0
  264. data/lib/sequencescape-api/resource.rb +47 -0
  265. data/lib/sequencescape-api/resource_model_proxy.rb +44 -0
  266. data/lib/sequencescape-api/version.rb +5 -0
  267. data/lib/sequencescape-api.rb +16 -0
  268. data/lib/sequencescape.rb +81 -0
  269. data/sequencescape-api.gemspec +32 -0
  270. data/spec/sequencescape-api/associations_spec.rb +95 -0
  271. data/spec/sequencescape-api/contracts/belongs-to-association.txt +14 -0
  272. data/spec/sequencescape-api/contracts/client-fails-authentication.txt +6 -0
  273. data/spec/sequencescape-api/contracts/create-invalid-resource.txt +10 -0
  274. data/spec/sequencescape-api/contracts/create-model-c-has-many-inline-nested.txt +10 -0
  275. data/spec/sequencescape-api/contracts/create-model-c-has-many-inline.txt +10 -0
  276. data/spec/sequencescape-api/contracts/create-model-c-has-many.txt +10 -0
  277. data/spec/sequencescape-api/contracts/create-model-c.txt +11 -0
  278. data/spec/sequencescape-api/contracts/create-via-has-many.txt +9 -0
  279. data/spec/sequencescape-api/contracts/model-a-instance.txt +21 -0
  280. data/spec/sequencescape-api/contracts/model-b-instance.txt +38 -0
  281. data/spec/sequencescape-api/contracts/model-c-instance-created.txt +17 -0
  282. data/spec/sequencescape-api/contracts/model-c-instance-updated.txt +17 -0
  283. data/spec/sequencescape-api/contracts/model-c-instance.txt +28 -0
  284. data/spec/sequencescape-api/contracts/model-c-invalid-attribute.txt +8 -0
  285. data/spec/sequencescape-api/contracts/resource-not-found.txt +6 -0
  286. data/spec/sequencescape-api/contracts/results-page-1.txt +17 -0
  287. data/spec/sequencescape-api/contracts/results-page-2.txt +18 -0
  288. data/spec/sequencescape-api/contracts/results-page-3.txt +17 -0
  289. data/spec/sequencescape-api/contracts/retrieve-belongs-to-association.txt +3 -0
  290. data/spec/sequencescape-api/contracts/retrieve-model.txt +4 -0
  291. data/spec/sequencescape-api/contracts/retrieve-results-page-1.txt +3 -0
  292. data/spec/sequencescape-api/contracts/retrieve-results-page-2.txt +3 -0
  293. data/spec/sequencescape-api/contracts/retrieve-results-page-3.txt +3 -0
  294. data/spec/sequencescape-api/contracts/retrieve-root-with-an-authorised-client.txt +5 -0
  295. data/spec/sequencescape-api/contracts/retrieve-root-with-an-unauthorised-client.txt +4 -0
  296. data/spec/sequencescape-api/contracts/retrieve-unauthorised-model-a-list.txt +4 -0
  297. data/spec/sequencescape-api/contracts/retrieve-unauthorised-model-b-list.txt +4 -0
  298. data/spec/sequencescape-api/contracts/retrieve-unauthorised-model-c-list.txt +4 -0
  299. data/spec/sequencescape-api/contracts/root-response-for-authorised-client.txt +20 -0
  300. data/spec/sequencescape-api/contracts/root-response-for-unauthorised-client.txt +28 -0
  301. data/spec/sequencescape-api/contracts/unauthorised-model-a-list.txt +15 -0
  302. data/spec/sequencescape-api/contracts/unauthorised-model-b-list.txt +14 -0
  303. data/spec/sequencescape-api/contracts/unauthorised-model-c-list.txt +15 -0
  304. data/spec/sequencescape-api/contracts/update-invalid-resource.txt +10 -0
  305. data/spec/sequencescape-api/contracts/update-model-c.txt +11 -0
  306. data/spec/sequencescape-api/finding_methods_spec.rb +34 -0
  307. data/spec/sequencescape-api/modifications_spec.rb +169 -0
  308. data/spec/sequencescape-api/root_spec.rb +58 -0
  309. data/spec/spec_helper.rb +13 -0
  310. data/spec/support/contract_helper.rb +112 -0
  311. data/spec/support/namespaces.rb +67 -0
  312. data/spec/support/shared_examples.rb +12 -0
  313. metadata +540 -0
@@ -0,0 +1,58 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Handling authentication issues' do
4
+ stub_request_from('retrieve-root-with-an-unauthorised-client') { response('client-fails-authentication') }
5
+
6
+ subject { Sequencescape::Api.new(:url => 'http://localhost:3000/', :cookie => 'single-sign-on-cookie') }
7
+
8
+ it 'raises an exception' do
9
+ lambda { subject }.should raise_error(Sequencescape::Api::UnauthenticatedError)
10
+ end
11
+ end
12
+
13
+ describe 'Retrieving the root URL' do
14
+ context 'with an unauthorised client' do
15
+ is_working_as_an_unauthorised_client
16
+
17
+ context 'with no namespace' do
18
+ subject { Sequencescape::Api.new(:url => 'http://localhost:3000/', :cookie => 'single-sign-on-cookie') }
19
+
20
+ Unauthorised::MODELS_THROUGH_API.each do |model|
21
+ it "provides the #{model} through the API instance" do
22
+ subject.should respond_to(model.to_sym)
23
+ end
24
+
25
+ it "errors because Sequencescape::#{model.to_s.classify} is not defined" do
26
+ # Note: Using a regex as > Ruby 2.3 'DidYouMean' changes the error message slightly.
27
+ lambda { subject.send(model.to_sym) }.should raise_error(NameError, /uninitialized constant Sequencescape::#{model.to_s.classify}/)
28
+ end
29
+ end
30
+ end
31
+
32
+ context "with a specified namespace" do
33
+ Unauthorised::MODELS_THROUGH_API.each do |model|
34
+ context do
35
+ stub_request_and_response("unauthorised-#{model.to_s.dasherize}-list")
36
+
37
+ subject { api.send(model) }
38
+
39
+ it "makes the correct request for Unauthorised::#{model.to_s.classify}" do
40
+ subject.all
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ context 'with an authorised client' do
48
+ is_working_as_an_authorised_client
49
+
50
+ subject { api }
51
+
52
+ [ :model_c, :model_d ].each do |model|
53
+ it "provides the #{model} through the API instance" do
54
+ subject.should respond_to(model.to_sym)
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,13 @@
1
+ require 'sequencescape-api'
2
+ require 'sequencescape'
3
+
4
+ # Make sure our support files can be loaded when required
5
+ $:.push(File.expand_path(File.join(File.dirname(__FILE__), 'support')))
6
+ require 'contract_helper'
7
+ require 'namespaces'
8
+ require 'shared_examples'
9
+
10
+ # Ensure that RSpec mocking is used
11
+ RSpec.configure do |config|
12
+ config.mock_framework = :rspec
13
+ end
@@ -0,0 +1,112 @@
1
+ # Fake the web connections so we don't trash anything
2
+ require 'webmock/rspec'
3
+
4
+ module ContractHelper
5
+ class StubRequestBuilder
6
+ include WebMock::API
7
+ include WebMock::Matchers
8
+
9
+ def initialize(root_directory)
10
+ @root = File.split(File.expand_path(root_directory))
11
+ end
12
+
13
+ REQUEST_REGEXP = %r{
14
+ (?<eol> \r\n|\r|\n){0}
15
+ (?<verb> GET|PUT|POST|DELETE){0}
16
+ (?<path> /[^\s]*){0}
17
+ (?<body> .+){0}
18
+ (?<header> [^:\r\n]+:[^\r\n]+){0}
19
+ (?<headers> \g<header>(\g<eol>\g<header>)*){0}
20
+
21
+ \g<verb>\s+\g<path>\s+HTTP/1.1\g<eol>
22
+ \g<headers>\g<eol>
23
+ (\g<eol>\g<body>?)?
24
+ }mx
25
+
26
+ def request(contract_name)
27
+ contract(contract_name) do |file|
28
+ match = REQUEST_REGEXP.match(file.read) or raise StandardError, "Invalidly formatted request in #{contract_name.inspect}"
29
+
30
+ @http_verb, @url = match[:verb].downcase.to_sym, "http://localhost:3000#{match[:path]}"
31
+ @conditions = {}
32
+ @conditions[:headers] = Hash[*match[:headers].split(/\r?\n/).map { |l| l.split(':') }.flatten.map(&:strip)]
33
+ @conditions[:body] = Yajl::Encoder.encode(Yajl::Parser.parse(match[:body])) unless match[:body].blank?
34
+ end
35
+ end
36
+
37
+ def response(contract_name)
38
+ contract(contract_name) do |file|
39
+ @content = file.read
40
+ end
41
+ end
42
+
43
+ def contract(contract_name, &block)
44
+ path = @root.dup
45
+ until path.empty?
46
+ filename = File.join(path, 'contracts', "#{contract_name}.txt")
47
+ return File.open(filename, 'r') { |file| yield(file) } if File.file?(filename)
48
+ path.pop
49
+ end
50
+ raise StandardError, "Cannot find contract #{filename.inspect} anywhere within #{@root.inspect}"
51
+ end
52
+ private :contract
53
+
54
+ def setup_request_and_response_mock
55
+ stub_request(@http_verb, @url).with(@conditions).to_return(@content)
56
+ end
57
+ private :setup_request_and_response_mock
58
+
59
+ def validate_request_and_response_called
60
+ a_request(@http_verb, @url).with(@conditions).should have_been_made
61
+ end
62
+ private :validate_request_and_response_called
63
+
64
+ def inject_into(spec)
65
+ builder = self
66
+ spec.before(:each) { builder.send(:setup_request_and_response_mock) }
67
+ spec.after(:each) { builder.send(:validate_request_and_response_called) }
68
+ end
69
+ end
70
+
71
+ def self.included(base)
72
+ base.extend(ClassMethods)
73
+ end
74
+
75
+ module ClassMethods
76
+ def stub_request_from(request_filename, &block)
77
+ stubbed_request = StubRequestBuilder.new(File.join(File.dirname(__FILE__), %w{.. sequencescape-api contracts}))
78
+ stubbed_request.request(request_filename)
79
+ stubbed_request.instance_eval(&block)
80
+ stubbed_request.inject_into(self)
81
+ end
82
+
83
+ def stub_request_and_response(contract_name)
84
+ stub_request_from("retrieve-#{contract_name}") { response(contract_name) }
85
+ end
86
+
87
+ def is_working_as_an_unauthorised_client
88
+ stub_request_from('retrieve-root-with-an-unauthorised-client') { response('root-response-for-unauthorised-client') }
89
+ let(:api) do
90
+ Sequencescape::Api.new(
91
+ :url => 'http://localhost:3000/', :cookie => 'single-sign-on-cookie',
92
+ :namespace => Unauthorised
93
+ )
94
+ end
95
+ end
96
+
97
+ def is_working_as_an_authorised_client
98
+ stub_request_from('retrieve-root-with-an-authorised-client') { response('root-response-for-authorised-client') }
99
+
100
+ let(:api) do
101
+ Sequencescape::Api.new(
102
+ :url => 'http://localhost:3000/', :cookie => 'single-sign-on-cookie',
103
+ :authorisation => 'authorised!', :namespace => Authenticated
104
+ )
105
+ end
106
+ end
107
+ end
108
+ end
109
+
110
+ RSpec.configure do |config|
111
+ config.include ContractHelper
112
+ end
@@ -0,0 +1,67 @@
1
+ module Unauthorised
2
+ MODELS_THROUGH_API = [ :model_a, :model_b, :model_c ]
3
+
4
+ class ModelA < Sequencescape::Api::Resource
5
+ module LotCreator
6
+ def create!(attributes=nil)
7
+ attributes ||= {}
8
+ new({}, false).tap do |lot|
9
+ api.create(actions.create, { 'model_b' => attributes }, Sequencescape::Api::ModifyingHandler.new(lot))
10
+ end
11
+ end
12
+ end
13
+
14
+ has_many :model_bs do
15
+ include ModelA::LotCreator
16
+ # has_create_action
17
+ end
18
+
19
+ attribute_accessor :name, :data
20
+ attribute_group :group do
21
+ attribute_accessor :data
22
+ end
23
+ end
24
+
25
+ class ModelB < Sequencescape::Api::Resource
26
+ belongs_to :model_a
27
+ belongs_to :model_by_simple_name, :class_name => 'ModelA'
28
+ belongs_to :model_by_full_name, :class_name => 'Nested::Model'
29
+ belongs_to :model_with_early_data, :class_name => 'ModelA'
30
+ attribute_accessor :test_attribute
31
+ end
32
+
33
+ class ModelC < Sequencescape::Api::Resource
34
+ has_many :model_bs, :disposition => :inline
35
+ has_many :model_as
36
+
37
+ attribute_accessor :attribute_validated_at_client, :attribute_validated_at_server
38
+ validates_each(:attribute_validated_at_client) do |record, attribute, value|
39
+ record.errors.add(attribute, 'cannot be set') unless value.blank?
40
+ end
41
+
42
+ attribute_accessor :changes_during_update, :remains_same_during_update
43
+
44
+ attribute_reader :read_only
45
+ attribute_writer :write_only
46
+ end
47
+
48
+ class Page < Sequencescape::Api::Resource
49
+ end
50
+
51
+ module Nested
52
+ class Model < Sequencescape::Api::Resource
53
+ attribute_accessor :name
54
+ end
55
+ end
56
+ end
57
+
58
+ module Authenticated
59
+ MODELS_THROUGH_API = [ :model_c, :model_d ]
60
+
61
+ class ModelC < Sequencescape::Api::Resource
62
+
63
+ end
64
+ class ModelD < Sequencescape::Api::Resource
65
+
66
+ end
67
+ end
@@ -0,0 +1,12 @@
1
+ shared_examples_for 'a paged result' do
2
+ it 'physically contains 3 items' do
3
+ subject.map(&:inspect).size.should == 3
4
+ end
5
+
6
+ it 'can be walked in pages' do
7
+ check = double('check that page gets called at least once')
8
+ check.should_receive(:called).at_least(1).at_most(3)
9
+
10
+ subject.each_page(&check.method(:called))
11
+ end
12
+ end
metadata ADDED
@@ -0,0 +1,540 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sequencescape-client-api
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.5
5
+ platform: ruby
6
+ authors:
7
+ - Matthew Denner
8
+ - James Glover
9
+ - Eduardo Martin Rojo
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2018-11-05 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: activesupport
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - ">="
20
+ - !ruby/object:Gem::Version
21
+ version: 4.0.0
22
+ - - "<"
23
+ - !ruby/object:Gem::Version
24
+ version: '5.2'
25
+ type: :runtime
26
+ prerelease: false
27
+ version_requirements: !ruby/object:Gem::Requirement
28
+ requirements:
29
+ - - ">="
30
+ - !ruby/object:Gem::Version
31
+ version: 4.0.0
32
+ - - "<"
33
+ - !ruby/object:Gem::Version
34
+ version: '5.2'
35
+ - !ruby/object:Gem::Dependency
36
+ name: activemodel
37
+ requirement: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: 4.0.0
42
+ - - "<"
43
+ - !ruby/object:Gem::Version
44
+ version: '5.2'
45
+ type: :runtime
46
+ prerelease: false
47
+ version_requirements: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: 4.0.0
52
+ - - "<"
53
+ - !ruby/object:Gem::Version
54
+ version: '5.2'
55
+ - !ruby/object:Gem::Dependency
56
+ name: i18n
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: yajl-ruby
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: 1.3.1
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 1.3.1
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 2.11.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 2.11.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: webmock
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: yard
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: redcarpet
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ description: Provides all of the necessary code for interacting with the Sequencescape
154
+ API
155
+ email:
156
+ - md12@sanger.ac.uk
157
+ - james.glover@sanger.ac.uk
158
+ - emr@sanger.ac.uk
159
+ executables: []
160
+ extensions: []
161
+ extra_rdoc_files: []
162
+ files:
163
+ - ".gitignore"
164
+ - ".rspec"
165
+ - ".rvmrc"
166
+ - ".yardoc/checksums"
167
+ - ".yardoc/complete"
168
+ - ".yardoc/object_types"
169
+ - ".yardoc/objects/root.dat"
170
+ - ".yardoc/proxy_types"
171
+ - Gemfile
172
+ - README.markdown
173
+ - Rakefile
174
+ - doc/Array.html
175
+ - doc/BaitLibrary.html
176
+ - doc/Hash.html
177
+ - doc/NilClass.html
178
+ - doc/Sequencescape.html
179
+ - doc/Sequencescape/Api.html
180
+ - doc/Sequencescape/Api/Actions.html
181
+ - doc/Sequencescape/Api/Actions/ClassActionHelpers.html
182
+ - doc/Sequencescape/Api/Actions/InstanceActionHelpers.html
183
+ - doc/Sequencescape/Api/Associations.html
184
+ - doc/Sequencescape/Api/Associations/Base.html
185
+ - doc/Sequencescape/Api/Associations/Base/InstanceMethods.html
186
+ - doc/Sequencescape/Api/Associations/BelongsTo.html
187
+ - doc/Sequencescape/Api/Associations/BelongsTo/AssociationProxy.html
188
+ - doc/Sequencescape/Api/Associations/BelongsTo/CommonBehaviour.html
189
+ - doc/Sequencescape/Api/Associations/BelongsTo/CommonBehaviour/LoadHandler.html
190
+ - doc/Sequencescape/Api/Associations/BelongsTo/InlineAssociationProxy.html
191
+ - doc/Sequencescape/Api/Associations/HasMany.html
192
+ - doc/Sequencescape/Api/Associations/HasMany/AssociationProxy.html
193
+ - doc/Sequencescape/Api/Associations/HasMany/InlineAssociationProxy.html
194
+ - doc/Sequencescape/Api/Associations/HasMany/Json.html
195
+ - doc/Sequencescape/Api/Associations/HasMany/Validation.html
196
+ - doc/Sequencescape/Api/Associations/HasMany/Validation/CompositeErrors.html
197
+ - doc/Sequencescape/Api/Associations/InstanceMethods.html
198
+ - doc/Sequencescape/Api/Associations/InstanceMethods/CompositeErrors.html
199
+ - doc/Sequencescape/Api/BasicErrorHandling.html
200
+ - doc/Sequencescape/Api/Composition.html
201
+ - doc/Sequencescape/Api/Composition/Target.html
202
+ - doc/Sequencescape/Api/ConnectionFactory.html
203
+ - doc/Sequencescape/Api/ConnectionFactory/Actions.html
204
+ - doc/Sequencescape/Api/ConnectionFactory/Helpers.html
205
+ - doc/Sequencescape/Api/ErrorHandling.html
206
+ - doc/Sequencescape/Api/ErrorHandling/TurnOffValidationOfUuidOnlyRecords.html
207
+ - doc/Sequencescape/Api/FinderMethods.html
208
+ - doc/Sequencescape/Api/FinderMethods/AllHandler.html
209
+ - doc/Sequencescape/Api/FinderMethods/Caching.html
210
+ - doc/Sequencescape/Api/FinderMethods/Delegation.html
211
+ - doc/Sequencescape/Api/FinderMethods/FindByUuidHandler.html
212
+ - doc/Sequencescape/Api/GeneralError.html
213
+ - doc/Sequencescape/Api/JsonError.html
214
+ - doc/Sequencescape/Api/ModifyingHandler.html
215
+ - doc/Sequencescape/Api/PageOfResults.html
216
+ - doc/Sequencescape/Api/PageOfResults/UpdateHandler.html
217
+ - doc/Sequencescape/Api/Rails.html
218
+ - doc/Sequencescape/Api/Rails/ApplicationController.html
219
+ - doc/Sequencescape/Api/Rails/Resourced.html
220
+ - doc/Sequencescape/Api/Resource.html
221
+ - doc/Sequencescape/Api/Resource/ActiveModel.html
222
+ - doc/Sequencescape/Api/Resource/Attributes.html
223
+ - doc/Sequencescape/Api/Resource/Attributes/InstanceMethods.html
224
+ - doc/Sequencescape/Api/Resource/Groups.html
225
+ - doc/Sequencescape/Api/Resource/Groups/InstanceMethods.html
226
+ - doc/Sequencescape/Api/Resource/Groups/Json.html
227
+ - doc/Sequencescape/Api/Resource/Groups/Proxy.html
228
+ - doc/Sequencescape/Api/Resource/Groups/Proxy/InstanceMethods.html
229
+ - doc/Sequencescape/Api/Resource/InstanceMethods.html
230
+ - doc/Sequencescape/Api/Resource/Json.html
231
+ - doc/Sequencescape/Api/Resource/Json/ClassMethods.html
232
+ - doc/Sequencescape/Api/Resource/Json/CoercionHandler.html
233
+ - doc/Sequencescape/Api/Resource/Modifications.html
234
+ - doc/Sequencescape/Api/ResourceInvalid.html
235
+ - doc/Sequencescape/Api/ResourceModelProxy.html
236
+ - doc/Sequencescape/Api/Version1.html
237
+ - doc/Sequencescape/Api/Version2.html
238
+ - doc/Sequencescape/Asset.html
239
+ - doc/Sequencescape/AssetAudit.html
240
+ - doc/Sequencescape/AssetGroup.html
241
+ - doc/Sequencescape/BaitLibraryLayout.html
242
+ - doc/Sequencescape/BarcodePrinter.html
243
+ - doc/Sequencescape/BarcodedAsset.html
244
+ - doc/Sequencescape/Batch.html
245
+ - doc/Sequencescape/Behaviour.html
246
+ - doc/Sequencescape/Behaviour/Barcoded.html
247
+ - doc/Sequencescape/Behaviour/Labeled.html
248
+ - doc/Sequencescape/Behaviour/Qced.html
249
+ - doc/Sequencescape/Behaviour/Qced/QcFile.html
250
+ - doc/Sequencescape/Behaviour/Receptacle.html
251
+ - doc/Sequencescape/Behaviour/Receptacle/Aliquot.html
252
+ - doc/Sequencescape/Behaviour/StateDriven.html
253
+ - doc/Sequencescape/BulkTransfer.html
254
+ - doc/Sequencescape/Comment.html
255
+ - doc/Sequencescape/Lane.html
256
+ - doc/Sequencescape/LibraryEvent.html
257
+ - doc/Sequencescape/LibraryTube.html
258
+ - doc/Sequencescape/Lot.html
259
+ - doc/Sequencescape/LotType.html
260
+ - doc/Sequencescape/LotType/LotCreator.html
261
+ - doc/Sequencescape/MultiplexedLibraryTube.html
262
+ - doc/Sequencescape/Order.html
263
+ - doc/Sequencescape/OrderTemplate.html
264
+ - doc/Sequencescape/OrderTemplate/OrderCreator.html
265
+ - doc/Sequencescape/Pipeline.html
266
+ - doc/Sequencescape/Plate.html
267
+ - doc/Sequencescape/Plate/CommentsCreation.html
268
+ - doc/Sequencescape/Plate/CurrentVolumeSubstraction.html
269
+ - doc/Sequencescape/Plate/Pooling.html
270
+ - doc/Sequencescape/Plate/WellStructure.html
271
+ - doc/Sequencescape/PlateConversion.html
272
+ - doc/Sequencescape/PlateCreation.html
273
+ - doc/Sequencescape/PlatePurpose.html
274
+ - doc/Sequencescape/PlatePurpose/PlateCreation.html
275
+ - doc/Sequencescape/PlateTemplate.html
276
+ - doc/Sequencescape/PooledPlateCreation.html
277
+ - doc/Sequencescape/Project.html
278
+ - doc/Sequencescape/QcDecision.html
279
+ - doc/Sequencescape/QcFile.html
280
+ - doc/Sequencescape/Qcable.html
281
+ - doc/Sequencescape/QcableCreator.html
282
+ - doc/Sequencescape/Request.html
283
+ - doc/Sequencescape/Robot.html
284
+ - doc/Sequencescape/Sample.html
285
+ - doc/Sequencescape/SampleTube.html
286
+ - doc/Sequencescape/Search.html
287
+ - doc/Sequencescape/Search/BaseHandler.html
288
+ - doc/Sequencescape/Search/MultipleResultHandler.html
289
+ - doc/Sequencescape/Search/SingleResultHandler.html
290
+ - doc/Sequencescape/SpecificTubeCreation.html
291
+ - doc/Sequencescape/Stamp.html
292
+ - doc/Sequencescape/StateChange.html
293
+ - doc/Sequencescape/Study.html
294
+ - doc/Sequencescape/Submission.html
295
+ - doc/Sequencescape/SubmissionPool.html
296
+ - doc/Sequencescape/Tag.html
297
+ - doc/Sequencescape/Tag/Group.html
298
+ - doc/Sequencescape/Tag2Layout.html
299
+ - doc/Sequencescape/Tag2LayoutTemplate.html
300
+ - doc/Sequencescape/TagGroup.html
301
+ - doc/Sequencescape/TagLayout.html
302
+ - doc/Sequencescape/TagLayoutTemplate.html
303
+ - doc/Sequencescape/Template.html
304
+ - doc/Sequencescape/Transfer.html
305
+ - doc/Sequencescape/TransferTemplate.html
306
+ - doc/Sequencescape/Tube.html
307
+ - doc/Sequencescape/TubeCreation.html
308
+ - doc/Sequencescape/TubeFromTubeCreation.html
309
+ - doc/Sequencescape/TubePurpose.html
310
+ - doc/Sequencescape/TubePurpose/TubeCreation.html
311
+ - doc/Sequencescape/User.html
312
+ - doc/Sequencescape/VolumeUpdate.html
313
+ - doc/Sequencescape/Well.html
314
+ - doc/_index.html
315
+ - doc/class_list.html
316
+ - doc/css/common.css
317
+ - doc/css/full_list.css
318
+ - doc/css/style.css
319
+ - doc/file.README.html
320
+ - doc/file_list.html
321
+ - doc/frames.html
322
+ - doc/index.html
323
+ - doc/js/app.js
324
+ - doc/js/full_list.js
325
+ - doc/js/jquery.js
326
+ - doc/method_list.html
327
+ - doc/top-level-namespace.html
328
+ - lib/sequencescape-api.rb
329
+ - lib/sequencescape-api/actions.rb
330
+ - lib/sequencescape-api/associations.rb
331
+ - lib/sequencescape-api/associations/base.rb
332
+ - lib/sequencescape-api/associations/base/instance_methods.rb
333
+ - lib/sequencescape-api/associations/belongs_to.rb
334
+ - lib/sequencescape-api/associations/has_many.rb
335
+ - lib/sequencescape-api/associations/has_many/json.rb
336
+ - lib/sequencescape-api/associations/has_many/validation.rb
337
+ - lib/sequencescape-api/capabilities.rb
338
+ - lib/sequencescape-api/composition.rb
339
+ - lib/sequencescape-api/connection_factory.rb
340
+ - lib/sequencescape-api/connection_factory/actions.rb
341
+ - lib/sequencescape-api/connection_factory/helpers.rb
342
+ - lib/sequencescape-api/core.rb
343
+ - lib/sequencescape-api/core_ext.rb
344
+ - lib/sequencescape-api/core_ext/array.rb
345
+ - lib/sequencescape-api/core_ext/hash.rb
346
+ - lib/sequencescape-api/error_handling.rb
347
+ - lib/sequencescape-api/errors.rb
348
+ - lib/sequencescape-api/finder_methods.rb
349
+ - lib/sequencescape-api/locale/en.yml
350
+ - lib/sequencescape-api/rails.rb
351
+ - lib/sequencescape-api/resource.rb
352
+ - lib/sequencescape-api/resource/active_model.rb
353
+ - lib/sequencescape-api/resource/attribute_groups.rb
354
+ - lib/sequencescape-api/resource/attributes.rb
355
+ - lib/sequencescape-api/resource/instance_methods.rb
356
+ - lib/sequencescape-api/resource/json.rb
357
+ - lib/sequencescape-api/resource/modifications.rb
358
+ - lib/sequencescape-api/resource_model_proxy.rb
359
+ - lib/sequencescape-api/version.rb
360
+ - lib/sequencescape.rb
361
+ - lib/sequencescape/asset.rb
362
+ - lib/sequencescape/asset_audit.rb
363
+ - lib/sequencescape/asset_group.rb
364
+ - lib/sequencescape/bait_library.rb
365
+ - lib/sequencescape/bait_library_layout.rb
366
+ - lib/sequencescape/barcode_printer.rb
367
+ - lib/sequencescape/barcoded_asset.rb
368
+ - lib/sequencescape/batch.rb
369
+ - lib/sequencescape/behaviour/barcoded.rb
370
+ - lib/sequencescape/behaviour/labeled.rb
371
+ - lib/sequencescape/behaviour/qced.rb
372
+ - lib/sequencescape/behaviour/receptacle.rb
373
+ - lib/sequencescape/behaviour/state_driven.rb
374
+ - lib/sequencescape/bulk_transfer.rb
375
+ - lib/sequencescape/comment.rb
376
+ - lib/sequencescape/custom_metadatum_collection.rb
377
+ - lib/sequencescape/lane.rb
378
+ - lib/sequencescape/library_event.rb
379
+ - lib/sequencescape/library_tube.rb
380
+ - lib/sequencescape/locale/en.yml
381
+ - lib/sequencescape/lot.rb
382
+ - lib/sequencescape/lot_type.rb
383
+ - lib/sequencescape/multiplexed_library_tube.rb
384
+ - lib/sequencescape/order.rb
385
+ - lib/sequencescape/order_template.rb
386
+ - lib/sequencescape/pipeline.rb
387
+ - lib/sequencescape/plate.rb
388
+ - lib/sequencescape/plate/pooling.rb
389
+ - lib/sequencescape/plate/well_structure.rb
390
+ - lib/sequencescape/plate_conversion.rb
391
+ - lib/sequencescape/plate_creation.rb
392
+ - lib/sequencescape/plate_purpose.rb
393
+ - lib/sequencescape/plate_template.rb
394
+ - lib/sequencescape/pooled_plate_creation.rb
395
+ - lib/sequencescape/project.rb
396
+ - lib/sequencescape/qc_decision.rb
397
+ - lib/sequencescape/qc_file.rb
398
+ - lib/sequencescape/qcable.rb
399
+ - lib/sequencescape/qcable_creator.rb
400
+ - lib/sequencescape/request.rb
401
+ - lib/sequencescape/robot.rb
402
+ - lib/sequencescape/sample.rb
403
+ - lib/sequencescape/sample_tube.rb
404
+ - lib/sequencescape/search.rb
405
+ - lib/sequencescape/specific_tube_creation.rb
406
+ - lib/sequencescape/stamp.rb
407
+ - lib/sequencescape/state_change.rb
408
+ - lib/sequencescape/study.rb
409
+ - lib/sequencescape/submission.rb
410
+ - lib/sequencescape/submission_pool.rb
411
+ - lib/sequencescape/tag.rb
412
+ - lib/sequencescape/tag2_layout.rb
413
+ - lib/sequencescape/tag2_layout_template.rb
414
+ - lib/sequencescape/tag_group.rb
415
+ - lib/sequencescape/tag_layout.rb
416
+ - lib/sequencescape/tag_layout_template.rb
417
+ - lib/sequencescape/template.rb
418
+ - lib/sequencescape/transfer.rb
419
+ - lib/sequencescape/transfer_request.rb
420
+ - lib/sequencescape/transfer_request_collection.rb
421
+ - lib/sequencescape/transfer_template.rb
422
+ - lib/sequencescape/tube.rb
423
+ - lib/sequencescape/tube_creation.rb
424
+ - lib/sequencescape/tube_from_tube_creation.rb
425
+ - lib/sequencescape/tube_purpose.rb
426
+ - lib/sequencescape/user.rb
427
+ - lib/sequencescape/volume_update.rb
428
+ - lib/sequencescape/well.rb
429
+ - lib/sequencescape/work_completion.rb
430
+ - sequencescape-api.gemspec
431
+ - spec/sequencescape-api/associations_spec.rb
432
+ - spec/sequencescape-api/contracts/belongs-to-association.txt
433
+ - spec/sequencescape-api/contracts/client-fails-authentication.txt
434
+ - spec/sequencescape-api/contracts/create-invalid-resource.txt
435
+ - spec/sequencescape-api/contracts/create-model-c-has-many-inline-nested.txt
436
+ - spec/sequencescape-api/contracts/create-model-c-has-many-inline.txt
437
+ - spec/sequencescape-api/contracts/create-model-c-has-many.txt
438
+ - spec/sequencescape-api/contracts/create-model-c.txt
439
+ - spec/sequencescape-api/contracts/create-via-has-many.txt
440
+ - spec/sequencescape-api/contracts/model-a-instance.txt
441
+ - spec/sequencescape-api/contracts/model-b-instance.txt
442
+ - spec/sequencescape-api/contracts/model-c-instance-created.txt
443
+ - spec/sequencescape-api/contracts/model-c-instance-updated.txt
444
+ - spec/sequencescape-api/contracts/model-c-instance.txt
445
+ - spec/sequencescape-api/contracts/model-c-invalid-attribute.txt
446
+ - spec/sequencescape-api/contracts/resource-not-found.txt
447
+ - spec/sequencescape-api/contracts/results-page-1.txt
448
+ - spec/sequencescape-api/contracts/results-page-2.txt
449
+ - spec/sequencescape-api/contracts/results-page-3.txt
450
+ - spec/sequencescape-api/contracts/retrieve-belongs-to-association.txt
451
+ - spec/sequencescape-api/contracts/retrieve-model.txt
452
+ - spec/sequencescape-api/contracts/retrieve-results-page-1.txt
453
+ - spec/sequencescape-api/contracts/retrieve-results-page-2.txt
454
+ - spec/sequencescape-api/contracts/retrieve-results-page-3.txt
455
+ - spec/sequencescape-api/contracts/retrieve-root-with-an-authorised-client.txt
456
+ - spec/sequencescape-api/contracts/retrieve-root-with-an-unauthorised-client.txt
457
+ - spec/sequencescape-api/contracts/retrieve-unauthorised-model-a-list.txt
458
+ - spec/sequencescape-api/contracts/retrieve-unauthorised-model-b-list.txt
459
+ - spec/sequencescape-api/contracts/retrieve-unauthorised-model-c-list.txt
460
+ - spec/sequencescape-api/contracts/root-response-for-authorised-client.txt
461
+ - spec/sequencescape-api/contracts/root-response-for-unauthorised-client.txt
462
+ - spec/sequencescape-api/contracts/unauthorised-model-a-list.txt
463
+ - spec/sequencescape-api/contracts/unauthorised-model-b-list.txt
464
+ - spec/sequencescape-api/contracts/unauthorised-model-c-list.txt
465
+ - spec/sequencescape-api/contracts/update-invalid-resource.txt
466
+ - spec/sequencescape-api/contracts/update-model-c.txt
467
+ - spec/sequencescape-api/finding_methods_spec.rb
468
+ - spec/sequencescape-api/modifications_spec.rb
469
+ - spec/sequencescape-api/root_spec.rb
470
+ - spec/spec_helper.rb
471
+ - spec/support/contract_helper.rb
472
+ - spec/support/namespaces.rb
473
+ - spec/support/shared_examples.rb
474
+ homepage: ''
475
+ licenses: []
476
+ metadata: {}
477
+ post_install_message:
478
+ rdoc_options: []
479
+ require_paths:
480
+ - lib
481
+ required_ruby_version: !ruby/object:Gem::Requirement
482
+ requirements:
483
+ - - ">="
484
+ - !ruby/object:Gem::Version
485
+ version: '0'
486
+ required_rubygems_version: !ruby/object:Gem::Requirement
487
+ requirements:
488
+ - - ">="
489
+ - !ruby/object:Gem::Version
490
+ version: '0'
491
+ requirements: []
492
+ rubyforge_project: sequencescape-client-api
493
+ rubygems_version: 2.6.14
494
+ signing_key:
495
+ specification_version: 4
496
+ summary: Gem for the client side of the Sequencescape API
497
+ test_files:
498
+ - spec/sequencescape-api/associations_spec.rb
499
+ - spec/sequencescape-api/contracts/belongs-to-association.txt
500
+ - spec/sequencescape-api/contracts/client-fails-authentication.txt
501
+ - spec/sequencescape-api/contracts/create-invalid-resource.txt
502
+ - spec/sequencescape-api/contracts/create-model-c-has-many-inline-nested.txt
503
+ - spec/sequencescape-api/contracts/create-model-c-has-many-inline.txt
504
+ - spec/sequencescape-api/contracts/create-model-c-has-many.txt
505
+ - spec/sequencescape-api/contracts/create-model-c.txt
506
+ - spec/sequencescape-api/contracts/create-via-has-many.txt
507
+ - spec/sequencescape-api/contracts/model-a-instance.txt
508
+ - spec/sequencescape-api/contracts/model-b-instance.txt
509
+ - spec/sequencescape-api/contracts/model-c-instance-created.txt
510
+ - spec/sequencescape-api/contracts/model-c-instance-updated.txt
511
+ - spec/sequencescape-api/contracts/model-c-instance.txt
512
+ - spec/sequencescape-api/contracts/model-c-invalid-attribute.txt
513
+ - spec/sequencescape-api/contracts/resource-not-found.txt
514
+ - spec/sequencescape-api/contracts/results-page-1.txt
515
+ - spec/sequencescape-api/contracts/results-page-2.txt
516
+ - spec/sequencescape-api/contracts/results-page-3.txt
517
+ - spec/sequencescape-api/contracts/retrieve-belongs-to-association.txt
518
+ - spec/sequencescape-api/contracts/retrieve-model.txt
519
+ - spec/sequencescape-api/contracts/retrieve-results-page-1.txt
520
+ - spec/sequencescape-api/contracts/retrieve-results-page-2.txt
521
+ - spec/sequencescape-api/contracts/retrieve-results-page-3.txt
522
+ - spec/sequencescape-api/contracts/retrieve-root-with-an-authorised-client.txt
523
+ - spec/sequencescape-api/contracts/retrieve-root-with-an-unauthorised-client.txt
524
+ - spec/sequencescape-api/contracts/retrieve-unauthorised-model-a-list.txt
525
+ - spec/sequencescape-api/contracts/retrieve-unauthorised-model-b-list.txt
526
+ - spec/sequencescape-api/contracts/retrieve-unauthorised-model-c-list.txt
527
+ - spec/sequencescape-api/contracts/root-response-for-authorised-client.txt
528
+ - spec/sequencescape-api/contracts/root-response-for-unauthorised-client.txt
529
+ - spec/sequencescape-api/contracts/unauthorised-model-a-list.txt
530
+ - spec/sequencescape-api/contracts/unauthorised-model-b-list.txt
531
+ - spec/sequencescape-api/contracts/unauthorised-model-c-list.txt
532
+ - spec/sequencescape-api/contracts/update-invalid-resource.txt
533
+ - spec/sequencescape-api/contracts/update-model-c.txt
534
+ - spec/sequencescape-api/finding_methods_spec.rb
535
+ - spec/sequencescape-api/modifications_spec.rb
536
+ - spec/sequencescape-api/root_spec.rb
537
+ - spec/spec_helper.rb
538
+ - spec/support/contract_helper.rb
539
+ - spec/support/namespaces.rb
540
+ - spec/support/shared_examples.rb