curator 0.3.2 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,9 @@
1
+ module Curator::Memory
2
+ class Configuration
3
+ include Curator::Configuration
4
+
5
+ def data_store
6
+ Curator::Memory::DataStore
7
+ end
8
+ end
9
+ end
@@ -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
- attr_accessor :created_at, :updated_at
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 respond_to?("#{attribute}=")
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,11 @@
1
+ module Curator::Mongo
2
+ class Configuration
3
+ include Curator::Configuration
4
+
5
+ attr_accessor :database, :mongo_config_file
6
+
7
+ def data_store
8
+ Curator::Mongo::DataStore
9
+ end
10
+ end
11
+ 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
@@ -59,7 +59,7 @@ module Curator
59
59
  end
60
60
 
61
61
  def save(object)
62
- _update_timestamps(object)
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 = data_store.save(hash).key
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
- singleton_class.class_eval do
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
- object = deserialize(migrated_attributes)
112
- object.id = id
113
- object.created_at = Time.parse(attributes[:created_at]) if attributes[:created_at].present?
114
- object.updated_at = Time.parse(attributes[:updated_at]) if attributes[:updated_at].present?
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
- path = "curator/#{data_store.to_s}/configuration"
21
- @config = path.camelize.constantize.new
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.3.2
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-01 00:00:00.000000000 Z
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: &70151605211180 !ruby/object:Gem::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: *70151605211180
24
+ version_requirements: *70259654638820
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: activemodel
27
- requirement: &70151605210700 !ruby/object:Gem::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: *70151605210700
35
+ version_requirements: *70259654637640
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: json
38
- requirement: &70151605210300 !ruby/object:Gem::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: *70151605210300
46
+ version_requirements: *70259654636680
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: riak-client
49
- requirement: &70151605209760 !ruby/object:Gem::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: *70151605209760
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.10
99
+ rubygems_version: 1.8.11
96
100
  signing_key:
97
101
  specification_version: 3
98
102
  summary: Model and repository framework