curator 0.3.2 → 0.4.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.
- 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
|