curator 0.10.0 → 0.11.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.
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: []