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,80 @@
1
+ require 'sequencescape-api/resource'
2
+
3
+ class Sequencescape::Search < ::Sequencescape::Api::Resource
4
+ class BaseHandler
5
+ include Sequencescape::Api::BasicErrorHandling
6
+
7
+ def success(attributes)
8
+ raise Sequencescape::Api::Error, 'A success response from a search is unexpected'
9
+ end
10
+ end
11
+
12
+ # The response from the server contains the JSON for the resource found. Using this we can
13
+ # handle the redirection by using the appropriate model based on the root element of the JSON.
14
+ # We don't even need to follow the redirect!
15
+ class SingleResultHandler < BaseHandler
16
+ def initialize(api)
17
+ @api = api
18
+ end
19
+
20
+ def redirection(json, &block)
21
+ json.delete('uuids_to_ids')
22
+ Sequencescape::Api::FinderMethods::FindByUuidHandler.new(@api.send(json.keys.first)).success(json)
23
+ end
24
+ end
25
+
26
+ # Wraps paginated results such that they can be navigated
27
+ # a step at a time.
28
+ class MultipleResultPaged
29
+ include Enumerable
30
+ attr_reader :objects, :size
31
+ def initialize(objects, size)
32
+ @objects = objects
33
+ @size = size
34
+ end
35
+
36
+ delegate :each, :empty?, :present?, to: :objects
37
+ end
38
+
39
+ # The response from the server contains the JSON for each of the resources found. We simply
40
+ # need to be able to create the resources from each of these.
41
+ class MultipleResultHandler
42
+ def initialize(api,model)
43
+ @api, @model = api, model
44
+ end
45
+
46
+ def redirection(json, &block)
47
+ items = json['searches'].map(&method(:new))
48
+ size = json['size']
49
+ MultipleResultPaged.new(items, size)
50
+ end
51
+
52
+ def new(json)
53
+ args = [ json, false ]
54
+ args.unshift(@api) unless @model.is_a_proxied_model?
55
+ @model.new(*args)
56
+ end
57
+ private :new
58
+ end
59
+
60
+ def self.search_action(name)
61
+ line = __LINE__ + 1
62
+ class_eval(%Q{
63
+ def #{name}(criteria = {})
64
+ api.create(actions.#{name}, { 'search' => criteria }, SingleResultHandler.new(api))
65
+ end
66
+ }, __FILE__, line)
67
+ end
68
+
69
+ attribute_reader :name
70
+
71
+ search_action(:first)
72
+ search_action(:last)
73
+
74
+ # When performing a search for all records we need to provide the model (as in 'api.plate')
75
+ # that we expect to be returned. So there is a limitation at the moment that the results can
76
+ # only belong to the same model hierarchy.
77
+ def all(model, criteria = {})
78
+ api.create(actions.all, { 'search' => criteria }, MultipleResultHandler.new(api, model))
79
+ end
80
+ end
@@ -0,0 +1,8 @@
1
+ require 'sequencescape-api/resource'
2
+
3
+ class Sequencescape::SpecificTubeCreation < ::Sequencescape::Api::Resource
4
+ belongs_to :user
5
+ belongs_to :parent, :class_name => 'Plate'
6
+ attribute_writer :child_purposes, :tube_attributes
7
+ has_many :children, :class_name => 'Tube'
8
+ end
@@ -0,0 +1,9 @@
1
+ require 'sequencescape-api/resource'
2
+
3
+ class Sequencescape::Stamp < ::Sequencescape::Api::Resource
4
+
5
+ belongs_to :user
6
+ belongs_to :lot
7
+ belongs_to :robot
8
+ attribute_accessor :tip_lot, :stamp_details
9
+ end
@@ -0,0 +1,11 @@
1
+ require 'sequencescape-api/resource'
2
+
3
+ class Sequencescape::StateChange < ::Sequencescape::Api::Resource
4
+ belongs_to :user
5
+ belongs_to :target, :class_name => 'Asset', :disposition => :inline
6
+ attribute_accessor :contents # Array of "contents" to fail, deciphered by the target, can be nil
7
+ attribute_accessor :target_state
8
+ attribute_accessor :previous_state
9
+ attribute_accessor :reason
10
+ attribute_accessor :customer_accepts_responsibility
11
+ end
@@ -0,0 +1,14 @@
1
+ require 'sequencescape-api/resource'
2
+
3
+ class Sequencescape::Study < ::Sequencescape::Api::Resource
4
+ has_many :projects
5
+ has_many :asset_groups
6
+ has_many :samples
7
+
8
+ attribute_accessor :name, :abbreviation, :abstract, :description, :state, :type
9
+ attribute_accessor :sac_sponsor, :accession_number, :reference_genome, :ethically_approved
10
+ attribute_accessor :contaminated_human_dna, :contains_human_dna
11
+ attribute_accessor :data_release_sort_of_study, :data_release_strategy
12
+
13
+ validates :name, :presence => true
14
+ end
@@ -0,0 +1,16 @@
1
+ require 'sequencescape-api/resource'
2
+
3
+ class Sequencescape::Submission < ::Sequencescape::Api::Resource
4
+ belongs_to :user
5
+ # TODO: get this working
6
+ # has_many :requests
7
+
8
+ # TODO: use a has many, but ensure it works
9
+ attribute_accessor :orders
10
+
11
+ has_update_action :submit!, :action => 'submit', :verb => :create, :skip_json => true
12
+
13
+ attribute_reader :state
14
+ attribute_reader :asset_group_name
15
+
16
+ end
@@ -0,0 +1,7 @@
1
+ require 'sequencescape-api/resource'
2
+
3
+ class Sequencescape::SubmissionPool < ::Sequencescape::Api::Resource
4
+ attribute_reader :plates_in_submission
5
+ attribute_reader :used_tag2_layout_templates
6
+ attribute_reader :used_tag_layout_templates
7
+ end
@@ -0,0 +1,14 @@
1
+ class Sequencescape::Tag
2
+ include Sequencescape::Api::Composition::Target
3
+
4
+ attribute_accessor :name, :oligo, :group, :identifier
5
+
6
+ class Group
7
+ include Sequencescape::Api::Composition::Target
8
+
9
+ attr_accessor :actions
10
+
11
+ attribute_accessor :uuid
12
+ attribute_accessor :name, :tags, :created_at, :updated_at
13
+ end
14
+ end
@@ -0,0 +1,10 @@
1
+ require 'sequencescape-api/resource'
2
+ require 'sequencescape/tag'
3
+
4
+ class Sequencescape::Tag2Layout < ::Sequencescape::Api::Resource
5
+ belongs_to :user
6
+ belongs_to :plate, :class_name => 'Plate'
7
+ belongs_to :source, :class_name => 'Asset'
8
+ composed_of :tag, :class_name => 'Tag'
9
+ attribute_reader :target_well_locations
10
+ end
@@ -0,0 +1,9 @@
1
+ require 'sequencescape-api/resource'
2
+ require 'sequencescape/tag'
3
+
4
+ class Sequencescape::Tag2LayoutTemplate < ::Sequencescape::Api::Resource
5
+ attribute_reader :name
6
+ composed_of :tag, :class_name => 'Tag'
7
+
8
+ has_create_action :resource => 'tag2_layout'
9
+ end
@@ -0,0 +1,4 @@
1
+ class Sequencescape::TagGroup < ::Sequencescape::Api::Resource
2
+
3
+ attribute_accessor :name, :tags, :created_at, :updated_at
4
+ end
@@ -0,0 +1,10 @@
1
+ require 'sequencescape-api/resource'
2
+ require 'sequencescape/tag'
3
+
4
+ class Sequencescape::TagLayout < ::Sequencescape::Api::Resource
5
+ belongs_to :user
6
+ belongs_to :plate, :class_name => 'Plate'
7
+ composed_of :tag_group, :class_name => 'Tag::Group'
8
+
9
+ attribute_accessor :substitutions, :direction, :walking_by, :initial_tag
10
+ end
@@ -0,0 +1,15 @@
1
+ require 'sequencescape-api/resource'
2
+ require 'sequencescape/tag'
3
+
4
+ class Sequencescape::TagLayoutTemplate < ::Sequencescape::Api::Resource
5
+ attribute_reader :name, :direction, :walking_by
6
+ belongs_to :plate, :class_name => 'Plate'
7
+ composed_of :tag_group, :class_name => 'Tag::Group'
8
+ composed_of :tag2_group, :class_name => 'Tag::Group'
9
+
10
+ has_create_action :resource => 'tag_layout'
11
+
12
+ def dual_index?
13
+ tag2_group.present?
14
+ end
15
+ end
@@ -0,0 +1,6 @@
1
+ require 'sequencescape-api/resource'
2
+ require 'sequencescape/tag'
3
+
4
+ class Sequencescape::Template < ::Sequencescape::Api::Resource
5
+ attribute_reader :name
6
+ end
@@ -0,0 +1,9 @@
1
+ require 'sequencescape-api/resource'
2
+
3
+ class Sequencescape::Transfer < ::Sequencescape::Api::Resource
4
+ belongs_to :user
5
+ belongs_to :source, :class_name => 'BarcodedAsset', :disposition => :inline
6
+ belongs_to :destination, :class_name => 'BarcodedAsset', :disposition => :inline
7
+ attribute_reader :transfers
8
+ attribute_accessor :targets
9
+ end
@@ -0,0 +1,12 @@
1
+ require 'sequencescape-api/resource'
2
+
3
+ class Sequencescape::TransferRequest < ::Sequencescape::Api::Resource
4
+
5
+ belongs_to :source_asset, :class_name => 'Asset'
6
+ belongs_to :target_asset, :class_name => 'Asset'
7
+ belongs_to :submission, :class_name => 'Submission'
8
+ belongs_to :outer_request, :class_name => 'Request'
9
+
10
+ attribute_accessor :type, :state, :submission_id
11
+
12
+ end
@@ -0,0 +1,8 @@
1
+ require 'sequencescape-api/resource'
2
+
3
+ class Sequencescape::TransferRequestCollection < ::Sequencescape::Api::Resource
4
+ belongs_to :user
5
+ # attribute_accessor :transfer_requests
6
+ has_many :transfer_requests, disposition: :inline
7
+ has_many :target_tubes, disposition: :inline, class_name: 'Tube'
8
+ end
@@ -0,0 +1,9 @@
1
+ require 'sequencescape-api/resource'
2
+
3
+ class Sequencescape::TransferTemplate < ::Sequencescape::Api::Resource
4
+ attribute_reader :name
5
+ attribute_reader :transfers
6
+
7
+ has_create_action :resource => 'transfer'
8
+ has_create_action :preview!, :action => :preview, :resource => 'transfer'
9
+ end
@@ -0,0 +1,26 @@
1
+ require 'sequencescape/asset'
2
+ require 'sequencescape/behaviour/receptacle'
3
+ require 'sequencescape/behaviour/barcoded'
4
+ require 'sequencescape/behaviour/labeled'
5
+ require 'sequencescape/behaviour/qced'
6
+
7
+ class Sequencescape::Tube < ::Sequencescape::Asset
8
+ include Sequencescape::Behaviour::Receptacle
9
+ include Sequencescape::Behaviour::Barcoded
10
+ include Sequencescape::Behaviour::Labeled
11
+ include Sequencescape::Behaviour::Qced
12
+
13
+ has_many :requests
14
+
15
+ attribute_accessor :closed
16
+ attribute_accessor :concentration, :volume
17
+ attribute_accessor :scanned_in_date, :conversion => :to_time
18
+
19
+ attribute_reader :state
20
+
21
+ attribute_accessor :sibling_tubes
22
+
23
+ belongs_to :purpose, :class_name => 'TubePurpose'
24
+ belongs_to :stock_plate, :class_name => 'Plate'
25
+ belongs_to :custom_metadatum_collection
26
+ end
@@ -0,0 +1,8 @@
1
+ require 'sequencescape-api/resource'
2
+
3
+ class Sequencescape::TubeCreation < ::Sequencescape::Api::Resource
4
+ belongs_to :user
5
+ belongs_to :parent, :class_name => 'Plate'
6
+ belongs_to :child_purpose, :class_name => 'TubePurpose'
7
+ has_many :children, :class_name => 'Tube'
8
+ end
@@ -0,0 +1,8 @@
1
+ require 'sequencescape-api/resource'
2
+
3
+ class Sequencescape::TubeFromTubeCreation < ::Sequencescape::Api::Resource
4
+ belongs_to :user
5
+ belongs_to :parent, :class_name => 'Plate'
6
+ belongs_to :child_purpose, :class_name => 'TubePurpose'
7
+ belongs_to :child, :class_name => 'Tube'
8
+ end
@@ -0,0 +1,24 @@
1
+ require 'sequencescape-api/resource'
2
+
3
+ class Sequencescape::TubePurpose < ::Sequencescape::Api::Resource
4
+ module TubeCreation
5
+ def create!(attributes = nil)
6
+ attributes ||= {}
7
+ attributes[:wells].delete_if { |_,v| v.blank? } if attributes.key?(:wells)
8
+
9
+ new({}, false).tap do |plate|
10
+ api.create(actions.create, { 'plate' => attributes }, Sequencescape::Api::ModifyingHandler.new(plate))
11
+ end
12
+ end
13
+ end
14
+
15
+ has_many :children, :class_name => 'TubePurpose'
16
+ has_many :parents, :class_name => 'TubePurpose'
17
+
18
+ has_many :tubes do
19
+ include Sequencescape::TubePurpose::TubeCreation
20
+ end
21
+
22
+ attribute_reader :name
23
+ attribute_writer :target_type, :type
24
+ end
@@ -0,0 +1,13 @@
1
+ class Sequencescape::User < ::Sequencescape::Api::Resource
2
+ attribute_reader :login
3
+ attribute_accessor :email
4
+ attribute_accessor :first_name
5
+ attribute_accessor :last_name
6
+ attribute_accessor :barcode
7
+
8
+ #TODO make swipecard_code readonly. Can't at the moment because of a bug
9
+ #attribute_writer :swipecard_code
10
+ attribute_accessor :swipecard_code
11
+
12
+ attribute_reader :has_a_swipecard_code
13
+ end
@@ -0,0 +1,6 @@
1
+ require 'sequencescape-api/resource'
2
+
3
+ class Sequencescape::VolumeUpdate < ::Sequencescape::Api::Resource
4
+ belongs_to :target, :class_name => 'Asset', :disposition => :inline
5
+ attribute_accessor :volume_change, :created_by
6
+ end
@@ -0,0 +1,19 @@
1
+ require 'sequencescape/asset'
2
+ require 'sequencescape/behaviour/receptacle'
3
+ require 'sequencescape/behaviour/state_driven'
4
+
5
+ class Sequencescape::Well < ::Sequencescape::Asset
6
+
7
+ include Sequencescape::Behaviour::Receptacle
8
+ include Sequencescape::Behaviour::StateDriven
9
+
10
+ belongs_to :plate
11
+
12
+ attribute_accessor :location, :pool
13
+ attribute_accessor :initial_volume, :measured_volume, :current_volume
14
+
15
+ def pool_id
16
+ pool.nil? ? nil : pool['id']
17
+ end
18
+
19
+ end
@@ -0,0 +1,10 @@
1
+ require 'sequencescape-api/resource'
2
+
3
+ class Sequencescape::WorkCompletion < ::Sequencescape::Api::Resource
4
+ belongs_to :user
5
+ belongs_to :target, :class_name => 'Asset'
6
+
7
+ # This should really be a has_many, but we'll need
8
+ # to get assignment from arrays of strings working first.
9
+ attribute_accessor :submissions
10
+ end
@@ -0,0 +1,69 @@
1
+ module Sequencescape::Api::Actions
2
+ def self.extended(base)
3
+ base.class_eval do
4
+ extend ClassActionHelpers
5
+ extend InstanceActionHelpers
6
+ end
7
+ end
8
+
9
+ module ClassActionHelpers
10
+ # Defines a method that is available on the resource model itself, rather than on an instance of
11
+ # the resource model.
12
+ def has_class_create_action(*args)
13
+ action_module, line = Module.new, __LINE__+1
14
+ action_module.module_eval(%Q{
15
+ def initialize_class_actions(proxy)
16
+ super
17
+
18
+ class << proxy
19
+ has_create_action(#{args.map(&:inspect).join(',')})
20
+ end
21
+ end
22
+ }, __FILE__, line)
23
+
24
+ extend action_module
25
+ end
26
+
27
+ def initialize_class_actions(proxy)
28
+ # Does nothing by default.
29
+ end
30
+ private :initialize_class_actions
31
+ end
32
+
33
+ module InstanceActionHelpers
34
+ def has_create_action(*args)
35
+ options = args.extract_options!
36
+ name = args.first || :create!
37
+
38
+ action = options[:action] || :create
39
+ result_class = 'self'
40
+ result_class = "api.#{options[:resource]}" if options[:resource]
41
+
42
+ line = __LINE__ + 1
43
+ class_eval(%Q{
44
+ def #{name}(attributes = nil)
45
+ url = actions.try(#{action.to_sym.inspect}) or
46
+ raise Sequencescape::Api::Error, "Cannot perform #{action} without an URL"
47
+
48
+ #{result_class}.new(attributes || {}, false).tap do |object|
49
+ object.save!(:url => url)
50
+ end
51
+ end
52
+ }, __FILE__, line)
53
+ end
54
+
55
+ def has_update_action(name, options = {})
56
+ api_method = options[:verb] == :create ? :create : :update
57
+ skip_json = options[:skip_json]||false
58
+ action = options[:action] || :update
59
+
60
+ line = __LINE__ + 1
61
+ class_eval(%Q{
62
+ def #{name}(body = nil)
63
+ update_from_json(body || {}, false)
64
+ modify!(:action => #{action.to_sym.inspect}, :http_verb => #{api_method.to_sym.inspect}, :skip_json => #{skip_json})
65
+ end
66
+ }, __FILE__, line)
67
+ end
68
+ end
69
+ end