hoodoo 1.0.2

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 (216) hide show
  1. checksums.yaml +7 -0
  2. data/bin/hoodoo +5 -0
  3. data/lib/hoodoo.rb +27 -0
  4. data/lib/hoodoo/active.rb +32 -0
  5. data/lib/hoodoo/active/active_model/uuid_validator.rb +45 -0
  6. data/lib/hoodoo/active/active_record/base.rb +81 -0
  7. data/lib/hoodoo/active/active_record/creator.rb +134 -0
  8. data/lib/hoodoo/active/active_record/dated.rb +343 -0
  9. data/lib/hoodoo/active/active_record/error_mapping.rb +351 -0
  10. data/lib/hoodoo/active/active_record/finder.rb +606 -0
  11. data/lib/hoodoo/active/active_record/search_helper.rb +189 -0
  12. data/lib/hoodoo/active/active_record/secure.rb +431 -0
  13. data/lib/hoodoo/active/active_record/support.rb +106 -0
  14. data/lib/hoodoo/active/active_record/translated.rb +87 -0
  15. data/lib/hoodoo/active/active_record/uuid.rb +80 -0
  16. data/lib/hoodoo/active/active_record/writer.rb +321 -0
  17. data/lib/hoodoo/client.rb +23 -0
  18. data/lib/hoodoo/client/augmented_array.rb +29 -0
  19. data/lib/hoodoo/client/augmented_base.rb +168 -0
  20. data/lib/hoodoo/client/augmented_hash.rb +23 -0
  21. data/lib/hoodoo/client/client.rb +354 -0
  22. data/lib/hoodoo/client/endpoint/endpoint.rb +427 -0
  23. data/lib/hoodoo/client/endpoint/endpoints/amqp.rb +180 -0
  24. data/lib/hoodoo/client/endpoint/endpoints/auto_session.rb +194 -0
  25. data/lib/hoodoo/client/endpoint/endpoints/http.rb +203 -0
  26. data/lib/hoodoo/client/endpoint/endpoints/http_based.rb +367 -0
  27. data/lib/hoodoo/client/endpoint/endpoints/not_found.rb +59 -0
  28. data/lib/hoodoo/client/headers.rb +269 -0
  29. data/lib/hoodoo/communicators.rb +23 -0
  30. data/lib/hoodoo/communicators/fast.rb +44 -0
  31. data/lib/hoodoo/communicators/pool.rb +601 -0
  32. data/lib/hoodoo/communicators/slow.rb +84 -0
  33. data/lib/hoodoo/data.rb +51 -0
  34. data/lib/hoodoo/data/resources/caller.rb +39 -0
  35. data/lib/hoodoo/data/resources/errors.rb +28 -0
  36. data/lib/hoodoo/data/resources/log.rb +31 -0
  37. data/lib/hoodoo/data/resources/session.rb +26 -0
  38. data/lib/hoodoo/data/types/error_primitive.rb +27 -0
  39. data/lib/hoodoo/data/types/permissions.rb +40 -0
  40. data/lib/hoodoo/data/types/permissions_defaults.rb +32 -0
  41. data/lib/hoodoo/data/types/permissions_full.rb +28 -0
  42. data/lib/hoodoo/data/types/permissions_resources.rb +31 -0
  43. data/lib/hoodoo/discovery.rb +20 -0
  44. data/lib/hoodoo/errors.rb +19 -0
  45. data/lib/hoodoo/errors/error_descriptions.rb +229 -0
  46. data/lib/hoodoo/errors/errors.rb +322 -0
  47. data/lib/hoodoo/generator.rb +139 -0
  48. data/lib/hoodoo/logger.rb +23 -0
  49. data/lib/hoodoo/logger/fast_writer.rb +27 -0
  50. data/lib/hoodoo/logger/flattener_mixin.rb +36 -0
  51. data/lib/hoodoo/logger/logger.rb +387 -0
  52. data/lib/hoodoo/logger/slow_writer.rb +49 -0
  53. data/lib/hoodoo/logger/writer_mixin.rb +52 -0
  54. data/lib/hoodoo/logger/writers/file_writer.rb +45 -0
  55. data/lib/hoodoo/logger/writers/log_entries_dot_com_writer.rb +64 -0
  56. data/lib/hoodoo/logger/writers/stream_writer.rb +43 -0
  57. data/lib/hoodoo/middleware.rb +33 -0
  58. data/lib/hoodoo/presenters.rb +45 -0
  59. data/lib/hoodoo/presenters/base.rb +281 -0
  60. data/lib/hoodoo/presenters/base_dsl.rb +519 -0
  61. data/lib/hoodoo/presenters/common_resource_fields.rb +31 -0
  62. data/lib/hoodoo/presenters/embedding.rb +232 -0
  63. data/lib/hoodoo/presenters/types/array.rb +118 -0
  64. data/lib/hoodoo/presenters/types/boolean.rb +26 -0
  65. data/lib/hoodoo/presenters/types/date.rb +26 -0
  66. data/lib/hoodoo/presenters/types/date_time.rb +26 -0
  67. data/lib/hoodoo/presenters/types/decimal.rb +47 -0
  68. data/lib/hoodoo/presenters/types/enum.rb +55 -0
  69. data/lib/hoodoo/presenters/types/field.rb +158 -0
  70. data/lib/hoodoo/presenters/types/float.rb +26 -0
  71. data/lib/hoodoo/presenters/types/hash.rb +361 -0
  72. data/lib/hoodoo/presenters/types/integer.rb +26 -0
  73. data/lib/hoodoo/presenters/types/object.rb +117 -0
  74. data/lib/hoodoo/presenters/types/string.rb +53 -0
  75. data/lib/hoodoo/presenters/types/tags.rb +24 -0
  76. data/lib/hoodoo/presenters/types/text.rb +26 -0
  77. data/lib/hoodoo/presenters/types/uuid.rb +54 -0
  78. data/lib/hoodoo/services.rb +34 -0
  79. data/lib/hoodoo/services/discovery/discoverers/by_consul.rb +66 -0
  80. data/lib/hoodoo/services/discovery/discoverers/by_convention.rb +173 -0
  81. data/lib/hoodoo/services/discovery/discoverers/by_drb/by_drb.rb +195 -0
  82. data/lib/hoodoo/services/discovery/discoverers/by_drb/drb_server.rb +166 -0
  83. data/lib/hoodoo/services/discovery/discoverers/by_drb/drb_server_start.rb +37 -0
  84. data/lib/hoodoo/services/discovery/discovery.rb +186 -0
  85. data/lib/hoodoo/services/discovery/results/for_amqp.rb +58 -0
  86. data/lib/hoodoo/services/discovery/results/for_http.rb +85 -0
  87. data/lib/hoodoo/services/discovery/results/for_local.rb +85 -0
  88. data/lib/hoodoo/services/discovery/results/for_remote.rb +57 -0
  89. data/lib/hoodoo/services/middleware/amqp_log_message.rb +186 -0
  90. data/lib/hoodoo/services/middleware/amqp_log_writer.rb +119 -0
  91. data/lib/hoodoo/services/middleware/endpoints/inter_resource_local.rb +130 -0
  92. data/lib/hoodoo/services/middleware/endpoints/inter_resource_remote.rb +202 -0
  93. data/lib/hoodoo/services/middleware/exception_reporting/base_reporter.rb +105 -0
  94. data/lib/hoodoo/services/middleware/exception_reporting/exception_reporting.rb +115 -0
  95. data/lib/hoodoo/services/middleware/exception_reporting/reporters/airbrake_reporter.rb +64 -0
  96. data/lib/hoodoo/services/middleware/exception_reporting/reporters/raygun_reporter.rb +63 -0
  97. data/lib/hoodoo/services/middleware/interaction.rb +127 -0
  98. data/lib/hoodoo/services/middleware/middleware.rb +2705 -0
  99. data/lib/hoodoo/services/middleware/rack_monkey_patch.rb +73 -0
  100. data/lib/hoodoo/services/services/context.rb +153 -0
  101. data/lib/hoodoo/services/services/implementation.rb +132 -0
  102. data/lib/hoodoo/services/services/interface.rb +934 -0
  103. data/lib/hoodoo/services/services/permissions.rb +250 -0
  104. data/lib/hoodoo/services/services/request.rb +189 -0
  105. data/lib/hoodoo/services/services/response.rb +316 -0
  106. data/lib/hoodoo/services/services/service.rb +141 -0
  107. data/lib/hoodoo/services/services/session.rb +729 -0
  108. data/lib/hoodoo/utilities.rb +12 -0
  109. data/lib/hoodoo/utilities/string_inquirer.rb +54 -0
  110. data/lib/hoodoo/utilities/utilities.rb +380 -0
  111. data/lib/hoodoo/utilities/uuid.rb +44 -0
  112. data/lib/hoodoo/version.rb +17 -0
  113. data/spec/active/active_record/base_spec.rb +57 -0
  114. data/spec/active/active_record/creator_spec.rb +88 -0
  115. data/spec/active/active_record/dated_spec.rb +248 -0
  116. data/spec/active/active_record/error_mapping_spec.rb +360 -0
  117. data/spec/active/active_record/finder_spec.rb +744 -0
  118. data/spec/active/active_record/search_helper_spec.rb +384 -0
  119. data/spec/active/active_record/secure_spec.rb +435 -0
  120. data/spec/active/active_record/support_spec.rb +225 -0
  121. data/spec/active/active_record/translated_spec.rb +19 -0
  122. data/spec/active/active_record/uuid_spec.rb +72 -0
  123. data/spec/active/active_record/writer_spec.rb +272 -0
  124. data/spec/alchemy/alchemy-amq.rb +33 -0
  125. data/spec/client/augmented_array_spec.rb +15 -0
  126. data/spec/client/augmented_base_spec.rb +50 -0
  127. data/spec/client/augmented_hash_spec.rb +15 -0
  128. data/spec/client/client_spec.rb +955 -0
  129. data/spec/client/endpoint/endpoint_spec.rb +70 -0
  130. data/spec/client/endpoint/endpoints/amqp_spec.rb +16 -0
  131. data/spec/client/endpoint/endpoints/auto_session_spec.rb +9 -0
  132. data/spec/client/endpoint/endpoints/http_based_spec.rb +9 -0
  133. data/spec/client/endpoint/endpoints/http_spec.rb +103 -0
  134. data/spec/client/endpoint/endpoints/not_found_spec.rb +35 -0
  135. data/spec/client/headers_spec.rb +172 -0
  136. data/spec/communicators/fast_spec.rb +9 -0
  137. data/spec/communicators/pool_spec.rb +339 -0
  138. data/spec/communicators/slow_spec.rb +15 -0
  139. data/spec/data/resources/caller_spec.rb +156 -0
  140. data/spec/data/resources/errors_spec.rb +22 -0
  141. data/spec/data/resources/log_spec.rb +20 -0
  142. data/spec/data/resources/session_spec.rb +15 -0
  143. data/spec/data/types/error_primitive_spec.rb +15 -0
  144. data/spec/data/types/permissions_defaults_spec.rb +25 -0
  145. data/spec/data/types/permissions_full_spec.rb +44 -0
  146. data/spec/data/types/permissions_resources_spec.rb +34 -0
  147. data/spec/data/types/permissions_spec.rb +37 -0
  148. data/spec/errors/error_descriptions_spec.rb +98 -0
  149. data/spec/errors/errors_spec.rb +346 -0
  150. data/spec/integration/service_actions_spec.rb +112 -0
  151. data/spec/logger/fast_writer_spec.rb +18 -0
  152. data/spec/logger/logger_spec.rb +259 -0
  153. data/spec/logger/slow_writer_spec.rb +144 -0
  154. data/spec/logger/writers/file_writer_spec.rb +37 -0
  155. data/spec/logger/writers/log_entries_dot_com_writer_spec.rb +29 -0
  156. data/spec/logger/writers/stream_writer_spec.rb +38 -0
  157. data/spec/presenters/base_dsl_spec.rb +111 -0
  158. data/spec/presenters/base_spec.rb +871 -0
  159. data/spec/presenters/common_resource_fields_spec.rb +30 -0
  160. data/spec/presenters/embedding_spec.rb +87 -0
  161. data/spec/presenters/types/array_spec.rb +249 -0
  162. data/spec/presenters/types/boolean_spec.rb +51 -0
  163. data/spec/presenters/types/date_spec.rb +57 -0
  164. data/spec/presenters/types/date_time_spec.rb +59 -0
  165. data/spec/presenters/types/decimal_spec.rb +58 -0
  166. data/spec/presenters/types/enum_spec.rb +71 -0
  167. data/spec/presenters/types/field_spec.rb +77 -0
  168. data/spec/presenters/types/float_spec.rb +50 -0
  169. data/spec/presenters/types/hash_spec.rb +1069 -0
  170. data/spec/presenters/types/integer_spec.rb +50 -0
  171. data/spec/presenters/types/object_spec.rb +177 -0
  172. data/spec/presenters/types/string_spec.rb +65 -0
  173. data/spec/presenters/types/tags_spec.rb +56 -0
  174. data/spec/presenters/types/text_spec.rb +50 -0
  175. data/spec/presenters/types/uuid_spec.rb +46 -0
  176. data/spec/presenters/walk_spec.rb +198 -0
  177. data/spec/services/discovery/discoverers/by_consul_spec.rb +29 -0
  178. data/spec/services/discovery/discoverers/by_convention_spec.rb +67 -0
  179. data/spec/services/discovery/discoverers/by_drb/by_drb_spec.rb +80 -0
  180. data/spec/services/discovery/discoverers/by_drb/drb_server_spec.rb +205 -0
  181. data/spec/services/discovery/discovery_spec.rb +73 -0
  182. data/spec/services/discovery/results/for_amqp_spec.rb +17 -0
  183. data/spec/services/discovery/results/for_http_spec.rb +37 -0
  184. data/spec/services/discovery/results/for_local_spec.rb +21 -0
  185. data/spec/services/discovery/results/for_remote_spec.rb +15 -0
  186. data/spec/services/middleware/amqp_log_message_spec.rb +60 -0
  187. data/spec/services/middleware/amqp_log_writer_spec.rb +95 -0
  188. data/spec/services/middleware/endpoints/inter_resource_local_spec.rb +9 -0
  189. data/spec/services/middleware/endpoints/inter_resource_remote_spec.rb +9 -0
  190. data/spec/services/middleware/exception_reporting/base_reporter_spec.rb +16 -0
  191. data/spec/services/middleware/exception_reporting/exception_reporting_spec.rb +92 -0
  192. data/spec/services/middleware/exception_reporting/reporters/airbrake_reporter_spec.rb +24 -0
  193. data/spec/services/middleware/exception_reporting/reporters/raygun_reporter_spec.rb +23 -0
  194. data/spec/services/middleware/middleware_cors_spec.rb +93 -0
  195. data/spec/services/middleware/middleware_create_update_spec.rb +489 -0
  196. data/spec/services/middleware/middleware_dated_at_spec.rb +186 -0
  197. data/spec/services/middleware/middleware_exotic_communication_spec.rb +560 -0
  198. data/spec/services/middleware/middleware_logging_spec.rb +356 -0
  199. data/spec/services/middleware/middleware_multi_local_spec.rb +1094 -0
  200. data/spec/services/middleware/middleware_multi_remote_spec.rb +1440 -0
  201. data/spec/services/middleware/middleware_permissions_spec.rb +1014 -0
  202. data/spec/services/middleware/middleware_public_spec.rb +238 -0
  203. data/spec/services/middleware/middleware_spec.rb +1569 -0
  204. data/spec/services/middleware/string_inquirer_spec.rb +30 -0
  205. data/spec/services/services/application_spec.rb +74 -0
  206. data/spec/services/services/context_spec.rb +48 -0
  207. data/spec/services/services/implementation_spec.rb +45 -0
  208. data/spec/services/services/interface_spec.rb +262 -0
  209. data/spec/services/services/permissions_spec.rb +249 -0
  210. data/spec/services/services/request_spec.rb +95 -0
  211. data/spec/services/services/response_spec.rb +250 -0
  212. data/spec/services/services/session_spec.rb +432 -0
  213. data/spec/spec_helper.rb +298 -0
  214. data/spec/utilities/utilities_spec.rb +537 -0
  215. data/spec/utilities/uuid_spec.rb +20 -0
  216. metadata +615 -0
@@ -0,0 +1,58 @@
1
+ ########################################################################
2
+ # File:: for_amqp.rb
3
+ # (C):: Loyalty New Zealand 2015
4
+ #
5
+ # Purpose:: Describe a resource endpoint location in a way that allows
6
+ # it to be contacted over AMQP (e.g. via Alchemy).
7
+ # ----------------------------------------------------------------------
8
+ # 03-Mar-2015 (ADH): Created.
9
+ ########################################################################
10
+
11
+ module Hoodoo
12
+ module Services
13
+ class Discovery # Just used as a namespace here
14
+
15
+ # Describe a resource endpoint location in a way that allows
16
+ # it to be contacted over AMQP (e.g. via Alchemy).
17
+ #
18
+ class ForAMQP
19
+
20
+ # The resource name described, as a Symbol (e.g. +:Purchase+).
21
+ #
22
+ attr_accessor :resource
23
+
24
+ # Resource endpoint version, as an Integer (e.g. 2).
25
+ #
26
+ attr_accessor :version
27
+
28
+ # Queue name for the target service implementation, as a
29
+ # String (e.g. "service.account").
30
+ #
31
+ attr_accessor :queue_name
32
+
33
+ # URL path equivalent that should be mapped to the queue in
34
+ # #queue_name, as a String (e.g. "/v2/accounts").
35
+ #
36
+ attr_accessor :equivalent_path
37
+
38
+ # Create an instance with named parameters as follows:
39
+ #
40
+ # +resource+:: See #resource.
41
+ # +version+:: See #version.
42
+ # +queue_name+:: See #queue_name.
43
+ # +equivalent_pat+:: See #equivalent_pat.
44
+ #
45
+ def initialize( resource:,
46
+ version:,
47
+ queue_name:,
48
+ equivalent_path: )
49
+
50
+ self.resource = resource.to_sym
51
+ self.version = version.to_i
52
+ self.queue_name = queue_name
53
+ self.equivalent_path = equivalent_path
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,85 @@
1
+ ########################################################################
2
+ # File:: for_http.rb
3
+ # (C):: Loyalty New Zealand 2015
4
+ #
5
+ # Purpose:: Describe a resource endpoint location in a way that allows
6
+ # it to be contacted over HTTP.
7
+ # ----------------------------------------------------------------------
8
+ # 03-Mar-2015 (ADH): Created.
9
+ ########################################################################
10
+
11
+ module Hoodoo
12
+ module Services
13
+ class Discovery # Just used as a namespace here
14
+
15
+ # Describe a resource endpoint location in a way that allows
16
+ # it to be contacted over HTTP.
17
+ #
18
+ class ForHTTP
19
+
20
+ # The resource name described, as a Symbol (e.g. +:Purchase+).
21
+ #
22
+ attr_accessor :resource
23
+
24
+ # Resource endpoint version, as an Integer (e.g. 2).
25
+ #
26
+ attr_accessor :version
27
+
28
+ # Full URI (as a URI object) at which the resource endpoint
29
+ # implementation can be contacted.
30
+ #
31
+ attr_accessor :endpoint_uri
32
+
33
+ # Full URI (as a URI object) of an HTTP proxy to use as an
34
+ # override to <tt>ENV['HTTP_PROXY']</tt> which Ruby itself
35
+ # will otherwise read. Will be +nil+ for no proxy override.
36
+ #
37
+ attr_accessor :proxy_uri
38
+
39
+ # An optional String indicating a relative or absolute file
40
+ # path to the location of a .pem format Certificate
41
+ # Authority file (trust store), which may include multliple
42
+ # certificates. The certificates in the file will be used
43
+ # by Net::HTTP to validate the SSL Ceritificate Chain
44
+ # presented by remote servers, when calling endpoints over
45
+ # HTTPS with Hoodoo::Client.
46
+ #
47
+ # Default +nil+ value should be used in nearly all cases
48
+ # and uses Ruby OpenSSL defaults which are generally
49
+ # Operating System provided.
50
+ #
51
+ attr_accessor :ca_file
52
+
53
+ # Optional Float indicating the Net::HTTP read timeout value.
54
+ # This operates at the HTTP transport level and is independent
55
+ # of any timeouts set within the API providing server.
56
+ #
57
+ attr_accessor :http_timeout
58
+
59
+ # Create an instance with named parameters as follows:
60
+ #
61
+ # +resource+:: See #resource.
62
+ # +version+:: See #version.
63
+ # +endpoint_uri+:: See #endpoint_uri.
64
+ # +proxy_uri+:: See #proxy_uri. Optional.
65
+ # +ca_file+:: See #ca_file. Optional.
66
+ # +http_timeout+:: See #http_timeout. Optional.
67
+ #
68
+ def initialize( resource:,
69
+ version:,
70
+ endpoint_uri:,
71
+ proxy_uri: nil,
72
+ ca_file: nil,
73
+ http_timeout: nil )
74
+
75
+ self.resource = resource.to_sym
76
+ self.version = version.to_i
77
+ self.endpoint_uri = endpoint_uri
78
+ self.proxy_uri = proxy_uri
79
+ self.ca_file = ca_file
80
+ self.http_timeout = http_timeout
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,85 @@
1
+ ########################################################################
2
+ # File:: for_local.rb
3
+ # (C):: Loyalty New Zealand 2015
4
+ #
5
+ # Purpose:: Describe a resource endpoint location in a way that allows
6
+ # it to be method-called from the service middleware directly.
7
+ # ----------------------------------------------------------------------
8
+ # 10-Mar-2015 (ADH): Created.
9
+ ########################################################################
10
+
11
+ module Hoodoo
12
+ module Services
13
+ class Discovery # Just used as a namespace here
14
+
15
+ # Describe a resource endpoint location in a way that allows it to be
16
+ # method-called from the service middleware directly.
17
+ #
18
+ # This is a very special case class used for the inter-resource local
19
+ # call code in Hoodoo::Services::Middleware. It really exists only for
20
+ # semantic purposes; the middleware calls via Hoodoo::Client::Endpoint
21
+ # subclass Hoodoo::Sevices::Middleware::InterResourceLocal; and the
22
+ # Endpoint subclass family are supposed to use result classes from the
23
+ # Hoodoo::Services::Discovery engine when they configure instances.
24
+ #
25
+ # This isn't actually enforced anywhere, but conceptually it's cleanest
26
+ # to follow the same pattern.
27
+ #
28
+ class ForLocal
29
+
30
+ # The resource name described, as a Symbol (e.g. +:Purchase+).
31
+ #
32
+ attr_accessor :resource
33
+
34
+ # Resource endpoint version, as an Integer (e.g. 2).
35
+ #
36
+ attr_accessor :version
37
+
38
+ # The base path of this resource and version - for example,
39
+ # "/v1/products" or "/v2/members". String.
40
+ #
41
+ attr_accessor :base_path
42
+
43
+ # A regular expression which matches the #base_path and any
44
+ # identifier data, allowing inbound URI-based requests to be
45
+ # routed to this endpoint. Regexp instance.
46
+ #
47
+ attr_accessor :routing_regexp
48
+
49
+ # The Hoodoo::Services::Interface subclass _class_ describing the
50
+ # resource interface.
51
+ #
52
+ attr_accessor :interface_class
53
+
54
+ # The Hoodoo::Services::Implementation subclass _instance_
55
+ # which implements the interface described by #interface_class.
56
+ #
57
+ attr_accessor :implementation_instance
58
+
59
+ # Create an instance with named parameters as follows:
60
+ #
61
+ # +resource+:: See #resource.
62
+ # +version+:: See #version.
63
+ # +base_path+:: See #base_path.
64
+ # +routing_regexp+:: See #routing_regexp.
65
+ # +interface_class+:: See #interface_class.
66
+ # +implementation_instance+:: See #implementation_instance.
67
+ #
68
+ def initialize( resource:,
69
+ version:,
70
+ base_path:,
71
+ routing_regexp:,
72
+ interface_class:,
73
+ implementation_instance: )
74
+
75
+ self.resource = resource.to_sym
76
+ self.version = version.to_i
77
+ self.base_path = base_path
78
+ self.routing_regexp = routing_regexp
79
+ self.interface_class = interface_class
80
+ self.implementation_instance = implementation_instance
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,57 @@
1
+ ########################################################################
2
+ # File:: for_remote.rb
3
+ # (C):: Loyalty New Zealand 2015
4
+ #
5
+ # Purpose:: Describe a "pseudo" resource endpoint location in terms of
6
+ # an interation context and wrapped "real" endpoint instance.
7
+ # ----------------------------------------------------------------------
8
+ # 10-Mar-2015 (ADH): Created.
9
+ ########################################################################
10
+
11
+ module Hoodoo
12
+ module Services
13
+ class Discovery # Just used as a namespace here
14
+
15
+ # Describe a "pseudo" resource endpoint location in terms of
16
+ # an interation context and wrapped "real" endpoint instance.
17
+ #
18
+ # This is a very special case class used for wrapping endpoints in, for
19
+ # example, the inter-resource remote call code in the middleware and in
20
+ # the auto-session code in Hoodoo::Client::Endpoint::AutoSession.
21
+ #
22
+ class ForRemote
23
+
24
+ # The resource name described, as a Symbol (e.g. +:Purchase+).
25
+ #
26
+ attr_accessor :resource
27
+
28
+ # Resource endpoint version, as an Integer (e.g. 2).
29
+ #
30
+ attr_accessor :version
31
+
32
+ # A wrapped Endpoint class, which will be used for the *actual* call
33
+ # to the remote resource, after pre/post-processing in the context of
34
+ # #source_interaction (e.g. augmenting session permissions with
35
+ # source-resource-interface-specified additions necessary to call the
36
+ # target remote resource).
37
+ #
38
+ attr_accessor :wrapped_endpoint
39
+
40
+ # Create an instance with named parameters as follows:
41
+ #
42
+ # +resource+:: See #resource.
43
+ # +version+:: See #version.
44
+ # +wrapped_endpoint+:: See #wrapped_endpoint.
45
+ #
46
+ def initialize( resource:,
47
+ version:,
48
+ wrapped_endpoint: )
49
+
50
+ self.resource = resource.to_sym
51
+ self.version = version.to_i
52
+ self.wrapped_endpoint = wrapped_endpoint
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,186 @@
1
+ ########################################################################
2
+ # File:: amqp_log_message.rb
3
+ # (C):: Loyalty New Zealand 2014
4
+ #
5
+ # Purpose:: Structured logging onto an AMQP-based queue, via the
6
+ # AlchemyAMQ gem. Optional; class is defined only if the
7
+ # supporting AlchemyAMQ gem's classes are defined.
8
+ #
9
+ # The middleware uses this to put log and error messages
10
+ # on the queue. Interested services use this to read such
11
+ # messages from the queue.
12
+ # ----------------------------------------------------------------------
13
+ # 20-Nov-2014 (ADH): Created.
14
+ ########################################################################
15
+
16
+ # TODO: See spec/alchemy/alchemy-amq.rb. Remove this once 'real' Alchemy
17
+ # is opened.
18
+ #
19
+ $LOAD_PATH.unshift File.join( File.dirname( __FILE__ ), 'alchemy' )
20
+
21
+ module Hoodoo; module Services
22
+ class Middleware
23
+
24
+ begin
25
+ require 'alchemy-amq' # Optional
26
+
27
+ # For AlchemyAMQ gem users, the AMQPLogMessage class provides an
28
+ # AlchemyAMQ::Message subclass used for sending structured log data to
29
+ # the queue. Hoodoo::Logger uses this.
30
+ #
31
+ # See the AlchemyAMQ gem for more details.
32
+ #
33
+ class AMQPLogMessage < ::AlchemyAMQ::Message
34
+
35
+ # The named "type" of this message, to be registered with AlchemyAMQ.
36
+ #
37
+ TYPE = 'hoodoo_service_middleware_amqp_log_message'
38
+
39
+ # The Time +strftime+ formatter used for string conversions in this
40
+ # class.
41
+ #
42
+ TIME_FORMATTER = '%Y-%m-%d %H:%M:%S.%12N %Z'
43
+
44
+ # This line of code registers wth AlchemyAMQ, but also makes RDoc
45
+ # screw up. RDoc decides that we have a new module,
46
+ # Hoodoo::Services::Middleware::AMQPLogMessage::AlchemyAMQ. Very
47
+ # strange...
48
+ #
49
+ ::AlchemyAMQ::Message.register_type( TYPE, self )
50
+
51
+ # ...so do _this_ purely so that we can get 100% real documentation
52
+ # coverage without it being clouded by RDoc's hiccups.
53
+
54
+ # This documentation exists purely to work around an RDoc hiccup where
55
+ # it thinks such a module exists.
56
+ #
57
+ # See file "services/middleware/amqp_log_message.rb" for details.
58
+ #
59
+ module AlchemyAMQ
60
+ end
61
+
62
+ # A UUID to assign to this log message. See Hoodoo::UUID::generate.
63
+ #
64
+ attr_accessor :id
65
+
66
+ # Logging level. See Hoodoo::Logger.
67
+ #
68
+ attr_accessor :level
69
+
70
+ # Logging component. See Hoodoo::Logger.
71
+ #
72
+ attr_accessor :component
73
+
74
+ # Component log code. See Hoodoo::Logger.
75
+ #
76
+ attr_accessor :code
77
+
78
+ # The time at which this log message is being reported to the Logger
79
+ # instance. This is a formatted *String* to high accuracy. See also
80
+ # #reported_at=.
81
+ #
82
+ attr_reader :reported_at
83
+
84
+ # Set the time read back by #reported_at using a Time instance. This
85
+ # is formatted internally as a String via TIME_FORMATTER and reported
86
+ # as such in subsequent calls to #reported_at.
87
+ #
88
+ # Conversion from Time to String is done here, rather than by the
89
+ # caller setting this instance's variables, so that we can internally
90
+ # enforce the accuracy required for this field.
91
+ #
92
+ # +time+:: The Time instance to set (and process into a string
93
+ # internally via TIME_FORMATTER), *or* a String instance
94
+ # already so formatted, *or* +nil+ to clear the value.
95
+ #
96
+ def reported_at=( time )
97
+ if time.is_a?( String )
98
+ @reported_at = time
99
+ elsif time.is_a?( Time )
100
+ @reported_at = time.strftime( TIME_FORMATTER )
101
+ else
102
+ @reported_at = nil
103
+ end
104
+ end
105
+
106
+ # Log payload. See Hoodoo::Logger.
107
+ #
108
+ attr_accessor :data
109
+
110
+ # Optional calling Caller ID, via session data inside the payload - see
111
+ # Hoodoo::Logger.
112
+ #
113
+ attr_accessor :caller_id
114
+
115
+ # Optional interaction UUID, via session data inside the payload - see
116
+ # Hoodoo::Logger.
117
+ #
118
+ attr_accessor :interaction_id
119
+
120
+ # Optional hash of identity properties from the session data inside the
121
+ # payload - see Hoodoo::Logger.
122
+ #
123
+ attr_accessor :identity
124
+
125
+ # Create an instance with options keyed on the attributes defined for
126
+ # the class.
127
+ #
128
+ def initialize(options = {})
129
+ update( options ) # Should be called before 'super'
130
+ super( options )
131
+
132
+ @type = AMQPLogMessage::TYPE
133
+ end
134
+
135
+ # Seralize this instance. See the AlchemyAMQ gem and
136
+ # AlchemyAMQ::Message#serialize.
137
+ #
138
+ def serialize
139
+ @content = {
140
+ :id => @id,
141
+ :level => @level,
142
+ :component => @component,
143
+ :code => @code,
144
+ :reported_at => @reported_at,
145
+
146
+ :data => @data,
147
+
148
+ :interaction_id => @interaction_id,
149
+ :caller_id => @caller_id,
150
+ :identity => @identity
151
+ }
152
+
153
+ super
154
+ end
155
+
156
+ # Unpack a serialized representation into this instance. See the
157
+ # AlchemyAMQ gem and AlchemyAMQ::Message#deserialize.
158
+ #
159
+ def deserialize
160
+ super
161
+ update( @content )
162
+ end
163
+
164
+ # Set public attribute values according to an options hash keyed on
165
+ # the attributes defined for the class.
166
+ #
167
+ def update( options )
168
+ self.id = options[ :id ]
169
+ self.level = options[ :level ]
170
+ self.component = options[ :component ]
171
+ self.code = options[ :code ]
172
+ self.reported_at = options[ :reported_at ]
173
+
174
+ self.data = options[ :data ]
175
+
176
+ self.interaction_id = options[ :interaction_id ]
177
+ self.caller_id = options[ :caller_id ]
178
+ self.identity = options[ :identity ]
179
+ end
180
+ end
181
+
182
+ rescue LoadError # Optional file 'alchemy-amq' is absent
183
+ end
184
+
185
+ end
186
+ end; end