curator 0.3.2 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/curator/memory/configuration.rb +9 -0
- data/lib/curator/memory/data_store.rb +100 -0
- data/lib/curator/model.rb +10 -2
- data/lib/curator/mongo/configuration.rb +11 -0
- data/lib/curator/mongo/data_store.rb +76 -0
- data/lib/curator/repository.rb +8 -8
- data/lib/curator/riak/data_store.rb +1 -1
- data/lib/curator.rb +4 -6
- metadata +15 -11
@@ -0,0 +1,100 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
|
3
|
+
module Curator
|
4
|
+
module Memory
|
5
|
+
class DataStore
|
6
|
+
def self.remove_all_keys
|
7
|
+
@data = {}
|
8
|
+
end
|
9
|
+
class << self
|
10
|
+
alias :reset! :remove_all_keys
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.save(options)
|
14
|
+
bucket = _bucket_name(options[:collection_name])
|
15
|
+
object = options[:value]
|
16
|
+
key = options[:key]
|
17
|
+
indexed_values = options.fetch(:index, {})
|
18
|
+
|
19
|
+
key = _generate_key(bucket) unless key
|
20
|
+
|
21
|
+
_records(bucket).store(key, object)
|
22
|
+
indexed_values.each do |index_name, indexed_value|
|
23
|
+
index = _index(bucket, index_name)
|
24
|
+
index[indexed_value] ||= []
|
25
|
+
index[indexed_value] << key unless index[indexed_value].include?(key)
|
26
|
+
end
|
27
|
+
|
28
|
+
OpenStruct.new(:key => key)
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.delete(collection_name, key)
|
32
|
+
bucket = _bucket_name(collection_name)
|
33
|
+
_records(bucket).delete(key)
|
34
|
+
_indices(bucket).each_key do |name|
|
35
|
+
index = _index(bucket, name)
|
36
|
+
index.each do |value, keys|
|
37
|
+
next unless keys.include?(key)
|
38
|
+
index[value].delete(key)
|
39
|
+
end
|
40
|
+
index.delete_if { |value, keys| keys.empty? }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.find_by_key(collection_name, key)
|
45
|
+
bucket = _bucket_name(collection_name)
|
46
|
+
value = _records(bucket).fetch(key, nil)
|
47
|
+
return if value.nil?
|
48
|
+
{:key => key, :data => value}
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.find_by_index(collection_name, index_name, query)
|
52
|
+
return [] if query.nil?
|
53
|
+
bucket = _bucket_name(collection_name)
|
54
|
+
index = _index(bucket, index_name)
|
55
|
+
keys = case query
|
56
|
+
when Range
|
57
|
+
keys = index.keys.select do |key|
|
58
|
+
key.between?(query.first, query.last)
|
59
|
+
end
|
60
|
+
index.values_at(*keys).flatten
|
61
|
+
else
|
62
|
+
index.fetch(query, [])
|
63
|
+
end
|
64
|
+
keys.map do |key|
|
65
|
+
find_by_key(collection_name, key)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def self._data
|
70
|
+
@data ||= {}
|
71
|
+
end
|
72
|
+
|
73
|
+
def self._bucket(bucket)
|
74
|
+
_data[bucket] ||= {}
|
75
|
+
end
|
76
|
+
|
77
|
+
def self._records(bucket)
|
78
|
+
_bucket(bucket)[:records] ||= {}
|
79
|
+
end
|
80
|
+
|
81
|
+
def self._indices(bucket)
|
82
|
+
_bucket(bucket)[:indices] ||= {}
|
83
|
+
end
|
84
|
+
|
85
|
+
def self._index(bucket, index_name)
|
86
|
+
_indices(bucket)[index_name] ||= {}
|
87
|
+
end
|
88
|
+
|
89
|
+
def self._generate_key(bucket)
|
90
|
+
keys = _records(bucket).keys
|
91
|
+
keys = [0] if keys.empty?
|
92
|
+
keys.max.next
|
93
|
+
end
|
94
|
+
|
95
|
+
def self._bucket_name(name)
|
96
|
+
"#{Curator.config.environment}:#{name}"
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
data/lib/curator/model.rb
CHANGED
@@ -7,13 +7,15 @@ module Curator
|
|
7
7
|
include ActiveModel::Conversion
|
8
8
|
|
9
9
|
included do
|
10
|
-
|
10
|
+
attr_reader :created_at, :updated_at
|
11
11
|
attr_writer :version
|
12
12
|
end
|
13
13
|
|
14
14
|
def initialize(args = {})
|
15
|
+
method_strings = methods.map(&:to_s)
|
15
16
|
args.each do |attribute, value|
|
16
|
-
send("#{attribute}=", value) if
|
17
|
+
send("#{attribute}=", value) if method_strings.include?("#{attribute}=")
|
18
|
+
instance_variable_set("@#{attribute}", value) if method_strings.include?(attribute.to_s)
|
17
19
|
end
|
18
20
|
end
|
19
21
|
|
@@ -21,6 +23,12 @@ module Curator
|
|
21
23
|
id.present?
|
22
24
|
end
|
23
25
|
|
26
|
+
def touch
|
27
|
+
now = Time.now.utc
|
28
|
+
@created_at = now if @created_at.nil?
|
29
|
+
@updated_at = now
|
30
|
+
end
|
31
|
+
|
24
32
|
def version
|
25
33
|
@version || self.class.version
|
26
34
|
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'mongo'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
module Curator
|
5
|
+
module Mongo
|
6
|
+
class DataStore
|
7
|
+
def self.client
|
8
|
+
return @client if @client
|
9
|
+
config = YAML.load(File.read(Curator.config.mongo_config_file))[Curator.config.environment]
|
10
|
+
host = config.delete(:host)
|
11
|
+
port = config.delete(:port)
|
12
|
+
@client = ::Mongo::Connection.new(host, port, config)
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.remove_all_keys
|
16
|
+
self.reset!
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.reset!
|
20
|
+
_db.collections.each {|coll| coll.drop unless coll.name =~ /system/ }
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.save(options)
|
24
|
+
collection = _collection options[:collection_name]
|
25
|
+
key = options.delete(:key)
|
26
|
+
document = options[:value]
|
27
|
+
document.merge!({:_id => key}) unless key.nil?
|
28
|
+
options.fetch(:index, {}).each do |index_name, index_value|
|
29
|
+
collection.ensure_index index_name
|
30
|
+
end
|
31
|
+
object_id = collection.save document
|
32
|
+
Hash[:key => object_id]
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.delete(collection_name, id)
|
36
|
+
collection = _collection(collection_name)
|
37
|
+
collection.remove(:_id => id)
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.find_by_index(collection_name, field, query)
|
41
|
+
return [] if query.nil?
|
42
|
+
|
43
|
+
collection = _collection(collection_name)
|
44
|
+
documents = collection.find(field.to_sym => query)
|
45
|
+
documents.map {|doc| normalize_document(doc) }
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.find_by_key(collection_name, id)
|
49
|
+
collection = _collection(collection_name)
|
50
|
+
document = collection.find_one({:_id => id})
|
51
|
+
normalize_document(document) unless document.nil?
|
52
|
+
end
|
53
|
+
|
54
|
+
def self._collection(name)
|
55
|
+
_db.collection(name)
|
56
|
+
end
|
57
|
+
|
58
|
+
def self._collection_name(name)
|
59
|
+
_db.collection(name).name
|
60
|
+
end
|
61
|
+
|
62
|
+
def self._db
|
63
|
+
client.db(_db_name)
|
64
|
+
end
|
65
|
+
|
66
|
+
def self._db_name
|
67
|
+
"#{Curator.config.database}:#{Curator.config.environment}"
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.normalize_document(doc)
|
71
|
+
key = doc.delete '_id'
|
72
|
+
Hash[:key => key, :data => doc]
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
data/lib/curator/repository.rb
CHANGED
@@ -59,7 +59,7 @@ module Curator
|
|
59
59
|
end
|
60
60
|
|
61
61
|
def save(object)
|
62
|
-
|
62
|
+
object.touch
|
63
63
|
save_without_timestamps(object)
|
64
64
|
end
|
65
65
|
|
@@ -74,7 +74,7 @@ module Curator
|
|
74
74
|
hash[:key] = object.id
|
75
75
|
data_store.save(hash)
|
76
76
|
else
|
77
|
-
object.id
|
77
|
+
object.instance_variable_set("@id", data_store.save(hash).key)
|
78
78
|
end
|
79
79
|
end
|
80
80
|
|
@@ -83,7 +83,8 @@ module Curator
|
|
83
83
|
end
|
84
84
|
|
85
85
|
def _build_finder_methods(field_name)
|
86
|
-
|
86
|
+
eigenclass = class << self; self; end
|
87
|
+
eigenclass.class_eval do
|
87
88
|
define_method("find_by_#{field_name}") do |value|
|
88
89
|
_find_by_index(collection_name, field_name, value)
|
89
90
|
end
|
@@ -108,11 +109,10 @@ module Curator
|
|
108
109
|
def _deserialize(id, data)
|
109
110
|
attributes = data.with_indifferent_access
|
110
111
|
migrated_attributes = migrator.migrate(attributes)
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
object
|
112
|
+
migrated_attributes[:id] = id
|
113
|
+
migrated_attributes[:created_at] = Time.parse(migrated_attributes[:created_at]) if migrated_attributes[:created_at]
|
114
|
+
migrated_attributes[:updated_at] = Time.parse(migrated_attributes[:updated_at]) if migrated_attributes[:updated_at]
|
115
|
+
deserialize(migrated_attributes)
|
116
116
|
end
|
117
117
|
|
118
118
|
def _format_time_for_index(time)
|
@@ -23,7 +23,7 @@ module Curator
|
|
23
23
|
def self.save(options)
|
24
24
|
bucket = _bucket(options[:collection_name])
|
25
25
|
object = ::Riak::RObject.new(bucket, options[:key])
|
26
|
-
object.content_type = "application/json"
|
26
|
+
object.content_type = options.fetch(:content_type, "application/json")
|
27
27
|
object.data = options[:value]
|
28
28
|
options.fetch(:index, {}).each do |index_name, index_value|
|
29
29
|
object.indexes["#{index_name}_bin"] << index_value
|
data/lib/curator.rb
CHANGED
@@ -5,10 +5,6 @@ require 'curator/migrator'
|
|
5
5
|
require 'curator/model'
|
6
6
|
require 'curator/repository'
|
7
7
|
require 'curator/configuration'
|
8
|
-
require 'curator/riak/configuration'
|
9
|
-
require 'curator/riak/data_store'
|
10
|
-
require 'curator/resettable_riak/configuration'
|
11
|
-
require 'curator/resettable_riak/data_store'
|
12
8
|
require 'curator/railtie' if defined?(Rails)
|
13
9
|
|
14
10
|
module Curator
|
@@ -17,8 +13,10 @@ module Curator
|
|
17
13
|
end
|
18
14
|
|
19
15
|
def self.configure(data_store, &block)
|
20
|
-
|
21
|
-
|
16
|
+
configuration_path = "curator/#{data_store.to_s}/configuration"
|
17
|
+
require configuration_path
|
18
|
+
require "curator/#{data_store}/data_store"
|
19
|
+
@config = configuration_path.camelize.constantize.new
|
22
20
|
yield(@config) if block_given?
|
23
21
|
end
|
24
22
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: curator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-03-
|
12
|
+
date: 2012-03-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
16
|
-
requirement: &
|
16
|
+
requirement: &70259654638820 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 3.0.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70259654638820
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: activemodel
|
27
|
-
requirement: &
|
27
|
+
requirement: &70259654637640 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 3.0.0
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70259654637640
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: json
|
38
|
-
requirement: &
|
38
|
+
requirement: &70259654636680 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70259654636680
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: riak-client
|
49
|
-
requirement: &
|
49
|
+
requirement: &70259654634820 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,7 +54,7 @@ dependencies:
|
|
54
54
|
version: 1.0.0
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70259654634820
|
58
58
|
description: Model and repository framework
|
59
59
|
email: code@getbraintree.com
|
60
60
|
executables: []
|
@@ -62,9 +62,13 @@ extensions: []
|
|
62
62
|
extra_rdoc_files: []
|
63
63
|
files:
|
64
64
|
- lib/curator/configuration.rb
|
65
|
+
- lib/curator/memory/configuration.rb
|
66
|
+
- lib/curator/memory/data_store.rb
|
65
67
|
- lib/curator/migration.rb
|
66
68
|
- lib/curator/migrator.rb
|
67
69
|
- lib/curator/model.rb
|
70
|
+
- lib/curator/mongo/configuration.rb
|
71
|
+
- lib/curator/mongo/data_store.rb
|
68
72
|
- lib/curator/railtie.rb
|
69
73
|
- lib/curator/repository.rb
|
70
74
|
- lib/curator/resettable_riak/configuration.rb
|
@@ -92,7 +96,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
92
96
|
version: '0'
|
93
97
|
requirements: []
|
94
98
|
rubyforge_project:
|
95
|
-
rubygems_version: 1.8.
|
99
|
+
rubygems_version: 1.8.11
|
96
100
|
signing_key:
|
97
101
|
specification_version: 3
|
98
102
|
summary: Model and repository framework
|