pebblebed 0.0.26 → 0.0.27

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -1,4 +1,8 @@
1
1
  source "http://rubygems.org"
2
2
 
3
+ group :development, :test do
4
+ gem "memcache_mock", :git => "git://github.com/fguillen/MemcacheMock.git"
5
+ end
6
+
3
7
  # Specify your gem's dependencies in pebblebed.gemspec
4
8
  gemspec
@@ -9,7 +9,7 @@ require 'pathbuilder'
9
9
  require 'active_support'
10
10
 
11
11
  module Pebblebed
12
- class HttpError < Exception
12
+ class HttpError < StandardError
13
13
  attr_reader :status, :message
14
14
 
15
15
  def initialize(message, status = nil)
@@ -74,8 +74,8 @@ module Pebblebed
74
74
  memberships_record['memberships'].each do |membership|
75
75
  @group_ids << membership['membership']['group_id']
76
76
  end
77
- memberships_record['groups'].each do |group|
78
- group['group']['subtrees'].each do |subtree|
77
+ memberships_record['access_groups'].each do |group|
78
+ group['access_group']['subtrees'].each do |subtree|
79
79
  @subtrees << subtree.split('.')
80
80
  end
81
81
  end
@@ -6,7 +6,9 @@ module Pebblebed
6
6
 
7
7
  def initialize(options)
8
8
  @app_name = options[:app_name]
9
- @handlers = {:group => {}, :group_membership => {}, :group_subtree => {}}
9
+ @handlers = {:access_group => {},
10
+ :access_group_membership => {},
11
+ :access_group_subtree => {}}
10
12
  end
11
13
 
12
14
  def start
@@ -21,30 +23,30 @@ module Pebblebed
21
23
  end
22
24
 
23
25
  def on_group_declared(&block)
24
- @handlers[:group][:create] = block
25
- @handlers[:group][:update] = block
26
+ @handlers[:access_group][:create] = block
27
+ @handlers[:access_group][:update] = block
26
28
  end
27
29
 
28
30
  def on_group_removed(&block)
29
- @handlers[:group][:delete] = block
31
+ @handlers[:access_group][:delete] = block
30
32
  end
31
33
 
32
34
  def on_subtree_declared(&block)
33
- @handlers[:group_subtree][:create] = block
34
- @handlers[:group_subtree][:update] = block
35
+ @handlers[:access_group_subtree][:create] = block
36
+ @handlers[:access_group_subtree][:update] = block
35
37
  end
36
38
 
37
39
  def on_subtree_removed(&block)
38
- @handlers[:group_subtree][:delete] = block
40
+ @handlers[:access_group_subtree][:delete] = block
39
41
  end
40
42
 
41
43
  def on_membership_declared(&block)
42
- @handlers[:group_membership][:create] = block
43
- @handlers[:group_membership][:update] = block
44
+ @handlers[:access_group_membership][:create] = block
45
+ @handlers[:access_group_membership][:update] = block
44
46
  end
45
47
 
46
48
  def on_membership_removed(&block)
47
- @handlers[:group_membership][:delete] = block
49
+ @handlers[:access_group_membership][:delete] = block
48
50
  end
49
51
 
50
52
  private
@@ -55,12 +57,12 @@ module Pebblebed
55
57
  queue_options = {
56
58
  :name => "#{@app_name}.security_listener",
57
59
  :path => '**',
58
- :klass => 'group|group_membership|group_subtree',
60
+ :klass => 'access_group|access_group_membership|access_group_subtree',
59
61
  :event => '**',
60
62
  :interval => 1
61
63
  }
62
64
  queue = river.queue queue_options
63
- queue.subscribe(ack: true) do |message|
65
+ queue.subscribe(:ack => true) do |message|
64
66
  consider message
65
67
  end
66
68
  end
@@ -79,12 +81,12 @@ module Pebblebed
79
81
  event_handler = @handlers[klass.to_sym][event.to_sym]
80
82
  return unless event_handler
81
83
  case klass
82
- when 'group'
84
+ when 'access_group'
83
85
  event_handler.call(:id => attributes['id'], :label => attributes['label'])
84
- when 'group_membership'
86
+ when 'access_group_membership'
85
87
  event_handler.call(:group_id => attributes['group_id'],
86
88
  :identity_id => attributes['identity_id'])
87
- when 'group_subtree'
89
+ when 'access_group_subtree'
88
90
  event_handler.call(:group_id => attributes['group_id'],
89
91
  :location => attributes['location'])
90
92
  end
@@ -33,9 +33,20 @@ module Sinatra
33
33
  end
34
34
 
35
35
  def current_identity
36
+ return nil unless current_session
36
37
  return @identity if @identity_checked
37
38
  @identity_checked = true
38
- @identity = pebbles.checkpoint.get("/identities/me")[:identity]
39
+ if cache_current_identity?
40
+ @identity = ::Pebblebed.memcached.fetch("identity-for-session-#{current_session}", ttl = 60) do
41
+ pebbles.checkpoint.get("/identities/me")[:identity]
42
+ end
43
+ else
44
+ @identity = pebbles.checkpoint.get("/identities/me")[:identity]
45
+ end
46
+ end
47
+
48
+ def cache_current_identity?
49
+ settings.respond_to?(:cache_current_identity) && settings.cache_current_identity
39
50
  end
40
51
 
41
52
  def require_identity
@@ -1,3 +1,3 @@
1
1
  module Pebblebed
2
- VERSION = "0.0.26"
2
+ VERSION = "0.0.27"
3
3
  end
data/pebblebed.gemspec CHANGED
@@ -24,7 +24,7 @@ Gem::Specification.new do |s|
24
24
  s.add_development_dependency "simplecov"
25
25
  s.add_development_dependency "sinatra" # for testing purposes
26
26
  s.add_development_dependency "rack-test" # for testing purposes
27
-
27
+
28
28
  s.add_runtime_dependency "deepstruct", ">= 0.0.2"
29
29
  s.add_runtime_dependency "curb", ">= 0.7.14"
30
30
  s.add_runtime_dependency "yajl-ruby"
@@ -5,7 +5,7 @@ require 'pebblebed/security/access_data'
5
5
  describe Pebblebed::Security::AccessData do
6
6
  let :access_data do
7
7
  Pebblebed::Security::AccessData.new(
8
- :groups => [1,2,3],
8
+ :access_groups => [1,2,3],
9
9
  :subtrees => ['a.b', 'a.b.c.d.e', 'a.c.d', 'a.c.e.f']
10
10
  )
11
11
  end
@@ -28,9 +28,9 @@ describe Pebblebed::Security::AccessData do
28
28
  {'membership' => {'id' => 10, 'group_id' => 1, 'identity_id' => 1}},
29
29
  {'membership' => {'id' => 20, 'group_id' => 2, 'identity_id' => 1}},
30
30
  ],
31
- 'groups' => [
32
- {'group' => {'id' => 1, 'label' => "group_1", 'subtrees' => ["a.b.c"]}},
33
- {'group' => {'id' => 2, 'label' => "group_2", 'subtrees' => ["a.c.d.c"]}}
31
+ 'access_groups' => [
32
+ {'access_group' => {'id' => 1, 'label' => "group_1", 'subtrees' => ["a.b.c"]}},
33
+ {'access_group' => {'id' => 2, 'label' => "group_2", 'subtrees' => ["a.c.d.c"]}}
34
34
  ]
35
35
  }
36
36
  ad = Pebblebed::Security::AccessData.new(record)
@@ -11,12 +11,12 @@ describe Pebblebed::Security::Client do
11
11
  let :sample_memberships_record do
12
12
  {
13
13
  'memberships' => [
14
- {'membership' => {'id' => 10, 'group_id' => 1, 'identity_id' => 1}},
15
- {'membership' => {'id' => 20, 'group_id' => 2, 'identity_id' => 1}},
14
+ {'membership' => {'id' => 10, 'access_group_id' => 1, 'identity_id' => 1}},
15
+ {'membership' => {'id' => 20, 'access_group_id' => 2, 'identity_id' => 1}},
16
16
  ],
17
- 'groups' => [
18
- {'group' => {'id' => 1, 'label' => "group_1", 'subtrees' => ["a.b.c"]}},
19
- {'group' => {'id' => 2, 'label' => "group_2", 'subtrees' => ["a.c.d.c"]}}
17
+ 'access_groups' => [
18
+ {'access_group' => {'id' => 1, 'label' => "group_1", 'subtrees' => ["a.b.c"]}},
19
+ {'access_group' => {'id' => 2, 'label' => "group_2", 'subtrees' => ["a.c.d.c"]}}
20
20
  ]
21
21
  }
22
22
  end
@@ -14,7 +14,7 @@ describe Pebblebed::Security::Listener do
14
14
  end
15
15
  message = {:payload => {
16
16
  'event' => 'create',
17
- 'uid' => 'group:abc.groups$10',
17
+ 'uid' => 'access_group:abc.access_groups$10',
18
18
  'attributes' => {
19
19
  'id' => 10,
20
20
  'label' => 'the_label'
data/spec/sinatra_spec.rb CHANGED
@@ -1,5 +1,4 @@
1
1
  # encoding: utf-8
2
-
3
2
  require 'pebblebed'
4
3
  require 'pebblebed/sinatra'
5
4
  require 'sinatra/base'
@@ -51,6 +50,13 @@ describe Sinatra::Pebblebed do
51
50
  Pebblebed::Connector.any_instance.stub(:checkpoint).and_return checkpoint
52
51
  end
53
52
 
53
+ let(:random_session) { rand(36**128).to_s(36) }
54
+
55
+ before :each do
56
+ # Make sure the app get an uniqie session key for every received request
57
+ TestApp.any_instance.stub(:current_session) { random_session }
58
+ end
59
+
54
60
  context "a guest" do
55
61
  let(:identity) { guest }
56
62
 
@@ -125,4 +131,22 @@ describe Sinatra::Pebblebed do
125
131
  last_response.body.should == 'Not found /nonexistant'
126
132
  end
127
133
  end
134
+
135
+ describe "current identity caching" do
136
+ let(:identity) { alice }
137
+
138
+ it "will not cache current_identity by default" do
139
+ checkpoint.should_receive(:get).twice
140
+ get '/private'
141
+ get '/private'
142
+ end
143
+
144
+ it "can be configured to cache current identity" do
145
+ session = random_session
146
+ app.set :cache_current_identity, true
147
+ checkpoint.should_receive(:get).once
148
+ get '/private'
149
+ get '/private'
150
+ end
151
+ end
128
152
  end
data/spec/spec_helper.rb CHANGED
@@ -5,14 +5,16 @@ SimpleCov.add_filter 'spec'
5
5
  SimpleCov.add_filter 'config'
6
6
  SimpleCov.start
7
7
 
8
- require './spec/mockcached'
8
+ require 'memcache_mock'
9
9
  require './spec/mock_pebble'
10
10
 
11
11
  RSpec.configure do |c|
12
12
  c.mock_with :rspec
13
+ c.before(:each) do
14
+ ::Pebblebed.memcached = MemcacheMock.new
15
+ end
13
16
  c.around(:each) do |example|
14
17
  clear_cookies if respond_to?(:clear_cookies)
15
- $memcached = Mockcached.new
16
18
  example.run
17
19
  end
18
20
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pebblebed
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.26
4
+ version: 0.0.27
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-10-25 00:00:00.000000000 Z
13
+ date: 2012-11-19 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rspec
17
- requirement: &70127313138320 !ruby/object:Gem::Requirement
17
+ requirement: !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,15 @@ dependencies:
22
22
  version: '0'
23
23
  type: :development
24
24
  prerelease: false
25
- version_requirements: *70127313138320
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: '0'
26
31
  - !ruby/object:Gem::Dependency
27
32
  name: rake
28
- requirement: &70127313137220 !ruby/object:Gem::Requirement
33
+ requirement: !ruby/object:Gem::Requirement
29
34
  none: false
30
35
  requirements:
31
36
  - - ! '>='
@@ -33,10 +38,15 @@ dependencies:
33
38
  version: '0'
34
39
  type: :development
35
40
  prerelease: false
36
- version_requirements: *70127313137220
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
37
47
  - !ruby/object:Gem::Dependency
38
48
  name: simplecov
39
- requirement: &70127313136580 !ruby/object:Gem::Requirement
49
+ requirement: !ruby/object:Gem::Requirement
40
50
  none: false
41
51
  requirements:
42
52
  - - ! '>='
@@ -44,10 +54,15 @@ dependencies:
44
54
  version: '0'
45
55
  type: :development
46
56
  prerelease: false
47
- version_requirements: *70127313136580
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
48
63
  - !ruby/object:Gem::Dependency
49
64
  name: sinatra
50
- requirement: &70127313135380 !ruby/object:Gem::Requirement
65
+ requirement: !ruby/object:Gem::Requirement
51
66
  none: false
52
67
  requirements:
53
68
  - - ! '>='
@@ -55,10 +70,15 @@ dependencies:
55
70
  version: '0'
56
71
  type: :development
57
72
  prerelease: false
58
- version_requirements: *70127313135380
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
59
79
  - !ruby/object:Gem::Dependency
60
80
  name: rack-test
61
- requirement: &70127313134840 !ruby/object:Gem::Requirement
81
+ requirement: !ruby/object:Gem::Requirement
62
82
  none: false
63
83
  requirements:
64
84
  - - ! '>='
@@ -66,10 +86,15 @@ dependencies:
66
86
  version: '0'
67
87
  type: :development
68
88
  prerelease: false
69
- version_requirements: *70127313134840
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ! '>='
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
70
95
  - !ruby/object:Gem::Dependency
71
96
  name: deepstruct
72
- requirement: &70127313134000 !ruby/object:Gem::Requirement
97
+ requirement: !ruby/object:Gem::Requirement
73
98
  none: false
74
99
  requirements:
75
100
  - - ! '>='
@@ -77,10 +102,15 @@ dependencies:
77
102
  version: 0.0.2
78
103
  type: :runtime
79
104
  prerelease: false
80
- version_requirements: *70127313134000
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: 0.0.2
81
111
  - !ruby/object:Gem::Dependency
82
112
  name: curb
83
- requirement: &70127313132320 !ruby/object:Gem::Requirement
113
+ requirement: !ruby/object:Gem::Requirement
84
114
  none: false
85
115
  requirements:
86
116
  - - ! '>='
@@ -88,10 +118,15 @@ dependencies:
88
118
  version: 0.7.14
89
119
  type: :runtime
90
120
  prerelease: false
91
- version_requirements: *70127313132320
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ none: false
123
+ requirements:
124
+ - - ! '>='
125
+ - !ruby/object:Gem::Version
126
+ version: 0.7.14
92
127
  - !ruby/object:Gem::Dependency
93
128
  name: yajl-ruby
94
- requirement: &70127313130020 !ruby/object:Gem::Requirement
129
+ requirement: !ruby/object:Gem::Requirement
95
130
  none: false
96
131
  requirements:
97
132
  - - ! '>='
@@ -99,10 +134,15 @@ dependencies:
99
134
  version: '0'
100
135
  type: :runtime
101
136
  prerelease: false
102
- version_requirements: *70127313130020
137
+ version_requirements: !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ! '>='
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
103
143
  - !ruby/object:Gem::Dependency
104
144
  name: queryparams
105
- requirement: &70127313128400 !ruby/object:Gem::Requirement
145
+ requirement: !ruby/object:Gem::Requirement
106
146
  none: false
107
147
  requirements:
108
148
  - - ! '>='
@@ -110,10 +150,15 @@ dependencies:
110
150
  version: '0'
111
151
  type: :runtime
112
152
  prerelease: false
113
- version_requirements: *70127313128400
153
+ version_requirements: !ruby/object:Gem::Requirement
154
+ none: false
155
+ requirements:
156
+ - - ! '>='
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
114
159
  - !ruby/object:Gem::Dependency
115
160
  name: futurevalue
116
- requirement: &70127313127340 !ruby/object:Gem::Requirement
161
+ requirement: !ruby/object:Gem::Requirement
117
162
  none: false
118
163
  requirements:
119
164
  - - ! '>='
@@ -121,10 +166,15 @@ dependencies:
121
166
  version: '0'
122
167
  type: :runtime
123
168
  prerelease: false
124
- version_requirements: *70127313127340
169
+ version_requirements: !ruby/object:Gem::Requirement
170
+ none: false
171
+ requirements:
172
+ - - ! '>='
173
+ - !ruby/object:Gem::Version
174
+ version: '0'
125
175
  - !ruby/object:Gem::Dependency
126
176
  name: pathbuilder
127
- requirement: &70127313125940 !ruby/object:Gem::Requirement
177
+ requirement: !ruby/object:Gem::Requirement
128
178
  none: false
129
179
  requirements:
130
180
  - - ! '>='
@@ -132,10 +182,15 @@ dependencies:
132
182
  version: '0'
133
183
  type: :runtime
134
184
  prerelease: false
135
- version_requirements: *70127313125940
185
+ version_requirements: !ruby/object:Gem::Requirement
186
+ none: false
187
+ requirements:
188
+ - - ! '>='
189
+ - !ruby/object:Gem::Version
190
+ version: '0'
136
191
  - !ruby/object:Gem::Dependency
137
192
  name: nokogiri
138
- requirement: &70127313124680 !ruby/object:Gem::Requirement
193
+ requirement: !ruby/object:Gem::Requirement
139
194
  none: false
140
195
  requirements:
141
196
  - - ! '>='
@@ -143,10 +198,15 @@ dependencies:
143
198
  version: '0'
144
199
  type: :runtime
145
200
  prerelease: false
146
- version_requirements: *70127313124680
201
+ version_requirements: !ruby/object:Gem::Requirement
202
+ none: false
203
+ requirements:
204
+ - - ! '>='
205
+ - !ruby/object:Gem::Version
206
+ version: '0'
147
207
  - !ruby/object:Gem::Dependency
148
208
  name: i18n
149
- requirement: &70127313122960 !ruby/object:Gem::Requirement
209
+ requirement: !ruby/object:Gem::Requirement
150
210
  none: false
151
211
  requirements:
152
212
  - - ! '>='
@@ -154,10 +214,15 @@ dependencies:
154
214
  version: '0'
155
215
  type: :runtime
156
216
  prerelease: false
157
- version_requirements: *70127313122960
217
+ version_requirements: !ruby/object:Gem::Requirement
218
+ none: false
219
+ requirements:
220
+ - - ! '>='
221
+ - !ruby/object:Gem::Version
222
+ version: '0'
158
223
  - !ruby/object:Gem::Dependency
159
224
  name: activesupport
160
- requirement: &70127313121480 !ruby/object:Gem::Requirement
225
+ requirement: !ruby/object:Gem::Requirement
161
226
  none: false
162
227
  requirements:
163
228
  - - ! '>='
@@ -165,10 +230,15 @@ dependencies:
165
230
  version: '0'
166
231
  type: :runtime
167
232
  prerelease: false
168
- version_requirements: *70127313121480
233
+ version_requirements: !ruby/object:Gem::Requirement
234
+ none: false
235
+ requirements:
236
+ - - ! '>='
237
+ - !ruby/object:Gem::Version
238
+ version: '0'
169
239
  - !ruby/object:Gem::Dependency
170
240
  name: bunny
171
- requirement: &70127313118900 !ruby/object:Gem::Requirement
241
+ requirement: !ruby/object:Gem::Requirement
172
242
  none: false
173
243
  requirements:
174
244
  - - ! '>='
@@ -176,7 +246,12 @@ dependencies:
176
246
  version: '0'
177
247
  type: :runtime
178
248
  prerelease: false
179
- version_requirements: *70127313118900
249
+ version_requirements: !ruby/object:Gem::Requirement
250
+ none: false
251
+ requirements:
252
+ - - ! '>='
253
+ - !ruby/object:Gem::Version
254
+ version: '0'
180
255
  description: Development tools for working with Pebblebed
181
256
  email:
182
257
  - katrina@bengler.no
@@ -215,7 +290,6 @@ files:
215
290
  - spec/http_spec.rb
216
291
  - spec/labels_spec.rb
217
292
  - spec/mock_pebble.rb
218
- - spec/mockcached.rb
219
293
  - spec/river_spec.rb
220
294
  - spec/river_subscription_spec.rb
221
295
  - spec/security/access_data_spec.rb
@@ -236,15 +310,21 @@ required_ruby_version: !ruby/object:Gem::Requirement
236
310
  - - ! '>='
237
311
  - !ruby/object:Gem::Version
238
312
  version: '0'
313
+ segments:
314
+ - 0
315
+ hash: 1631620775838906147
239
316
  required_rubygems_version: !ruby/object:Gem::Requirement
240
317
  none: false
241
318
  requirements:
242
319
  - - ! '>='
243
320
  - !ruby/object:Gem::Version
244
321
  version: '0'
322
+ segments:
323
+ - 0
324
+ hash: 1631620775838906147
245
325
  requirements: []
246
326
  rubyforge_project: pebblebed
247
- rubygems_version: 1.8.15
327
+ rubygems_version: 1.8.24
248
328
  signing_key:
249
329
  specification_version: 3
250
330
  summary: Development tools for working with Pebblebed
@@ -255,7 +335,6 @@ test_files:
255
335
  - spec/http_spec.rb
256
336
  - spec/labels_spec.rb
257
337
  - spec/mock_pebble.rb
258
- - spec/mockcached.rb
259
338
  - spec/river_spec.rb
260
339
  - spec/river_subscription_spec.rb
261
340
  - spec/security/access_data_spec.rb
data/spec/mockcached.rb DELETED
@@ -1,25 +0,0 @@
1
- class Mockcached
2
- def initialize
3
- @store = {}
4
- end
5
-
6
- def set(*args)
7
- @store[args[0]] = args[1]
8
- end
9
-
10
- def get(*args)
11
- @store[args[0]]
12
- end
13
-
14
- def get_multi(*keys)
15
- result = {}
16
- keys.each do |key|
17
- result[key] = get(key) if @store.has_key?(key)
18
- end
19
- result
20
- end
21
-
22
- def delete(*args)
23
- @store.delete(args[0])
24
- end
25
- end