curator 0.10.0 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 37a4d7f18c7aa69e15d24937296c753cd601068a
4
+ data.tar.gz: a914c1ad69c6ec5b6035eb85e5736cc7a32f3ba2
5
+ SHA512:
6
+ metadata.gz: e15781810ecbf8b29894188a0962c0e17ed815a9e84abc9f6faad062e7ffd29e4c2d31f687724bc2c7b0a7f5b937eb8f2bd3fdd794e14272f2b5cdc771bccbcc
7
+ data.tar.gz: 334bd6659e11c125a6553f22bbdae0d7b788320dc7f84b70c32618bcc3a696809bfe76f9ac4c673b5fd580992dd742f5fccb5d4e0269dc7fc2d0b65df63dc187
data/lib/curator.rb CHANGED
@@ -12,6 +12,14 @@ module Curator
12
12
  attr_reader :config
13
13
  end
14
14
 
15
+ def self.repositories
16
+ @repositories ||= Set.new
17
+ end
18
+
19
+ def self.repositories=(repositories)
20
+ @repositories = repositories
21
+ end
22
+
15
23
  def self.configure(data_store, &block)
16
24
  configuration_path = "curator/#{data_store.to_s}/configuration"
17
25
  require configuration_path
@@ -3,6 +3,15 @@ require 'ostruct'
3
3
  module Curator
4
4
  module Memory
5
5
  class DataStore
6
+
7
+ def settings(bucket_name)
8
+ {}
9
+ end
10
+
11
+ def update_settings!(collection_name, updated_settings)
12
+ # NOOP
13
+ end
14
+
6
15
  def remove_all_keys
7
16
  @data = {}
8
17
  end
@@ -34,6 +34,14 @@ module Curator
34
34
  @client
35
35
  end
36
36
 
37
+ def settings(collection_name)
38
+ raise StandardError, "Not implemented yet"
39
+ end
40
+
41
+ def update_settings!(collection_name, updated_settings)
42
+ raise StandardError, "Not implemented yet"
43
+ end
44
+
37
45
  def remove_all_keys
38
46
  self.reset!
39
47
  end
@@ -8,5 +8,10 @@ module Curator
8
8
  config.riak_config_file = Rails.root.join('config', 'riak.yml')
9
9
  end
10
10
  end
11
+
12
+ rake_tasks do
13
+ tasks = Dir[File.join(File.dirname(__FILE__),'tasks/*.rake')]
14
+ tasks.each { |f| load f }
15
+ end
11
16
  end
12
17
  end
@@ -1,13 +1,22 @@
1
1
  require 'active_support/inflector'
2
2
  require 'active_support/core_ext/object/instance_variables'
3
3
  require 'active_support/core_ext/hash/indifferent_access'
4
+ require 'active_support/core_ext/module/delegation'
5
+ require 'curator/repository/settings'
4
6
  require 'json'
5
7
 
6
8
  module Curator
7
9
  module Repository
8
10
  extend ActiveSupport::Concern
9
11
 
12
+ def self.included(klass)
13
+ Curator.repositories << klass
14
+ end
15
+
10
16
  module ClassMethods
17
+ delegate :enable, :disable, :set, :to => :settings
18
+ delegate :uncommitted?, :to => :settings, :prefix => true
19
+
11
20
  def all
12
21
  data_store.find_all(collection_name).map do |result|
13
22
  _deserialize(result[:key], result[:data])
@@ -99,6 +108,15 @@ module Curator
99
108
  HashWithIndifferentAccess.new(object.instance_values)
100
109
  end
101
110
 
111
+ def settings
112
+ @settings ||= Settings.new(data_store.settings(collection_name))
113
+ end
114
+
115
+ def apply_settings!
116
+ settings.apply!(:data_store => data_store,
117
+ :collection_name => collection_name)
118
+ end
119
+
102
120
  def _build_finder_methods(attribute)
103
121
  eigenclass = class << self; self; end
104
122
  eigenclass.class_eval do
@@ -114,8 +132,8 @@ module Curator
114
132
  def _find_by_attribute(attribute, value)
115
133
  if results = data_store.find_by_attribute(collection_name, attribute, value)
116
134
  results.map do |hash|
117
- _deserialize(hash[:key], hash[:data])
118
- end
135
+ _deserialize(hash[:key], hash[:data]) if hash
136
+ end.compact
119
137
  end
120
138
  end
121
139
 
@@ -0,0 +1,50 @@
1
+ require 'curator/repository'
2
+ require 'active_support/core_ext/hash/indifferent_access'
3
+
4
+ module Curator
5
+ module Repository
6
+ class Settings
7
+ attr_reader :all, :changed
8
+ alias_method :to_hash, :all
9
+
10
+ def initialize(current_settings = {})
11
+ @all = HashWithIndifferentAccess.new(current_settings)
12
+ clear_dirty!
13
+ end
14
+
15
+ def set(property, value)
16
+ original_value = all[property]
17
+ unless value == original_value
18
+ all[property] = value
19
+ changed[property] = value
20
+ end
21
+ end
22
+
23
+ def enable(property)
24
+ set(property, true)
25
+ end
26
+
27
+ def disable(property)
28
+ set(property, false)
29
+ end
30
+
31
+ def [](property)
32
+ all[property]
33
+ end
34
+
35
+ def uncommitted?
36
+ changed.any?
37
+ end
38
+
39
+ def clear_dirty!
40
+ @changed = HashWithIndifferentAccess.new
41
+ end
42
+
43
+ def apply!(opts = {})
44
+ data_store = opts.fetch(:data_store)
45
+ collection_name = opts.fetch(:collection_name)
46
+ clear_dirty! if data_store.update_settings!(collection_name, changed)
47
+ end
48
+ end
49
+ end
50
+ end
@@ -26,13 +26,22 @@ module Curator
26
26
  client.ping
27
27
  end
28
28
 
29
+ def settings(bucket_name)
30
+ _bucket(bucket_name).props.dup.freeze
31
+ end
32
+
33
+ def update_settings!(bucket_name, updated_settings)
34
+ return true if updated_settings.empty?
35
+ _bucket(bucket_name).props = updated_settings
36
+ end
37
+
29
38
  def save(options)
30
39
  bucket = _bucket(options[:collection_name])
31
40
  object = ::Riak::RObject.new(bucket, options[:key])
32
41
  object.content_type = options.fetch(:content_type, "application/json")
33
42
  object.data = options[:value]
34
43
  options.fetch(:index, {}).each do |index_name, index_data|
35
- object.indexes["#{index_name}_bin"] << _normalized_index_data(index_data)
44
+ object.indexes["#{index_name}_bin"].merge(Array(index_data))
36
45
  end
37
46
  result = object.store
38
47
  result.key
@@ -48,7 +57,7 @@ module Curator
48
57
  begin
49
58
  object = bucket.get(key)
50
59
  { :key => object.key, :data => _deserialize(object.data) } unless object.data.empty?
51
- rescue ::Riak::HTTPFailedRequest => failed_request
60
+ rescue ::Riak::HTTPFailedRequest, ::Riak::ProtobuffsFailedRequest => failed_request
52
61
  raise failed_request unless failed_request.not_found?
53
62
  end
54
63
  end
@@ -60,7 +69,7 @@ module Curator
60
69
  begin
61
70
  keys = _find_key_by_index(bucket, index_name.to_s, query)
62
71
  keys.map { |key| find_by_key(bucket_name, key) }
63
- rescue ::Riak::HTTPFailedRequest => failed_request
72
+ rescue ::Riak::HTTPFailedRequest, ::Riak::ProtobuffsFailedRequest => failed_request
64
73
  raise failed_request unless failed_request.not_found?
65
74
  end
66
75
  end
@@ -83,14 +92,6 @@ module Curator
83
92
  def _find_key_by_index(bucket, index_name, query)
84
93
  bucket.get_index("#{index_name}_bin", query)
85
94
  end
86
-
87
- def _normalized_index_data(index_data)
88
- if index_data.is_a?(Array)
89
- index_data.join(", ")
90
- else
91
- index_data
92
- end
93
- end
94
95
  end
95
96
  end
96
97
  end
@@ -0,0 +1,62 @@
1
+ module Curator
2
+ class SettingsUpdater
3
+ attr_reader :repositories
4
+ attr_accessor :counter
5
+
6
+ def initialize(repositories = Curator.repositories, options = {})
7
+ @repositories = repositories
8
+ @verbose = options.fetch(:verbose, true)
9
+ @logger = options.fetch(:logger, STDOUT)
10
+ @counter = 0
11
+ end
12
+
13
+ def run!
14
+ announce "Preparing to apply settings to all repositories..."
15
+ repositories.each do |repository|
16
+ next unless repository.settings_uncommitted?
17
+ announce " * Updating settings for #{repository}...", :finish => false,
18
+ :header => false
19
+ if repository.apply_settings!
20
+ finish
21
+ else
22
+ finish "Failed."
23
+ end
24
+ self.counter += 1
25
+ end
26
+ complete!
27
+ end
28
+
29
+ private
30
+ attr_reader :logger
31
+
32
+ def complete!
33
+ if any_run?
34
+ announce "Done!"
35
+ else
36
+ announce "Nothing to do."
37
+ end
38
+ end
39
+
40
+ def announce(msg, options = {})
41
+ return unless verbose?
42
+ finish = options.fetch(:finish, true)
43
+ header = options.fetch(:header, true)
44
+ logger.write "[Curator] " if header
45
+ logger.write msg
46
+ logger.write "\n" if finish
47
+ end
48
+
49
+ def finish(msg = "Done!")
50
+ return unless verbose?
51
+ logger.write " #{msg}\n"
52
+ end
53
+
54
+ def verbose?
55
+ @verbose
56
+ end
57
+
58
+ def any_run?
59
+ counter > 0
60
+ end
61
+ end
62
+ end
metadata CHANGED
@@ -1,86 +1,78 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: curator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.0
5
- prerelease:
4
+ version: 0.11.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Braintree
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-04-10 00:00:00.000000000 Z
11
+ date: 2014-10-30 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: activesupport
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
19
  version: 3.0.0
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - ">="
28
25
  - !ruby/object:Gem::Version
29
26
  version: 3.0.0
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: activemodel
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - ">="
36
32
  - !ruby/object:Gem::Version
37
33
  version: 3.0.0
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - ">="
44
39
  - !ruby/object:Gem::Version
45
40
  version: 3.0.0
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: json
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - ">="
52
46
  - !ruby/object:Gem::Version
53
47
  version: '0'
54
48
  type: :runtime
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - ">="
60
53
  - !ruby/object:Gem::Version
61
54
  version: '0'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: riak-client
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ! '>='
59
+ - - "~>"
68
60
  - !ruby/object:Gem::Version
69
- version: 1.0.0
61
+ version: 1.4.3
70
62
  type: :runtime
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ! '>='
66
+ - - "~>"
76
67
  - !ruby/object:Gem::Version
77
- version: 1.0.0
68
+ version: 1.4.3
78
69
  description: Model and repository framework
79
70
  email: code@getbraintree.com
80
71
  executables: []
81
72
  extensions: []
82
73
  extra_rdoc_files: []
83
74
  files:
75
+ - lib/curator.rb
84
76
  - lib/curator/configuration.rb
85
77
  - lib/curator/memory/configuration.rb
86
78
  - lib/curator/memory/data_store.rb
@@ -91,43 +83,38 @@ files:
91
83
  - lib/curator/mongo/data_store.rb
92
84
  - lib/curator/railtie.rb
93
85
  - lib/curator/repository.rb
86
+ - lib/curator/repository/settings.rb
94
87
  - lib/curator/resettable_riak/configuration.rb
95
88
  - lib/curator/resettable_riak/data_store.rb
96
89
  - lib/curator/riak/configuration.rb
97
90
  - lib/curator/riak/data_store.rb
98
- - lib/curator.rb
91
+ - lib/curator/settings_updater.rb
99
92
  - lib/rails/generators/curator/model/model_generator.rb
100
93
  - lib/rails/generators/curator/model/templates/model.rb
101
94
  - lib/rails/generators/curator/repository/repository_generator.rb
102
95
  - lib/rails/generators/curator/repository/templates/repository.rb
103
96
  homepage: http://github.com/braintree/curator
104
- licenses: []
97
+ licenses:
98
+ - MIT
99
+ metadata: {}
105
100
  post_install_message:
106
101
  rdoc_options: []
107
102
  require_paths:
108
103
  - lib
109
104
  required_ruby_version: !ruby/object:Gem::Requirement
110
- none: false
111
105
  requirements:
112
- - - ! '>='
106
+ - - ">="
113
107
  - !ruby/object:Gem::Version
114
108
  version: '0'
115
- segments:
116
- - 0
117
- hash: 12316657956024539
118
109
  required_rubygems_version: !ruby/object:Gem::Requirement
119
- none: false
120
110
  requirements:
121
- - - ! '>='
111
+ - - ">="
122
112
  - !ruby/object:Gem::Version
123
113
  version: '0'
124
- segments:
125
- - 0
126
- hash: 12316657956024539
127
114
  requirements: []
128
115
  rubyforge_project:
129
- rubygems_version: 1.8.25
116
+ rubygems_version: 2.2.1
130
117
  signing_key:
131
- specification_version: 3
118
+ specification_version: 4
132
119
  summary: Model and repository framework
133
120
  test_files: []