cryptkeeper 0.2.5 → 0.2.6

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 CHANGED
@@ -47,6 +47,17 @@ Add a new object to a bucket
47
47
  data = File.open("/Users/user/Desktop/text_file.txt", 'r')
48
48
  new_bucket.add_object("myTextFile.txt", data) # if you don't specify a content type, binary/octet-stream is used
49
49
 
50
+ Copy an object from one bucket to another
51
+ # Fetch an object
52
+ my_object = keeper.bucket_meta_objects('adam_new_bucket3', {:prefix => 'Picture%205.png'}).first
53
+
54
+ # Copy an object to another bucket
55
+ my_object.copy_to 'adam_first_bucket' # copy to a different bucket and keep the path intact
56
+ my_object.copy_to 'adam_new_bucket', 'path_1/path_2/path_3/Picture5.png' # copy to a different bucket and path
57
+
58
+ Delete an object
59
+ my_object.delete
60
+
50
61
  Delete an object
51
62
  keeper.bucket_meta_objects('adam_new_bucket3', {:prefix => 'Picture%205.png'}).first.delete
52
63
 
data/cryptkeeper.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{cryptkeeper}
8
- s.version = "0.2.5"
8
+ s.version = "0.2.6"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Adam Medeiros"]
12
- s.date = %q{2011-02-19}
12
+ s.date = %q{2011-02-20}
13
13
  s.description = %q{Use cryptkeeper to talk to Google Storage}
14
14
  s.email = %q{adammede@gmail.com}
15
15
  s.extra_rdoc_files = [
data/lib/buckets.rb CHANGED
@@ -2,7 +2,6 @@ require 'hpricot'
2
2
  require 'digest/md5'
3
3
  module Buckets
4
4
 
5
- # Bucket stuff
6
5
  # GET Service
7
6
  # lists all of the buckets that you own
8
7
  # return an array of Bucket objects
@@ -10,16 +9,21 @@ module Buckets
10
9
  find_buckets
11
10
  end
12
11
 
12
+ # returns the connection object that was initialized
13
13
  def connection
14
14
  CryptKeeper::Connection.http_instance
15
15
  end
16
16
 
17
+ # create a bucket. Takes a Hash as it's argument
18
+ # {:name => 'my_new_bucket_name'}
17
19
  def create_bucket(*args)
18
20
  options = args.last
19
21
  connection.put("/", options[:name])
20
22
  find_buckets(options)
21
23
  end
22
24
 
25
+ # search for buckets by name
26
+ # {:name => 'my_bucket_name'}
23
27
  def find_buckets(*args)
24
28
  options = args.last
25
29
  name = options[:name] if options.is_a? Hash
@@ -37,7 +41,13 @@ module Buckets
37
41
  # GET Bucket
38
42
  # lists the contents of a bucket or retrieves the ACLs that are
39
43
  # applied to a bucket.
40
- # return an array of BucketObjects
44
+ # returns an array of BucketMetaObjects
45
+ # takes a bucket name and hash for options.
46
+ # Possible keys for the hash are
47
+ # * :delimeter
48
+ # * :marker
49
+ # * :max_keys
50
+ # * :prefix
41
51
  def bucket_meta_objects(bucket_name, *args)
42
52
  options = {
43
53
  :delimeter => nil,
@@ -70,12 +80,16 @@ module Buckets
70
80
  obj_hashes.map { |obj| BucketMetaObject.new(obj) }
71
81
  end
72
82
 
83
+ # Utils class
73
84
  class Utils
85
+
86
+ # returns a connection instance
74
87
  def connection
75
88
  CryptKeeper::Connection.http_instance
76
89
  end
77
90
  end
78
91
 
92
+ # Bucket
79
93
  class Bucket < Utils
80
94
  attr_accessor :name, :created_at
81
95
 
@@ -86,14 +100,19 @@ module Buckets
86
100
  @created_at = options[:created_at]
87
101
  end
88
102
 
103
+ # Delete this bucket if it's empty
89
104
  def delete(options={})
90
105
  connection.delete("/", @name)
91
106
  end
92
107
 
93
- def update(*args)
108
+ #
109
+ #def update(*args)
94
110
 
95
- end
111
+ #end
96
112
 
113
+ # add an object to this bucket
114
+ # pass in a name, a File or IO object, it's content type and a hash
115
+ # containing additional headers (keys and values)
97
116
  def add_object(name, data, content_type='binary/octet-stream', *args)
98
117
  data.rewind
99
118
  additional_headers = {
@@ -105,6 +124,8 @@ module Buckets
105
124
  end
106
125
  end
107
126
 
127
+ # BucketMetaObject
128
+ # Contains information about an object
108
129
  class BucketMetaObject < Utils
109
130
  attr_accessor :properties,
110
131
  :key, :last_modified, :e_tag, :size, :storage_class,
@@ -123,16 +144,26 @@ module Buckets
123
144
  @owner_display_name = @properties[:owner_display_name]
124
145
  end
125
146
 
147
+ # When called, returns the previously set data of the object. If the object data
148
+ # hasn't been set, it will go fetch it from Google Storage and set it as an instance
149
+ # variable to be returned next time.
126
150
  def object
127
151
  @object ||= object!
128
152
  end
129
153
 
154
+ # Forces retrieval of the object data from Google Storage.
130
155
  def object!
131
156
  connection.get("/#{URI.escape(@key)}", @bucket_name)
132
157
  end
133
158
 
159
+ # Deletes the object from the bucket.
134
160
  def delete
135
161
  connection.delete("/#{URI.escape(@key)}", @bucket_name)
136
162
  end
163
+
164
+ def copy_to(bucket_name, path=nil)
165
+ path = path.nil? ? "/#{URI.escape(@key)}" : "/#{URI.escape(path)}"
166
+ connection.put(path, bucket_name, nil, {'x-goog-copy-source' => "#{@bucket_name}/#{URI.escape(@key)}"})
167
+ end
137
168
  end
138
169
  end
data/lib/crypt_keeper.rb CHANGED
@@ -4,7 +4,17 @@ require ck_path + '/crypt_keeper_http.rb'
4
4
  require 'uri'
5
5
 
6
6
  module CryptKeeper
7
- VERSION = "0.2.5"
7
+ VERSION = "0.2.6"
8
+
9
+ # :title: Connection
10
+ # Author:: Adam R. Medeiros (AKA: ScaryThings)
11
+ # License:: MIT Style
12
+
13
+ # Builds the connection to Google Storage with the credentials
14
+ # passed in.
15
+
16
+ # For example:
17
+ # keeper = CryptKeeper::Connection.new({:access_key => 'your_access_key', :secret_key => 'your_secret_key'})
8
18
  class Connection
9
19
  @@http_instance = nil
10
20
  def self.http_instance
@@ -48,10 +48,12 @@ class CryptKeeperHttp
48
48
 
49
49
  content_md5 = ''
50
50
  content_type = ''
51
+ x_headers = ''
51
52
 
52
53
  if !additional_headers.empty?
53
54
  additional_headers.each do |k, v|
54
55
  req.add_field(k, v)
56
+ x_headers << "#{k}:#{v}\n" if k[0..5] == "x-goog"
55
57
  if type==PUT
56
58
  case k
57
59
  when 'Content-MD5'
@@ -80,7 +82,7 @@ class CryptKeeperHttp
80
82
  req.add_field('Host', "#{bucket_name}#{@address}")
81
83
  req.add_field('Date', time)
82
84
  req.add_field('Content-length', content_length)
83
- sig = "#{type}\n#{content_md5}\n#{content_type}\n#{time}\n#{sig_path}"
85
+ sig = "#{type}\n#{content_md5}\n#{content_type}\n#{time}\n#{x_headers}#{sig_path}"
84
86
  req.add_field('Authorization', "#{@signature_id} #{@access_key}:#{signature(sig)}")
85
87
 
86
88
  res = http.request(req)
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 2
8
- - 5
9
- version: 0.2.5
8
+ - 6
9
+ version: 0.2.6
10
10
  platform: ruby
11
11
  authors:
12
12
  - Adam Medeiros
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-02-19 00:00:00 -08:00
17
+ date: 2011-02-20 00:00:00 -08:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency