azure 0.0.0 → 0.1.0

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 (212) hide show
  1. data/Gemfile +3 -0
  2. data/Gemfile.lock +36 -0
  3. data/README.md +3 -0
  4. data/Rakefile +81 -0
  5. data/azure.gemspec +20 -9
  6. data/lib/azure.rb +4 -0
  7. data/lib/azure/atom.rb +170 -0
  8. data/lib/azure/auth.rb +29 -0
  9. data/lib/azure/blobs.rb +620 -0
  10. data/lib/azure/blobs/blob.rb +360 -0
  11. data/lib/azure/blobs/container.rb +209 -0
  12. data/lib/azure/blobs/service.rb +396 -0
  13. data/lib/azure/blobs/shared_access_signature.rb +84 -0
  14. data/lib/azure/blobs/uri.rb +60 -0
  15. data/lib/azure/configuration.rb +121 -0
  16. data/lib/azure/core/auth/shared_key.rb +95 -0
  17. data/lib/azure/core/auth/shared_key_lite.rb +34 -0
  18. data/lib/azure/core/collection.rb +118 -0
  19. data/lib/azure/core/service.rb +43 -0
  20. data/lib/azure/core/signer.rb +32 -0
  21. data/lib/azure/core/utils/interval.rb +97 -0
  22. data/lib/azure/core/utils/queryable.rb +74 -0
  23. data/lib/azure/core/utils/storage_service_properties.rb +83 -0
  24. data/lib/azure/core/utils/string.rb +59 -0
  25. data/lib/azure/error.rb +72 -0
  26. data/lib/azure/queues.rb +272 -0
  27. data/lib/azure/queues/message.rb +174 -0
  28. data/lib/azure/queues/queue.rb +187 -0
  29. data/lib/azure/queues/service.rb +263 -0
  30. data/lib/azure/queues/service_properties.rb +152 -0
  31. data/lib/azure/queues/uri.rb +78 -0
  32. data/lib/azure/request.rb +102 -0
  33. data/lib/azure/response.rb +93 -0
  34. data/lib/azure/service_bus.rb +4 -0
  35. data/lib/azure/service_bus/auth/authorizer.rb +22 -0
  36. data/lib/azure/service_bus/auth/uri.rb +52 -0
  37. data/lib/azure/service_bus/auth/wrap.rb +37 -0
  38. data/lib/azure/service_bus/auth/wrap_service.rb +76 -0
  39. data/lib/azure/service_bus/auth/wrap_token.rb +45 -0
  40. data/lib/azure/service_bus/auth/wrap_token_manager.rb +46 -0
  41. data/lib/azure/service_bus/brokered_message.rb +139 -0
  42. data/lib/azure/service_bus/brokered_message_serializer.rb +113 -0
  43. data/lib/azure/service_bus/queues.rb +194 -0
  44. data/lib/azure/service_bus/queues/queue.rb +100 -0
  45. data/lib/azure/service_bus/queues/queue_serializer.rb +51 -0
  46. data/lib/azure/service_bus/queues/service.rb +154 -0
  47. data/lib/azure/service_bus/queues/uri.rb +80 -0
  48. data/lib/azure/service_bus/rules.rb +110 -0
  49. data/lib/azure/service_bus/rules/rule.rb +97 -0
  50. data/lib/azure/service_bus/rules/service.rb +122 -0
  51. data/lib/azure/service_bus/rules/uri.rb +39 -0
  52. data/lib/azure/service_bus/service_bus_service.rb +22 -0
  53. data/lib/azure/service_bus/subscriptions.rb +170 -0
  54. data/lib/azure/service_bus/subscriptions/service.rb +133 -0
  55. data/lib/azure/service_bus/subscriptions/subscription.rb +164 -0
  56. data/lib/azure/service_bus/subscriptions/subscription_serializer.rb +74 -0
  57. data/lib/azure/service_bus/subscriptions/uri.rb +71 -0
  58. data/lib/azure/service_bus/topics.rb +120 -0
  59. data/lib/azure/service_bus/topics/service.rb +98 -0
  60. data/lib/azure/service_bus/topics/topic.rb +122 -0
  61. data/lib/azure/service_bus/topics/topic_serializer.rb +44 -0
  62. data/lib/azure/service_bus/topics/uri.rb +58 -0
  63. data/lib/azure/service_runtime/client/goal_state_pipe_monitor.rb +21 -0
  64. data/lib/azure/service_runtime/client/goal_state_protocol.rb +18 -0
  65. data/lib/azure/service_runtime/client/runtime_client.rb +135 -0
  66. data/lib/azure/service_runtime/deployment.rb +24 -0
  67. data/lib/azure/service_runtime/local_resource.rb +15 -0
  68. data/lib/azure/service_runtime/role.rb +17 -0
  69. data/lib/azure/service_runtime/role_environment.rb +206 -0
  70. data/lib/azure/service_runtime/role_environment_change.rb +32 -0
  71. data/lib/azure/service_runtime/role_instance.rb +35 -0
  72. data/lib/azure/service_runtime/role_instance_endpoint.rb +14 -0
  73. data/lib/azure/tables.rb +215 -0
  74. data/lib/azure/tables/auth/shared_key.rb +71 -0
  75. data/lib/azure/tables/auth/shared_key_lite.rb +30 -0
  76. data/lib/azure/tables/entities_collection.rb +66 -0
  77. data/lib/azure/tables/entity.rb +127 -0
  78. data/lib/azure/tables/service.rb +211 -0
  79. data/lib/azure/tables/table.rb +129 -0
  80. data/lib/azure/tables/tables_collection.rb +62 -0
  81. data/lib/azure/tables/types.rb +65 -0
  82. data/lib/azure/tables/uri.rb +62 -0
  83. data/test/fixtures/32px-fulls-black.jpg +0 -0
  84. data/test/fixtures/all_containers.xml +20 -0
  85. data/test/fixtures/all_tables.xml +22 -0
  86. data/test/fixtures/create_table_response_entry.xml +15 -0
  87. data/test/fixtures/error.xml +5 -0
  88. data/test/fixtures/insert_entity_response_entry.xml +25 -0
  89. data/test/fixtures/messages.xml +12 -0
  90. data/test/fixtures/query_entities_empty_response.xml +7 -0
  91. data/test/fixtures/query_entities_response.xml +45 -0
  92. data/test/fixtures/queue_service_properties.xml +22 -0
  93. data/test/fixtures/queue_service_properties_original.xml +19 -0
  94. data/test/fixtures/queues.xml +16 -0
  95. data/test/fixtures/sb_default_create_queue_response.xml +23 -0
  96. data/test/fixtures/sb_default_create_topic_response.xml +18 -0
  97. data/test/fixtures/sb_get_access_token_response.txt +1 -0
  98. data/test/fixtures/sb_queues_runtime_peek_message_response_headers.txt +9 -0
  99. data/test/integration/blobs/auth_test.rb +19 -0
  100. data/test/integration/blobs/blob_test.rb +61 -0
  101. data/test/integration/blobs/clear_page_range_test.rb +19 -0
  102. data/test/integration/blobs/copy_test.rb +33 -0
  103. data/test/integration/blobs/create_blobs_test.rb +51 -0
  104. data/test/integration/blobs/create_container_test.rb +13 -0
  105. data/test/integration/blobs/create_snapshot_test.rb +17 -0
  106. data/test/integration/blobs/delete_blob_snapshots_test.rb +19 -0
  107. data/test/integration/blobs/delete_blobs_test.rb +25 -0
  108. data/test/integration/blobs/delete_container_test.rb +24 -0
  109. data/test/integration/blobs/delete_snapshot_test.rb +17 -0
  110. data/test/integration/blobs/get_blob_snapshot_test.rb +18 -0
  111. data/test/integration/blobs/get_blobs_test.rb +31 -0
  112. data/test/integration/blobs/get_page_range_test.rb +19 -0
  113. data/test/integration/blobs/list_blobs_test.rb +39 -0
  114. data/test/integration/blobs/list_containers_test.rb +28 -0
  115. data/test/integration/blobs/manage_blob_leases_test.rb +45 -0
  116. data/test/integration/blobs/manage_blob_metadata_test.rb +51 -0
  117. data/test/integration/blobs/manage_blob_properties_test.rb +25 -0
  118. data/test/integration/blobs/manage_blob_service_properties_test.rb +38 -0
  119. data/test/integration/blobs/manage_container_metadata_test.rb +46 -0
  120. data/test/integration/blobs/manage_container_permissions_test.rb +17 -0
  121. data/test/integration/blobs/update_page_range_test.rb +20 -0
  122. data/test/integration/queues/clear_messages_test.rb +22 -0
  123. data/test/integration/queues/create_queue_test.rb +13 -0
  124. data/test/integration/queues/delete_message_test.rb +42 -0
  125. data/test/integration/queues/delete_queue_test.rb +24 -0
  126. data/test/integration/queues/get_messages_test.rb +39 -0
  127. data/test/integration/queues/list_queues_test.rb +43 -0
  128. data/test/integration/queues/manage_queue_metadata_test.rb +45 -0
  129. data/test/integration/queues/manage_queue_service_properties_test.rb +27 -0
  130. data/test/integration/queues/peek_messages_test.rb +55 -0
  131. data/test/integration/queues/put_message_test.rb +31 -0
  132. data/test/integration/queues/update_message_test.rb +46 -0
  133. data/test/integration/service_bus/auth_test.rb +18 -0
  134. data/test/integration/service_bus/queues/create_queue_test.rb +25 -0
  135. data/test/integration/service_bus/queues/delete_message_from_queue_test.rb +29 -0
  136. data/test/integration/service_bus/queues/delete_queue_test.rb +25 -0
  137. data/test/integration/service_bus/queues/get_queue_test.rb +23 -0
  138. data/test/integration/service_bus/queues/list_queues_test.rb +39 -0
  139. data/test/integration/service_bus/queues/peek_message_from_queue_test.rb +34 -0
  140. data/test/integration/service_bus/queues/read_and_delete_message_from_queue_test.rb +31 -0
  141. data/test/integration/service_bus/queues/send_message_to_queue_test.rb +22 -0
  142. data/test/integration/service_bus/queues/unlock_message_from_queue_test.rb +36 -0
  143. data/test/integration/service_bus/rules/create_rule_test.rb +19 -0
  144. data/test/integration/service_bus/rules/delete_rule_test.rb +17 -0
  145. data/test/integration/service_bus/rules/get_rule_test.rb +21 -0
  146. data/test/integration/service_bus/rules/list_rules_test.rb +24 -0
  147. data/test/integration/service_bus/rules/rule_test.rb +16 -0
  148. data/test/integration/service_bus/subscriptions/create_subscription_test.rb +25 -0
  149. data/test/integration/service_bus/subscriptions/delete_message_from_subscription_test.rb +31 -0
  150. data/test/integration/service_bus/subscriptions/delete_subscription_test.rb +30 -0
  151. data/test/integration/service_bus/subscriptions/fetch_subscription_test.rb +28 -0
  152. data/test/integration/service_bus/subscriptions/list_subscriptions_test.rb +23 -0
  153. data/test/integration/service_bus/subscriptions/peek_lock_message_from_subscription_test.rb +42 -0
  154. data/test/integration/service_bus/subscriptions/read_delete_message_from_subscription_test.rb +36 -0
  155. data/test/integration/service_bus/subscriptions/subscription_test.rb +31 -0
  156. data/test/integration/service_bus/subscriptions/unlock_message_from_subscription_test.rb +43 -0
  157. data/test/integration/service_bus/topics/create_topic_test.rb +25 -0
  158. data/test/integration/service_bus/topics/delete_topic_test.rb +25 -0
  159. data/test/integration/service_bus/topics/get_topic_test.rb +23 -0
  160. data/test/integration/service_bus/topics/list_topics_test.rb +39 -0
  161. data/test/integration/service_bus/topics/send_message_to_topic_test.rb +23 -0
  162. data/test/integration/tables/auth_test.rb +29 -0
  163. data/test/integration/tables/creating_tables_test.rb +16 -0
  164. data/test/integration/tables/delete_entity_test.rb +39 -0
  165. data/test/integration/tables/deleting_table_test.rb +22 -0
  166. data/test/integration/tables/insert_entity_test.rb +23 -0
  167. data/test/integration/tables/merge_entity_test.rb +28 -0
  168. data/test/integration/tables/query_entities_test.rb +131 -0
  169. data/test/integration/tables/query_tables_test.rb +63 -0
  170. data/test/integration/tables/update_entity_test.rb +54 -0
  171. data/test/integration/test_helper.rb +14 -0
  172. data/test/support/blobs.rb +12 -0
  173. data/test/support/env.rb +5 -0
  174. data/test/support/fixtures.rb +22 -0
  175. data/test/support/stubs.rb +28 -0
  176. data/test/support/table_names.rb +44 -0
  177. data/test/test_helper.rb +10 -0
  178. data/test/unit/atom_test.rb +58 -0
  179. data/test/unit/auth_test.rb +24 -0
  180. data/test/unit/blobs/blob_test.rb +5 -0
  181. data/test/unit/blobs/container_test.rb +67 -0
  182. data/test/unit/blobs/service_test.rb +17 -0
  183. data/test/unit/blobs/shared_access_signature_test.rb +66 -0
  184. data/test/unit/blobs_test.rb +156 -0
  185. data/test/unit/core/service_test.rb +57 -0
  186. data/test/unit/core/utils/interval_test.rb +70 -0
  187. data/test/unit/core/utils/queryable_test.rb +69 -0
  188. data/test/unit/core/utils/storage_service_properties_test.rb +66 -0
  189. data/test/unit/error_test.rb +39 -0
  190. data/test/unit/queues/message_test.rb +40 -0
  191. data/test/unit/queues/queue_test.rb +64 -0
  192. data/test/unit/queues/service_properties.rb +35 -0
  193. data/test/unit/request_test.rb +38 -0
  194. data/test/unit/response_test.rb +43 -0
  195. data/test/unit/service_bus/auth/authorizer_test.rb +27 -0
  196. data/test/unit/service_bus/auth/wrap_token_test.rb +28 -0
  197. data/test/unit/service_bus/queues/queue_test.rb +38 -0
  198. data/test/unit/service_bus/topics/topic_test.rb +33 -0
  199. data/test/unit/service_runtime/data/goalstate.xml +9 -0
  200. data/test/unit/service_runtime/data/roleenvironmentdata.xml +29 -0
  201. data/test/unit/service_runtime/data/runtime.xml +6 -0
  202. data/test/unit/service_runtime/role_environment_test.rb +144 -0
  203. data/test/unit/tables/auth/shared_key_lite_test.rb +39 -0
  204. data/test/unit/tables/auth/shared_key_test.rb +45 -0
  205. data/test/unit/tables/entities_collection_test.rb +39 -0
  206. data/test/unit/tables/entity_test.rb +72 -0
  207. data/test/unit/tables/table_test.rb +57 -0
  208. data/test/unit/tables_test.rb +302 -0
  209. data/test/unit/types_test.rb +67 -0
  210. metadata +310 -47
  211. data/LICENSE +0 -0
  212. data/README +0 -0
@@ -0,0 +1,74 @@
1
+ require "nokogiri"
2
+ require "azure/service_bus/subscriptions/subscription"
3
+
4
+ module Azure
5
+ module ServiceBus
6
+ module Subscriptions
7
+ # Public: Serialize a Subscription to/from XML.
8
+ #
9
+ # See http://msdn.microsoft.com/en-us/library/windowsazure/hh780763
10
+ class SubscriptionSerializer
11
+ MAPPINGS = {
12
+ LockDuration: :lock_duration,
13
+ RequiresSession: :requires_session,
14
+ DefaultMessageTimeToLive: :default_ttl,
15
+ DeadLetteringOnMessageExpiration: :keep_expired,
16
+ DeadLetteringOnFilterEvaluationExceptions: :keep_on_errors
17
+ }.freeze
18
+
19
+ # Public: Parse an AtomPub fragment and return a Subscription from it.
20
+ #
21
+ # xml - A String.
22
+ #
23
+ # Returns a Subscription.
24
+ def self.parse(xml)
25
+ body = Nokogiri::XML(xml)
26
+ body.remove_namespaces!
27
+
28
+ name = (body % "title").text
29
+
30
+ Subscription.new(name) do |sub|
31
+ MAPPINGS.each do |tag, method|
32
+ tag = (body % tag.to_s)
33
+
34
+ if sub.respond_to?("#{method}=") && tag
35
+ sub.send("#{method}=", tag.text)
36
+ end
37
+ end
38
+
39
+ yield sub if block_given?
40
+ end
41
+ end
42
+
43
+ attr :object
44
+
45
+ # Public: Initialize the serializer
46
+ #
47
+ # subscription - A Subscription.
48
+ def initialize(subscription)
49
+ @subscription = subscription
50
+ end
51
+
52
+ # Public: Generate an XML that represents the subscription.
53
+ #
54
+ # xml - A Nokogiri::XML::Builder.
55
+ #
56
+ # Returns a String.
57
+ def to_xml(xml=Nokogiri::XML::Builder.new)
58
+ xml.entry(xmlns: "http://www.w3.org/2005/Atom") do |xml|
59
+ xml.content(type: "application/xml") do |xml|
60
+ xml.SubscriptionDescription("xmlns" => "http://schemas.microsoft.com/netservices/2010/10/servicebus/connect", "xmlns:i" => "http://www.w3.org/2001/XMLSchema-instance") do |xml|
61
+ MAPPINGS.each do |tag, method|
62
+ property = @subscription.send(method)
63
+ xml.send(tag, property.to_s) unless property.nil?
64
+ end
65
+ end
66
+ end
67
+ end
68
+
69
+ xml.to_xml
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,71 @@
1
+ require "azure/configuration"
2
+ require "uri"
3
+
4
+ module Azure
5
+ module ServiceBus
6
+ module Subscriptions
7
+ module URI
8
+ # Public: Generate the URI for a given subscription.
9
+ #
10
+ # topic_name - The name of the topic.
11
+ # name - The name of the subscription.
12
+ # host - The host of the API.
13
+ #
14
+ # Returns a URI.
15
+ def self.subscription(topic_name, name, host=Azure.config.service_bus_host)
16
+ generate(host, File.join(topic_name, "Subscriptions", name))
17
+ end
18
+
19
+ # Public: Generate the URI for the list of subscriptions.
20
+ #
21
+ # topic_name - The name of the topic.
22
+ # host - The host of the API.
23
+ #
24
+ # Returns a URI.
25
+ def self.collection(topic_name, host=Azure.config.service_bus_host)
26
+ generate(host, File.join(topic_name, "Subscriptions"))
27
+ end
28
+
29
+ #TODO: we need to move this method to other module to be mixedin here
30
+ #
31
+ # Utility method to generate the URI.
32
+ #
33
+ # host - A String with the URI's host.
34
+ # path - A String with the URI's path.
35
+ # query - A simple Hash with query parameters (default: {}).
36
+ #
37
+ # Returns a URI.
38
+ def self.generate(host, path, query={})
39
+ uri = ::URI.parse(File.join(host, path))
40
+ uri.query = ::URI.encode_www_form(query) unless query.empty?
41
+ uri
42
+ end
43
+
44
+ # Public: generate the URI for the given subscription's head
45
+ #
46
+ # topic_name - The topic's name
47
+ # subscription_name - The subscription's name
48
+ # options - Options for this query (optional, default: {})
49
+ # host - The host of the API.
50
+ #
51
+ # Returns a URI.
52
+ def self.messages_head(topic_name, subscription_name, options={}, host=Azure.config.service_bus_host)
53
+ generate(host, "#{topic_name}/Subscriptions/#{subscription_name}/messages/head", options)
54
+ end
55
+
56
+ # Public: generate the URI to operate on the given message in the given subscription
57
+ #
58
+ # topic_name - The topic's name
59
+ # subscription_name - The subscription's name
60
+ # seq_number - The message's sequence_number
61
+ # lock_token - The message's lock_token
62
+ # host - The host of the API (optional).
63
+ #
64
+ # Returns a URI.
65
+ def self.message(topic_name, subscription_name, seq_number, lock_token, host=Azure.config.service_bus_host)
66
+ generate(host, "#{topic_name}/Subscriptions/#{subscription_name}/messages/#{seq_number}/#{lock_token}")
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,120 @@
1
+ require "nokogiri"
2
+ require "azure/service_bus/topics/service"
3
+ require "azure/service_bus/topics/topic"
4
+ require "azure/service_bus/topics/topic_serializer"
5
+ require "azure/service_bus/brokered_message"
6
+ require "azure/service_bus/brokered_message_serializer"
7
+
8
+ module Azure
9
+ module ServiceBus
10
+ module Topics
11
+ # Public: Try to create a new topic. If the operation is unsuccessful,
12
+ # the resulting Topic object will have the error accessible through the
13
+ # #error method.
14
+ #
15
+ # name - The name of the topic.
16
+ # properties - Properties hash describing this topic (optional, default: {}).
17
+ # service - The backend service to implement this (optional).
18
+ #
19
+ # Returns a Topic.
20
+ def self.create(name, props={}, service=Services::Create.new)
21
+ serializer = TopicSerializer.new(props)
22
+ xml = serializer.to_xml
23
+ response = service.call(name, xml)
24
+
25
+ if response.success?
26
+ node = Nokogiri::XML(response.body)
27
+ Topic.from_node(node)
28
+ else
29
+ Topic.from_error(response.error)
30
+ end
31
+ end
32
+
33
+ # Public: Delete a Topic from the server. If the delete operation fails,
34
+ # the topic is invalidated. Otherwise it's frozen.
35
+ #
36
+ # topic - An Azure::ServiceBus::Topics::Topic.
37
+ # service - The backend service to implement this (optional).
38
+ #
39
+ # Returns true|false to indicate success.
40
+ def self.delete(topic, service=Services::Delete.new)
41
+ response = service.call(topic.name)
42
+
43
+ if response.success?
44
+ topic.freeze
45
+ else
46
+ topic.error = response.error
47
+ end
48
+
49
+ response.success?
50
+ end
51
+
52
+ # Public: Get a topic by name. If the operation fails,
53
+ # the resulting Topic object will have the error accessible through the
54
+ # #error method.
55
+ #
56
+ # service - The backend service to implement this (optional).
57
+ #
58
+ # Returns a Topic
59
+ def self.get(topic_name, service=Services::Get.new)
60
+ response = service.call(topic_name)
61
+
62
+ if response.success?
63
+ node = Nokogiri::XML(response.body).remove_namespaces!
64
+ if (node % 'entry')
65
+ Topic.from_node(node)
66
+ else
67
+ #FIXME: If the topic is not found, Azure returns an atom feed containing links to immediate child nodes
68
+ # What to do with this?
69
+ end
70
+ else
71
+ Topic.from_error(response.error)
72
+ end
73
+ end
74
+
75
+ # Public: This operation enumerates the topics in the service namespace.
76
+ #
77
+ # options - Options for this query (default: {}):
78
+ # :skip - Integer: number of entries to skip
79
+ # :top - Integer: number of entries to retrieve
80
+ # service - The backend service to implement this (optional).
81
+ #
82
+ # Returns an Array of Query elements.
83
+ def self.list(options={}, service=Services::List.new)
84
+ response = service.call(options)
85
+
86
+ if response.success?
87
+ result = Nokogiri::XML(response.body).remove_namespaces!
88
+ (result / 'entry').map {|node| Topic.from_node(node) }
89
+ else
90
+ []
91
+ end
92
+ end
93
+
94
+ # Public: This operation sends a message into the specified topic.
95
+ # If the operation is unsuccessful the resulting BrokeredMessage object will be invalidated
96
+ # and the error will be accessible through the #error method.
97
+ #
98
+ # queue - The Topic
99
+ # message - The Message
100
+ # service - The backend service to implement this (optional).
101
+ #
102
+ # Returns true|false to indicate success.
103
+ def self.send_message_to_topic(topic, message, service=Services::SendMessageToTopic.new)
104
+ serializer = BrokeredMessageSerializer.new(message)
105
+ broker_properties = serializer.to_json
106
+ message_properties = serializer.get_property_headers
107
+
108
+ content_type = message.content_type || 'text/plain'
109
+ response = service.call(topic.name, message.body, content_type, broker_properties, message_properties)
110
+
111
+ if !response.success?
112
+ message.error = response.error
113
+ end
114
+
115
+ response.success?
116
+ end
117
+
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,98 @@
1
+ require "azure/core/service"
2
+ require "azure/core/utils/queryable"
3
+ require "azure/service_bus/service_bus_service"
4
+ require "azure/service_bus/auth/wrap"
5
+ require "azure/service_bus/auth/authorizer"
6
+ require "azure/service_bus/topics/uri"
7
+
8
+ module Azure
9
+ module ServiceBus
10
+ module Topics
11
+ class Service < Core::Service
12
+ def initialize(signer=Azure::ServiceBus::Auth::Wrap.new)
13
+ super(signer, Azure::ServiceBus::Auth::Authorizer.new)
14
+ end
15
+ end
16
+
17
+ module Services
18
+ # Public: Create a topic.
19
+ class Create < Service
20
+ # Public: Invoke the service.
21
+ #
22
+ # name - A String with the topic name.
23
+ # xml - An xml String according to the Azure docs
24
+ #
25
+ # Returns a Response.
26
+ def call(name, xml)
27
+ super(:put, URI.topic(name), xml)
28
+ end
29
+ end
30
+
31
+ # Public: Delete a topic.
32
+ class Delete < Service
33
+ # Public: Invoke the service.
34
+ #
35
+ # name - A String with the topic name.
36
+ #
37
+ # Returns a Response.
38
+ def call(name)
39
+ super(:delete, URI.topic(name))
40
+ end
41
+ end
42
+
43
+ # Public: Get a topic.
44
+ class Get < Service
45
+ # Public: Invoke the service.
46
+ #
47
+ # name - A String with the topic name.
48
+ #
49
+ # Returns a Response.
50
+ def call(name)
51
+ super(:get, URI.topic(name))
52
+ end
53
+ end
54
+
55
+ # Public: List topics
56
+ class List < Service
57
+ include Core::Utils::Queryable
58
+
59
+ # Public: Invoke the service.
60
+ #
61
+ # options - Options for this query (default: {}):
62
+ # :skip - Integer: number of entries to skip
63
+ # :top - Integer: number of entries to retrieve
64
+ #
65
+ # Returns a Response.
66
+ def call(options={})
67
+ options = translate_options_hash(options)
68
+ super(:get, URI.collection(options))
69
+ end
70
+ end
71
+
72
+ ## Messages
73
+
74
+ # Public: Sends a message to a topic
75
+ class SendMessageToTopic < ServiceBusService
76
+ # Public: Invoke the service.
77
+ #
78
+ # topic_name - A String with the topic name
79
+ # body - A String with the message's body
80
+ # broker_properties_json - A JSON encoded String with the message's properties.
81
+ # content_type - A String with the desired Content-Type for the message body
82
+ # message_properties - A Hash with the user-defined message's properties.
83
+ #
84
+ # Returns a Response.
85
+ def call(topic_name, body, content_type, broker_properties_json, message_properties)
86
+ super(:post, URI.messages(topic_name), body) do |request|
87
+ request.headers['BrokerProperties'] = broker_properties_json
88
+ message_properties.each do |k,v|
89
+ request.headers[k.to_s] = v
90
+ end
91
+ request.headers["Content-Type"] = content_type
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,122 @@
1
+ require "azure/error"
2
+ require "azure/service_bus/topics"
3
+ require "azure/service_bus/subscriptions"
4
+ require "azure/service_bus/subscriptions/subscription"
5
+ require "azure/core/collection"
6
+
7
+ module Azure
8
+ module ServiceBus
9
+ module Topics
10
+ class Topic
11
+ include Azure::ErrorHandler
12
+ # Get the Topic's ID.
13
+ #
14
+ # Returns a URI.
15
+ attr_accessor :id
16
+ alias_method :url, :id
17
+
18
+ # Get the Topic's name.
19
+ #
20
+ # Returns a String.
21
+ attr_accessor :name
22
+ alias_method :title, :name
23
+
24
+ # Public: Get the published time
25
+ #
26
+ # Returns a Time
27
+ attr_accessor :published
28
+
29
+ # Public: Get the updated time
30
+ #
31
+ # Returns a Time
32
+ attr_accessor :updated
33
+
34
+ # Public: Get the author name
35
+ #
36
+ # Returns a String
37
+ attr_accessor :author_name
38
+
39
+ # Public: Topic description
40
+ #
41
+ # Returns a Hash
42
+ attr_accessor :description
43
+
44
+ # Public: Instantiate a topic from an XML entry.
45
+ #
46
+ # entry - An XML::Node element.
47
+ #
48
+ # Returns a Topic.
49
+ def self.from_node(node)
50
+ name = (node % "title").text
51
+
52
+ new(name) do |q|
53
+ q.id = URI((node % "id").text)
54
+ # q.title = (node % "title").text
55
+ q.published = Time.parse((node % "published").text)
56
+ q.updated = Time.parse((node % "updated").text)
57
+ q.author_name = (node % "author/name").text
58
+ # q.description = Description.from_node(node % 'content/TopicDescription')
59
+
60
+ q.description = (node / "content/TopicDescription *").each_with_object({}) do |el, desc|
61
+ desc[el.name] = el.text
62
+ end
63
+ end
64
+ end
65
+
66
+ # Public: Instantiate a topic from an error object.
67
+ #
68
+ # error - An Azure::Error.
69
+ #
70
+ # Returns a Topic.
71
+ def self.from_error(error)
72
+ topic = new(nil)
73
+ topic.error = error
74
+ topic
75
+ end
76
+
77
+ # Public: Initialize the topic.
78
+ #
79
+ # name - A String with the name of the topic.
80
+ # description - The topic description Hash
81
+ # topic_service - The Topic service to perform external calls
82
+ # (optional).
83
+ # subscription_service - The Subscription service to perform external
84
+ # calls (optional).
85
+ def initialize(name, description = {}, topic_service=Azure::ServiceBus::Topics,
86
+ subscription_service=Azure::ServiceBus::Subscriptions)
87
+ @name = name
88
+ @description = description
89
+ @topic_service = topic_service
90
+ @subscription_service = subscription_service
91
+
92
+ yield self if block_given?
93
+ end
94
+
95
+ # Public: List subscriptions in this topic.
96
+ #
97
+ # Returns Azure::Core::Collection.
98
+ def subscriptions
99
+ @subscriptions ||= Core::Collection.new(
100
+ self,
101
+ :topic,
102
+ Subscriptions::Subscription,
103
+ @subscription_service
104
+ )
105
+ end
106
+
107
+ def delete
108
+ @topic_service.delete(self)
109
+ end
110
+
111
+ # Public: Compare two topics to see if they are the same.
112
+ #
113
+ # other - A topic.
114
+ #
115
+ # Returns true|false.
116
+ def ==(other)
117
+ id == other.id
118
+ end
119
+ end
120
+ end
121
+ end
122
+ end