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,127 @@
1
+ require "azure/tables/types"
2
+ require "azure/tables"
3
+ require "azure/error"
4
+
5
+ module Azure
6
+ module Tables
7
+ # Public: Representation of a table Entity.
8
+ class Entity
9
+ # ETag to force updates/deletes.
10
+ FORCE_UPDATE = "*".freeze
11
+
12
+ include Azure::ErrorHandler
13
+
14
+ # Public: Returns an Entity from an Atom::Entry object.
15
+ #
16
+ # entry - Atom::Entry object representing the Entity.
17
+ #
18
+ # Returns Azure::Entity
19
+ def self.from_entry(entry)
20
+ entity = new
21
+
22
+ entity.url = URI(entry.id)
23
+
24
+ entry.content.m_properties.each do |property_node|
25
+ value = Types.cast(
26
+ property_node.content,
27
+ property_node.attributes["type"]
28
+ )
29
+
30
+ entity[property_node.name] = value
31
+ end
32
+
33
+ entity
34
+ end
35
+
36
+ # Public: Get/Set this entity's URL.
37
+ attr_accessor :url
38
+
39
+ # Public: Get/Set this entity's ETag for conditional updates.
40
+ attr_accessor :etag
41
+
42
+ # Public: Get the attributes.
43
+ attr :attributes
44
+
45
+ # Public: Initialize an Entity.
46
+ #
47
+ # attributes - A Hash of attributes.
48
+ #
49
+ # Yields self.
50
+ def initialize(attributes={}, service=Azure::Tables)
51
+ @attributes = attributes
52
+ @service = service
53
+ self.etag = FORCE_UPDATE
54
+ yield self if block_given?
55
+ end
56
+
57
+ # Public: Two entities are considered equal if they both have the same
58
+ # URI.
59
+ #
60
+ # other - An Entity.
61
+ #
62
+ # Returns true|false.
63
+ def ==(other)
64
+ url == other.url
65
+ end
66
+
67
+ # Public: Reset this entity to clone another's properties. This will copy
68
+ # everything from the other entity into this one.
69
+ #
70
+ # other - An entity.
71
+ #
72
+ # Returns self.
73
+ def reset(other)
74
+ self.url = other.url
75
+ self.attributes.replace(other.attributes)
76
+ self
77
+ end
78
+
79
+ # Public: Replace an entity with a new set of attributes. In case of an
80
+ # error, self.error will be set.
81
+ #
82
+ # attributes - A Hash of attributes.
83
+ #
84
+ # Returns true|false to indicate success.
85
+ def update(attributes)
86
+ @service.update_entity(self, attributes)
87
+ end
88
+
89
+ # Public: Merge new attributes into our set of attributes. In case of an
90
+ # error, self.error will be set.
91
+ #
92
+ # attributes - A Hash of attributes.
93
+ #
94
+ # Returns true|false to indicate success.
95
+ def merge(attributes)
96
+ @service.merge_entity(self, attributes)
97
+ end
98
+
99
+ # Public: Delete this entity from the service. In case of an error,
100
+ # self.error will be set.
101
+ #
102
+ # Returns true|false to indicate success.
103
+ def delete
104
+ @service.delete_entity(self)
105
+ end
106
+
107
+ # Public: Access a property on this entity.
108
+ #
109
+ # name - The property name.
110
+ #
111
+ # Returns the property value.
112
+ def [](name)
113
+ @attributes[name]
114
+ end
115
+
116
+ # Public: Set a property on this entity.
117
+ #
118
+ # name - The property name.
119
+ # value - The value for this property.
120
+ #
121
+ # Returns the property value.
122
+ def []=(name, value)
123
+ @attributes[name] = value
124
+ end
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,211 @@
1
+ require "azure/core/service"
2
+ require "azure/core/utils/queryable"
3
+ require "azure/tables/auth/shared_key"
4
+ require "azure/tables/auth/shared_key_lite"
5
+ require "azure/tables/uri"
6
+ require "azure/atom"
7
+
8
+ module Azure
9
+ module Tables
10
+ class Service < Core::Service
11
+ def initialize(signer=Azure::Tables::Auth::SharedKey.new)
12
+ super(signer)
13
+ end
14
+ end
15
+
16
+ module Services
17
+ # Public: Get a list of tables from the server.
18
+ class QueryTables < Service
19
+ include Core::Utils::Queryable
20
+
21
+ # Public: Invoke the service.
22
+ #
23
+ # query - A hash of options.
24
+ # :filter - A string to filter results.
25
+ # :top - Returns only the top n tables from the set.
26
+ #
27
+ # To read more about supported query filters check this link.
28
+ # http://msdn.microsoft.com/en-us/library/windowsazure/dd894031
29
+ #
30
+ # Returns a Response.
31
+ def call(query)
32
+ uri = Tables::URI.collection
33
+ query.delete(:select)
34
+ uri.query = build_query(query)
35
+ super(:get, uri) do |request|
36
+ request.headers["DataServiceVersion"] = "2.0;NetFx"
37
+ end
38
+ end
39
+ end
40
+
41
+ # Public: Find a single table by name.
42
+ class FetchTable < Service
43
+ # Public: Invoke the service.
44
+ #
45
+ # name - The name of the table.
46
+ #
47
+ # Returns a Response.
48
+ def call(name)
49
+ uri = Tables::URI.table(name)
50
+ super(:get, uri)
51
+ end
52
+ end
53
+
54
+ # Public: Create a table.
55
+ class CreateTable < Service
56
+ # Public: Invoke the service.
57
+ #
58
+ # table_name - A String with the table name.
59
+ #
60
+ # Returns a Response.
61
+ def call(table_name)
62
+ body = Atom::Entry.new do |entry|
63
+ entry.properties["TableName"] = table_name
64
+ end
65
+
66
+ super(:post, Tables::URI.collection, body.to_xml)
67
+ end
68
+ end
69
+
70
+ # Public: Delete a table.
71
+ class DeleteTable < Service
72
+ # Public: Invoke the service.
73
+ #
74
+ # table_name - A String with the table name.
75
+ #
76
+ # Returns a Response.
77
+ def call(table_name)
78
+ super(:delete, Tables::URI.table(table_name))
79
+ end
80
+ end
81
+
82
+ # Public: Insert an entity into a table.
83
+ class InsertEntity < Service
84
+ # Public: Invoke the service.
85
+ #
86
+ # table_name - A String with the table name.
87
+ # attributes - A Hash of entity attributes. The hash *must* contain the
88
+ # keys: "PartitionKey" and "RowKey".
89
+ #
90
+ # Returns a Response.
91
+ def call(table_name, attributes)
92
+ body = Atom::Entry.new do |entry|
93
+ entry.updated = Time.now.utc
94
+ entry.properties.merge(attributes)
95
+ end
96
+
97
+ super(:post, Tables::URI.entities(table_name), body.to_xml)
98
+ end
99
+ end
100
+
101
+ # Public: Replace the attributes of an existing entity.
102
+ class ReplaceEntity < Service
103
+ # Public: Invoke the service.
104
+ #
105
+ # table_name - A String with the table name.
106
+ # attributes - A Hash of entity attributes. The hash *must* contain the
107
+ # keys: "PartitionKey" and "RowKey".
108
+ # etag - The condition to perform the update. "*" will force an
109
+ # unconditional update.
110
+ #
111
+ # Returns a Response.
112
+ def call(table_name, attributes, etag)
113
+ uri = Tables::URI.entities(
114
+ table_name,
115
+ attributes.fetch("PartitionKey"),
116
+ attributes.fetch("RowKey")
117
+ )
118
+
119
+ body = Atom::Entry.new do |entry|
120
+ entry.id = uri
121
+ entry.updated = Time.now.utc
122
+ entry.properties.merge(attributes)
123
+ end
124
+
125
+ super(:put, uri, body.to_xml) do |request|
126
+ request.headers["If-Match"] = etag
127
+ end
128
+ end
129
+ end
130
+
131
+ # Public: Update only certain properties of an entity.
132
+ class MergeEntity < Service
133
+ # Public: Invoke the service.
134
+ #
135
+ # uri - The URI of the Entity we're updating.
136
+ # attributes - A Hash of new entity attributes.
137
+ # etag - The condition to perform the update. "*" will force an
138
+ # unconditional update.
139
+ #
140
+ # Returns a Response.
141
+ def call(uri, attributes, etag)
142
+ body = Atom::Entry.new do |entry|
143
+ entry.id = uri
144
+ entry.updated = Time.now.utc
145
+ entry.properties.merge(attributes)
146
+ end
147
+
148
+ super(:post, uri, body.to_xml) do |request|
149
+ request.headers["If-Match"] = etag
150
+ request.headers["X-HTTP-Method"] = "MERGE"
151
+ end
152
+ end
153
+ end
154
+
155
+ # Public: Delete an Entity
156
+ class DeleteEntity < Service
157
+ # Public: Invoke the service.
158
+ #
159
+ # uri - The URI of the Entity we're deleting.
160
+ # etag - The condition to perform the update. "*" will force an
161
+ # unconditional update.
162
+ #
163
+ # Returns a Response.
164
+ def call(uri, etag)
165
+ super(:delete, uri) do |request|
166
+ request.headers["If-Match"] = etag
167
+ end
168
+ end
169
+ end
170
+
171
+ # Public: Get entities from a given table.
172
+ class QueryEntities < Service
173
+ include Core::Utils::Queryable
174
+
175
+ # Public: Invoke the service.
176
+ #
177
+ # table_name - A String with the table name.
178
+ # query - A hash of options.
179
+ # :partition_key - Only get entities with this PartitionKey
180
+ # (optional, but :row_key must also be
181
+ # included).
182
+ # :row_key - Only get entities with this RowKey
183
+ # (optional, but :partition_key must also
184
+ # be included).
185
+ # :select - An array with property names. Only these
186
+ # properties are provided from the
187
+ # returned returned set of entities.
188
+ # :filter - A string to filter results.
189
+ # :top - Returns only the top n tables or entities from the set.
190
+ #
191
+ # To read more about supported query filters check this link.
192
+ # http://msdn.microsoft.com/en-us/library/windowsazure/dd894031
193
+ #
194
+ # Returns a Response.
195
+ def call(table_name, query)
196
+ uri = Tables::URI.entities(
197
+ table_name,
198
+ query.fetch(:partition_key, nil),
199
+ query.fetch(:row_key, nil)
200
+ )
201
+
202
+ uri.query = build_query(query)
203
+
204
+ super(:get, uri) do |request|
205
+ request.headers["DataServiceVersion"] = "2.0;NetFx"
206
+ end
207
+ end
208
+ end
209
+ end
210
+ end
211
+ end
@@ -0,0 +1,129 @@
1
+ require "azure/tables"
2
+ require "azure/tables/uri"
3
+ require "azure/error"
4
+ require "uri"
5
+
6
+ module Azure
7
+ module Tables
8
+ # Public: Representation of a Table in the storage system.
9
+ class Table
10
+ include Azure::ErrorHandler
11
+
12
+ # Get the Table's URI.
13
+ #
14
+ # Returns a URI.
15
+ attr :url
16
+
17
+ # Get the Table's name.
18
+ #
19
+ # Returns a String.
20
+ attr :name
21
+
22
+ # Public: Instantiate a table from an Atom entry.
23
+ #
24
+ # entry - An Atom::Entry element.
25
+ #
26
+ # Returns a Table.
27
+ def self.from_entry(entry)
28
+ name = entry.content.m_properties.children.first.content
29
+ new(name, ::URI.parse(entry.id))
30
+ end
31
+
32
+ # Public: Instantiate a table from an error object.
33
+ #
34
+ # error - An Azure::Error.
35
+ #
36
+ # Returns a Table.
37
+ def self.from_error(error)
38
+ table = new(nil, nil)
39
+ table.error = error
40
+ table
41
+ end
42
+
43
+ # Public: Create a Table. The resulting table will be invalid if the
44
+ # create operation fails.
45
+ #
46
+ # name - The name of the table.
47
+ # service - The Table service to perform external calls.
48
+ #
49
+ # Returns a Table.
50
+ def self.create(name, service=Azure::Tables)
51
+ service.create(name)
52
+ end
53
+
54
+ # Public: Find a Table by name. If no table matches the provided name, nil
55
+ # is returned.
56
+ #
57
+ # name - The name of the table.
58
+ #
59
+ # Returns a Table or nil.
60
+ def self.[](name)
61
+ fetch(name) { nil }
62
+ end
63
+
64
+ # Public: Find a Table by name. If no table matches the provided name,
65
+ # execute the given block, or raise ArgumentError.
66
+ #
67
+ # name - The name of the table.
68
+ # service - The Table service to perform external calls.
69
+ #
70
+ # Yields the error returned by the server in case the table wasn't found.
71
+ #
72
+ # Returns a Table.
73
+ # Raises ArgumentError if the table isn't found and no block is given.
74
+ def self.fetch(name, service=Azure::Tables, &block)
75
+ block ||= -> { raise ArgumentError, "Can't find Table named '#{name}'" }
76
+ table = service.fetch(name)
77
+ table.valid? ? table : block.call(table.error)
78
+ end
79
+
80
+ # Public: Initialize the table.
81
+ #
82
+ # name - A String with the name of the table.
83
+ # url - The URI of the table in the service.
84
+ # service - The Table service to perform external calls.
85
+ def initialize(name, url=Azure::Tables::URI.table(name), service=Azure::Tables)
86
+ @name = name
87
+ @url = url
88
+ @service = service
89
+ end
90
+
91
+ # Public: Compare two tables to see if they are the same.
92
+ #
93
+ # other - A table.
94
+ #
95
+ # Returns true|false.
96
+ def ==(other)
97
+ name == other.name
98
+ end
99
+
100
+ # Public: Deletes this table from the storage service.
101
+ #
102
+ # Returns true|false to indicate whether the delete was successful or not.
103
+ def delete
104
+ @service.delete(self)
105
+ end
106
+
107
+ # Public: Insert a new entity into this table. If the operation fails, an
108
+ # error will be added to the entity.
109
+ #
110
+ # entity - An Azure::Tables::Entity.
111
+ #
112
+ # Returns the entity.
113
+ def insert(entity)
114
+ @service.insert_entity(self, entity)
115
+ end
116
+
117
+ # Public: Query for entities in this table.
118
+ #
119
+ # Returns a list of entities.
120
+ def entities(query={})
121
+ if query.key?(:partition_key) && query.key?(:row_key)
122
+ @service.query_entity(self, query.delete(:partition_key), query.delete(:row_key), query)
123
+ else
124
+ @service.query_entities(self, query)
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end