qoobaa-stree 0.1.0 → 0.2.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.
- data/README.rdoc +8 -8
- data/VERSION +1 -1
- data/extra/stree_backend.rb +1 -1
- data/lib/stree/bucket.rb +38 -44
- data/lib/stree/connection.rb +3 -3
- data/lib/stree/object.rb +68 -54
- data/lib/stree/parser.rb +48 -0
- data/lib/stree/service.rb +11 -18
- data/lib/stree.rb +8 -8
- data/stree.gemspec +7 -3
- metadata +5 -3
data/README.rdoc
CHANGED
@@ -16,28 +16,28 @@ environment variables and uses them by default, so if you don't want
|
|
16
16
|
to pass them each time, export them (e.g. in .bashrc file).
|
17
17
|
|
18
18
|
* list buckets
|
19
|
-
|
19
|
+
stree bucket
|
20
20
|
|
21
21
|
* create bucket
|
22
|
-
|
22
|
+
stree bucket add name-of-bucket
|
23
23
|
|
24
24
|
* list objects in bucket
|
25
|
-
|
25
|
+
stree bucket show name-of-bucket
|
26
26
|
|
27
27
|
* destroy bucket
|
28
|
-
|
28
|
+
stree bucket remove name-of-bucket
|
29
29
|
|
30
30
|
* list objects (in all buckets)
|
31
|
-
|
31
|
+
stree object
|
32
32
|
|
33
33
|
* show the object information
|
34
|
-
|
34
|
+
stree object show bucket_name/path/to/object.extension
|
35
35
|
|
36
36
|
* download the content of the object
|
37
|
-
|
37
|
+
stree object show bucket_name/path/to/object.extension filename_to_store_the_content.extension
|
38
38
|
|
39
39
|
* show the content of the object to STDOUT
|
40
|
-
|
40
|
+
stree object show bucket_name/path/to/object.extension -
|
41
41
|
|
42
42
|
You can also pass --help to the commmands like:
|
43
43
|
stree bucket add --help
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/extra/stree_backend.rb
CHANGED
data/lib/stree/bucket.rb
CHANGED
@@ -1,25 +1,26 @@
|
|
1
1
|
module Stree
|
2
2
|
class Bucket
|
3
|
+
include Parser
|
3
4
|
extend Roxy::Moxie
|
4
5
|
extend Forwardable
|
5
6
|
|
6
7
|
attr_reader :name, :service
|
7
8
|
|
8
9
|
def_instance_delegators :service, :service_request
|
10
|
+
private_class_method :new
|
9
11
|
|
10
12
|
# Retrieves the bucket information from the server. Raises an
|
11
13
|
# Stree::Error exception if the bucket doesn't exist or you don't
|
12
14
|
# have access to it, etc.
|
13
15
|
def retrieve
|
14
|
-
|
16
|
+
list_bucket(:max_keys => 0)
|
15
17
|
self
|
16
18
|
end
|
17
19
|
|
18
20
|
# Returns location of the bucket, e.g. "EU"
|
19
21
|
def location(reload = false)
|
20
22
|
if reload or @location.nil?
|
21
|
-
|
22
|
-
@location = parse_location(response.body)
|
23
|
+
@location = location_constraint
|
23
24
|
else
|
24
25
|
@location
|
25
26
|
end
|
@@ -45,7 +46,7 @@ module Stree
|
|
45
46
|
# bucket is not empty. You can destroy non-empty bucket passing
|
46
47
|
# true (to force destroy)
|
47
48
|
def destroy(force = false)
|
48
|
-
|
49
|
+
delete_bucket
|
49
50
|
true
|
50
51
|
rescue Error::BucketNotEmpty
|
51
52
|
if force
|
@@ -59,13 +60,7 @@ module Stree
|
|
59
60
|
# Saves the newly built bucket. Optionally you can pass location
|
60
61
|
# of the bucket (:eu or :us)
|
61
62
|
def save(location = nil)
|
62
|
-
location
|
63
|
-
options = { :headers => {} }
|
64
|
-
if location and location != "US"
|
65
|
-
options[:body] = "<CreateBucketConfiguration><LocationConstraint>#{location}</LocationConstraint></CreateBucketConfiguration>"
|
66
|
-
options[:headers][:content_type] = "application/xml"
|
67
|
-
end
|
68
|
-
bucket_request(:put, options)
|
63
|
+
create_bucket_configuration(location)
|
69
64
|
true
|
70
65
|
end
|
71
66
|
|
@@ -92,7 +87,7 @@ module Stree
|
|
92
87
|
# reload).
|
93
88
|
def objects(reload = false)
|
94
89
|
if reload or @objects.nil?
|
95
|
-
@objects =
|
90
|
+
@objects = list_bucket
|
96
91
|
else
|
97
92
|
@objects
|
98
93
|
end
|
@@ -102,7 +97,7 @@ module Stree
|
|
102
97
|
|
103
98
|
# Builds the object in the bucket with given key
|
104
99
|
def build(key)
|
105
|
-
Object.new
|
100
|
+
Object.send(:new, proxy_owner, :key => key)
|
106
101
|
end
|
107
102
|
|
108
103
|
# Finds first object with given name or raises the exception if
|
@@ -120,7 +115,7 @@ module Stree
|
|
120
115
|
# +max_keys+:: The maximum number of keys you'd like to see
|
121
116
|
# +delimiter+:: Causes keys that contain the same string between the prefix and the first occurrence of the delimiter to be rolled up into a single result element
|
122
117
|
def find_all(options = {})
|
123
|
-
proxy_owner.send(:
|
118
|
+
proxy_owner.send(:list_bucket, options)
|
124
119
|
end
|
125
120
|
|
126
121
|
# Reloads the object list (clears the cache)
|
@@ -140,15 +135,40 @@ module Stree
|
|
140
135
|
"#<#{self.class}:#{name}>"
|
141
136
|
end
|
142
137
|
|
138
|
+
private
|
139
|
+
|
140
|
+
attr_writer :service
|
141
|
+
|
142
|
+
def location_constraint
|
143
|
+
response = bucket_request(:get, :params => { :location => nil })
|
144
|
+
parse_location_constraint(response.body)
|
145
|
+
end
|
146
|
+
|
147
|
+
def list_bucket(options = {})
|
148
|
+
response = bucket_request(:get, :params => options)
|
149
|
+
objects_attributes = parse_list_bucket_result(response.body)
|
150
|
+
objects_attributes.map { |object_attributes| Object.send(:new, self, object_attributes) }
|
151
|
+
end
|
152
|
+
|
153
|
+
def create_bucket_configuration(location = nil)
|
154
|
+
location = location.to_s.upcase if location
|
155
|
+
options = { :headers => {} }
|
156
|
+
if location and location != "US"
|
157
|
+
options[:body] = "<CreateBucketConfiguration><LocationConstraint>#{location}</LocationConstraint></CreateBucketConfiguration>"
|
158
|
+
options[:headers][:content_type] = "application/xml"
|
159
|
+
end
|
160
|
+
bucket_request(:put, options)
|
161
|
+
end
|
162
|
+
|
163
|
+
def delete_bucket
|
164
|
+
bucket_request(:delete)
|
165
|
+
end
|
166
|
+
|
143
167
|
def initialize(service, name) #:nodoc:
|
144
168
|
self.service = service
|
145
169
|
self.name = name
|
146
170
|
end
|
147
171
|
|
148
|
-
private
|
149
|
-
|
150
|
-
attr_writer :service
|
151
|
-
|
152
172
|
def name=(name)
|
153
173
|
raise ArgumentError.new("Invalid bucket name: #{name}") unless name_valid?(name)
|
154
174
|
@name = name
|
@@ -159,32 +179,6 @@ module Stree
|
|
159
179
|
service_request(method, options.merge(:host => host, :path => path))
|
160
180
|
end
|
161
181
|
|
162
|
-
def fetch_objects(options = {})
|
163
|
-
response = bucket_request(:get, options)
|
164
|
-
parse_objects(response.body)
|
165
|
-
end
|
166
|
-
|
167
|
-
def parse_objects(xml_body)
|
168
|
-
xml = XmlSimple.xml_in(xml_body)
|
169
|
-
objects_attributes = xml["Contents"]
|
170
|
-
if objects_attributes
|
171
|
-
objects_attributes.map do |object_attributes|
|
172
|
-
Object.new(self,
|
173
|
-
object_attributes["Key"].first,
|
174
|
-
:etag => object_attributes["ETag"].first,
|
175
|
-
:last_modified => object_attributes["LastModified"].first,
|
176
|
-
:size => object_attributes["Size"].first)
|
177
|
-
end
|
178
|
-
else
|
179
|
-
[]
|
180
|
-
end
|
181
|
-
end
|
182
|
-
|
183
|
-
def parse_location(xml_body)
|
184
|
-
xml = XmlSimple.xml_in(xml_body)
|
185
|
-
xml["content"]
|
186
|
-
end
|
187
|
-
|
188
182
|
def name_valid?(name)
|
189
183
|
name =~ /\A[a-z0-9][a-z0-9\._-]{2,254}\Z/ and name !~ /\A#{URI::REGEXP::PATTERN::IPV4ADDR}\Z/
|
190
184
|
end
|
data/lib/stree/connection.rb
CHANGED
@@ -2,6 +2,8 @@ module Stree
|
|
2
2
|
|
3
3
|
# Class responsible for handling connections to amazon hosts
|
4
4
|
class Connection
|
5
|
+
include Parser
|
6
|
+
|
5
7
|
attr_accessor :access_key_id, :secret_access_key, :use_ssl, :timeout, :debug
|
6
8
|
alias :use_ssl? :use_ssl
|
7
9
|
|
@@ -185,9 +187,7 @@ module Stree
|
|
185
187
|
if response.body.nil? || response.body.empty?
|
186
188
|
raise Error::ResponseError.new(nil, response)
|
187
189
|
else
|
188
|
-
|
189
|
-
message = xml["Message"].first
|
190
|
-
code = xml["Code"].first
|
190
|
+
code, message = parse_error(response.body)
|
191
191
|
raise Error::ResponseError.exception(code).new(message, response)
|
192
192
|
end
|
193
193
|
else
|
data/lib/stree/object.rb
CHANGED
@@ -2,6 +2,7 @@ module Stree
|
|
2
2
|
|
3
3
|
# Class responsible for handling objects stored in S3 buckets
|
4
4
|
class Object
|
5
|
+
include Parser
|
5
6
|
extend Forwardable
|
6
7
|
|
7
8
|
attr_accessor :content_type, :content_disposition, :content_encoding
|
@@ -10,6 +11,7 @@ module Stree
|
|
10
11
|
|
11
12
|
def_instance_delegators :bucket, :name, :service, :bucket_request, :vhost?, :host, :path_prefix
|
12
13
|
def_instance_delegators :service, :protocol, :port
|
14
|
+
private_class_method :new
|
13
15
|
|
14
16
|
# Compares the object with other object. Returns true if the key
|
15
17
|
# of the objects are the same, and both have the same buckets (see
|
@@ -43,8 +45,7 @@ module Stree
|
|
43
45
|
# NOT download the content of the object (use the content method
|
44
46
|
# to do it).
|
45
47
|
def retrieve
|
46
|
-
|
47
|
-
parse_headers(response)
|
48
|
+
get_object(:headers => { :range => 0..0 })
|
48
49
|
self
|
49
50
|
end
|
50
51
|
|
@@ -62,18 +63,14 @@ module Stree
|
|
62
63
|
# to clear the cache and download the object again.
|
63
64
|
def content(reload = false)
|
64
65
|
if reload or @content.nil?
|
65
|
-
|
66
|
-
parse_headers(response)
|
67
|
-
self.content = response.body
|
66
|
+
get_object
|
68
67
|
end
|
69
68
|
@content
|
70
69
|
end
|
71
70
|
|
72
71
|
# Saves the object, returns true if successfull.
|
73
72
|
def save
|
74
|
-
|
75
|
-
response = object_request(:put, :body => body, :headers => dump_headers)
|
76
|
-
parse_headers(response)
|
73
|
+
put_object
|
77
74
|
true
|
78
75
|
end
|
79
76
|
|
@@ -84,28 +81,12 @@ module Stree
|
|
84
81
|
# +acl+:: acl of the copied object (default: "public-read")
|
85
82
|
# +content_type+:: content type of the copied object (default: "application/octet-stream")
|
86
83
|
def copy(options = {})
|
87
|
-
|
88
|
-
bucket = options[:bucket] || self.bucket
|
89
|
-
|
90
|
-
headers = {}
|
91
|
-
headers[:x_amz_acl] = options[:acl] || acl || "public-read"
|
92
|
-
headers[:content_type] = options[:content_type] || content_type || "application/octet-stream"
|
93
|
-
headers[:content_encoding] = options[:content_encoding] if options[:content_encoding]
|
94
|
-
headers[:content_disposition] = options[:content_disposition] if options[:content_disposition]
|
95
|
-
headers[:x_amz_copy_source] = full_key
|
96
|
-
headers[:x_amz_metadata_directive] = "REPLACE"
|
97
|
-
headers[:x_amz_copy_source_if_match] = options[:if_match] if options[:if_match]
|
98
|
-
headers[:x_amz_copy_source_if_none_match] = options[:if_none_match] if options[:if_none_match]
|
99
|
-
headers[:x_amz_copy_source_if_unmodified_since] = options[:if_modified_since] if options[:if_modified_since]
|
100
|
-
headers[:x_amz_copy_source_if_modified_since] = options[:if_unmodified_since] if options[:if_unmodified_since]
|
101
|
-
|
102
|
-
response = bucket.send(:bucket_request, :put, :path => key, :headers => headers)
|
103
|
-
self.class.parse_copied(:object => self, :bucket => bucket, :key => key, :body => response.body, :headers => headers)
|
84
|
+
copy_object(options)
|
104
85
|
end
|
105
86
|
|
106
87
|
# Destroys the file on the server
|
107
88
|
def destroy
|
108
|
-
|
89
|
+
delete_object
|
109
90
|
true
|
110
91
|
end
|
111
92
|
|
@@ -127,18 +108,62 @@ module Stree
|
|
127
108
|
"#<#{self.class}:/#{name}/#{key}>"
|
128
109
|
end
|
129
110
|
|
130
|
-
|
111
|
+
private
|
112
|
+
|
113
|
+
attr_writer :last_modified, :etag, :size, :original_key, :bucket
|
114
|
+
|
115
|
+
def copy_object(options = {})
|
116
|
+
key = options[:key] or raise ArgumentError, "No key given"
|
117
|
+
raise ArgumentError.new("Invalid key name: #{key}") unless key_valid?(key)
|
118
|
+
bucket = options[:bucket] || self.bucket
|
119
|
+
|
120
|
+
headers = {}
|
121
|
+
|
122
|
+
headers[:x_amz_acl] = options[:acl] || acl || "public-read"
|
123
|
+
headers[:content_type] = options[:content_type] || content_type || "application/octet-stream"
|
124
|
+
headers[:content_encoding] = options[:content_encoding] if options[:content_encoding]
|
125
|
+
headers[:content_disposition] = options[:content_disposition] if options[:content_disposition]
|
126
|
+
headers[:x_amz_copy_source] = full_key
|
127
|
+
headers[:x_amz_metadata_directive] = "REPLACE"
|
128
|
+
headers[:x_amz_copy_source_if_match] = options[:if_match] if options[:if_match]
|
129
|
+
headers[:x_amz_copy_source_if_none_match] = options[:if_none_match] if options[:if_none_match]
|
130
|
+
headers[:x_amz_copy_source_if_unmodified_since] = options[:if_modified_since] if options[:if_modified_since]
|
131
|
+
headers[:x_amz_copy_source_if_modified_since] = options[:if_unmodified_since] if options[:if_unmodified_since]
|
132
|
+
|
133
|
+
response = bucket.send(:bucket_request, :put, :path => key, :headers => headers)
|
134
|
+
object_attributes = parse_copy_object_result(response.body)
|
135
|
+
|
136
|
+
object = Object.send(:new, bucket, object_attributes.merge(:key => key, :size => size))
|
137
|
+
object.acl = response[:x_amz_acl]
|
138
|
+
object.content_type = response[:content_type]
|
139
|
+
object.content_encoding = response[:content_encoding]
|
140
|
+
object.content_disposition = response[:content_disposition]
|
141
|
+
object
|
142
|
+
end
|
143
|
+
|
144
|
+
def get_object(options = {})
|
145
|
+
response = object_request(:get, options)
|
146
|
+
parse_headers(response)
|
147
|
+
end
|
148
|
+
|
149
|
+
def put_object
|
150
|
+
body = content.is_a?(IO) ? content.read : content
|
151
|
+
response = object_request(:put, :body => body, :headers => dump_headers)
|
152
|
+
parse_headers(response)
|
153
|
+
end
|
154
|
+
|
155
|
+
def delete_object(options = {})
|
156
|
+
object_request(:delete)
|
157
|
+
end
|
158
|
+
|
159
|
+
def initialize(bucket, options = {})
|
131
160
|
self.bucket = bucket
|
132
|
-
self.key = key
|
161
|
+
self.key = options[:key]
|
133
162
|
self.last_modified = options[:last_modified]
|
134
163
|
self.etag = options[:etag]
|
135
164
|
self.size = options[:size]
|
136
165
|
end
|
137
166
|
|
138
|
-
private
|
139
|
-
|
140
|
-
attr_writer :last_modified, :etag, :size, :original_key, :bucket
|
141
|
-
|
142
167
|
def object_request(method, options = {})
|
143
168
|
bucket_request(method, options.merge(:path => key))
|
144
169
|
end
|
@@ -151,6 +176,14 @@ module Stree
|
|
151
176
|
@etag = etag[1..-2] if etag
|
152
177
|
end
|
153
178
|
|
179
|
+
def key_valid?(key)
|
180
|
+
if (key.nil? or key.empty? or key =~ %r#//#)
|
181
|
+
false
|
182
|
+
else
|
183
|
+
true
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
154
187
|
def dump_headers
|
155
188
|
headers = {}
|
156
189
|
headers[:x_amz_acl] = @acl || "public-read"
|
@@ -160,37 +193,18 @@ module Stree
|
|
160
193
|
headers
|
161
194
|
end
|
162
195
|
|
163
|
-
def key_valid?(key)
|
164
|
-
if (key.nil? or key.empty? or key =~ %r#//#)
|
165
|
-
false
|
166
|
-
else
|
167
|
-
true
|
168
|
-
end
|
169
|
-
end
|
170
|
-
|
171
196
|
def parse_headers(response)
|
172
197
|
self.etag = response["etag"]
|
173
198
|
self.content_type = response["content-type"]
|
174
199
|
self.content_disposition = response["content-disposition"]
|
175
200
|
self.content_encoding = response["content-encoding"]
|
176
201
|
self.last_modified = response["last-modified"]
|
177
|
-
self.size = response["content-length"]
|
178
202
|
if response["content-range"]
|
179
203
|
self.size = response["content-range"].sub(/[^\/]+\//, "").to_i
|
204
|
+
else
|
205
|
+
self.size = response["content-length"]
|
206
|
+
self.content = response.body
|
180
207
|
end
|
181
208
|
end
|
182
|
-
|
183
|
-
def self.parse_copied(options)
|
184
|
-
xml = XmlSimple.xml_in(options[:body])
|
185
|
-
etag = xml["ETag"].first
|
186
|
-
last_modified = xml["LastModified"].first
|
187
|
-
size = options[:object].size
|
188
|
-
object = Object.new(options[:bucket], options[:key], :etag => etag, :last_modified => last_modified, :size => size)
|
189
|
-
object.acl = options[:headers][:x_amz_acl]
|
190
|
-
object.content_type = options[:headers][:content_type]
|
191
|
-
object.content_encoding = options[:headers][:content_encoding]
|
192
|
-
object.content_disposition = options[:headers][:content_disposition]
|
193
|
-
object
|
194
|
-
end
|
195
209
|
end
|
196
210
|
end
|
data/lib/stree/parser.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
module Stree
|
2
|
+
module Parser
|
3
|
+
include REXML
|
4
|
+
|
5
|
+
def rexml_document(xml)
|
6
|
+
xml.force_encoding(Encoding::UTF_8) if xml.respond_to? :force_encoding
|
7
|
+
Document.new(xml)
|
8
|
+
end
|
9
|
+
|
10
|
+
def parse_list_all_my_buckets_result(xml)
|
11
|
+
names = []
|
12
|
+
rexml_document(xml).elements.each("ListAllMyBucketsResult/Buckets/Bucket/Name") { |e| names << e.text }
|
13
|
+
names
|
14
|
+
end
|
15
|
+
|
16
|
+
def parse_location_constraint(xml)
|
17
|
+
rexml_document(xml).elements["LocationConstraint"].text
|
18
|
+
end
|
19
|
+
|
20
|
+
def parse_list_bucket_result(xml)
|
21
|
+
objects_attributes = []
|
22
|
+
rexml_document(xml).elements.each("ListBucketResult/Contents") do |e|
|
23
|
+
object_attributes = {}
|
24
|
+
object_attributes[:key] = e.elements["Key"].text
|
25
|
+
object_attributes[:etag] = e.elements["ETag"].text
|
26
|
+
object_attributes[:last_modified] = e.elements["LastModified"].text
|
27
|
+
object_attributes[:size] = e.elements["Size"].text
|
28
|
+
objects_attributes << object_attributes
|
29
|
+
end
|
30
|
+
objects_attributes
|
31
|
+
end
|
32
|
+
|
33
|
+
def parse_copy_object_result(xml)
|
34
|
+
object_attributes = {}
|
35
|
+
document = rexml_document(xml)
|
36
|
+
object_attributes[:etag] = document.elements["CopyObjectResult/ETag"].text
|
37
|
+
object_attributes[:last_modified] = document.elements["CopyObjectResult/LastModified"].text
|
38
|
+
object_attributes
|
39
|
+
end
|
40
|
+
|
41
|
+
def parse_error(xml)
|
42
|
+
document = rexml_document(xml)
|
43
|
+
code = document.elements["Error/Code"].text
|
44
|
+
message = document.elements["Error/Message"].text
|
45
|
+
[code, message]
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/lib/stree/service.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
module Stree
|
2
2
|
class Service
|
3
|
+
include Parser
|
3
4
|
extend Roxy::Moxie
|
4
5
|
|
5
6
|
attr_reader :access_key_id, :secret_access_key, :use_ssl
|
@@ -19,8 +20,8 @@ module Stree
|
|
19
20
|
# +timeout+:: parameter for Net::HTTP module
|
20
21
|
# +debug+:: prints the raw requests to STDOUT
|
21
22
|
def initialize(options)
|
22
|
-
@access_key_id = options[:access_key_id] or raise ArgumentError
|
23
|
-
@secret_access_key = options[:secret_access_key] or raise ArgumentError
|
23
|
+
@access_key_id = options[:access_key_id] or raise ArgumentError, "No access key id given"
|
24
|
+
@secret_access_key = options[:secret_access_key] or raise ArgumentError, "No secret access key given"
|
24
25
|
@use_ssl = options[:use_ssl]
|
25
26
|
@timeout = options[:timeout]
|
26
27
|
@debug = options[:debug]
|
@@ -29,8 +30,7 @@ module Stree
|
|
29
30
|
# Returns all buckets in the service and caches the result (see reload)
|
30
31
|
def buckets(reload = false)
|
31
32
|
if reload or @buckets.nil?
|
32
|
-
|
33
|
-
@buckets = parse_buckets(response.body)
|
33
|
+
@buckets = list_all_my_buckets
|
34
34
|
else
|
35
35
|
@buckets
|
36
36
|
end
|
@@ -49,7 +49,7 @@ module Stree
|
|
49
49
|
proxy :buckets do
|
50
50
|
# Builds new bucket with given name
|
51
51
|
def build(name)
|
52
|
-
Bucket.new
|
52
|
+
Bucket.send(:new, proxy_owner, name)
|
53
53
|
end
|
54
54
|
|
55
55
|
# Finds the bucket with given name
|
@@ -85,6 +85,12 @@ module Stree
|
|
85
85
|
|
86
86
|
private
|
87
87
|
|
88
|
+
def list_all_my_buckets
|
89
|
+
response = service_request(:get)
|
90
|
+
names = parse_list_all_my_buckets_result(response.body)
|
91
|
+
names.map { |name| Bucket.send(:new, self, name) }
|
92
|
+
end
|
93
|
+
|
88
94
|
def service_request(method, options = {})
|
89
95
|
connection.request(method, options.merge(:path => "/#{options[:path]}"))
|
90
96
|
end
|
@@ -100,18 +106,5 @@ module Stree
|
|
100
106
|
end
|
101
107
|
@connection
|
102
108
|
end
|
103
|
-
|
104
|
-
def parse_buckets(xml_body)
|
105
|
-
xml = XmlSimple.xml_in(xml_body)
|
106
|
-
buckets = xml["Buckets"].first["Bucket"]
|
107
|
-
if buckets
|
108
|
-
buckets_names = buckets.map { |bucket| bucket["Name"].first }
|
109
|
-
buckets_names.map do |bucket_name|
|
110
|
-
Bucket.new(self, bucket_name)
|
111
|
-
end
|
112
|
-
else
|
113
|
-
[]
|
114
|
-
end
|
115
|
-
end
|
116
109
|
end
|
117
110
|
end
|
data/lib/stree.rb
CHANGED
@@ -1,16 +1,16 @@
|
|
1
|
-
require "time"
|
2
|
-
require "openssl"
|
3
|
-
require "net/http"
|
4
|
-
require "net/https"
|
5
1
|
require "base64"
|
6
|
-
require "forwardable"
|
7
2
|
require "digest/md5"
|
3
|
+
require "forwardable"
|
4
|
+
require "net/http"
|
5
|
+
require "net/https"
|
6
|
+
require "openssl"
|
7
|
+
require "rexml/document"
|
8
|
+
require "time"
|
8
9
|
|
9
|
-
require "xmlsimple"
|
10
|
-
|
11
|
-
require "stree/roxy/proxy"
|
12
10
|
require "stree/roxy/moxie"
|
11
|
+
require "stree/roxy/proxy"
|
13
12
|
|
13
|
+
require "stree/parser"
|
14
14
|
require "stree/bucket"
|
15
15
|
require "stree/connection"
|
16
16
|
require "stree/exceptions"
|
data/stree.gemspec
CHANGED
@@ -1,12 +1,15 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
|
1
4
|
# -*- encoding: utf-8 -*-
|
2
5
|
|
3
6
|
Gem::Specification.new do |s|
|
4
7
|
s.name = %q{stree}
|
5
|
-
s.version = "0.
|
8
|
+
s.version = "0.2.0"
|
6
9
|
|
7
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
11
|
s.authors = ["Jakub Kuźma", "Mirosław Boruta"]
|
9
|
-
s.date = %q{2009-
|
12
|
+
s.date = %q{2009-08-19}
|
10
13
|
s.default_executable = %q{stree}
|
11
14
|
s.email = %q{qoobaa@gmail.com}
|
12
15
|
s.executables = ["stree"]
|
@@ -28,6 +31,7 @@ Gem::Specification.new do |s|
|
|
28
31
|
"lib/stree/connection.rb",
|
29
32
|
"lib/stree/exceptions.rb",
|
30
33
|
"lib/stree/object.rb",
|
34
|
+
"lib/stree/parser.rb",
|
31
35
|
"lib/stree/roxy/moxie.rb",
|
32
36
|
"lib/stree/roxy/proxy.rb",
|
33
37
|
"lib/stree/service.rb",
|
@@ -43,7 +47,7 @@ Gem::Specification.new do |s|
|
|
43
47
|
s.homepage = %q{http://github.com/qoobaa/stree}
|
44
48
|
s.rdoc_options = ["--charset=UTF-8"]
|
45
49
|
s.require_paths = ["lib"]
|
46
|
-
s.rubygems_version = %q{1.3.
|
50
|
+
s.rubygems_version = %q{1.3.5}
|
47
51
|
s.summary = %q{Library for accessing S3 objects and buckets, with command line tool}
|
48
52
|
s.test_files = [
|
49
53
|
"test/bucket_test.rb",
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: qoobaa-stree
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- "Jakub Ku\xC5\xBAma"
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2009-
|
13
|
+
date: 2009-08-19 00:00:00 -07:00
|
14
14
|
default_executable: stree
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -46,6 +46,7 @@ files:
|
|
46
46
|
- lib/stree/connection.rb
|
47
47
|
- lib/stree/exceptions.rb
|
48
48
|
- lib/stree/object.rb
|
49
|
+
- lib/stree/parser.rb
|
49
50
|
- lib/stree/roxy/moxie.rb
|
50
51
|
- lib/stree/roxy/proxy.rb
|
51
52
|
- lib/stree/service.rb
|
@@ -59,6 +60,7 @@ files:
|
|
59
60
|
- test/test_helper.rb
|
60
61
|
has_rdoc: false
|
61
62
|
homepage: http://github.com/qoobaa/stree
|
63
|
+
licenses:
|
62
64
|
post_install_message:
|
63
65
|
rdoc_options:
|
64
66
|
- --charset=UTF-8
|
@@ -79,7 +81,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
79
81
|
requirements: []
|
80
82
|
|
81
83
|
rubyforge_project:
|
82
|
-
rubygems_version: 1.
|
84
|
+
rubygems_version: 1.3.5
|
83
85
|
signing_key:
|
84
86
|
specification_version: 3
|
85
87
|
summary: Library for accessing S3 objects and buckets, with command line tool
|