snapshot-ruby 0.1
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.md +66 -0
- data/lib/snapshot/connection.rb +40 -0
- data/lib/snapshot/image.rb +115 -0
- data/lib/snapshot/url.rb +22 -0
- data/lib/snapshot/version.rb +3 -0
- data/lib/snapshot.rb +71 -0
- metadata +129 -0
data/README.md
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
Snapshot
|
2
|
+
========
|
3
|
+
|
4
|
+
The Snapshot gem provides an nice, ActiveRecord-ish interface to the
|
5
|
+
[Snapshot](http://snapshothq.com/) API.
|
6
|
+
|
7
|
+
* [Fork the code on Github](https://github.com/jeremyboles/snapshot-ruby)
|
8
|
+
|
9
|
+
Installation
|
10
|
+
------------
|
11
|
+
|
12
|
+
gem install snapshot-ruby
|
13
|
+
|
14
|
+
Using the gem
|
15
|
+
-------------
|
16
|
+
|
17
|
+
require 'rubygems'
|
18
|
+
require 'snapshot'
|
19
|
+
|
20
|
+
### Connecting the Client ###
|
21
|
+
|
22
|
+
Snapshot.configure do |config|
|
23
|
+
config.domain = 'yourdomain.snapshothq.com'
|
24
|
+
config.access_key = 'your access key'
|
25
|
+
config.secret_key = 'your secret key'
|
26
|
+
end
|
27
|
+
|
28
|
+
# or with a hash
|
29
|
+
Snapshot.configure({:access_key => ...})
|
30
|
+
|
31
|
+
### Typical Usage ###
|
32
|
+
|
33
|
+
The API for the gem was modeled after ActiveRecord to make it easy to pick up.
|
34
|
+
Uploading a video to Snapshot is done with via the `create` method:
|
35
|
+
|
36
|
+
img = Snapshot::Image.create('example.jpg')
|
37
|
+
# => #<Snapshot::Image:0x00000100a51080>
|
38
|
+
|
39
|
+
img.id
|
40
|
+
# => 'adf4675e46a6078c1bbc6a663a47e1e56e4622e5'
|
41
|
+
|
42
|
+
img.created_at
|
43
|
+
# => 2011-01-13 15:30:34 -0600
|
44
|
+
|
45
|
+
img.format
|
46
|
+
# => "JPEG"
|
47
|
+
|
48
|
+
img.width
|
49
|
+
# => 720
|
50
|
+
|
51
|
+
img.height
|
52
|
+
# => 640
|
53
|
+
|
54
|
+
Once and image has been uploaded, you can reference and process the image based on its `id`:
|
55
|
+
|
56
|
+
img = Snapshot::Image.find('adf4675e46a6078c1bbc6a663a47e1e56e4622e5')
|
57
|
+
# => #<Snapshot::Image:0x000001008a3df0>
|
58
|
+
|
59
|
+
img = Snapshot::Image.find('wrong id')
|
60
|
+
# => nil
|
61
|
+
|
62
|
+
To delete an image, call its `destroy` method:
|
63
|
+
|
64
|
+
img.destroy
|
65
|
+
# => true
|
66
|
+
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'uri'
|
2
|
+
|
3
|
+
module Snapshot
|
4
|
+
class Connection
|
5
|
+
attr_accessor :access_key, :domain, :secret_key
|
6
|
+
|
7
|
+
# Creates a new Connection object.
|
8
|
+
#
|
9
|
+
# ==== Parameters
|
10
|
+
#
|
11
|
+
# * +opts+ - (optional) String or Hash
|
12
|
+
#
|
13
|
+
def initialize(opts={})
|
14
|
+
if opts.is_a?(Hash)
|
15
|
+
opts.each do |m,v|
|
16
|
+
self.send("#{m}=", v)
|
17
|
+
end
|
18
|
+
else
|
19
|
+
uri = URI.parse(opts)
|
20
|
+
self.access_key, self.domain, self.secret_key = uri.user, uri.host, uri.password
|
21
|
+
self.domain << ":#{uri.port}" unless uri.port == 80
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Returns an authenticated RestClient::Resource
|
26
|
+
#
|
27
|
+
def resource
|
28
|
+
@resource ||= RestClient::Resource.new(self.url, {
|
29
|
+
:user => self.access_key,
|
30
|
+
:password => self.secret_key
|
31
|
+
})
|
32
|
+
end
|
33
|
+
|
34
|
+
# Returns a URL to Snapshot for the connection
|
35
|
+
#
|
36
|
+
def url
|
37
|
+
"http://#{domain}/"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'rest_client'
|
3
|
+
|
4
|
+
module Snapshot
|
5
|
+
class Image
|
6
|
+
attr_accessor :created_at, :filesize, :format, :height, :id, :width
|
7
|
+
|
8
|
+
class << self
|
9
|
+
# Uploads a file to the connected Snapshot account.
|
10
|
+
#
|
11
|
+
# ==== Parameters
|
12
|
+
#
|
13
|
+
# * +file+ - File or path to a file
|
14
|
+
#
|
15
|
+
# ==== Examples
|
16
|
+
#
|
17
|
+
# # With a path:
|
18
|
+
# img = Snapshot::Image.create('example.jpg')
|
19
|
+
#
|
20
|
+
# # With a file:
|
21
|
+
# file = File.open('example.jpg')
|
22
|
+
# img = Snapshot::Image.create(file)
|
23
|
+
#
|
24
|
+
def create(file)
|
25
|
+
file = File.open(file) if file.is_a?(String)
|
26
|
+
result = Snapshot.connection.resource.post(:file => file)
|
27
|
+
info = JSON.parse(result)['file']
|
28
|
+
|
29
|
+
self.new.tap do |img|
|
30
|
+
img.created_at = Time.at(info['uploaded_at'].to_i)
|
31
|
+
img.filesize = info['size'].to_i
|
32
|
+
img.format = info['type']
|
33
|
+
img.height = info['height'].to_i
|
34
|
+
img.id = info['id']
|
35
|
+
img.width = info['width'].to_i
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# Deletes a file from Snapshot.
|
40
|
+
#
|
41
|
+
# ==== Parameters
|
42
|
+
#
|
43
|
+
# * +id+ - The ID of the image
|
44
|
+
#
|
45
|
+
# ==== Examples
|
46
|
+
#
|
47
|
+
# Snapshot::Image.destroy('a45af9b9e6ebab9c685faef4e72e7a14f3e24e1a')
|
48
|
+
#
|
49
|
+
def destroy(id)
|
50
|
+
find(id).destroy
|
51
|
+
end
|
52
|
+
|
53
|
+
# Finds a file on the connected Snapshot account.
|
54
|
+
#
|
55
|
+
# ==== Parameters
|
56
|
+
#
|
57
|
+
# * +id+ - The ID of the image
|
58
|
+
#
|
59
|
+
# ==== Examples
|
60
|
+
#
|
61
|
+
# Snapshot::Image.find('a45af9b9e6ebab9c685faef4e72e7a14f3e24e1a')
|
62
|
+
#
|
63
|
+
def find(id)
|
64
|
+
result = Snapshot.connection.resource["#{id}"].get
|
65
|
+
info = JSON.parse(result)
|
66
|
+
|
67
|
+
self.new.tap do |img|
|
68
|
+
img.created_at = Time.at(info['uploaded_at'].to_i)
|
69
|
+
img.filesize = info['size'].to_i
|
70
|
+
img.format = info['type']
|
71
|
+
img.height = info['height'].to_i
|
72
|
+
img.id = info['id']
|
73
|
+
img.width = info['width'].to_i
|
74
|
+
end
|
75
|
+
rescue RestClient::ResourceNotFound
|
76
|
+
nil
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
# Removes the image from the connect Snapshot account
|
81
|
+
#
|
82
|
+
# ==== Examples
|
83
|
+
#
|
84
|
+
# img = Snapshot::Image.find('a45af9b9e6ebab9c685faef4e72e7a14f3e24e1a')
|
85
|
+
# img.destroy
|
86
|
+
#
|
87
|
+
def destroy
|
88
|
+
Snapshot.connection.resource["#{id}"].delete
|
89
|
+
true
|
90
|
+
rescue RestClient::ResourceNotFound
|
91
|
+
nil
|
92
|
+
end
|
93
|
+
|
94
|
+
# Return the URL of the image
|
95
|
+
#
|
96
|
+
# ==== Examples
|
97
|
+
#
|
98
|
+
# img = Snapshot::Image.find('a45af9b9e6ebab9c685faef4e72e7a14f3e24e1a')
|
99
|
+
# img.url # => http://subdomain.snapshothq.com/a45af9b9e6ebab9c685faef4e72e7a14f3e24e1a.jpg
|
100
|
+
#
|
101
|
+
def url(&block)
|
102
|
+
Snapshot::URL.new(id, extension, &block)
|
103
|
+
end
|
104
|
+
|
105
|
+
private
|
106
|
+
|
107
|
+
def extension
|
108
|
+
case self.format
|
109
|
+
when 'JPEG' then '.jpg'
|
110
|
+
when 'PNG' then '.png'
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
115
|
+
end
|
data/lib/snapshot/url.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
module Snapshot
|
2
|
+
class URL
|
3
|
+
attr_reader :extension, :id
|
4
|
+
|
5
|
+
def initialize(id, extension, &block)
|
6
|
+
@id = id
|
7
|
+
@extension = extension
|
8
|
+
@options = []
|
9
|
+
tap(&block) if block_given?
|
10
|
+
end
|
11
|
+
|
12
|
+
def method_missing(process, *options)
|
13
|
+
@options << [process.to_s, options]
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_s
|
17
|
+
@options = @options.flatten
|
18
|
+
@options << '' unless @options.empty?
|
19
|
+
Snapshot.connection.url << @options.join('/') << id << '.' << extension
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/snapshot.rb
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'snapshot/connection'
|
2
|
+
require 'snapshot/image'
|
3
|
+
require 'snapshot/url'
|
4
|
+
require 'snapshot/version'
|
5
|
+
|
6
|
+
module Snapshot
|
7
|
+
extend self
|
8
|
+
|
9
|
+
# Configures and connects to Snapshot.
|
10
|
+
#
|
11
|
+
# ==== Parameters
|
12
|
+
#
|
13
|
+
# * +opts+ - String or Hash
|
14
|
+
# * +block+ - The block is optional and is passed a Connection object
|
15
|
+
#
|
16
|
+
# ==== Examples
|
17
|
+
#
|
18
|
+
# # Using a String:
|
19
|
+
# Snapshot.configure('http://access_key:secret_ket@subdomain.snapshothq.com/')
|
20
|
+
#
|
21
|
+
# # Using a Hash:
|
22
|
+
# Snapshot.configure(:access_key => 'access_key', :domain => 'subdomain.snapshothq.com', :secret_key => 'secret_key')
|
23
|
+
#
|
24
|
+
# # Using a block:
|
25
|
+
# Snapshot.configure do |config|
|
26
|
+
# config.access_key = 'access_key'
|
27
|
+
# config.domain = 'subdomain.snapshothq.com'
|
28
|
+
# config.secret_key = 'secret_key
|
29
|
+
# end
|
30
|
+
#
|
31
|
+
def configure(opts={})
|
32
|
+
if opts
|
33
|
+
connect!(opts)
|
34
|
+
else
|
35
|
+
yield @connection = Connection.new
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# Connects the library to Snapshot. If no connection options are given, the
|
40
|
+
# method will try to use the environment variable <code>SNAPSHOT_URL</code>.
|
41
|
+
#
|
42
|
+
# ==== Parameters
|
43
|
+
#
|
44
|
+
# * +opts+ - (optional) String or Hash
|
45
|
+
#
|
46
|
+
# ==== Examples
|
47
|
+
#
|
48
|
+
# # Using a String:
|
49
|
+
# Snapshot.connect!('http://access_key:secret_ket@subdomain.snapshothq.com/')
|
50
|
+
#
|
51
|
+
# # Using a Hash:
|
52
|
+
# Snapshot.connect!(:access_key => 'access_key', :domain => 'subdomain.snapshothq.com', :secret_key => 'secret_key')
|
53
|
+
#
|
54
|
+
def connect!(opts=nil)
|
55
|
+
opts = ENV['SNAPSHOT_URL'] if opts.nil?
|
56
|
+
@connection = Connection.new(opts)
|
57
|
+
end
|
58
|
+
|
59
|
+
# Returns the connection for the library. Will raise an error if the
|
60
|
+
# library has not been connected via the <code>connect!</code> method
|
61
|
+
#
|
62
|
+
def connection
|
63
|
+
raise 'Not connected. Please connect! first.' unless @connection
|
64
|
+
@connection
|
65
|
+
end
|
66
|
+
|
67
|
+
# Terminates the connection to Snapshot
|
68
|
+
def disconnect!
|
69
|
+
@connection = nil
|
70
|
+
end
|
71
|
+
end
|
metadata
ADDED
@@ -0,0 +1,129 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: snapshot-ruby
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 1
|
8
|
+
version: "0.1"
|
9
|
+
platform: ruby
|
10
|
+
authors:
|
11
|
+
- Jeremy Boles
|
12
|
+
autorequire:
|
13
|
+
bindir: bin
|
14
|
+
cert_chain: []
|
15
|
+
|
16
|
+
date: 2011-01-31 00:00:00 -06:00
|
17
|
+
default_executable:
|
18
|
+
dependencies:
|
19
|
+
- !ruby/object:Gem::Dependency
|
20
|
+
name: json
|
21
|
+
prerelease: false
|
22
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
23
|
+
none: false
|
24
|
+
requirements:
|
25
|
+
- - "="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 1
|
29
|
+
- 4
|
30
|
+
- 6
|
31
|
+
version: 1.4.6
|
32
|
+
type: :runtime
|
33
|
+
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: rest-client
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
+
none: false
|
39
|
+
requirements:
|
40
|
+
- - "="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
segments:
|
43
|
+
- 1
|
44
|
+
- 6
|
45
|
+
- 1
|
46
|
+
version: 1.6.1
|
47
|
+
type: :runtime
|
48
|
+
version_requirements: *id002
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
name: fakeweb
|
51
|
+
prerelease: false
|
52
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - "="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
segments:
|
58
|
+
- 1
|
59
|
+
- 3
|
60
|
+
version: "1.3"
|
61
|
+
type: :development
|
62
|
+
version_requirements: *id003
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: rspec
|
65
|
+
prerelease: false
|
66
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
68
|
+
requirements:
|
69
|
+
- - "="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
segments:
|
72
|
+
- 2
|
73
|
+
- 4
|
74
|
+
- 0
|
75
|
+
version: 2.4.0
|
76
|
+
type: :development
|
77
|
+
version_requirements: *id004
|
78
|
+
description: Snap is a very simple image storage and processing services for developers.
|
79
|
+
email:
|
80
|
+
- jeremy@jeremyboles.com
|
81
|
+
executables: []
|
82
|
+
|
83
|
+
extensions: []
|
84
|
+
|
85
|
+
extra_rdoc_files: []
|
86
|
+
|
87
|
+
files:
|
88
|
+
- lib/snapshot/connection.rb
|
89
|
+
- lib/snapshot/image.rb
|
90
|
+
- lib/snapshot/url.rb
|
91
|
+
- lib/snapshot/version.rb
|
92
|
+
- lib/snapshot.rb
|
93
|
+
- README.md
|
94
|
+
has_rdoc: true
|
95
|
+
homepage: https://github.com/jeremyboles/snapshot-ruby
|
96
|
+
licenses: []
|
97
|
+
|
98
|
+
post_install_message:
|
99
|
+
rdoc_options: []
|
100
|
+
|
101
|
+
require_paths:
|
102
|
+
- lib
|
103
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
104
|
+
none: false
|
105
|
+
requirements:
|
106
|
+
- - ">="
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
segments:
|
109
|
+
- 0
|
110
|
+
version: "0"
|
111
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
112
|
+
none: false
|
113
|
+
requirements:
|
114
|
+
- - ">="
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
segments:
|
117
|
+
- 1
|
118
|
+
- 3
|
119
|
+
- 7
|
120
|
+
version: 1.3.7
|
121
|
+
requirements: []
|
122
|
+
|
123
|
+
rubyforge_project: snapshot-ruby
|
124
|
+
rubygems_version: 1.3.7
|
125
|
+
signing_key:
|
126
|
+
specification_version: 3
|
127
|
+
summary: Ruby wrapper for storing and manipulating images via Snapshot.
|
128
|
+
test_files: []
|
129
|
+
|