pebblebed 0.0.13 → 0.0.16

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.
@@ -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