sequencescape-client-api 0.3.5

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 (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