pebblebed 0.0.13 → 0.0.16

Sign up to get free protection for your applications and to get access to all the features.
@@ -20,10 +20,11 @@ module Pebblebed
20
20
 
21
21
  if Pebblebed.memcached
22
22
  cache_keys = ids.collect {|id| cache_key_for_identity_id(id) }
23
- result = Hash[Pebblebed.memcached.get_multi(*cache_keys).map do |key, identity|
24
- /identity:(?<id>\d+)/ =~ key # yup, this is ugly, but an easy hack to get the actual identity id we are trying to retrieve
25
- [id.to_i, identity]
26
- end]
23
+ result = Hash[Pebblebed.memcached.get_multi(*cache_keys).map { |key, identity|
24
+ if key =~ /identity:(\d+)/
25
+ [$1.to_i, identity]
26
+ end
27
+ }]
27
28
  uncached = ids-result.keys
28
29
  end
29
30
 
@@ -90,8 +90,10 @@ class Pebblebed::Parts
90
90
  end
91
91
 
92
92
  def self.parse_partspec(partspec)
93
- /^(?<service>[^\.]+)\.(?<part>.*)$/ =~ partspec
94
- [service, part]
93
+ if partspec =~ /^([^\.]+)\.(.*)$/
94
+ service, part = $1, $2
95
+ [service, part]
96
+ end
95
97
  end
96
98
 
97
99
  # Create a string of data-attributes from a hash
data/lib/pebblebed/uid.rb CHANGED
@@ -1,3 +1,5 @@
1
+ require 'cgi'
2
+
1
3
  module Pebblebed
2
4
  class InvalidUid < StandardError; end
3
5
  class Uid
@@ -30,50 +32,6 @@ module Pebblebed
30
32
  @oid = (value.strip != "") ? value : nil
31
33
  end
32
34
 
33
- def self.raw_parse(string)
34
- /(?<klass>^[^:]+)\:(?<path>[^\$]*)?\$?(?<oid>.*$)?/ =~ string
35
- [klass, path, oid]
36
- end
37
-
38
- def self.valid?(string)
39
- begin
40
- true if new(string)
41
- rescue InvalidUid
42
- false
43
- end
44
- end
45
-
46
- def self.parse(string)
47
- uid = new(string)
48
- [uid.klass, uid.path, uid.oid]
49
- end
50
-
51
- def self.valid_label?(value)
52
- !!(value =~ /^[a-zA-Z0-9_-]+$/)
53
- end
54
-
55
- def self.valid_klass?(value)
56
- return false if value =~ /^\.+$/
57
- return false if value == ""
58
- value.split('.').each do |label|
59
- return false unless self.valid_label?(label)
60
- end
61
- true
62
- end
63
-
64
- def self.valid_path?(value)
65
- # catches a stupid edge case in ruby where "..".split('.') == [] instead of ["", "", ""]
66
- return false if value =~ /^\.+$/
67
- value.split('.').each do |label|
68
- return false unless self.valid_label?(label)
69
- end
70
- true
71
- end
72
-
73
- def self.valid_oid?(value)
74
- !value.nil? && !value.include?('/')
75
- end
76
-
77
35
  def realm
78
36
  self.path.split(".").first if self.path
79
37
  end
@@ -95,5 +53,95 @@ module Pebblebed
95
53
  self == other
96
54
  end
97
55
 
56
+ class << self
57
+ def raw_parse(string)
58
+ if string =~ /\A([^:]+)\:([^\$]*)?\$?(.+)?\Z/
59
+ klass, path, oid = $1, $2, $3
60
+ [klass, path, oid]
61
+ end
62
+ end
63
+
64
+ def valid?(string)
65
+ begin
66
+ true if new(string)
67
+ rescue InvalidUid
68
+ false
69
+ end
70
+ end
71
+
72
+ def parse(string)
73
+ uid = new(string)
74
+ [uid.klass, uid.path, uid.oid]
75
+ end
76
+
77
+ def valid_label?(value)
78
+ !!(value =~ /^[a-zA-Z0-9_-]+$/)
79
+ end
80
+
81
+ def valid_klass?(value)
82
+ return false if value =~ /^\.+$/
83
+ return false if value == ""
84
+ value.split('.').each do |label|
85
+ return false unless self.valid_label?(label)
86
+ end
87
+ true
88
+ end
89
+
90
+ def valid_path?(value)
91
+ # catches a stupid edge case in ruby where "..".split('.') == [] instead of ["", "", ""]
92
+ return false if value =~ /^\.+$/
93
+
94
+ return true if valid_wildcard_path?(value)
95
+
96
+ value.split('.').all? { |s| valid_label?(s) }
97
+ end
98
+
99
+ def valid_oid?(value)
100
+ !value.nil? && !value.include?('/')
101
+ end
102
+
103
+ def wildcard_path?(value)
104
+ value =~ /[\*\|\^]/
105
+ end
106
+
107
+ def valid_wildcard_path?(value)
108
+ wildcard_path?(value) && WildcardPath.valid?(value)
109
+ end
110
+ end
111
+
112
+ module WildcardPath
113
+
114
+ class << self
115
+ def valid?(path)
116
+ stars_are_solitary?(path) && pipes_are_interleaved?(path) && carets_are_leading?(path) && stars_are_terminating?(path)
117
+ end
118
+
119
+ # a.*.c is valid
120
+ # a.*b.c is not
121
+ def stars_are_solitary?(path)
122
+ !path.split('.').any? {|s| s.match(/.+\*|\*.+/)}
123
+ end
124
+
125
+ # a.b|c.d is valid
126
+ # a.|b.c is not
127
+ def pipes_are_interleaved?(path)
128
+ !path.split('.').any? {|s| s.match(/^\||\|$/)}
129
+ end
130
+
131
+ # a.^b.c is valid
132
+ # a.b^c.d is not
133
+ def carets_are_leading?(path)
134
+ !path.split('.').any? {|s| s.match(/.+\^|\^$/) }
135
+ end
136
+
137
+ # a.b.* is valid
138
+ # *.b.c is not
139
+ def stars_are_terminating?(path)
140
+ path !~ /.*\*\.\w/
141
+ end
142
+ end
143
+ end
144
+
98
145
  end
146
+
99
147
  end
@@ -1,3 +1,3 @@
1
1
  module Pebblebed
2
- VERSION = "0.0.13"
2
+ VERSION = "0.0.16"
3
3
  end
data/spec/uid_spec.rb CHANGED
@@ -1,28 +1,33 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Pebblebed::Uid do
4
- it "parses a full uid correctly" do
5
- uid = Pebblebed::Uid.new("klass:path$oid")
6
- uid.klass.should eq "klass"
7
- uid.path.should eq "path"
8
- uid.oid.should eq "oid"
9
- uid.to_s.should eq "klass:path$oid"
10
- end
4
+ describe "parsing" do
5
+ context "a full uid" do
6
+ subject { Pebblebed::Uid.new("klass:path$oid") }
7
+
8
+ its(:klass) { should eq "klass" }
9
+ its(:path) { should eq "path" }
10
+ its(:oid) { should eq "oid" }
11
+ its(:to_s) { should eq "klass:path$oid" }
12
+ end
11
13
 
12
- it "parses an uid with no oid correctly" do
13
- uid = Pebblebed::Uid.new("klass:path")
14
- uid.klass.should eq "klass"
15
- uid.path.should eq "path"
16
- uid.oid.should be_nil
17
- uid.to_s.should eq "klass:path"
18
- end
14
+ context "without oid" do
15
+ subject { Pebblebed::Uid.new("klass:path") }
16
+
17
+ its(:klass) { should eq "klass" }
18
+ its(:path) { should eq "path" }
19
+ its(:oid) { should be_nil }
20
+ its(:to_s) { should eq "klass:path" }
21
+ end
19
22
 
20
- it "parses an uid with no path correctly" do
21
- uid = Pebblebed::Uid.new("klass:$oid")
22
- uid.klass.should eq "klass"
23
- uid.path.should be_nil
24
- uid.oid.should eq "oid"
25
- uid.to_s.should eq "klass:$oid"
23
+ context "without path" do
24
+ subject { Pebblebed::Uid.new("klass:$oid") }
25
+
26
+ its(:klass) { should eq "klass" }
27
+ its(:path) { should be_nil }
28
+ its(:oid) { should eq "oid" }
29
+ its(:to_s) { should eq "klass:$oid" }
30
+ end
26
31
  end
27
32
 
28
33
  it "can be created with a string" do
@@ -43,11 +48,11 @@ describe Pebblebed::Uid do
43
48
  -> { Pebblebed::Uid.new("!:$298") }.should raise_error Pebblebed::InvalidUid
44
49
  end
45
50
 
46
- it "raises an exception when you modify a uid with an invalid value" do
47
- uid = Pebblebed::Uid.new("klass:path$oid")
48
- -> { uid.klass = "!" }.should raise_error Pebblebed::InvalidUid
49
- -> { uid.path = "..." }.should raise_error Pebblebed::InvalidUid
50
- -> { uid.oid = "/" }.should raise_error Pebblebed::InvalidUid
51
+ describe "raises an exception when you modify a uid with an invalid value" do
52
+ let(:uid) { Pebblebed::Uid.new("klass:path$oid") }
53
+ specify { -> { uid.klass = "!" }.should raise_error Pebblebed::InvalidUid }
54
+ specify { -> { uid.path = "..." }.should raise_error Pebblebed::InvalidUid }
55
+ specify { -> { uid.oid = "/" }.should raise_error Pebblebed::InvalidUid }
51
56
  end
52
57
 
53
58
  describe "klass" do
@@ -107,51 +112,74 @@ describe Pebblebed::Uid do
107
112
  Pebblebed::Uid.valid_klass?("").should be_false
108
113
  end
109
114
 
110
- describe "path" do
111
- it "accepts valid paths" do
112
- Pebblebed::Uid.valid_path?("").should be_true
113
- Pebblebed::Uid.valid_path?("abc123").should be_true
114
- Pebblebed::Uid.valid_path?("abc.123").should be_true
115
- Pebblebed::Uid.valid_path?("abc.de-f.123").should be_true
116
- end
117
-
118
- it "rejects invalid paths" do
119
- Pebblebed::Uid.valid_path?("abc!.").should be_false
120
- Pebblebed::Uid.valid_path?(".").should be_false
121
- Pebblebed::Uid.valid_path?("ab. 123").should be_false
115
+ describe "validating paths" do
116
+ specify { Pebblebed::Uid.valid_path?("").should be_true }
117
+ specify { Pebblebed::Uid.valid_path?("abc123").should be_true }
118
+ specify { Pebblebed::Uid.valid_path?("abc.123").should be_true }
119
+ specify { Pebblebed::Uid.valid_path?("abc.de-f.123").should be_true }
120
+
121
+ specify { Pebblebed::Uid.valid_path?("abc!.").should be_false }
122
+ specify { Pebblebed::Uid.valid_path?(".").should be_false }
123
+ specify { Pebblebed::Uid.valid_path?("ab. 123").should be_false }
124
+
125
+ context "with wildcards" do
126
+ specify { Pebblebed::Uid.valid_path?('*').should be_true }
127
+ specify { Pebblebed::Uid.valid_path?('a.b.c.*').should be_true }
128
+ specify { Pebblebed::Uid.valid_path?('a.b|c.d').should be_true }
129
+ specify { Pebblebed::Uid.valid_path?('a.b|c.*').should be_true }
130
+ specify { Pebblebed::Uid.valid_path?('^a').should be_true }
131
+ specify { Pebblebed::Uid.valid_path?('^a.b').should be_true }
132
+ specify { Pebblebed::Uid.valid_path?('^a.b.c').should be_true }
133
+ specify { Pebblebed::Uid.valid_path?('a.^b.c').should be_true }
134
+ specify { Pebblebed::Uid.valid_path?('a.^b.c|d.e').should be_true }
135
+ specify { Pebblebed::Uid.valid_path?('a.^b.c.*').should be_true }
136
+
137
+ specify { Pebblebed::Uid.valid_path?('*a').should be_false }
138
+ specify { Pebblebed::Uid.valid_path?('a*').should be_false }
139
+ specify { Pebblebed::Uid.valid_path?('*.b').should be_false }
140
+ specify { Pebblebed::Uid.valid_path?('a.*.b').should be_false }
141
+ specify { Pebblebed::Uid.valid_path?('|').should be_false }
142
+ specify { Pebblebed::Uid.valid_path?('a.|b').should be_false }
143
+ specify { Pebblebed::Uid.valid_path?('a.b|').should be_false }
144
+ specify { Pebblebed::Uid.valid_path?('a.|b.c').should be_false }
145
+ specify { Pebblebed::Uid.valid_path?('a.b|.c').should be_false }
146
+ specify { Pebblebed::Uid.valid_path?('^').should be_false }
147
+ specify { Pebblebed::Uid.valid_path?('^.a').should be_false }
148
+ specify { Pebblebed::Uid.valid_path?('a^').should be_false }
149
+ specify { Pebblebed::Uid.valid_path?('a^b.c').should be_false }
122
150
  end
123
151
  end
124
152
 
125
- it "knows how to parse in place" do
126
- Pebblebed::Uid.parse("klass:path$oid").should eq ['klass', 'path', 'oid']
127
- Pebblebed::Uid.parse("post:this.is.a.path.to$object_id").should eq ['post', 'this.is.a.path.to', 'object_id']
128
- Pebblebed::Uid.parse("post:$object_id").should eq ['post', nil, 'object_id']
153
+ describe "wildcard paths" do
154
+ specify { Pebblebed::Uid.wildcard_path?('*').should be_true }
155
+ specify { Pebblebed::Uid.wildcard_path?('a.b|c.d').should be_true }
156
+ specify { Pebblebed::Uid.wildcard_path?('a.^b.d').should be_true }
157
+ specify { Pebblebed::Uid.wildcard_path?('a.b.d').should be_false }
129
158
  end
130
159
 
131
- it "knows the valid uids from the invalid ones" do
132
- Pebblebed::Uid.valid?("F**ing H%$#!!!").should be_false
133
- Pebblebed::Uid.valid?("").should be_false
134
- Pebblebed::Uid.valid?("bang:").should be_false
135
- Pebblebed::Uid.valid?(":bang").should be_false
136
- Pebblebed::Uid.valid?(":bang$paff").should be_false
137
- Pebblebed::Uid.valid?("$paff").should be_false
138
- Pebblebed::Uid.valid?("a:b.c.d$e").should be_true
139
- Pebblebed::Uid.valid?("a:$e").should be_true
140
- Pebblebed::Uid.valid?("a:b.c.d").should be_true
160
+ describe "parsing in place" do
161
+ specify { Pebblebed::Uid.parse("klass:path$oid").should eq ['klass', 'path', 'oid'] }
162
+ specify { Pebblebed::Uid.parse("post:this.is.a.path.to$object_id").should eq ['post', 'this.is.a.path.to', 'object_id'] }
163
+ specify { Pebblebed::Uid.parse("post:$object_id").should eq ['post', nil, 'object_id'] }
141
164
  end
142
165
 
143
- it "knows how to extract the realm from the path" do
144
- Pebblebed::Uid.new("klass:realm.other.stuff$3").realm.should eq 'realm'
145
- Pebblebed::Uid.new("klass:realm$3").realm.should eq 'realm'
146
- Pebblebed::Uid.new("klass:realm").realm.should eq 'realm'
147
- Pebblebed::Uid.new("klass:$3").realm.should eq nil
166
+ describe "validating uids" do
167
+ specify { Pebblebed::Uid.valid?("a:b.c.d$e").should be_true }
168
+ specify { Pebblebed::Uid.valid?("a:$e").should be_true }
169
+ specify { Pebblebed::Uid.valid?("a:b.c.d").should be_true }
170
+ specify { Pebblebed::Uid.valid?("F**ing H%$#!!!").should be_false }
171
+ specify { Pebblebed::Uid.valid?("").should be_false }
172
+ specify { Pebblebed::Uid.valid?("bang:").should be_false }
173
+ specify { Pebblebed::Uid.valid?(":bang").should be_false }
174
+ specify { Pebblebed::Uid.valid?(":bang$paff").should be_false }
175
+ specify { Pebblebed::Uid.valid?("$paff").should be_false }
148
176
  end
149
177
 
150
- it "knows how to extract the realm from the path" do
151
- Pebblebed::Uid.new("klass:realm.other.stuff$3").realm.should eq 'realm'
152
- Pebblebed::Uid.new("klass:realm$3").realm.should eq 'realm'
153
- Pebblebed::Uid.new("klass:realm").realm.should eq 'realm'
154
- Pebblebed::Uid.new("klass:$3").realm.should eq nil
178
+ describe "extracting realm from path" do
179
+ specify { Pebblebed::Uid.new("klass:realm.other.stuff$3").realm.should eq 'realm' }
180
+ specify { Pebblebed::Uid.new("klass:realm$3").realm.should eq 'realm' }
181
+ specify { Pebblebed::Uid.new("klass:realm").realm.should eq 'realm' }
182
+ specify { Pebblebed::Uid.new("klass:$3").realm.should eq nil }
155
183
  end
156
184
 
157
185
  describe "equality" do
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.13
4
+ version: 0.0.16
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-03-23 00:00:00.000000000Z
13
+ date: 2012-05-14 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rspec
17
- requirement: &70137844473260 !ruby/object:Gem::Requirement
17
+ requirement: &70227836596560 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: '0'
23
23
  type: :development
24
24
  prerelease: false
25
- version_requirements: *70137844473260
25
+ version_requirements: *70227836596560
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: rake
28
- requirement: &70137844608900 !ruby/object:Gem::Requirement
28
+ requirement: &70227836595980 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ! '>='
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
- version_requirements: *70137844608900
36
+ version_requirements: *70227836595980
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: simplecov
39
- requirement: &70137844757700 !ruby/object:Gem::Requirement
39
+ requirement: &70227836595040 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ! '>='
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: '0'
45
45
  type: :development
46
46
  prerelease: false
47
- version_requirements: *70137844757700
47
+ version_requirements: *70227836595040
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: deepstruct
50
- requirement: &70137844911300 !ruby/object:Gem::Requirement
50
+ requirement: &70227836594380 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ! '>='
@@ -55,10 +55,10 @@ dependencies:
55
55
  version: '0'
56
56
  type: :runtime
57
57
  prerelease: false
58
- version_requirements: *70137844911300
58
+ version_requirements: *70227836594380
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: curb
61
- requirement: &70137845088040 !ruby/object:Gem::Requirement
61
+ requirement: &70227836593660 !ruby/object:Gem::Requirement
62
62
  none: false
63
63
  requirements:
64
64
  - - ~>
@@ -66,10 +66,10 @@ dependencies:
66
66
  version: 0.8.0
67
67
  type: :runtime
68
68
  prerelease: false
69
- version_requirements: *70137845088040
69
+ version_requirements: *70227836593660
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: yajl-ruby
72
- requirement: &70137845087440 !ruby/object:Gem::Requirement
72
+ requirement: &70227836628500 !ruby/object:Gem::Requirement
73
73
  none: false
74
74
  requirements:
75
75
  - - ! '>='
@@ -77,10 +77,10 @@ dependencies:
77
77
  version: '0'
78
78
  type: :runtime
79
79
  prerelease: false
80
- version_requirements: *70137845087440
80
+ version_requirements: *70227836628500
81
81
  - !ruby/object:Gem::Dependency
82
82
  name: queryparams
83
- requirement: &70137845086220 !ruby/object:Gem::Requirement
83
+ requirement: &70227836634040 !ruby/object:Gem::Requirement
84
84
  none: false
85
85
  requirements:
86
86
  - - ! '>='
@@ -88,10 +88,10 @@ dependencies:
88
88
  version: '0'
89
89
  type: :runtime
90
90
  prerelease: false
91
- version_requirements: *70137845086220
91
+ version_requirements: *70227836634040
92
92
  - !ruby/object:Gem::Dependency
93
93
  name: futurevalue
94
- requirement: &70137845085320 !ruby/object:Gem::Requirement
94
+ requirement: &70227836637420 !ruby/object:Gem::Requirement
95
95
  none: false
96
96
  requirements:
97
97
  - - ! '>='
@@ -99,10 +99,10 @@ dependencies:
99
99
  version: '0'
100
100
  type: :runtime
101
101
  prerelease: false
102
- version_requirements: *70137845085320
102
+ version_requirements: *70227836637420
103
103
  - !ruby/object:Gem::Dependency
104
104
  name: pathbuilder
105
- requirement: &70137845084560 !ruby/object:Gem::Requirement
105
+ requirement: &70227836642820 !ruby/object:Gem::Requirement
106
106
  none: false
107
107
  requirements:
108
108
  - - ! '>='
@@ -110,10 +110,10 @@ dependencies:
110
110
  version: '0'
111
111
  type: :runtime
112
112
  prerelease: false
113
- version_requirements: *70137845084560
113
+ version_requirements: *70227836642820
114
114
  - !ruby/object:Gem::Dependency
115
115
  name: nokogiri
116
- requirement: &70137845083420 !ruby/object:Gem::Requirement
116
+ requirement: &70227836646700 !ruby/object:Gem::Requirement
117
117
  none: false
118
118
  requirements:
119
119
  - - ! '>='
@@ -121,10 +121,10 @@ dependencies:
121
121
  version: '0'
122
122
  type: :runtime
123
123
  prerelease: false
124
- version_requirements: *70137845083420
124
+ version_requirements: *70227836646700
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: i18n
127
- requirement: &70137845082680 !ruby/object:Gem::Requirement
127
+ requirement: &70227836873840 !ruby/object:Gem::Requirement
128
128
  none: false
129
129
  requirements:
130
130
  - - ! '>='
@@ -132,10 +132,10 @@ dependencies:
132
132
  version: '0'
133
133
  type: :runtime
134
134
  prerelease: false
135
- version_requirements: *70137845082680
135
+ version_requirements: *70227836873840
136
136
  - !ruby/object:Gem::Dependency
137
137
  name: activesupport
138
- requirement: &70137845081960 !ruby/object:Gem::Requirement
138
+ requirement: &70227837080040 !ruby/object:Gem::Requirement
139
139
  none: false
140
140
  requirements:
141
141
  - - ! '>='
@@ -143,7 +143,7 @@ dependencies:
143
143
  version: '0'
144
144
  type: :runtime
145
145
  prerelease: false
146
- version_requirements: *70137845081960
146
+ version_requirements: *70227837080040
147
147
  description: Development tools for working with Pebblebed
148
148
  email:
149
149
  - katrina@bengler.no