couchrest_session_store 0.2.2 → 0.2.4

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.
@@ -14,7 +14,7 @@ Gem::Specification.new do |gem|
14
14
  gem.files = `git ls-files`.split("\n")
15
15
  gem.name = "couchrest_session_store"
16
16
  gem.require_paths = ["lib"]
17
- gem.version = '0.2.2'
17
+ gem.version = '0.2.4'
18
18
 
19
19
  gem.add_dependency "couchrest"
20
20
  gem.add_dependency "couchrest_model"
@@ -1,16 +1,16 @@
1
1
  require 'couchrest/session/utility'
2
2
  require 'time'
3
3
 
4
- class CouchRest::Session::Document
4
+ class CouchRest::Session::Document < CouchRest::Document
5
+ include CouchRest::Model::Configuration
6
+ include CouchRest::Model::Connection
5
7
  include CouchRest::Session::Utility
6
8
 
7
- def initialize(doc)
8
- @doc = doc
9
- end
9
+ use_database "sessions"
10
10
 
11
- def self.load(sid)
11
+ def self.fetch(sid)
12
12
  self.allocate.tap do |session_doc|
13
- session_doc.load(sid)
13
+ session_doc.fetch(sid)
14
14
  end
15
15
  end
16
16
 
@@ -22,15 +22,26 @@ class CouchRest::Session::Document
22
22
 
23
23
  def self.build_or_update(sid, session, options = {})
24
24
  options[:marshal_data] = true if options[:marshal_data].nil?
25
- doc = self.load(sid)
25
+ doc = self.fetch(sid)
26
26
  doc.update(session, options)
27
27
  return doc
28
28
  rescue RestClient::ResourceNotFound
29
29
  self.build(sid, session, options)
30
30
  end
31
31
 
32
- def load(sid)
33
- @doc = database.get(sid)
32
+ def self.find_by_expires(options = {})
33
+ options[:reduce] ||= false
34
+ design = database.get '_design/Session'
35
+ response = design.view :by_expires, options
36
+ response['rows']
37
+ end
38
+
39
+ def initialize(doc)
40
+ @doc = doc
41
+ end
42
+
43
+ def fetch(sid = nil)
44
+ @doc = database.get(sid || doc['_id'])
34
45
  end
35
46
 
36
47
  def to_session
@@ -56,6 +67,9 @@ class CouchRest::Session::Document
56
67
 
57
68
  def save
58
69
  database.save_doc(doc)
70
+ rescue RestClient::Conflict
71
+ fetch
72
+ retry
59
73
  end
60
74
 
61
75
  def expired?
@@ -1,47 +1,36 @@
1
1
  class CouchRest::Session::Store < ActionDispatch::Session::AbstractStore
2
2
 
3
- include CouchRest::Model::Configuration
4
- include CouchRest::Model::Connection
5
-
6
- def initialize(app, options = {})
7
- super
8
- self.class.set_options(options)
3
+ # delegate configure to document
4
+ def self.configure(*args, &block)
5
+ CouchRest::Session::Document.configure *args, &block
9
6
  end
10
7
 
11
8
  def self.set_options(options)
12
9
  @options = options
10
+ if @options[:database]
11
+ CouchRest::Session::Document.use_database @options[:database]
12
+ end
13
13
  end
14
14
 
15
- # just fetch from the config
16
- def self.database
17
- @database ||= initialize_database
18
- end
19
-
20
- def self.initialize_database
21
- use_database @options[:database] || "sessions"
15
+ def initialize(app, options = {})
16
+ super
17
+ self.class.set_options(options)
22
18
  end
23
19
 
24
20
  def cleanup(rows)
25
21
  rows.each do |row|
26
- doc = CouchRest::Session::Document.load(row['id'])
22
+ doc = CouchRest::Session::Document.fetch(row['id'])
27
23
  doc.delete
28
24
  end
29
25
  end
30
26
 
31
27
  def expired
32
- find_by_expires startkey: 1,
28
+ CouchRest::Session::Document.find_by_expires startkey: 1,
33
29
  endkey: Time.now.utc.iso8601
34
30
  end
35
31
 
36
32
  def never_expiring
37
- find_by_expires endkey: 1
38
- end
39
-
40
- def find_by_expires(options = {})
41
- options[:reduce] ||= false
42
- design = self.class.database.get '_design/Session'
43
- response = design.view :by_expires, options
44
- response['rows']
33
+ CouchRest::Session::Document.find_by_expires endkey: 1
45
34
  end
46
35
 
47
36
  private
@@ -55,6 +44,12 @@ class CouchRest::Session::Store < ActionDispatch::Session::AbstractStore
55
44
  rescue RestClient::ResourceNotFound
56
45
  # session data does not exist anymore
57
46
  return [sid, {}]
47
+ rescue RestClient::Unauthorized,
48
+ Errno::EHOSTUNREACH,
49
+ Errno::ECONNREFUSED => e
50
+ # can't connect to couch. We add some status to the session
51
+ # so the app can react. (Display error for example)
52
+ return [sid, {"_status" => {"couch" => "unreachable"}}]
58
53
  end
59
54
 
60
55
  def set_session(env, sid, session, options)
@@ -62,7 +57,10 @@ class CouchRest::Session::Store < ActionDispatch::Session::AbstractStore
62
57
  doc = build_or_update_doc(sid, session, options)
63
58
  doc.save
64
59
  return sid
65
- rescue CouchRest::Model::Errors::ConnectionFailed
60
+ # if we can't store the session we just return false.
61
+ rescue RestClient::Unauthorized,
62
+ Errno::EHOSTUNREACH,
63
+ Errno::ECONNREFUSED => e
66
64
  return false
67
65
  end
68
66
 
@@ -90,7 +88,7 @@ class CouchRest::Session::Store < ActionDispatch::Session::AbstractStore
90
88
  # but better be save than sorry.
91
89
  def secure_get(sid)
92
90
  raise RestClient::ResourceNotFound if /^_design\/(.*)/ =~ sid
93
- CouchRest::Session::Document.load(sid)
91
+ CouchRest::Session::Document.fetch(sid)
94
92
  end
95
93
 
96
94
  end
@@ -9,8 +9,4 @@ module CouchRest::Session::Utility
9
9
  Marshal.load(::Base64.decode64(data)) if data
10
10
  end
11
11
 
12
- def database
13
- CouchRest::Session::Store.database
14
- end
15
-
16
12
  end
data/test/couch_tester.rb CHANGED
@@ -3,14 +3,16 @@
3
3
  # on the SessionStore
4
4
  #
5
5
 
6
- class CouchTester
6
+ class CouchTester < CouchRest::Document
7
7
  include CouchRest::Model::Configuration
8
8
  include CouchRest::Model::Connection
9
9
 
10
- attr_reader :database
10
+ use_database 'sessions'
11
11
 
12
12
  def initialize(options = {})
13
- @database = self.class.use_database options[:database] || "sessions"
13
+ if options[:database]
14
+ self.class.use_database options[:database]
15
+ end
14
16
  end
15
17
 
16
18
  def get(sid)
@@ -0,0 +1,27 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/test_helper')
2
+
3
+ class SessionDocumentTest < MiniTest::Test
4
+
5
+ def test_storing_session
6
+ sid = '1234'
7
+ session = {'a' => 'b'}
8
+ options = {}
9
+ doc = CouchRest::Session::Document.build_or_update(sid, session, options)
10
+ doc.save
11
+ doc.fetch(sid)
12
+ assert_equal session, doc.to_session
13
+ end
14
+
15
+ def test_storing_session_with_conflict
16
+ sid = '1234'
17
+ session = {'a' => 'b'}
18
+ options = {}
19
+ doc = CouchRest::Session::Document.build_or_update(sid, session, options)
20
+ doc2 = CouchRest::Session::Document.build_or_update(sid, session, options)
21
+ doc.save
22
+ doc2.save
23
+ doc2.fetch(sid)
24
+ assert_equal session, doc2.to_session
25
+ end
26
+
27
+ end
@@ -64,7 +64,7 @@ class SessionStoreTest < MiniTest::Test
64
64
 
65
65
  def test_stored_and_not_expired_yet
66
66
  sid, session = expiring_session
67
- doc = CouchRest::Session::Document.load(sid)
67
+ doc = CouchRest::Session::Document.fetch(sid)
68
68
  expires = doc.send :expires
69
69
  assert expires
70
70
  assert !doc.expired?
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: couchrest_session_store
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.2.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-12-09 00:00:00.000000000 Z
12
+ date: 2013-12-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: couchrest
@@ -110,6 +110,7 @@ files:
110
110
  - lib/couchrest/session/utility.rb
111
111
  - lib/couchrest_session_store.rb
112
112
  - test/couch_tester.rb
113
+ - test/session_document_test.rb
113
114
  - test/session_store_test.rb
114
115
  - test/setup_couch.sh
115
116
  - test/test_clock.rb