devise_couch 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,19 @@
1
+ source 'http://rubygems.org'
2
+
3
+ #gem 'rails', '3.0.0.rc'
4
+ gem 'rails', :git => 'git://github.com/rails/rails.git'
5
+
6
+ gem 'warden'
7
+ gem 'devise', :git => 'git://github.com/plataformatec/devise.git'
8
+
9
+ gem 'couchrest'
10
+ gem 'couchrest_extended_document'
11
+ gem 'couchrest_model'
12
+
13
+ gem 'oauth2'
14
+
15
+ gem 'rails3-generators', :git => 'git://github.com/shenoudab/rails3-generators.git'
16
+
17
+ gem 'webrat', '0.7.0'
18
+ gem 'mocha', :require => false
19
+ gem 'bcrypt-ruby', :require => 'bcrypt'
data/Gemfile.lock ADDED
@@ -0,0 +1,128 @@
1
+ GIT
2
+ remote: git://github.com/plataformatec/devise.git
3
+ revision: 701bbf2
4
+ specs:
5
+ devise (1.2.0)
6
+ bcrypt-ruby (~> 2.1.2)
7
+ warden (~> 0.10.7)
8
+
9
+ GIT
10
+ remote: git://github.com/rails/rails.git
11
+ revision: 2a98480
12
+ specs:
13
+ actionmailer (3.0.0.rc)
14
+ actionpack (= 3.0.0.rc)
15
+ mail (~> 2.2.5)
16
+ actionpack (3.0.0.rc)
17
+ activemodel (= 3.0.0.rc)
18
+ activesupport (= 3.0.0.rc)
19
+ builder (~> 2.1.2)
20
+ erubis (~> 2.6.6)
21
+ i18n (~> 0.4.1)
22
+ rack (~> 1.2.1)
23
+ rack-mount (~> 0.6.9)
24
+ rack-test (~> 0.5.4)
25
+ tzinfo (~> 0.3.22)
26
+ activemodel (3.0.0.rc)
27
+ activesupport (= 3.0.0.rc)
28
+ builder (~> 2.1.2)
29
+ i18n (~> 0.4.1)
30
+ activerecord (3.0.0.rc)
31
+ activemodel (= 3.0.0.rc)
32
+ activesupport (= 3.0.0.rc)
33
+ arel (~> 0.4.0)
34
+ tzinfo (~> 0.3.22)
35
+ activeresource (3.0.0.rc)
36
+ activemodel (= 3.0.0.rc)
37
+ activesupport (= 3.0.0.rc)
38
+ activesupport (3.0.0.rc)
39
+ rails (3.0.0.rc)
40
+ actionmailer (= 3.0.0.rc)
41
+ actionpack (= 3.0.0.rc)
42
+ activerecord (= 3.0.0.rc)
43
+ activeresource (= 3.0.0.rc)
44
+ activesupport (= 3.0.0.rc)
45
+ bundler (>= 1.0.0.rc.2)
46
+ railties (= 3.0.0.rc)
47
+ railties (3.0.0.rc)
48
+ actionpack (= 3.0.0.rc)
49
+ activesupport (= 3.0.0.rc)
50
+ rake (>= 0.8.3)
51
+ thor (~> 0.14.0)
52
+
53
+ GEM
54
+ remote: http://rubygems.org/
55
+ specs:
56
+ abstract (1.0.0)
57
+ addressable (2.2.0)
58
+ arel (0.4.0)
59
+ activesupport (>= 3.0.0.beta)
60
+ bcrypt-ruby (2.1.2)
61
+ builder (2.1.2)
62
+ couchrest (1.0.0)
63
+ json (= 1.2.4)
64
+ mime-types (>= 1.15)
65
+ rest-client (>= 0.5)
66
+ couchrest_extended_document (1.0.0)
67
+ activesupport (>= 2.3.0)
68
+ builder (>= 2.1.2)
69
+ couchrest (>= 1.0.0)
70
+ mime-types (>= 1.15)
71
+ couchrest_model (1.0.0.beta7)
72
+ activemodel (>= 3.0.0.beta4)
73
+ activesupport (>= 2.3.5)
74
+ couchrest (>= 1.0.0.beta)
75
+ mime-types (>= 1.15)
76
+ erubis (2.6.6)
77
+ abstract (>= 1.0.0)
78
+ faraday (0.4.6)
79
+ addressable (>= 2.1.1)
80
+ rack (>= 1.0.1)
81
+ i18n (0.4.1)
82
+ json (1.2.4)
83
+ mail (2.2.5)
84
+ activesupport (>= 2.3.6)
85
+ mime-types
86
+ treetop (>= 1.4.5)
87
+ mime-types (1.16)
88
+ mocha (0.9.8)
89
+ rake
90
+ multi_json (0.0.4)
91
+ nokogiri (1.4.3.1)
92
+ oauth2 (0.0.10)
93
+ faraday (~> 0.4.1)
94
+ multi_json (>= 0.0.4)
95
+ polyglot (0.3.1)
96
+ rack (1.2.1)
97
+ rack-mount (0.6.9)
98
+ rack (>= 1.0.0)
99
+ rack-test (0.5.4)
100
+ rack (>= 1.0)
101
+ rake (0.8.7)
102
+ rest-client (1.6.0)
103
+ mime-types (>= 1.16)
104
+ thor (0.14.0)
105
+ treetop (1.4.8)
106
+ polyglot (>= 0.3.1)
107
+ tzinfo (0.3.22)
108
+ warden (0.10.7)
109
+ rack (>= 1.0.0)
110
+ webrat (0.7.0)
111
+ nokogiri (>= 1.2.0)
112
+ rack (>= 1.0)
113
+ rack-test (>= 0.5.3)
114
+
115
+ PLATFORMS
116
+ ruby
117
+
118
+ DEPENDENCIES
119
+ bcrypt-ruby
120
+ couchrest
121
+ couchrest_extended_document
122
+ couchrest_model
123
+ devise!
124
+ mocha
125
+ oauth2
126
+ rails!
127
+ warden
128
+ webrat (= 0.7.0)
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2010 YOURNAME
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.markdown ADDED
@@ -0,0 +1,86 @@
1
+ # DeviseCouch for Devise and CouchrestModel
2
+
3
+ *devise_couch* will let you use [devise](http://github.com/plataformatec/devise) with [CocuhrestModel](http://github.com/couchrest/couchrest_model).
4
+
5
+ *devise_couch* is intended for use with *Rails 3* and *Devise 1.1.1*. It may work with earlier versions of devise, but it's not been tested.
6
+
7
+ This README only covers *devise_couch* specifics. Make sure to read the [devise README](http://github.com/plataformatec/devise/blob/master/README.rdoc)
8
+
9
+ ## Usage options
10
+
11
+ The gem gives you the options of 2 ORM setups depending on what library you wish to use for validations:
12
+
13
+ * *couchrest_model* - Uses CocuhrestModel validations
14
+ * *couchrest_model_active_model* - Uses ActiveModel::Validations
15
+
16
+ The advantage to this is ActiveModel's I18n support for error messages, and it uses the same validations lib as devise does by default.
17
+
18
+ ## ActiveModel compatibility
19
+
20
+ Currently only the <code>couchrest_model</code> option has been tested.
21
+ There should be full ActiveModel support in a future version of CocuhrestModel, after Rails 3 is released.
22
+ ActiveModel support will likely be part of *CocuhrestModel 1.0* (as mentioned by jnunemaker in a post).
23
+
24
+ ## Installation
25
+
26
+ Add *devise*, *devise_couch* and *couchrest_model* gems to your Gemfile (your Rails app Gemfile). The following gems are required
27
+
28
+ <pre>
29
+ gem 'couchrest'
30
+ gem 'couchrest_extended_document'
31
+ gem 'couchrest_model'
32
+ gem 'devise'
33
+ gem 'devise_couch'
34
+ gem 'rails3-generators', :git => 'git://github.com/shenoudab/rails3-generators.git'
35
+ </pre>
36
+
37
+ <pre>gem install rails3-generators</pre>
38
+
39
+ Alternatively use bundler to install all required gems in your Rails 3 app
40
+
41
+ <pre>bundle install</pre>
42
+
43
+ Run the generator:
44
+
45
+ <pre>rails generate devise:install</pre>
46
+
47
+ The generator will install an initializer which describes ALL Devise's
48
+ configuration options and you MUST take a look at it. Make sure to specify
49
+ either <code>mongo_mapper</code> or <code>mongo_mapper_active_model</code> (ActiveModel::Validations)
50
+ as the orm in the configuration file.
51
+
52
+ To add Devise to any of your models using the generator:
53
+
54
+ <pre>rails generate couchrest_model:devise MODEL</pre>
55
+
56
+ Example: create a User model for use with Devise
57
+
58
+ <pre>rails generate couchrest_model:devise User</pre>
59
+
60
+ Read the README for devise at [devise README](http://github.com/plataformatec/devise/blob/master/README.rdoc)
61
+
62
+ ## Note on Patches/Pull Requests
63
+
64
+ * Fork the project.
65
+ * Make your feature addition or bug fix.
66
+ * Add tests for it. This is important so I don't break it in a
67
+ future version unintentionally.
68
+ * Commit, do not mess with rakefile, version, or history.
69
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
70
+ * Send me a pull request. Bonus points for topic branches.
71
+
72
+ ## Thanks
73
+
74
+ *Kristian Mandrup* - - Created the mm-devise gem which was used as a template for the development of this gem.
75
+ Also made suggestions for a few critical fixes and improvements in the code. Thanks :)
76
+
77
+ *Jared Morgan* - Created the dm-devise gem which was used as a template for the development of this gem.
78
+ Also made suggestions for a few critical fixes and improvements in the code. Thanks :)
79
+
80
+ ## Bugs and Feedback
81
+
82
+ For *devise_couch* specific issues, please create an issue on GitHub at: [devise_couch issues](http://github.com/shenoudab/devise_couch/issues)
83
+
84
+ ## Copyright
85
+
86
+ Copyright (c) 2010 Shenouda Bertel MobiThought. See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1,60 @@
1
+ # encoding: UTF-8
2
+ require 'rake'
3
+ require 'rake/rdoctask'
4
+ require 'rake/gempackagetask'
5
+ require 'rake/testtask'
6
+ require File.join(File.dirname(__FILE__), 'lib', 'devise_couch', 'version')
7
+
8
+ desc 'Default: run tests for all CouchDB ORM setups.'
9
+ task :default => :pre_commit
10
+
11
+ desc 'Run Devise tests for all CouchDB ORM setups.'
12
+ task :pre_commit do
13
+ Dir[File.join(File.dirname(__FILE__), 'test', 'orm', '*.rb')].each do |file|
14
+ orm = File.basename(file).split(".").first
15
+ ENV['DEVISE_PATH'] ||= File.expand_path('../devise')
16
+ system "rake test DEVISE_ORM=#{orm} DEVISE_PATH=#{ENV['DEVISE_PATH']}"
17
+ end
18
+ end
19
+
20
+ desc 'Run Devise tests using CouchDB. Specify path to devise with DEVISE_PATH'
21
+ Rake::TestTask.new(:test) do |test|
22
+ ENV['DEVISE_ORM'] ||= 'couchrest_model'
23
+ ENV['DEVISE_PATH'] ||= File.expand_path('./')
24
+ unless File.exist?(ENV['DEVISE_PATH'])
25
+ puts "Specify the path to devise (e.g. rake DEVISE_PATH=/path/to/devise). Not found at #{ENV['DEVISE_PATH']}"
26
+ exit
27
+ end
28
+ test.libs << 'lib' << 'test'
29
+ test.libs << "#{ENV['DEVISE_PATH']}/lib"
30
+ test.libs << "#{ENV['DEVISE_PATH']}/test"
31
+ test.test_files = FileList["#{ENV['DEVISE_PATH']}/test/**/*_test.rb"] + FileList['test/**/*_test.rb']
32
+ test.verbose = true
33
+ end
34
+
35
+ Rake::RDocTask.new(:rdoc) do |rdoc|
36
+ rdoc.rdoc_dir = 'rdoc'
37
+ rdoc.title = 'DeviseCouch'
38
+ rdoc.options << '--line-numbers' << '--inline-source'
39
+ rdoc.rdoc_files.include('README.rdoc')
40
+ rdoc.rdoc_files.include('lib/**/*.rb')
41
+ end
42
+
43
+ spec = Gem::Specification.new do |s|
44
+ s.name = "devise_couch"
45
+ s.summary = "CouchDB integration for Devise framework."
46
+ s.description = "CouchDB integration for Devise framework."
47
+ s.files = FileList["[A-Z]*", "{app,config,lib}/**/*"]
48
+ s.version = CouchrestModel::Devise::VERSION.dup
49
+ s.email = "sbertel@mobithought.com"
50
+ s.homepage = "http://github.com/shenoudab/devise_couch"
51
+ s.author = 'Shenouda Bertel'
52
+ end
53
+
54
+ Rake::GemPackageTask.new(spec) do |pkg|
55
+ end
56
+
57
+ desc "Install the gem #{spec.name}-#{spec.version}.gem"
58
+ task :install do
59
+ system("gem install pkg/#{spec.name}-#{spec.version}.gem --no-ri --no-rdoc")
60
+ end
@@ -0,0 +1,89 @@
1
+ module Devise
2
+ module Orm
3
+ module CouchrestModel
4
+ module Compatibility
5
+ extend ActiveSupport::Concern
6
+
7
+ extend ActiveSupport::Concern
8
+ extend ActiveModel::Naming
9
+
10
+ include ActiveModel::Serializers::Xml
11
+ include ActiveModel::Serializers::JSON
12
+
13
+ def to_xml(options = {}, &block)
14
+ options[:except] ||= []
15
+ options[:except] << :_id
16
+
17
+ super options do |b|
18
+ b.id self.id
19
+ block.call(b) if block_given?
20
+ end
21
+ end
22
+
23
+
24
+ module ClassMethods
25
+ # Hooks for confirmable
26
+ def before_create(*args)
27
+ wrap_hook(:before, :create, *args)
28
+ end
29
+
30
+ def after_create(*args)
31
+ wrap_hook(:after, :create, *args)
32
+ end
33
+
34
+ def before_save(*args)
35
+ wrap_hook(:before, :save, *args)
36
+ end
37
+
38
+ def wrap_hook(action, method, *args)
39
+ options = args.extract_options!
40
+
41
+ args.each do |callback|
42
+ callback_method = :"#{callback}_callback_wrap"
43
+ send action, method, callback_method
44
+ class_eval <<-METHOD, __FILE__, __LINE__ + 1
45
+ def #{callback_method}
46
+ #{callback} if #{options[:if] || true}
47
+ end
48
+ METHOD
49
+ end
50
+ end
51
+
52
+ # Add ActiveRecord like finder
53
+ def find(*args)
54
+ case args.first
55
+ when :first, :all
56
+ send(args.shift, *args)
57
+ else
58
+ where(:'_id' => args.first).first
59
+ end
60
+ end
61
+ end
62
+
63
+ # def changed?
64
+ # dirty?
65
+ # end
66
+
67
+ def save(options=nil)
68
+ if options.is_a?(Hash) && options[:validate] == false
69
+ save!
70
+ else
71
+ super()
72
+ end
73
+ end
74
+
75
+ def update_attribute(name, value)
76
+ update_attributes(name => value)
77
+ end
78
+ #
79
+ # def update_attributes(*args)
80
+ # update(*args)
81
+ # end
82
+
83
+ def invalid?
84
+ !valid?
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,88 @@
1
+ module Validatable
2
+ # Monkey-patch Validatable::Errors to support generation of error message from a Symbol.
3
+ class Errors
4
+ @@default_error_messages = {}
5
+
6
+ # Holds a hash with all the default error messages that can be replaced by your own copy or localizations.
7
+ def self.default_error_messages=(default_error_messages)
8
+ @@default_error_messages = default_error_messages
9
+ end
10
+
11
+ def self.default_error_message(key, field, *values)
12
+ field = field.to_s.humanize
13
+ @@default_error_messages[key] % [field, *values].flatten
14
+ end
15
+
16
+ # original add before monkey-patch
17
+ # def add(attribute, message) #:nodoc:
18
+ # errors[attribute.to_sym] = [] if errors[attribute.to_sym].nil?
19
+ # errors[attribute.to_sym] << message
20
+ # end
21
+
22
+ alias_method :original_add, :add
23
+
24
+ # If the message is a Symbol, allow +default_error_message+ to generate
25
+ # the message, including translation.
26
+ def add(field_name, message)
27
+ if message.kind_of?(Symbol)
28
+ message = self.class.default_error_message(message, field_name)
29
+ end
30
+ fld_name = field_name.to_sym
31
+ errors[fld_name] = [] if errors[fld_name].nil?
32
+ original_add(fld_name, message) unless errors[fld_name].include?(message)
33
+ end
34
+ end
35
+ end
36
+
37
+ module Validatable
38
+ class ValidatesPresenceOf < ValidationBase #:nodoc:
39
+ def message(instance)
40
+ super || "can't be blank"
41
+ end
42
+ end
43
+ end
44
+
45
+ module Validatable
46
+ class ValidatesLengthOf < ValidationBase #:nodoc:
47
+ def message(instance)
48
+ min = !within.nil? ? within.first : minimum
49
+ max = !within.nil? ? within.last : maximum
50
+ super || "must be between #{min} and #{max} characters long"
51
+ end
52
+ end
53
+ end
54
+
55
+
56
+ # Default error messages consistent with ActiveModel messages and devise
57
+ # expectations.
58
+ Validatable::Errors.default_error_messages = {
59
+ :absent => 'must be absent',
60
+ :inclusion => 'is not included in the list',
61
+ :exclusion => 'is reserved',
62
+ :invalid => 'is invalid',
63
+ :confirmation => " doesn't match confirmation",
64
+ :accepted => 'must be accepted',
65
+ :nil => 'must not be nil',
66
+ :empty => "can't be empty",
67
+ :blank => "can't be blank",
68
+ :length_between => 'must be between %s and %s characters long',
69
+ :too_long => 'is too long (maximum is %s characters)',
70
+ :too_short => 'is too short (minimum is %s characters)',
71
+ :wrong_length => 'is the wrong length (should be %s characters)',
72
+ :taken => 'has already been taken',
73
+ :not_a_number => 'is not a number',
74
+ :not_an_integer => 'must be an integer',
75
+ :greater_than => 'must be greater than %s',
76
+ :greater_than_or_equal_to => 'must be greater than or equal to ',
77
+ :equal_to => 'must be equal to %s',
78
+ :not_equal_to => 'must not be equal to %s',
79
+ :less_than => 'must be less than %s',
80
+ :less_than_or_equal_to => 'must be less than or equal to %s',
81
+ :value_between => 'must be between %s and %s',
82
+ :odd => 'must be odd',
83
+ :even => 'must be even',
84
+ :primitive => 'must be of type %s',
85
+ :not_found => 'not found',
86
+ :already_confirmed => 'was already confirmed',
87
+ :not_locked => 'was not locked'
88
+ }
@@ -0,0 +1,14 @@
1
+ class Date
2
+ unless method_defined?(:gmtime)
3
+ delegate :gmtime, :to => :to_time
4
+ end
5
+
6
+ def utc
7
+ Time.zone.parse("#{hour.to_i - zone.to_i}:#{min}:#{sec}")
8
+ # self.to_datetime.new_offset(0)
9
+ end
10
+
11
+ def to_i
12
+ to_time.utc.to_i
13
+ end
14
+ end
@@ -0,0 +1,85 @@
1
+ module CouchrestModel
2
+ class ValidationUtil
3
+ class << self
4
+ attr_accessor :counter
5
+
6
+ def inc_counter
7
+ @counter ||= 0
8
+ @counter += 1
9
+ end
10
+ end
11
+ end
12
+ end
13
+ module Devise
14
+ module Orm
15
+ module CouchrestModel
16
+ module Schema
17
+ include Devise::Schema
18
+
19
+ SCHEMA_OPTIONS = {
20
+ :null => :required,
21
+ :limit => :length
22
+ }
23
+
24
+ # Tell how to apply schema methods. This automatically maps :limit to
25
+ # :length and :null to :required.
26
+ def apply_devise_schema(name, type, options={})
27
+ SCHEMA_OPTIONS.each do |old_key, new_key|
28
+ next unless options.key?(old_key)
29
+ if :null == old_key
30
+ # :required is opposite of :null
31
+ options[new_key] = !options.delete(old_key)
32
+ else
33
+ options[new_key] = options.delete(old_key)
34
+ end
35
+ end
36
+
37
+ options.delete(:default) if options[:default].nil?
38
+ required_option = options.delete(:required)
39
+ length_option = options.delete(:length)
40
+
41
+ type = Time if type == DateTime
42
+
43
+ key name, type, options
44
+
45
+ counter = ::CouchrestModel::ValidationUtil.inc_counter
46
+
47
+ handle_email(name, counter) if name == :email
48
+ handle_length(name, counter, length_option) if length_option
49
+ handle_required(name, counter) if required_option
50
+ end
51
+
52
+ protected
53
+
54
+ def make_key prefix, name, counter
55
+ "#{prefix}_#{name}_#{counter}"
56
+ end
57
+
58
+ def handle_required name, counter
59
+ key = make_key :presence, name, counter
60
+ validates_presence_of name.to_sym, :key => key
61
+ end
62
+
63
+ def handle_email name, counter
64
+ key = make_key :unique, name, counter
65
+ validates_uniqueness_of name.to_sym, :key => key
66
+ end
67
+
68
+ def handle_length name, counter, length_option
69
+ key = make_key :length, name, counter
70
+ options = case length_option
71
+ when Fixnum
72
+ {:maximum => length_option}
73
+ when Hash
74
+ length_option
75
+ else
76
+ raise ArgumentError, "length validation option must be either a Fixnum or Hash"
77
+ end
78
+ options[:key] = key
79
+
80
+ validates_length_of name.to_sym, options
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,40 @@
1
+ require "couchrest/model/base"
2
+
3
+ module Devise
4
+ module Orm
5
+ module CouchrestModel
6
+ module Hook
7
+ def devise_modules_hook!
8
+ extend Schema
9
+ #Include Compatibility
10
+ yield
11
+ return unless Devise.apply_schema
12
+ devise_modules.each { |m| send(m) if respond_to?(m, true) }
13
+ end
14
+ end #Hook
15
+ module Schema
16
+ include Devise::Schema
17
+ # Tell how to apply schema methods.
18
+ def apply_schema(name, type, options={})
19
+ return unless Devise.apply_schema
20
+ property name, :type => type
21
+ end
22
+ end #Module Schema
23
+ end #CouchRest
24
+ end #Orm
25
+ end #Devise
26
+
27
+ #CouchRest::Model::Base.send(:extend, Devise::Models)
28
+ #CouchRest::Model::Base.send(:include, Devise::Models)
29
+
30
+ #CouchRest::Model::Base.append_extensions(Devise::Models)
31
+ #CouchRest::Model::Base.append_extensions(Devise::Orm::CouchrestModel::Hook)
32
+
33
+ module CouchRest
34
+ module Model
35
+ class Base
36
+ extend ::Devise::Models
37
+ extend ::Devise::Orm::CouchrestModel::Hook
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,72 @@
1
+ require 'devise/orm/couchrest_model/compatibility'
2
+ require 'devise/orm/couchrest_model/schema'
3
+ require 'devise/orm/couchrest_model/date_time'
4
+
5
+ module Devise
6
+ module Orm
7
+ module CouchrestModel
8
+ module Hook
9
+ def devise_modules_hook!
10
+ extend Schema
11
+ include ActiveModel::Validations
12
+ include ActiveModelCompatibility
13
+ include Compatibility
14
+ class << self; attr_reader :descendants; end;
15
+
16
+ def self.validates_uniqueness_of(*fields)
17
+ validates_with UniquenessValidator, _merge_attributes(fields)
18
+ end
19
+
20
+ yield
21
+
22
+ return unless Devise.apply_schema
23
+ devise_modules.each { |m| send(m) if respond_to?(m, true) }
24
+ end
25
+ end
26
+
27
+ # http://github.com/jkaramon/CouchrestModel/blob/rails3/lib/couchrest_model/plugins/validations.rb
28
+ # ==============================================================
29
+ # validates_each in couchrest_model should work just fine!
30
+ # ==============================================================
31
+
32
+ # class UniquenessValidator < ActiveModel::EachValidator
33
+ # def validate_each(target, attribute, value)
34
+ # resource = ::DataMapper.repository(target.repository.name) { target.model.first(attribute => value) }
35
+ # if resource.nil? || (target.saved? && resource.key == target.key)
36
+ # return true
37
+ # else
38
+ # target.errors.add(attribute, :taken)
39
+ # return false
40
+ # end
41
+ # end
42
+ # end
43
+
44
+ module ActiveModelCompatibility
45
+ # include ActiveModel::Validations does not make save check valid?.
46
+ # This may not be the best solution, but it seems to work. Note that
47
+ # Compatibility is included after this module; its #save method handles
48
+ # the :validate => false option.
49
+ def save(*args)
50
+ retval = valid? && super(*args)
51
+ assert_save_successful(:save, retval)
52
+ retval
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+
59
+ CouchRest::Model::Base.send(:extend, Devise::Models)
60
+ CouchRest::Model::Base.send(:include, Devise::Models)
61
+
62
+ #CouchRest::Model::Base.append_extensions(Devise::Models)
63
+ #CouchRest::Model::Base.append_extensions(Devise::Orm::CouchrestModel::Hook)
64
+
65
+ #module CouchRest
66
+ # module Model
67
+ # module Base
68
+ # extend ::Devise::Models
69
+ # extend ::Devise::Orm::CouchrestModel::Hook
70
+ # end
71
+ # end
72
+ #end
@@ -0,0 +1,5 @@
1
+ module CouchrestModel
2
+ module Devise
3
+ VERSION = "0.1.0".freeze
4
+ end
5
+ end
@@ -0,0 +1,17 @@
1
+ require 'generators/devise/orm_helpers'
2
+
3
+ module CouchrestModel
4
+ module Generators
5
+ class DeviseGenerator < Rails::Generators::NamedBase
6
+ include Devise::Generators::OrmHelpers
7
+
8
+ def generate_model
9
+ invoke "couchrest_model:model", [name] unless model_exists?
10
+ end
11
+
12
+ def inject_devise_content
13
+ inject_into_file model_path, model_contents, :after => "CouchRest::Model::Base\n"
14
+ end
15
+ end
16
+ end
17
+ end
metadata ADDED
@@ -0,0 +1,76 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: devise_couch
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 0
9
+ version: 0.1.0
10
+ platform: ruby
11
+ authors:
12
+ - Shenouda Bertel
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-08-13 00:00:00 +02:00
18
+ default_executable:
19
+ dependencies: []
20
+
21
+ description: CouchDB integration for Devise framework.
22
+ email: sbertel@mobithought.com
23
+ executables: []
24
+
25
+ extensions: []
26
+
27
+ extra_rdoc_files: []
28
+
29
+ files:
30
+ - MIT-LICENSE
31
+ - Gemfile
32
+ - Gemfile.lock
33
+ - Rakefile
34
+ - README.markdown
35
+ - lib/devise_couch/version.rb
36
+ - lib/devise/orm/couchrest_model/date_time.rb
37
+ - lib/devise/orm/couchrest_model/schema.rb
38
+ - lib/devise/orm/couchrest_model/couch_validations.rb
39
+ - lib/devise/orm/couchrest_model/compatibility.rb
40
+ - lib/devise/orm/couchrest_model_active_model.rb
41
+ - lib/devise/orm/couchrest_model.rb
42
+ - lib/generators/couchrest_model/devise_generator.rb
43
+ has_rdoc: true
44
+ homepage: http://github.com/shenoudab/devise_couch
45
+ licenses: []
46
+
47
+ post_install_message:
48
+ rdoc_options: []
49
+
50
+ require_paths:
51
+ - lib
52
+ required_ruby_version: !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ segments:
58
+ - 0
59
+ version: "0"
60
+ required_rubygems_version: !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ segments:
66
+ - 0
67
+ version: "0"
68
+ requirements: []
69
+
70
+ rubyforge_project:
71
+ rubygems_version: 1.3.7
72
+ signing_key:
73
+ specification_version: 3
74
+ summary: CouchDB integration for Devise framework.
75
+ test_files: []
76
+