sdb_service 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.
@@ -0,0 +1,49 @@
|
|
1
|
+
module SdbService
|
2
|
+
class Serializer
|
3
|
+
|
4
|
+
def initialize(data)
|
5
|
+
@payload = data
|
6
|
+
@transformed_payload = nil
|
7
|
+
@valid = true
|
8
|
+
end
|
9
|
+
|
10
|
+
def serialize!
|
11
|
+
begin
|
12
|
+
@transformed_payload = serialize_payload(@payload)
|
13
|
+
@valid = true
|
14
|
+
rescue
|
15
|
+
@valid = false
|
16
|
+
@transformed_payload = @payload
|
17
|
+
end
|
18
|
+
return @transformed_payload
|
19
|
+
end
|
20
|
+
|
21
|
+
def deserialize!
|
22
|
+
begin
|
23
|
+
@transformed_payload = deserialize_payload(@payload)
|
24
|
+
rescue
|
25
|
+
@transformed_payload = @payload
|
26
|
+
end
|
27
|
+
return @transformed_payload
|
28
|
+
end
|
29
|
+
|
30
|
+
def valid?
|
31
|
+
@valid
|
32
|
+
end
|
33
|
+
|
34
|
+
def to_s
|
35
|
+
@transformed_payload
|
36
|
+
end
|
37
|
+
|
38
|
+
# these methods should be overriden by the strategy that subclasses the Serializer class.
|
39
|
+
|
40
|
+
def serialize_payload
|
41
|
+
raise "override me! -- #serialize_payload"
|
42
|
+
end
|
43
|
+
|
44
|
+
def deserialize_payload
|
45
|
+
raise "override me! -- #deserialize_payload"
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'sdb_service/serializer'
|
2
|
+
require 'json/pure'
|
3
|
+
|
4
|
+
module SdbService
|
5
|
+
class JsonSerializer < Serializer
|
6
|
+
|
7
|
+
def serialize_payload(payload)
|
8
|
+
JSON.generate(payload)
|
9
|
+
end
|
10
|
+
|
11
|
+
def deserialize_payload(payload)
|
12
|
+
JSON.parse(payload)
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'sdb_service/serializer'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
module SdbService
|
5
|
+
class YamlSerializer < Serializer
|
6
|
+
|
7
|
+
def serialize_payload(payload)
|
8
|
+
YAML.dump(payload)
|
9
|
+
end
|
10
|
+
|
11
|
+
def deserialize_payload(payload)
|
12
|
+
YAML.load(payload)
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,165 @@
|
|
1
|
+
require 'uuidtools'
|
2
|
+
require 'aws_sdb'
|
3
|
+
require 'sdb_service/support/constantizer'
|
4
|
+
|
5
|
+
module SdbService
|
6
|
+
|
7
|
+
class Service
|
8
|
+
|
9
|
+
include Constantizer
|
10
|
+
|
11
|
+
attr_reader :database # this is the name of the amazon SimpleDB domain.
|
12
|
+
attr_reader :serializer_format # this is a symbol representation of the serializer format.
|
13
|
+
|
14
|
+
# initialization has one required argument, and one optional argument.
|
15
|
+
# the first argument should be the name of the database on Amazon's SimpleDB servers.
|
16
|
+
# the secondary, optional argument, is the type of serialization strategy you'd like
|
17
|
+
# to use for this database.
|
18
|
+
def initialize(database, serializer = :json)
|
19
|
+
@serializer_format = serializer
|
20
|
+
load_serializer!(@serializer_format)
|
21
|
+
unless database.nil?
|
22
|
+
@database = database
|
23
|
+
self.class.create_database!(@database)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# This method just takes a ruby object, of any depth or complexity; anything you
|
28
|
+
# wish to send out to the Amazon SimpleDB service, can be sent there through this method.
|
29
|
+
# eg: SERV.put("some" => "data", "more_data" => { "here" => [1,2,3] })
|
30
|
+
#
|
31
|
+
# all data passed through the #put method is serialized into whatever format you constructed
|
32
|
+
# the data service to be aware of, however, you can pass a false in as the first argument of #put
|
33
|
+
# to have it ignore serialization entirely.
|
34
|
+
# eg: SERV.put(false, "some" => {"more" => [1,2,3]}) #=> { "some" => ["more123"]}
|
35
|
+
#
|
36
|
+
# put returns the unique identifier (UUID) of the object that was persisted into SimpleDB.
|
37
|
+
def put(*args)
|
38
|
+
data_payload, raw_payload = args
|
39
|
+
serializer_result = nil
|
40
|
+
if raw_payload.nil?
|
41
|
+
data = _parse(data_payload) do |value|
|
42
|
+
serializer_result = serializer.new(value)
|
43
|
+
serializer_result.serialize!.to_s
|
44
|
+
end
|
45
|
+
data["mime_type"] = "text/#{serializer_result.valid? ? self.serializer_format : "plain"}"
|
46
|
+
else
|
47
|
+
data = raw_payload
|
48
|
+
data["mime_type"] = "text/plain"
|
49
|
+
end
|
50
|
+
|
51
|
+
ident = self.class.generate_unique_identifier
|
52
|
+
data_store.put_attributes(self.database, ident, data)
|
53
|
+
return ident
|
54
|
+
end
|
55
|
+
|
56
|
+
# This method returns an object from Amazon SimpleDB based on its UUID identifier,
|
57
|
+
# and will also attempt to deserialize its various values from whatever serialization
|
58
|
+
# format you've specified when constructing the data service.
|
59
|
+
def get(id)
|
60
|
+
_parse(self.get!(id)) do |value|
|
61
|
+
serializer.new(value.first).deserialize!
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# This method returns an object from Amazon SimpleDB based on its UUID identifier,
|
66
|
+
# it returns the raw, unparsed data that sits at that key in the store.
|
67
|
+
def get!(id)
|
68
|
+
data_store.get_attributes(self.database, id)
|
69
|
+
end
|
70
|
+
|
71
|
+
# this method deletes an object from Amazon SimpleDB based on its UUID identifier.
|
72
|
+
def delete(id)
|
73
|
+
data_store.delete_attributes(self.database, id)
|
74
|
+
end
|
75
|
+
|
76
|
+
# this method allows you to query simple for raw information using its query language.
|
77
|
+
def query(statement)
|
78
|
+
data_store.query(self.database, statement)
|
79
|
+
end
|
80
|
+
|
81
|
+
# this method returns all of the UUIDS stored in Amazon SimpleDB for the current domain.
|
82
|
+
def all!
|
83
|
+
self.query("")
|
84
|
+
end
|
85
|
+
|
86
|
+
# this method returns all of the fully qualified, and deserialized objects stored in Amazon
|
87
|
+
# SimpleDB for the current domain.
|
88
|
+
def all
|
89
|
+
results = Hash.new
|
90
|
+
self.all![0].each do |item_name|
|
91
|
+
results[item_name] = self.get(item_name)
|
92
|
+
end
|
93
|
+
return results
|
94
|
+
end
|
95
|
+
|
96
|
+
# this method returns a list of all databases associated with this AWS account.
|
97
|
+
def self.all_databases
|
98
|
+
self.send(:data_store).list_domains[0]
|
99
|
+
end
|
100
|
+
|
101
|
+
# this method creates a new database associated with this AWS account, unless one with
|
102
|
+
# the same name already exists. returns true on success, false on failure.
|
103
|
+
def self.create_database!(database)
|
104
|
+
unless self.all_databases.include?(database)
|
105
|
+
self.send(:data_store).create_domain(database)
|
106
|
+
return true
|
107
|
+
else
|
108
|
+
return false
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
# this method destroys an existing database associated with this AWS account, unless one
|
113
|
+
# with the name specified does not exist. returns true on success, false on failure.
|
114
|
+
def self.destroy_database!(database)
|
115
|
+
if self.all_databases.include?(database)
|
116
|
+
self.send(:data_store).delete_domain(database)
|
117
|
+
return true
|
118
|
+
else
|
119
|
+
return false
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
# this method can be used to reset all the data stored in an Amazon SimpleDB database associated
|
124
|
+
# with the current AWS account.
|
125
|
+
def clear!
|
126
|
+
self.class.destroy_database!(self.database)
|
127
|
+
self.class.create_database!(self.database)
|
128
|
+
end
|
129
|
+
|
130
|
+
private
|
131
|
+
|
132
|
+
# simple method for associating and activiating a serializer strategy for an
|
133
|
+
# instance of this class.
|
134
|
+
def load_serializer!(serializer)
|
135
|
+
@serializer = constantize("#{serializer}_serializer", "lib/sdb_service/serializers")
|
136
|
+
end
|
137
|
+
|
138
|
+
# accessor for serializer
|
139
|
+
def serializer
|
140
|
+
@serializer
|
141
|
+
end
|
142
|
+
|
143
|
+
# simple strategy pattern that allows a block to have access to every value in a data hash
|
144
|
+
# returned from Amazon SimpleDB. Useful for serialization/deserialization.
|
145
|
+
def _parse(data, &block)
|
146
|
+
Hash[data.collect { |k,v| [k,block.call(v)] }]
|
147
|
+
end
|
148
|
+
|
149
|
+
# accessor for AWS/SDB data service.
|
150
|
+
def self.data_store
|
151
|
+
AwsSdb::Service.new(:logger => Logger.new("/dev/null"))
|
152
|
+
end
|
153
|
+
|
154
|
+
# instance accessor for AWS/SDB data service.
|
155
|
+
def data_store
|
156
|
+
@store ||= self.class.data_store
|
157
|
+
end
|
158
|
+
|
159
|
+
# this helper method generates a random UUID for SimpleDB objects.
|
160
|
+
def self.generate_unique_identifier
|
161
|
+
UUIDTools::UUID.random_create.to_s
|
162
|
+
end
|
163
|
+
|
164
|
+
end
|
165
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module SdbService
|
2
|
+
module Constantizer
|
3
|
+
|
4
|
+
# hackish helper method for properly casting a string to a constantized class.
|
5
|
+
def constantize(klass_name, load_path)
|
6
|
+
require "#{load_path}/#{klass_name}"
|
7
|
+
eval(klass_name.gsub(/^[a-z]|\s|_+[a-z]/) { |a| a.upcase }.gsub(/\s|_/, '')) rescue nil
|
8
|
+
end
|
9
|
+
|
10
|
+
end
|
11
|
+
end
|
data/sdb_service.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'sdb_service/service'
|
metadata
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sdb_service
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
version: 0.1.0
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Derek Perez
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-05-04 00:00:00 -07:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: uuidtools
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 2
|
29
|
+
- 1
|
30
|
+
- 1
|
31
|
+
version: 2.1.1
|
32
|
+
type: :runtime
|
33
|
+
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: json_pure
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 1
|
43
|
+
- 4
|
44
|
+
- 1
|
45
|
+
version: 1.4.1
|
46
|
+
type: :runtime
|
47
|
+
version_requirements: *id002
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: aws-sdb
|
50
|
+
prerelease: false
|
51
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
segments:
|
56
|
+
- 0
|
57
|
+
- 3
|
58
|
+
- 1
|
59
|
+
version: 0.3.1
|
60
|
+
type: :runtime
|
61
|
+
version_requirements: *id003
|
62
|
+
description: even simpler wrapper around aws_sdb, with builtin serialization.
|
63
|
+
email: derek@derekperez.com
|
64
|
+
executables: []
|
65
|
+
|
66
|
+
extensions: []
|
67
|
+
|
68
|
+
extra_rdoc_files: []
|
69
|
+
|
70
|
+
files:
|
71
|
+
- sdb_service.rb
|
72
|
+
- lib/sdb_service/serializer.rb
|
73
|
+
- lib/sdb_service/serializers/json_serializer.rb
|
74
|
+
- lib/sdb_service/serializers/yaml_serializer.rb
|
75
|
+
- lib/sdb_service/service.rb
|
76
|
+
- lib/sdb_service/support/constantizer.rb
|
77
|
+
has_rdoc: true
|
78
|
+
homepage: http://blog.derekperez.com/
|
79
|
+
licenses: []
|
80
|
+
|
81
|
+
post_install_message:
|
82
|
+
rdoc_options: []
|
83
|
+
|
84
|
+
require_paths:
|
85
|
+
- lib
|
86
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
segments:
|
91
|
+
- 0
|
92
|
+
version: "0"
|
93
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - ">="
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
segments:
|
98
|
+
- 0
|
99
|
+
version: "0"
|
100
|
+
requirements: []
|
101
|
+
|
102
|
+
rubyforge_project:
|
103
|
+
rubygems_version: 1.3.6
|
104
|
+
signing_key:
|
105
|
+
specification_version: 3
|
106
|
+
summary: even simpler wrapper around aws_sdb, with builtin serialization.
|
107
|
+
test_files: []
|
108
|
+
|