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
+