phony 2.20.5 → 3.0.2

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.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +117 -0
  3. data/lib/phony/config.rb +25 -26
  4. data/lib/phony/countries/argentina.rb +311 -314
  5. data/lib/phony/countries/austria.rb +71 -72
  6. data/lib/phony/countries/bangladesh.rb +27 -28
  7. data/lib/phony/countries/belarus.rb +110 -111
  8. data/lib/phony/countries/brazil.rb +93 -93
  9. data/lib/phony/countries/cambodia.rb +9 -9
  10. data/lib/phony/countries/china.rb +22 -21
  11. data/lib/phony/countries/croatia.rb +6 -5
  12. data/lib/phony/countries/georgia.rb +84 -84
  13. data/lib/phony/countries/germany.rb +4067 -4068
  14. data/lib/phony/countries/guinea.rb +8 -8
  15. data/lib/phony/countries/india.rb +31 -34
  16. data/lib/phony/countries/indonesia.rb +57 -46
  17. data/lib/phony/countries/ireland.rb +4 -5
  18. data/lib/phony/countries/italy.rb +54 -52
  19. data/lib/phony/countries/japan.rb +456 -456
  20. data/lib/phony/countries/kyrgyzstan.rb +109 -109
  21. data/lib/phony/countries/latvia.rb +34 -34
  22. data/lib/phony/countries/libya.rb +109 -107
  23. data/lib/phony/countries/malaysia.rb +12 -12
  24. data/lib/phony/countries/moldova.rb +42 -42
  25. data/lib/phony/countries/montenegro.rb +24 -20
  26. data/lib/phony/countries/myanmar.rb +39 -39
  27. data/lib/phony/countries/namibia.rb +35 -29
  28. data/lib/phony/countries/nepal.rb +60 -62
  29. data/lib/phony/countries/netherlands.rb +13 -13
  30. data/lib/phony/countries/pakistan.rb +135 -111
  31. data/lib/phony/countries/paraguay.rb +135 -135
  32. data/lib/phony/countries/russia_kazakhstan_abkhasia_south_ossetia.rb +125 -128
  33. data/lib/phony/countries/saudi_arabia.rb +5 -5
  34. data/lib/phony/countries/serbia.rb +47 -39
  35. data/lib/phony/countries/somalia.rb +18 -18
  36. data/lib/phony/countries/south_korea.rb +16 -13
  37. data/lib/phony/countries/sweden.rb +356 -48
  38. data/lib/phony/countries/taiwan.rb +20 -19
  39. data/lib/phony/countries/tajikistan.rb +70 -70
  40. data/lib/phony/countries/turkmenistan.rb +65 -65
  41. data/lib/phony/countries/ukraine.rb +607 -607
  42. data/lib/phony/countries/united_kingdom.rb +66 -66
  43. data/lib/phony/countries/uruguay.rb +40 -41
  44. data/lib/phony/countries/vietnam.rb +19 -14
  45. data/lib/phony/countries/zimbabwe.rb +31 -31
  46. data/lib/phony/countries.rb +469 -447
  47. data/lib/phony/country.rb +44 -44
  48. data/lib/phony/country_codes.rb +67 -60
  49. data/lib/phony/dsl.rb +23 -26
  50. data/lib/phony/local_splitters/fixed.rb +23 -30
  51. data/lib/phony/local_splitters/regex.rb +30 -31
  52. data/lib/phony/national_code.rb +7 -10
  53. data/lib/phony/national_splitters/default.rb +9 -11
  54. data/lib/phony/national_splitters/dsl.rb +8 -18
  55. data/lib/phony/national_splitters/fixed.rb +12 -15
  56. data/lib/phony/national_splitters/none.rb +7 -11
  57. data/lib/phony/national_splitters/regex.rb +13 -17
  58. data/lib/phony/national_splitters/variable.rb +37 -38
  59. data/lib/phony/trunk_code.rb +20 -20
  60. data/lib/phony/vanity.rb +12 -13
  61. data/lib/phony.rb +84 -84
  62. metadata +9 -42
  63. data/README.textile +0 -116
  64. data/spec/functional/config_spec.rb +0 -44
  65. data/spec/functional/plausibility_spec.rb +0 -674
  66. data/spec/lib/phony/countries_spec.rb +0 -1454
  67. data/spec/lib/phony/country_codes_spec.rb +0 -227
  68. data/spec/lib/phony/country_spec.rb +0 -104
  69. data/spec/lib/phony/dsl_spec.rb +0 -28
  70. data/spec/lib/phony/local_splitters/fixed_spec.rb +0 -56
  71. data/spec/lib/phony/local_splitters/regex_spec.rb +0 -94
  72. data/spec/lib/phony/national_code_spec.rb +0 -61
  73. data/spec/lib/phony/national_splitters/default_spec.rb +0 -34
  74. data/spec/lib/phony/national_splitters/fixed_spec.rb +0 -45
  75. data/spec/lib/phony/national_splitters/none_spec.rb +0 -28
  76. data/spec/lib/phony/national_splitters/regex_spec.rb +0 -23
  77. data/spec/lib/phony/national_splitters/variable_spec.rb +0 -35
  78. data/spec/lib/phony/trunk_code_spec.rb +0 -85
  79. data/spec/lib/phony/vanity_spec.rb +0 -30
  80. data/spec/lib/phony_spec.rb +0 -70
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 443ce0ac52dcde0ab0b419d6c49123ac60fdb6525ce56df52c09102b2a1b79af
4
- data.tar.gz: 3db5d454a9c112ad429b1c0986379bae3230685bcc795aaedf5c0f7feba2a902
3
+ metadata.gz: 914522596278234ccd64fd27a07f0b32426738aa3b886233c14e5ca9469a99f9
4
+ data.tar.gz: 9fcbb9e8607a93d2271ff19f61215139a04f922b3f5bbfa1d309ae15b30222bb
5
5
  SHA512:
6
- metadata.gz: c0081748a294e804a1e1870dc40bc9e4359733f25f54e73dbbf2ad7fd01661af91e6724fa550dc61a29f4ff0c2f3b2b9161160657c852493e63afbdc839f7ae7
7
- data.tar.gz: 0f371abf103cd53b85093973e96cbf3ae91d9d44b3e4e1b7db51826ce2a9f818252d9774cdd81abcdcf5f893dd696cf2649b70a0e7960164e8f02b4ca8618088
6
+ metadata.gz: 17cda2331907984caf6a7a876bc7021efd08d2026082081412a93c8a93dad3211c44db1c785f7971fb645b1ee0dbfb0ac10a9849618eab8e045e667f50d7a1b2
7
+ data.tar.gz: d6702bd8f91fdb5aaa8a01715a12726df2a4937b9f59161ceb4951049309674aa3e9306c398fc3901b55a3a83f74a634a2aa52ea8670509645dfa5d7e05c6710
data/README.md ADDED
@@ -0,0 +1,117 @@
1
+ [![Build Status](https://secure.travis-ci.org/floere/phony.png)](http://travis-ci.org/floere/phony)
2
+ [![Coverage Status](https://coveralls.io/repos/floere/phony/badge.svg?branch=master)](https://coveralls.io/r/floere/phony?branch=master)
3
+ [![Code Climate](https://codeclimate.com/github/floere/phony.png)](https://codeclimate.com/github/floere/phony)
4
+ [![Inline docs](http://inch-ci.org/github/floere/phony.png)](http://inch-ci.org/github/floere/phony)
5
+
6
+ # Phony
7
+
8
+ Disclaimer: Phony works with international numbers only, such as `61 412 345 678`!
9
+
10
+ The (admittedly crazy) goal of this Gem is to be able to normalize/format/split all phone numbers in the world.
11
+
12
+ Used in: [airbnb.com](http://airbnb.com), [socialcam.com](http://socialcam.com), [zendesk.com](http://www.zendesk.com/) (and many, many others).
13
+
14
+ ## Runtime Memory Usage {#memory}
15
+
16
+ According to [memory_profiler](https://github.com/SamSaffron/memory_profiler), the Phony gem uses roughly 1MB of memory per Ruby process.
17
+ Usage was generated using (look for `Total retained`): `ruby -e 'require "memory_profiler"; MemoryProfiler.report(allow_files: "phony"){ require "phony" }.pretty_print'`
18
+
19
+ ## Description
20
+
21
+ This gem normalizes, formats and splits "**E164 phone numbers**". A valid E164 phone number **must** include a country code.
22
+
23
+ E164 numbers are international numbers with a country dial prefix, usually an area code and a subscriber number. For example, the Australian number `+61 412 345 678` can be broken down into the following components:
24
+ * Country Code (CC): a country code of `61`
25
+ * National Destination Code (NDC): a mobile number denoted by the `4` (specific to Australia)
26
+ * Local Number Part: a subscriber number of `12 345 678`
27
+
28
+ It currently handles the countries listed at the end of this README.
29
+
30
+ It is covered by roughly 2,250 tests that run in 2 seconds (April 2019).
31
+ If it doesn't work, please [enter an issue](http://github.com/floere/phony/issues) or better, fork and [send a pull request](http://github.com/floere/phony/pulls).
32
+
33
+ ## Installation
34
+
35
+ With Rails? Check out: https://github.com/joost/phony_rails.
36
+
37
+ With Bundler: Append `gem 'phony'` to your `Gemfile` and `bundle install` it.
38
+
39
+ Without Bundler: Run `gem install phony` from your command line.
40
+
41
+ ## Usage docs {#usage}
42
+
43
+ Phony uses [qed](https://github.com/rubyworks/qed) as docs and to run its functional tests. Start here for usage docs: [Usage index](./qed/index.md).
44
+
45
+ ### Phony.normalize(number) {#normalizing}
46
+
47
+ Normalize intelligently removes all non-numeric characters of a number. Do it before storing a number in a DB.
48
+
49
+ [Phony.normalize docs](./qed/normalize.md)
50
+
51
+ `Phony.normalize('1-888-407-4747').assert == '18884074747'`
52
+
53
+ ### Phony.format(number, options = {}) {#formatting}
54
+
55
+ Format formats a normalized number according to a country's predominant formatting. Lots of options for int'l, national, local formatting.
56
+
57
+ [Phony.format docs](./qed/format.md)
58
+
59
+ `Phony.format('41443643532').assert == '+41 44 364 35 32'`
60
+
61
+ ### Phony.plausible?(number, options = {}) {#plausibility}
62
+
63
+ Is a number plausible?
64
+
65
+ [Phony.plausible? docs](./qed/plausibility.md)
66
+
67
+ `Phony.assert.plausible?('+41 44 111 22 33')`
68
+
69
+ ### Phony.split(number) {#splitting}
70
+
71
+ Split a number into its parts: CC, NDC, local.
72
+
73
+ [Phony.split docs](./qed/split.md)
74
+
75
+ `Phony.split('3928061371').assert == ['39', '2', '806', '1371']`
76
+
77
+ NB If a country does not have an NDC, `#split` will return `false` in the NDC position, for example for Denmark:
78
+
79
+ `Phony.split('4512121212').assert == ['45', false, '12', '12', '12', '12']`
80
+
81
+ ### Loading only a country subset (Phony 2.18.0+). {#loading}
82
+
83
+ Use this in case you'd like to save [memory](#memory) that is used by Phony's CC rules.
84
+
85
+ [Phony::Config.load docs](./qed/config.md)
86
+
87
+ First, `require 'phony/config'`.
88
+ Then, one of the following, which will load the rest of Phony.
89
+
90
+ Load only these CCs:
91
+ `Phony::Config.load(only: ['41', '44'])`
92
+
93
+ Loads everything except these CCs:
94
+ `Phony::Config.load(except: ['41', '44'])`
95
+
96
+ Convenience form of `only`:
97
+ `Phony::Config.load('41', '44')`
98
+
99
+ Each of these loads the rest of Phony.
100
+
101
+ Memory usage can be checked using (look for `Total retained`):
102
+ `ruby -e 'require "memory_profiler"; MemoryProfiler.report(allow_files: "phony"){ require "phony/config"; Phony::Config.load("1") }.pretty_print'`
103
+ For example, when just loading the NANP CC, the retained memory usage is ~63kB.
104
+
105
+ ## List of Handled Countries
106
+
107
+ Mildly unmaintained list: Abhas, Afghan, Algerian, Argentina, Austrian, Australian, Azerbaijani, Belgian, Brazilian, Cambodian, Chilean, Chinese, Croatian, Cuban, Cypriot, Czech, Danish, Dutch, Egyptian, El Salvadorian, Estonian, French, German, Ghanan, Gibraltar, Greek, Haiti, Hong Kong, Hungarian, Indian, Iran, Irish, Israel, Italian, Japanese, Kazakh, Liberian, Lithuanian, Luxembourgian, Malaysian, Malta, Mauritian, Mexican, Monaco, Morocco, New Zealand, Nigerian, Norwegian, Peruvian, Polish, Romanian, Russian, Rwandan, Seychelles, Singapore, Slovakian, South African, South Korean, South Osetian, Spanish, Sri Lankan, Sudan, Swedish, Swiss, Thailand, Tunisian, Turkish, Liechtenstein, UK, US, Venezuelan, Vietnamese, and Zambian numbers.
108
+
109
+ ## Proud Sponsors
110
+
111
+ * Renuo AG (July 2022 – January 2025): [Github](https://github.com/renuo), [Homepage](https://www.renuo.ch). Much appreciated!
112
+
113
+ ## License
114
+
115
+ MIT.
116
+ See [LICENSE](./LICENSE) file.
117
+
data/lib/phony/config.rb CHANGED
@@ -1,53 +1,53 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Phony
4
-
5
4
  # Add config.
6
5
  class << self
7
6
  attr_writer :config
8
-
7
+
9
8
  def config
10
9
  # Default config includes all CCs.
11
10
  @config ||= Config.new([], [])
12
11
  end
13
12
  end
14
-
13
+
15
14
  # The Config class is only used to configure Phony and to load specific
16
15
  # subsets of CCs.
17
16
  #
18
17
  class Config
19
-
20
18
  attr_reader :included_ccs, :excluded_ccs
21
-
22
- def initialize included_ccs, excluded_ccs
19
+
20
+ def initialize(included_ccs, excluded_ccs)
23
21
  @included_ccs = included_ccs || []
24
22
  @excluded_ccs = excluded_ccs || []
25
23
  end
26
-
27
- def load? cc
24
+
25
+ def load?(cc)
28
26
  return false if has_excluded? && excluded_ccs.include?(cc)
29
-
27
+
30
28
  if has_included?
31
29
  # We have to check the included_ccs, otherwise false.
32
30
  return true if included_ccs.include?(cc)
33
-
31
+
34
32
  false
35
33
  else
36
34
  # It's not in excluded and no included was given.
37
35
  true
38
36
  end
39
37
  end
38
+
40
39
  def has_included?
41
40
  !included_ccs.empty?
42
41
  end
42
+
43
43
  def has_excluded?
44
44
  !excluded_ccs.empty?
45
45
  end
46
-
46
+
47
47
  # Use as follows:
48
48
  #
49
49
  # require 'phony/config'
50
- #
50
+ #
51
51
  # # Load only these:
52
52
  # Phony::Config.load(only: ['41', '44'])
53
53
  # # or all except these:
@@ -61,31 +61,30 @@ module Phony
61
61
  # Extract options.
62
62
  last = options.last
63
63
  only, except = if last.respond_to?(:to_hash)
64
- # We have the explicit form.
65
- [last[:only], last[:except]]
66
- elsif options.respond_to?(:to_ary)
67
- # We have the convenience short forms.
68
- [options, []]
69
- end
70
-
64
+ # We have the explicit form.
65
+ [last[:only], last[:except]]
66
+ elsif options.respond_to?(:to_ary)
67
+ # We have the convenience short forms.
68
+ [options, []]
69
+ end
70
+
71
71
  # Set defaults.
72
72
  only, except = [only || [], except || []]
73
73
  # Convert to expected format if possible.
74
74
  only, except = [only.map(&:to_s), except.map(&:to_s)]
75
-
75
+
76
76
  # Check params.
77
77
  raise "Params given to Phony::Config.load must be Array-like. The one given was: #{only}" unless only.respond_to?(:to_ary)
78
78
  raise "Params given to Phony::Config.load must be Array-like. The one given was: #{except}" unless except.respond_to?(:to_ary)
79
-
79
+
80
80
  # Configure Phony.
81
81
  Phony.config = new(only, except)
82
-
82
+
83
83
  # Load phony.
84
- Kernel.load File.expand_path('../../phony.rb', __FILE__)
85
-
84
+ Kernel.load File.expand_path('../phony.rb', __dir__)
85
+
86
86
  # Return the stored config data.
87
87
  Phony.config
88
88
  end
89
-
90
89
  end
91
- end
90
+ end