hoodoo 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
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