couchrest_model 1.1.0.beta4 → 1.1.0.beta5

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/VERSION CHANGED
@@ -1 +1 @@
1
- 1.1.0.beta4
1
+ 1.1.0.beta5
@@ -6,7 +6,7 @@ Gem::Specification.new do |s|
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["J. Chris Anderson", "Matt Aimonetti", "Marcos Tapajos", "Will Leinweber", "Sam Lown"]
9
- s.date = %q{2011-01-16}
9
+ s.date = %q{2011-04-29}
10
10
  s.description = %q{CouchRest Model provides aditional features to the standard CouchRest Document class such as properties, view designs, associations, callbacks, typecasting and validations.}
11
11
  s.email = %q{jchris@apache.org}
12
12
  s.extra_rdoc_files = [
@@ -25,7 +25,7 @@ Gem::Specification.new do |s|
25
25
 
26
26
  s.add_dependency(%q<couchrest>, "1.1.0.pre2")
27
27
  s.add_dependency(%q<mime-types>, "~> 1.15")
28
- s.add_dependency(%q<activemodel>, "~> 3.0.5")
28
+ s.add_dependency(%q<activemodel>, "~> 3.0.0")
29
29
  s.add_dependency(%q<tzinfo>, "~> 0.3.22")
30
30
  s.add_dependency(%q<railties>, "~> 3.0.0")
31
31
  s.add_development_dependency(%q<rspec>, ">= 2.0.0")
@@ -1,4 +1,15 @@
1
- == 1.1.0.beta4
1
+ # CouchRest Model Change History
2
+
3
+ ## 1.1.0.beta5 - 2011-04-30
4
+
5
+ * Major changes:
6
+ * Database auto configuration, with connection options!
7
+ * Changed default CouchRest Model type to 'type' to be more consistent with ActiveRecord's reserverd words we're all used to (sorry for the change again!!)
8
+
9
+ * Minor changes
10
+ * Added filter option to designs (Used with CouchDB _changes feeds)
11
+
12
+ ## 1.1.0.beta4
2
13
 
3
14
  * Major changes:
4
15
  * Fast Dirty Tracking! Many thanks to @sobakasu (Andrew Williams)
@@ -10,11 +21,11 @@
10
21
  * Added "auto_update_design_doc" configuration option.
11
22
  * Using #descending on View object will automatically swap startkey with endkey.
12
23
 
13
- == 1.1.0.beta3
24
+ ## 1.1.0.beta3
14
25
 
15
26
  * Removed
16
27
 
17
- == 1.1.0.beta2
28
+ ## 1.1.0.beta2
18
29
 
19
30
  * Minor enhancements:
20
31
  * Time handling improved in accordance with CouchRest 1.1.0. Always set to UTC.
@@ -23,7 +34,7 @@
23
34
  * Unique Validation now supports scopes!
24
35
  * Added support for #keys with list on Design View.
25
36
 
26
- == 1.1.0.beta
37
+ ## 1.1.0.beta
27
38
 
28
39
  * Epic enhancements:
29
40
  * Added "View" object for dynamic view queries
@@ -37,7 +48,7 @@
37
48
  * Numeric types can be casted from strings with leading or trailing whitespace (thanks chrisdurtschi)
38
49
  * CollectionProxy no longer provided by default with simple views (pending deprication)
39
50
 
40
- == CouchRest Model 1.0.0
51
+ ## CouchRest Model 1.0.0
41
52
 
42
53
  * Major enhancements
43
54
  * Support for configuration module and "model_type_key" option for overriding model's type key
@@ -56,7 +67,7 @@ Notes:
56
67
  Until these have been resolved (if possible?!) they should not be included. See the
57
68
  'active_model_attrs' if you'd like to test.
58
69
 
59
- == CouchRest Model 1.0.0.beta8
70
+ ## CouchRest Model 1.0.0.beta8
60
71
 
61
72
  * Major enhancements
62
73
  * Added model generator
@@ -67,7 +78,7 @@ Notes:
67
78
  * Parsing times without zone
68
79
  * Using latest rspec (2.0.0.beta.19)
69
80
 
70
- == CouchRest Model 1.0.0.beta7
81
+ ## CouchRest Model 1.0.0.beta7
71
82
 
72
83
  * Major enhancements
73
84
  * Renamed ExtendedDocument to CouchRest::Model
@@ -83,7 +94,7 @@ Notes:
83
94
  * Removed support for auto_validate! and :length on properties
84
95
 
85
96
 
86
- == 1.0.0.beta6
97
+ ## 1.0.0.beta6
87
98
 
88
99
  * Major enhancements
89
100
  * Added support for anonymous CastedModels defined in Documents
@@ -97,12 +108,12 @@ Notes:
97
108
  * Setting a property of type Array (or keyed hash) must be an array or an error will be raised.
98
109
  * Now possible to set Array attribute from hash where keys determine order.
99
110
 
100
- == 1.0.0.beta5
111
+ ## 1.0.0.beta5
101
112
 
102
113
  * Minor enhancements
103
114
  * Added 'find' alias for 'get' for easier rails transition
104
115
 
105
- == 1.0.0.beta3
116
+ ## 1.0.0.beta3
106
117
 
107
118
  * Minor enhancements
108
119
  * Removed Validation by default, requires too many structure changes (FAIL)
@@ -112,12 +123,12 @@ Notes:
112
123
  * Added support for setting type directly on property (Sam Lown)
113
124
 
114
125
 
115
- == 1.0.0.beta2
126
+ ## 1.0.0.beta2
116
127
 
117
128
  * Minor enhancements
118
129
  * Enable Validation by default and refactored location (Sam Lown)
119
130
 
120
- == 1.0.0.beta
131
+ ## 1.0.0.beta
121
132
 
122
133
  * Major enhancements
123
134
  * Separated ExtendedDocument from main CouchRest gem (Sam Lown)
@@ -125,12 +136,12 @@ Notes:
125
136
  * Minor enhancements
126
137
  * active_support included by default
127
138
 
128
- == 0.37
139
+ ## 0.37
129
140
 
130
141
  * Minor enhancements
131
142
  * Added gemspec (needed for Bundler install) (Tapajós)
132
143
 
133
- == 0.36
144
+ ## 0.36
134
145
 
135
146
  * Major enhancements
136
147
  * Adds support for continuous replication (sauy7)
@@ -140,7 +151,7 @@ Notes:
140
151
  * Minor enhancements
141
152
  * Provide a description of the timeout error (John Wood)
142
153
 
143
- == 0.35
154
+ ## 0.35
144
155
 
145
156
  * Major enhancements
146
157
  * CouchRest::ExtendedDocument allow chaining the inherit class callback (Kenneth Kalmer) - http://github.com/couchrest/couchrest/issues#issue/8
@@ -156,7 +167,7 @@ Notes:
156
167
  * Added an update_doc method to database to handle conflicts during atomic updates. (Pierre Larochelle)
157
168
  * Bug fix: http://github.com/couchrest/couchrest/issues/#issue/2 (Luke Burton)
158
169
 
159
- == 0.34
170
+ ## 0.34
160
171
 
161
172
  * Major enhancements
162
173
 
@@ -181,7 +192,7 @@ Notes:
181
192
  * Fix Initialization of ExtendentDocument model shouldn't failed on a nil value in argument (deepj)
182
193
  * Change to use Jeweler and Gemcutter (Marcos Tapajós)
183
194
 
184
- == 0.33
195
+ ## 0.33
185
196
 
186
197
  * Major enhancements
187
198
 
@@ -196,7 +207,7 @@ Notes:
196
207
  * Created a new abstraction layer for the REST API (Matt Aimonetti)
197
208
  * Bug fix: made ExtendedDocument#all compatible with Couch 0.10 (tc)
198
209
 
199
- == 0.32
210
+ ## 0.32
200
211
 
201
212
  * Major enhancements
202
213
 
@@ -211,7 +222,7 @@ Notes:
211
222
  * Bug fix: the count method on the proxy collection was missing (Daniel Kirsch)
212
223
  * Added #amount_pages to a paginated collection. (Matt Aimonetti)
213
224
 
214
- == 0.31
225
+ ## 0.31
215
226
 
216
227
  * Major enhancements
217
228
 
@@ -225,7 +236,7 @@ Notes:
225
236
  * Optimized ExtendedDocument.count to run about 3x faster (Matt Aimonetti)
226
237
  * Added Float casting (Ryan Felton & Matt Aimonetti)
227
238
 
228
- == 0.30
239
+ ## 0.30
229
240
 
230
241
  * Major enhancements
231
242
 
@@ -5,9 +5,10 @@ module CouchRest
5
5
  extend ActiveModel::Naming
6
6
 
7
7
  include CouchRest::Model::Configuration
8
+ include CouchRest::Model::Connection
8
9
  include CouchRest::Model::Persistence
9
10
  include CouchRest::Model::Callbacks
10
- include CouchRest::Model::DocumentQueries
11
+ include CouchRest::Model::DocumentQueries
11
12
  include CouchRest::Model::Views
12
13
  include CouchRest::Model::DesignDoc
13
14
  include CouchRest::Model::ExtendedAttachments
@@ -11,11 +11,27 @@ module CouchRest
11
11
  add_config :model_type_key
12
12
  add_config :mass_assign_any_attribute
13
13
  add_config :auto_update_design_doc
14
+ add_config :environment
15
+ add_config :connection
16
+ add_config :connection_config_file
14
17
 
15
18
  configure do |config|
16
- config.model_type_key = 'model' # was 'couchrest-type'
19
+ config.model_type_key = 'type' # was 'couchrest-type'
17
20
  config.mass_assign_any_attribute = false
18
21
  config.auto_update_design_doc = true
22
+
23
+ config.environment = :development
24
+ config.connection_config_file = File.join(Dir.pwd, 'config', 'couchdb.yml')
25
+ config.connection = {
26
+ :protocol => 'http',
27
+ :host => 'localhost',
28
+ :port => '5984',
29
+ :prefix => 'couchrest',
30
+ :suffix => nil,
31
+ :join => '_',
32
+ :username => nil,
33
+ :password => nil
34
+ }
19
35
  end
20
36
  end
21
37
 
@@ -0,0 +1,70 @@
1
+ module CouchRest
2
+ module Model
3
+ module Connection
4
+ extend ActiveSupport::Concern
5
+
6
+ def server
7
+ self.class.server
8
+ end
9
+
10
+ module ClassMethods
11
+
12
+ # Overwrite the normal use_database method so that a database
13
+ # name can be provided instead of a full connection.
14
+ def use_database(db)
15
+ @database = prepare_database(db)
16
+ end
17
+
18
+ # Overwrite the default database method so that it always
19
+ # provides something from the configuration
20
+ def database
21
+ super || (@database ||= prepare_database)
22
+ end
23
+
24
+ def server
25
+ @server ||= CouchRest::Server.new(prepare_server_uri)
26
+ end
27
+
28
+ def prepare_database(db = nil)
29
+ unless db.is_a?(CouchRest::Database)
30
+ conf = connection_configuration
31
+ db = [conf[:prefix], db.to_s, conf[:suffix]].reject{|s| s.to_s.empty?}.join(conf[:join])
32
+ self.server.database!(db)
33
+ else
34
+ db
35
+ end
36
+ end
37
+
38
+ protected
39
+
40
+ def prepare_server_uri
41
+ conf = connection_configuration
42
+ userinfo = [conf[:username], conf[:password]].compact.join(':')
43
+ userinfo += '@' unless userinfo.empty?
44
+ "#{conf[:protocol]}://#{userinfo}#{conf[:host]}:#{conf[:port]}"
45
+ end
46
+
47
+ def connection_configuration
48
+ @connection_configuration ||=
49
+ self.connection.update(
50
+ (load_connection_config_file[environment.to_sym] || {}).symbolize_keys
51
+ )
52
+ end
53
+
54
+ def load_connection_config_file
55
+ file = connection_config_file
56
+ connection_config_cache[file] ||=
57
+ (File.exists?(file) ?
58
+ YAML::load(ERB.new(IO.read(file)).result) :
59
+ { }).symbolize_keys
60
+ end
61
+
62
+ def connection_config_cache
63
+ Thread.current[:connection_config_cache] ||= {}
64
+ end
65
+
66
+ end
67
+
68
+ end
69
+ end
70
+ end
@@ -65,6 +65,17 @@ module CouchRest
65
65
  create_view_method(name)
66
66
  end
67
67
 
68
+ # Really simple design function that allows a filter
69
+ # to be added. Filters are simple functions used when listening
70
+ # to the _changes feed.
71
+ #
72
+ # No methods are created here, the design is simply updated.
73
+ # See the CouchDB API for more information on how to use this.
74
+ def filter(name, function)
75
+ filters = (self.model.design_doc['filters'] ||= {})
76
+ filters[name.to_s] = function
77
+ end
78
+
68
79
  def create_view_method(name)
69
80
  model.class_eval <<-EOS, __FILE__, __LINE__ + 1
70
81
  def self.#{name}(opts = {})
@@ -89,7 +89,6 @@ module CouchRest
89
89
  self
90
90
  end
91
91
 
92
-
93
92
  protected
94
93
 
95
94
  def perform_validations(options = {})
@@ -140,7 +140,7 @@ module CouchRest
140
140
  module ClassMethods
141
141
 
142
142
  def property(name, *options, &block)
143
- raise "Invalid property definition, '#{name}' already used for CouchRest Model type field" if name.to_s == model_type_key.to_s
143
+ raise "Invalid property definition, '#{name}' already used for CouchRest Model type field" if name.to_s == model_type_key.to_s && CouchRest::Model::Base >= self
144
144
  opts = { }
145
145
  type = options.shift
146
146
  if type.class != Hash
@@ -4,8 +4,14 @@ module CouchRest
4
4
  module Proxyable
5
5
  extend ActiveSupport::Concern
6
6
 
7
+ def proxy_database
8
+ raise StandardError, "Please set the #proxy_database_method" if self.class.proxy_database_method.nil?
9
+ @proxy_database ||= self.class.prepare_database(self.send(self.class.proxy_database_method))
10
+ end
11
+
7
12
  module ClassMethods
8
13
 
14
+
9
15
  # Define a collection that will use the base model for the database connection
10
16
  # details.
11
17
  def proxy_for(assoc_name, options = {})
@@ -13,19 +19,19 @@ module CouchRest
13
19
  options[:class_name] ||= assoc_name.to_s.singularize.camelize
14
20
  class_eval <<-EOS, __FILE__, __LINE__ + 1
15
21
  def #{assoc_name}
16
- unless respond_to?('#{db_method}')
17
- raise "Missing ##{db_method} method for proxy"
18
- end
19
22
  @#{assoc_name} ||= CouchRest::Model::Proxyable::ModelProxy.new(::#{options[:class_name]}, self, self.class.to_s.underscore, #{db_method})
20
23
  end
21
24
  EOS
22
25
  end
23
26
 
27
+ # Tell this model which other model to use a base for the database
28
+ # connection to use.
24
29
  def proxied_by(model_name, options = {})
25
30
  raise "Model can only be proxied once or ##{model_name} already defined" if method_defined?(model_name) || !proxy_owner_method.nil?
26
31
  self.proxy_owner_method = model_name
27
32
  attr_accessor :model_proxy
28
33
  attr_accessor model_name
34
+ overwrite_database_reader(model_name)
29
35
  end
30
36
 
31
37
  # Define an a class variable accessor ready to be inherited and unique
@@ -34,6 +40,25 @@ module CouchRest
34
40
  def proxy_owner_method=(name); @proxy_owner_method = name; end
35
41
  def proxy_owner_method; @proxy_owner_method; end
36
42
 
43
+ # Define the name of a method to call to determine the name of
44
+ # the database to use as a proxy.
45
+ def proxy_database_method(name = nil)
46
+ @proxy_database_method = name if name
47
+ @proxy_database_method
48
+ end
49
+
50
+ private
51
+
52
+ # Ensure that no attempt is made to autoload a database connection
53
+ # by overwriting it to provide a basic accessor.
54
+ def overwrite_database_reader(model_name)
55
+ class_eval <<-EOS, __FILE__, __LINE__ + 1
56
+ def self.database
57
+ raise StandardError, "#{self.to_s} database must be accessed via '#{model_name}' proxy"
58
+ end
59
+ EOS
60
+ end
61
+
37
62
  end
38
63
 
39
64
  class ModelProxy
@@ -1,12 +1,21 @@
1
1
  require "rails"
2
2
  require "active_model/railtie"
3
3
 
4
- module CouchrestModel
4
+ module CouchRest
5
5
  # = Active Record Railtie
6
- class Railtie < Rails::Railtie
6
+ class ModelRailtie < Rails::Railtie
7
7
  config.generators.orm :couchrest_model
8
8
  config.generators.test_framework :test_unit, :fixture => false
9
+
10
+ initializer "couchrest_model.configure_default_connection" do
11
+ CouchRest::Model::Base.configure do |conf|
12
+ conf.environment = Rails.env
13
+ conf.connection_config_file = File.join(Rails.root, 'config', 'couchdb.yml')
14
+ conf.connection[:prefix] =
15
+ Rails.application.class.to_s.underscore.gsub(/\/.*/, '')
16
+ end
17
+ end
9
18
  end
10
-
19
+
11
20
  end
12
-
21
+
@@ -46,6 +46,7 @@ require "couchrest/model/proxyable"
46
46
  require "couchrest/model/collection"
47
47
  require "couchrest/model/associations"
48
48
  require "couchrest/model/configuration"
49
+ require "couchrest/model/connection"
49
50
  require "couchrest/model/designs"
50
51
  require "couchrest/model/designs/view"
51
52
 
@@ -61,4 +62,6 @@ require "couchrest/model/casted_model"
61
62
  require "couchrest/model/base"
62
63
  # Add rails support *after* everything has loaded
63
64
 
64
- require "couchrest/railtie"
65
+ if defined?(Rails)
66
+ require "couchrest/railtie"
67
+ end
@@ -59,7 +59,7 @@ describe CouchRest::Model::Base do
59
59
  describe "General examples" do
60
60
 
61
61
  before(:all) do
62
- @default_model_key = 'model'
62
+ @default_model_key = 'model-type'
63
63
  end
64
64
 
65
65