phony 2.0.0 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NzVjNGJlYTgwN2Q5NzFmODAzYzY5YjUzZmVkY2FkNjc2MjRkOTQwMg==
4
+ NGI2NWU3NWFlYjc4MmE5Y2EyYTdlYmFhYmM4Yzg2MjNmNWRkYzhlMw==
5
5
  data.tar.gz: !binary |-
6
- MjdjMWU2ZjBiODg2YjE2MThiNGQyZDlkODE2OGM1MGJkNjAyNTE0NA==
6
+ MGI0NTI1ZTRjYzg1ZGU4OTc0NTA0ZmM5NmYzM2U4NzQ5ZTk4NjIxOA==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- ZTM3NDM2MGM3MjVhZmVjYjBjZTQ0YTEwNmEzYWUwMDk4NDRhNDZlNDU0NjU0
10
- ODRjZTQ4ZTQ0YTA1NjAxMzlkODQyOTJiMzFkYTZmYWYzYmNiNGNkZWMxZmIx
11
- MjQyYzUwNWE2MTMxNDJkZDU3MTY5MTY1MmRjZTg4ZTExOGQ1MTA=
9
+ YjllNWExZjBhNTk5YTNjMTM5NjYxMTJlZDNmNmM5MjAxNDE1NzgwNzEyNDFi
10
+ OGU2ZWZhMTY5MmYyY2Q5YTVkNmIzODc1YTViMDMyMzg0ZTcxZTJjZTVlYzc2
11
+ Zjk2NTQwOTNmNDJkZGExMzAyMTk4ODgyNzQxODM1ZjM2ZjM3ZDU=
12
12
  data.tar.gz: !binary |-
13
- MjY4Zjk0MjdjNWQ1NzZmNjEyMjQyMzhjY2M5YTNjZTA5MDlmMDY2NjI4MmRk
14
- ZTY2ZjdhY2U2ZDNhZjZlMTJlMDY4NGM2OGRlMTI1ZTIzYzI1YjU5ZjdlNDVm
15
- YmE0Njk0NGI4NDRhYTAzYmQ1ZTI0MDYzMThmYzQ1MzkyMGU1MTE=
13
+ ZTE5NzRjMzBlZWMwMzkxNDNmZTE0ZTQ5NDc4ZTdlMTI1ZDQwNzUxNTNkODNh
14
+ NjM0M2UxNWE4MmRhZGY4ZGZiMWFlNzEwNGVmOGI4OTIwMmZjZGI2NTcxNWNm
15
+ NDhmZjI2NTJmZDdlZTNjZGE5ODViOWM0MjczNjNhMGFiYzRhYjg=
data/lib/phony.rb CHANGED
@@ -11,6 +11,7 @@ require File.expand_path '../phony/national_splitters/default', __FILE__
11
11
  require File.expand_path '../phony/national_splitters/none', __FILE__
12
12
  require File.expand_path '../phony/national_code', __FILE__
13
13
  require File.expand_path '../phony/country', __FILE__
14
+ require File.expand_path '../phony/trunk_code', __FILE__
14
15
  require File.expand_path '../phony/country_codes', __FILE__
15
16
 
16
17
  require File.expand_path '../phony/dsl', __FILE__
@@ -20,7 +20,7 @@
20
20
  # Note: The ones that are commented are defined in their special files.
21
21
  #
22
22
  Phony.define do
23
-
23
+
24
24
  # Reserved.
25
25
  #
26
26
  country '0', fixed(1) >> split(10) # Reserved.
@@ -28,9 +28,9 @@ Phony.define do
28
28
  # USA, Canada, etc.
29
29
  #
30
30
  country '1',
31
- fixed(3, :zero => false) >> trunk('1') >> split(3,4),
32
- # invalid_ndcs('911'), # /911/ would also work.
33
- :invalid_ndcs => ['911'] # TODO
31
+ trunk('1') |
32
+ fixed(3, :zero => false) >> split(3,4),
33
+ :invalid_ndcs => ['911']
34
34
 
35
35
  # Kazakhstan (Republic of) & Russsian Federation.
36
36
  # also Abhasia and South Osetia autonomous regions / recognized by some states as independent countries
@@ -51,16 +51,17 @@ Phony.define do
51
51
  # Greece. http://www.numberingplans.com/?page=dialling&sub=areacodes
52
52
  # https://www.numberingplans.com/?page=plans&sub=phonenr&alpha_2_input=GR
53
53
  country '30',
54
- one_of(%w(231 241 251 261 271 281)) >> split(3,4) |
55
- one_of('800') >> split(3,4) | # freephone
56
- one_of(%w(801 807)) >> split(3,4) | # shared cost, premium rate
57
- one_of('896') >> split(3,4) | # ISP
58
- one_of(%w(901 909)) >> split(3,4) | # premium rate
59
- one_of(%w(21 22 23 24 25 26 27 28)) >> split(4,4) |
60
- one_of('50') >> split(4,4) | # VPN
61
- one_of('69') >> split(4,4) | # mobile, pager
62
- one_of('70') >> split(4,4) | # universal access
63
- fixed(4) >> split(6) # 3-digit NDCs
54
+ trunk('0') |
55
+ one_of(%w(231 241 251 261 271 281)) >> split(3,4) |
56
+ one_of('800') >> split(3,4) | # freephone
57
+ one_of(%w(801 807)) >> split(3,4) | # shared cost, premium rate
58
+ one_of('896') >> split(3,4) | # ISP
59
+ one_of(%w(901 909)) >> split(3,4) | # premium rate
60
+ one_of(%w(21 22 23 24 25 26 27 28)) >> split(4,4) |
61
+ one_of('50') >> split(4,4) | # VPN
62
+ one_of('69') >> split(4,4) | # mobile, pager
63
+ one_of('70') >> split(4,4) | # universal access
64
+ fixed(4) >> split(6) # 3-digit NDCs
64
65
 
65
66
  # country '31' # Netherlands, see special file.
66
67
 
@@ -83,9 +84,10 @@ Phony.define do
83
84
  # Hungary.
84
85
  #
85
86
  country '36',
86
- one_of('104','105','107','112') >> trunk('06') >> split(3,3) | # Service
87
- one_of('1') >> trunk('06') >> split(3,4) | # Budapest
88
- fixed(2) >> trunk('06') >> split(3,4) # 2-digit NDCs
87
+ trunk('06') |
88
+ one_of('104','105','107','112') >> split(3,3) | # Service
89
+ one_of('1') >> split(3,4) | # Budapest
90
+ fixed(2) >> split(3,4) # 2-digit NDCs
89
91
 
90
92
  # country '39' # Italy, see special file.
91
93
 
@@ -340,8 +342,8 @@ Phony.define do
340
342
  # http://en.wikipedia.org/wiki/Telephone_numbers_in_Rwanda
341
343
  country '250',
342
344
  one_of('25') >> split(7) | # Geographic, fixed
343
- match(/^(7[238])/) >> split(7) | # Non-geographic, mobile
344
- one_of('06') >> split(6) # Satellite
345
+ match(/^(7[238])/) >> split(7) | # Non-geographic, mobile
346
+ one_of('06') >> split(6) # Satellite
345
347
 
346
348
  country '251', fixed(2) >> split(3, 4) # Ethiopia http://www.wtng.info/wtng-251-et.html
347
349
 
@@ -352,8 +354,9 @@ Phony.define do
352
354
  # Kenya
353
355
  # http://en.wikipedia.org/wiki/Telephone_numbers_in_Kenya
354
356
  country '254',
355
- match(/^(7\d\d)/) >> split(6) | # mobile
356
- fixed(2) >> split(7) # landline
357
+ trunk('0') |
358
+ match(/^(7\d\d)/) >> split(6) | # mobile
359
+ fixed(2) >> split(7) # landline
357
360
 
358
361
  # Tanzania.
359
362
  #
@@ -562,11 +565,12 @@ Phony.define do
562
565
  # Lithuania
563
566
  #
564
567
  country '370',
565
- one_of('700', '800') >> trunk('8') >> split(2,3) | # Service
566
- match(/^(6\d\d)\d+$/) >> trunk('8') >> split(2,3) | # Mobile
567
- one_of('5') >> trunk('8') >> split(3,2,2) | # Vilnius
568
- one_of('37','41') >> trunk('8') >> split(2,2,2) | # Kaunas, Šiauliai
569
- fixed(3) >> trunk('8') >> split(1,2,2) # 3-digit NDCs.
568
+ trunk('8') |
569
+ one_of('700', '800') >> split(2,3) | # Service
570
+ match(/^(6\d\d)\d+$/) >> split(2,3) | # Mobile
571
+ one_of('5') >> split(3,2,2) | # Vilnius
572
+ one_of('37','41') >> split(2,2,2) | # Kaunas, Šiauliai
573
+ fixed(3) >> split(1,2,2) # 3-digit NDCs.
570
574
 
571
575
  # country '371' # Latvia, see special file
572
576
 
@@ -152,8 +152,9 @@ service = [ # Not exhaustive.
152
152
  ]
153
153
 
154
154
  Phony.define do
155
- country '39', one_of(*service) >> trunk('0', normalize: false) >> split(3,3) |
156
- one_of(*mobile) >> trunk('0', normalize: false) >> split(3,4) |
157
- one_of(*ndcs_2digit) >> trunk('0', normalize: false) >> split(4,4) |
158
- one_of(*ndcs, :max_length => 3) >> trunk('0', normalize: false) >> split(3,4)
155
+ country '39', trunk('0', :normalize => false) |
156
+ one_of(*service) >> split(3,3) |
157
+ one_of(*mobile) >> split(3,4) |
158
+ one_of(*ndcs_2digit) >> split(4,4) |
159
+ one_of(*ndcs, :max_length => 3) >> split(3,4)
159
160
  end
@@ -33,8 +33,9 @@ ndcs_with_5_subscriber_numbers = %w(
33
33
  ndcs_with_6_subscriber_numbers = %w(67)
34
34
 
35
35
  Phony.define do
36
- country '371',
37
- one_of(ndcs_with_5_subscriber_numbers) >> trunk('8') >> split(3,2) |
38
- one_of(ndcs_with_6_subscriber_numbers) >> trunk('8') >> split(3,3) |
39
- fixed(3) >> trunk('8') >> split(3,2)
36
+ country '371',
37
+ trunk('8', :normalize => false) |
38
+ one_of(ndcs_with_5_subscriber_numbers) >> split(3,2) |
39
+ one_of(ndcs_with_6_subscriber_numbers) >> split(3,3) |
40
+ fixed(3) >> split(3,2)
40
41
  end
@@ -51,8 +51,9 @@ service = [
51
51
  ]
52
52
 
53
53
  Phony.define do
54
- country '31', one_of(service) >> split(3,3) |
55
- one_of('6') >> split(2,2,2,2) | # mobile
56
- one_of(ndcs) >> split(3,4) | # landline (geographic region)
57
- fixed(3) >> split(3,3) # 3 digit ndc
54
+ country '31',
55
+ one_of(service) >> split(3,3) |
56
+ one_of('6') >> split(2,2,2,2) | # mobile
57
+ one_of(ndcs) >> split(3,4) | # landline (geographic region)
58
+ fixed(3) >> split(3,3) # 3 digit ndc
58
59
  end
@@ -117,16 +117,12 @@ ndcs_with_7_subscriber_digits = %w(342 343 347 351 383 391 473 495 496 498 499 8
117
117
  )
118
118
 
119
119
  Phony.define do
120
- country '7', one_of(ndcs_with_5_subscriber_digits) >> trunk('8') >> split(1, 2, 2) |
121
- one_of(ndcs_with_6_subscriber_digits) >> trunk('8') >> split(2, 2, 2) |
122
- one_of(ndcs_with_7_subscriber_digits) >> trunk('8') >> split(3, 2, 2) |
123
- one_of(%w(800)) >> trunk('8') >> split(3, 2, 2) | # Russia free number
124
- one_of(%w(995344 9971 99744 9976 997)) >> trunk('8') >> split(2, 2, 2) | # South Osetia
125
-
126
- # The two following lines have been replaced by fixed(3).
127
- #
128
- # match(/([67]\d{2})/) >> split(2, 2, 2) | # Kazakhstan: (600..799)
129
- # one_of(%w(840 940)) >> split(2,2,2) # Abhasia
130
-
131
- fixed(3) >> trunk('8') >> split(2,2,3) # TODO 2,2,3 or 2,2,2?
120
+ country '7',
121
+ trunk('8') |
122
+ one_of(ndcs_with_5_subscriber_digits) >> split(1, 2, 2) |
123
+ one_of(ndcs_with_6_subscriber_digits) >> split(2, 2, 2) |
124
+ one_of(ndcs_with_7_subscriber_digits) >> split(3, 2, 2) |
125
+ one_of(%w(800)) >> split(3, 2, 2) | # Russia free number
126
+ one_of(%w(995344 9971 99744 9976 997)) >> split(2, 2, 2) | # South Osetia
127
+ fixed(3) >> split(2, 2, 3)
132
128
  end
@@ -67,10 +67,11 @@ ndcs_with_3_subscriber_digits = %w(331700)
67
67
 
68
68
  Phony.define do
69
69
  country '992',
70
- one_of(ndcs_with_3_subscriber_digits) >> trunk('8') >> split(3) |
71
- one_of(ndcs_with_5_subscriber_digits) >> trunk('8') >> split(3,2) |
72
- one_of(ndcs_with_6_subscriber_digits) >> trunk('8') >> split(3,3) |
73
- match(/\A(505|9\d\d)\d+\z/) >> trunk('8') >> split(3,3) | # mobile
74
- one_of(%w(446 474 487)) >> trunk('8') >> split(3,3) | # wireless geographic
75
- fixed(3) >> trunk('8') >> split(3,3)
70
+ trunk('8') |
71
+ one_of(ndcs_with_3_subscriber_digits) >> split(3) |
72
+ one_of(ndcs_with_5_subscriber_digits) >> split(3,2) |
73
+ one_of(ndcs_with_6_subscriber_digits) >> split(3,3) |
74
+ match(/\A(505|9\d\d)\d+\z/) >> split(3,3) | # mobile
75
+ one_of(%w(446 474 487)) >> split(3,3) | # wireless geographic
76
+ fixed(3) >> split(3,3)
76
77
  end
@@ -65,9 +65,10 @@ ndcs_with_4_subscriber_digits = %w(1392)
65
65
 
66
66
  Phony.define do
67
67
  country '993',
68
- one_of(ndcs_with_4_subscriber_digits) >> trunk('8') >> split(4) |
69
- one_of(ndcs_with_5_subscriber_digits) >> trunk('8') >> split(3,2) |
70
- one_of(ndcs_with_6_subscriber_digits) >> trunk('8') >> split(3,3) |
71
- one_of('6') >> trunk('8') >> split(3,4) | # mobile
72
- fixed(3) >> trunk('8') >> split(3,2)
68
+ trunk('8') |
69
+ one_of(ndcs_with_4_subscriber_digits) >> split(4) |
70
+ one_of(ndcs_with_5_subscriber_digits) >> split(3,2) |
71
+ one_of(ndcs_with_6_subscriber_digits) >> split(3,3) |
72
+ one_of('6') >> split(3,4) | # mobile
73
+ fixed(3) >> split(3,2)
73
74
  end
@@ -34,14 +34,19 @@ module Phony
34
34
  # We can't know from what country that person was calling, so we
35
35
  # can't remove the intl' call prefix.
36
36
  #
37
- @@basic_normalizing_pattern = /^00?|\D/
37
+ # We remove:
38
+ # * 0 or 00 at the very beginning.
39
+ # * (0) anywhere.
40
+ # * Non-digits.
41
+ #
42
+ @@basic_cleaning_pattern = /^00?|\(0\)|\D/
38
43
  def clean number
39
44
  clean! number && number.dup
40
45
  end
41
46
  def clean! number
42
47
  # Remove non-digit chars.
43
48
  #
44
- number.gsub!(@@basic_normalizing_pattern, EMPTY_STRING) || number
49
+ number.gsub!(@@basic_cleaning_pattern, EMPTY_STRING) || number
45
50
  end
46
51
  def normalize number, options = {}
47
52
  clean! number
data/lib/phony/dsl.rb CHANGED
@@ -54,25 +54,10 @@ module Phony
54
54
  Phony::CountryCodes.instance.add country_code, definition
55
55
  end
56
56
 
57
- class Trunk
58
-
59
- def initialize code, options = {}
60
- @code = code
61
- @normalize = options[:normalize]
62
- end
63
-
64
- def national_splitter= national_splitter
65
- @national_splitter = national_splitter
66
- end
67
-
68
- def >> local_splitter
69
- @national_splitter.country_for local_splitter, @normalize, @code
70
- end
71
-
72
- end
73
-
57
+ #
58
+ #
74
59
  def trunk code, options = {}
75
- Trunk.new code, options
60
+ TrunkCode.new code, options
76
61
  end
77
62
 
78
63
  # National matcher & splitters.
@@ -150,7 +135,7 @@ module Phony
150
135
  # This country still uses a default NDC (and needs to be done, hence the todo).
151
136
  #
152
137
  def todo
153
- none >> NationalSplitters::Default.instance_for
138
+ none >> split(10)
154
139
  end
155
140
 
156
141
  # Local splitters.
@@ -59,7 +59,7 @@ module Phony
59
59
  end
60
60
  end
61
61
 
62
- # TODO Fix length fudging.
62
+ #
63
63
  #
64
64
  def plausible? rest, hints = {}
65
65
  @length === rest.inject(0) { |total, part| total + part.size }
@@ -8,12 +8,9 @@ module Phony
8
8
 
9
9
  #
10
10
  #
11
- def initialize national_splitter, local_splitter, normalize = nil, trunk_code = '0'
11
+ def initialize national_splitter, local_splitter
12
12
  @national_splitter = national_splitter
13
13
  @local_splitter = local_splitter
14
- @normalize = normalize != false
15
- @trunk_code = trunk_code
16
- @trunk_code_replacement = /\A#{@trunk_code}+/
17
14
  end
18
15
 
19
16
  # Split gets a number without country code and splits it into
@@ -30,8 +27,7 @@ module Phony
30
27
  # Note: Some cases, like Italy, don't remove the relative zero.
31
28
  #
32
29
  def normalize national_number
33
- return national_number unless @normalize
34
- national_number.gsub(@trunk_code_replacement, EMPTY_STRING)
30
+ national_number.gsub(/\A0+/, EMPTY_STRING)
35
31
  end
36
32
 
37
33
  end
@@ -10,15 +10,15 @@ module Phony
10
10
  #
11
11
  def >> local_splitter
12
12
  if local_splitter.respond_to? :split
13
- country_for local_splitter, true
13
+ country_for local_splitter
14
14
  else
15
15
  local_splitter.national_splitter = self
16
16
  local_splitter
17
17
  end
18
18
  end
19
19
 
20
- def country_for local_splitter, with_zero, trunk = '0'
21
- Phony::Country.new Phony::NationalCode.new(self, local_splitter, with_zero, trunk)
20
+ def country_for local_splitter
21
+ Phony::Country.new Phony::NationalCode.new(self, local_splitter)
22
22
  end
23
23
 
24
24
  end
@@ -0,0 +1,35 @@
1
+ module Phony
2
+
3
+ class TrunkCode
4
+
5
+ def initialize code, options = {}
6
+ @trunk_code_replacement = /\A#{code}+/
7
+ @normalize = options[:normalize] != false
8
+ @split = options[:split]
9
+ end
10
+
11
+ # Prepends itself to the other codes.
12
+ #
13
+ def | other
14
+ other.codes.unshift self
15
+ other
16
+ end
17
+
18
+ # Split gets a number without country code and splits it into
19
+ # its parts.
20
+ #
21
+ def split national_number
22
+ national_number.gsub! @trunk_code_replacement, EMPTY_STRING if @split
23
+ return [@code, national_number]
24
+ end
25
+
26
+ # Never normalizes.
27
+ #
28
+ def normalize national_number
29
+ return national_number unless @normalize
30
+ national_number.gsub @trunk_code_replacement, EMPTY_STRING
31
+ end
32
+
33
+ end
34
+
35
+ end
@@ -56,36 +56,36 @@ describe Phony::NationalCode do
56
56
  @national.normalize('142278186').should == '142278186'
57
57
  end
58
58
  end
59
- context 'normalizing' do
60
- context 'false' do
61
- before(:each) do
62
- @national = Phony::NationalCode.new nil, nil, false
63
- end
64
- it 'normalizes an italian case correctly' do
65
- @national.normalize('0909709511').should == '0909709511'
66
- end
67
- end
68
- context 'true' do
69
- before(:each) do
70
- national_splitter = Phony::NationalSplitters::Fixed.instance_for 2
71
- local_splitter = Phony::LocalSplitters::Fixed.instance_for [3, 2, 2]
72
- @national = Phony::NationalCode.new national_splitter, local_splitter, true
73
- end
74
- it 'normalizes a swiss case correctly' do
75
- @national.normalize('044364353').should == '44364353'
76
- end
77
- end
78
- context 'nil (true)' do
79
- before(:each) do
80
- national_splitter = Phony::NationalSplitters::Fixed.instance_for 2
81
- local_splitter = Phony::LocalSplitters::Fixed.instance_for [3, 2, 2]
82
- @national = Phony::NationalCode.new national_splitter, local_splitter, nil
83
- end
84
- it 'normalizes a swiss case correctly' do
85
- @national.normalize('044364353').should == '44364353'
86
- end
87
- end
88
- end
59
+ # context 'normalizing' do
60
+ # context 'false' do
61
+ # before(:each) do
62
+ # @national = Phony::NationalCode.new nil, nil, false
63
+ # end
64
+ # it 'normalizes an italian case correctly' do
65
+ # @national.normalize('0909709511').should == '0909709511'
66
+ # end
67
+ # end
68
+ # context 'true' do
69
+ # before(:each) do
70
+ # national_splitter = Phony::NationalSplitters::Fixed.instance_for 2
71
+ # local_splitter = Phony::LocalSplitters::Fixed.instance_for [3, 2, 2]
72
+ # @national = Phony::NationalCode.new national_splitter, local_splitter, true
73
+ # end
74
+ # it 'normalizes a swiss case correctly' do
75
+ # @national.normalize('044364353').should == '44364353'
76
+ # end
77
+ # end
78
+ # context 'nil (true)' do
79
+ # before(:each) do
80
+ # national_splitter = Phony::NationalSplitters::Fixed.instance_for 2
81
+ # local_splitter = Phony::LocalSplitters::Fixed.instance_for [3, 2, 2]
82
+ # @national = Phony::NationalCode.new national_splitter, local_splitter, nil
83
+ # end
84
+ # it 'normalizes a swiss case correctly' do
85
+ # @national.normalize('044364353').should == '44364353'
86
+ # end
87
+ # end
88
+ # end
89
89
  end
90
90
 
91
91
  end
@@ -440,6 +440,13 @@ describe 'validations' do
440
440
  #'+850 2 8801 1234 5678 1256',
441
441
  '+850 191 123 4567']
442
442
  it_is_correct_for 'Kuwait (State of)', :samples => ['+965 2345 6789', '+965 181 2345' ]
443
+ it_is_correct_for 'Kenya', :samples => [
444
+ '254201234567',
445
+ '254111234567',
446
+ '254723100220',
447
+ '+254-20-4262 140',
448
+ '+254-(0)20-4262 140'
449
+ ]
443
450
  it_is_correct_for 'Kyrgyzstan', :samples => ['+996 312 212 345',
444
451
  '+996 315 212 345',
445
452
  '+996 3131 212 34',
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: phony
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Florian Hanke
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-11 00:00:00.000000000 Z
11
+ date: 2013-12-15 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: ! 'Fast international phone number (E164 standard) normalizing, splitting
14
14
  and formatting. Lots of formatting options: International (+.., 00..), national
@@ -67,6 +67,7 @@ files:
67
67
  - lib/phony/national_splitters/none.rb
68
68
  - lib/phony/national_splitters/regex.rb
69
69
  - lib/phony/national_splitters/variable.rb
70
+ - lib/phony/trunk_code.rb
70
71
  - lib/phony/vanity.rb
71
72
  - lib/phony.rb
72
73
  - README.textile