mini_phone 1.0.4 → 1.1.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.
- checksums.yaml +4 -4
- data/Dockerfile.dev +9 -0
- data/Gemfile +2 -0
- data/README.md +17 -15
- data/Rakefile +18 -0
- data/debug/memory_plot/memory.rb +33 -0
- data/debug/memory_plot/plot.sh +6 -0
- data/ext/mini_phone/mini_phone.cc +149 -57
- data/lib/mini_phone/version.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 45a73dd6dde16c5baff08c0d9cf225e4bb53ae15b8b040559e4555180070e8d1
|
4
|
+
data.tar.gz: cbb196644cb95f7cf3a46648c176e22845708f5e3bab14256a8d80832e187175
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b95b0e2e18d15b7cf7c17e901a85d0b42f2e5fd6d9947f6d0e63a97197c86b39ce8f6341669e67ab69a07a6356b336f3cf4659a328a9c603a6d03856ac7c325b
|
7
|
+
data.tar.gz: 5db0ebb434cd3d427ae511e2a3e8bad13bcc7520c1147e1d7a8fafbf06c3213ae8521b30234b7691d0f06f634e0a503912bf638820f7dd37750ea12838944cf3
|
data/Dockerfile.dev
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
FROM ruby:2.7-alpine
|
2
|
+
|
3
|
+
WORKDiR /app
|
4
|
+
|
5
|
+
# RUN apt-get update -y && apt-get install -y valgrind libphonenumber
|
6
|
+
RUN apk add --no-cache libphonenumber-dev valgrind git make libffi-dev build-base
|
7
|
+
COPY Gemfile Gemfile.lock mini_phone.gemspec ./
|
8
|
+
COPY lib/mini_phone/version.rb ./lib/mini_phone/version.rb
|
9
|
+
RUN bundle install -j4
|
data/Gemfile
CHANGED
@@ -7,6 +7,8 @@ gemspec
|
|
7
7
|
|
8
8
|
gem 'rake', require: false
|
9
9
|
# https://github.com/rake-compiler/rake-compiler/pull/166
|
10
|
+
gem 'get_process_mem', require: false
|
11
|
+
gem 'pry', require: false
|
10
12
|
gem 'rake-compiler', github: 'larskanis/rake-compiler', branch: 'fix-native-version'
|
11
13
|
gem 'rspec', '~> 3.0', require: false
|
12
14
|
gem 'rspec-github', require: false
|
data/README.md
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
# MiniPhone
|
2
2
|
|
3
|
-
A Ruby gem which plugs directly
|
4
|
-
[libphonenumber](https://github.com/google/libphonenumber) for
|
3
|
+
A Ruby gem which plugs directly into Google's native C++
|
4
|
+
[libphonenumber](https://github.com/google/libphonenumber) for extremely
|
5
5
|
_fast_ and _robust_ phone number parsing, validation, and formatting. On
|
6
|
-
average, most methods are 40x
|
6
|
+
average, most methods are 40x to 50x faster than other Ruby phone number
|
7
7
|
libraries.
|
8
8
|
|
9
9
|
## Usage
|
@@ -23,10 +23,12 @@ MiniPhone.default_country = 'US'
|
|
23
23
|
|
24
24
|
phone_number = MiniPhone.parse('404-384-1399')
|
25
25
|
|
26
|
-
phone_number.e164
|
27
|
-
phone_number.national
|
28
|
-
phone_number.
|
29
|
-
phone_number.
|
26
|
+
phone_number.e164 # +14043841399
|
27
|
+
phone_number.national # (404) 384-1399
|
28
|
+
phone_number.raw_national # 4043841399
|
29
|
+
phone_number.dasherized_national # 404-384-1399
|
30
|
+
phone_number.international # +1 404-384-1399
|
31
|
+
phone_number.rfc3966 # tel:+1-404-384-1384
|
30
32
|
```
|
31
33
|
|
32
34
|
### Checking if a phone number is possible
|
@@ -41,7 +43,7 @@ phone_number.possible? # false
|
|
41
43
|
|
42
44
|
```ruby
|
43
45
|
MiniPhone.parse('+12423570000').type # :mobile
|
44
|
-
MiniPhone.parse
|
46
|
+
MiniPhone.parse('+12423651234').type # :fixed_line
|
45
47
|
```
|
46
48
|
|
47
49
|
The possible types are directly mapped from [this
|
@@ -65,14 +67,14 @@ enum](https://github.com/google/libphonenumber/blob/4e9954edea7cf263532c5dd3861a
|
|
65
67
|
## Compatibility with PhoneLib
|
66
68
|
|
67
69
|
MiniPhone aims to be compatible with
|
68
|
-
[Phonelib](https://github.com/daddyz/phonelib)
|
69
|
-
drop in replacement. It has a smaller feature set, so
|
70
|
-
|
70
|
+
[Phonelib](https://github.com/daddyz/phonelib). In many cases it can be a
|
71
|
+
drop in replacement. It has a smaller feature set, so it is not a
|
72
|
+
replacement for every use case. If there is a feature you need, open
|
71
73
|
an issue and we will try to support it.
|
72
74
|
|
73
75
|
## Benchmarks
|
74
76
|
|
75
|
-
On average, most methods are 40x
|
77
|
+
On average, most methods are 40x to 50x faster than other libraries. To run
|
76
78
|
the benchmarks locally, execute: `bundle exec rake bench`
|
77
79
|
|
78
80
|
```
|
@@ -132,10 +134,10 @@ push git commits and tags, and push the `.gem` file to
|
|
132
134
|
## Contributing
|
133
135
|
|
134
136
|
Bug reports and pull requests are welcome on GitHub at
|
135
|
-
https://github.com/
|
137
|
+
https://github.com/ianks/mini_phone. This project is intended to be a
|
136
138
|
safe, welcoming space for collaboration, and contributors are expected to
|
137
139
|
adhere to the [code of
|
138
|
-
conduct](https://github.com/
|
140
|
+
conduct](https://github.com/ianks/mini_phone/blob/master/CODE_OF_CONDUCT.md).
|
139
141
|
|
140
142
|
## License
|
141
143
|
|
@@ -146,4 +148,4 @@ License](https://opensource.org/licenses/MIT).
|
|
146
148
|
|
147
149
|
Everyone interacting in the MiniPhone project's codebases, issue trackers,
|
148
150
|
chat rooms and mailing lists is expected to follow the [code of
|
149
|
-
conduct](https://github.com/
|
151
|
+
conduct](https://github.com/ianks/mini_phone/blob/master/CODE_OF_CONDUCT.md).
|
data/Rakefile
CHANGED
@@ -76,3 +76,21 @@ namespace :publish do
|
|
76
76
|
push_to_github_registry(g)
|
77
77
|
end
|
78
78
|
end
|
79
|
+
|
80
|
+
desc 'Run valgrind test'
|
81
|
+
|
82
|
+
namespace :debug do
|
83
|
+
desc 'Plot memory'
|
84
|
+
task :memory do
|
85
|
+
sh 'debug/memory_plot/plot.sh'
|
86
|
+
end
|
87
|
+
|
88
|
+
task :valgrind do
|
89
|
+
sh 'docker build --tag mini_phone_dev -f Dockerfile.dev .'
|
90
|
+
args = '--tool=memcheck --num-callers=15 --partial-loads-ok=yes --undef-value-errors=no'
|
91
|
+
script = 'ruby debug/memory_plot/memory.rb --once'
|
92
|
+
cmd = "docker run -it --rm -v #{Dir.pwd}:/app -w /app mini_phone_dev valgrind #{args} #{script}"
|
93
|
+
puts cmd
|
94
|
+
system cmd
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'mini_phone'
|
5
|
+
require 'get_process_mem'
|
6
|
+
|
7
|
+
10.times do
|
8
|
+
GC.start
|
9
|
+
GC.compact
|
10
|
+
end
|
11
|
+
|
12
|
+
$stdout.sync = true
|
13
|
+
|
14
|
+
loop do
|
15
|
+
10_000.times do
|
16
|
+
pn = MiniPhone::PhoneNumber.new('+1 404 388 1299')
|
17
|
+
pn.e164
|
18
|
+
pn.valid?
|
19
|
+
pn.possible?
|
20
|
+
pn.raw_national
|
21
|
+
pn.international
|
22
|
+
pn.country_code
|
23
|
+
pn.area_code
|
24
|
+
end
|
25
|
+
|
26
|
+
4.times { GC.start }
|
27
|
+
|
28
|
+
memory_mb = GetProcessMem.new.mb
|
29
|
+
|
30
|
+
$stdout.puts memory_mb
|
31
|
+
|
32
|
+
break if ARGV.first == '--once'
|
33
|
+
end
|
@@ -12,11 +12,31 @@ static VALUE rb_mMiniPhone;
|
|
12
12
|
static VALUE rb_cPhoneNumber;
|
13
13
|
|
14
14
|
static RepeatedPtrField<NumberFormat> raw_national_format;
|
15
|
+
static RepeatedPtrField<NumberFormat> dasherized_national_format;
|
15
16
|
|
16
|
-
extern "C" struct PhoneNumberInfo {
|
17
|
-
|
18
|
-
|
19
|
-
|
17
|
+
extern "C" struct PhoneNumberInfo { PhoneNumber *phone_number; };
|
18
|
+
|
19
|
+
extern "C" size_t phone_number_info_size(const void *data) { return sizeof(PhoneNumberInfo) + sizeof(PhoneNumber); }
|
20
|
+
|
21
|
+
extern "C" void phone_number_info_free(void *data) {
|
22
|
+
PhoneNumberInfo *phone_number_info = static_cast<PhoneNumberInfo *>(data);
|
23
|
+
phone_number_info->phone_number->~PhoneNumber();
|
24
|
+
xfree(phone_number_info->phone_number);
|
25
|
+
phone_number_info->~PhoneNumberInfo();
|
26
|
+
xfree(data);
|
27
|
+
}
|
28
|
+
|
29
|
+
extern "C" const rb_data_type_t phone_number_info_type = {
|
30
|
+
.wrap_struct_name = "MiniPhone/PhoneNumberInfo",
|
31
|
+
.function =
|
32
|
+
{
|
33
|
+
.dmark = NULL,
|
34
|
+
.dfree = phone_number_info_free,
|
35
|
+
.dsize = phone_number_info_size,
|
36
|
+
},
|
37
|
+
.parent = NULL,
|
38
|
+
.data = NULL,
|
39
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY,
|
20
40
|
};
|
21
41
|
|
22
42
|
static inline VALUE is_phone_number_valid(VALUE self, VALUE str, VALUE cc) {
|
@@ -106,23 +126,27 @@ extern "C" VALUE rb_set_default_country(VALUE self, VALUE str_code) {
|
|
106
126
|
|
107
127
|
extern "C" VALUE rb_get_default_country(VALUE self) { return rb_iv_get(self, "@default_country"); }
|
108
128
|
|
109
|
-
extern "C" void rb_phone_number_dealloc(PhoneNumberInfo *phone_number_info) { delete phone_number_info; }
|
110
|
-
|
111
129
|
extern "C" VALUE rb_phone_number_parse(int argc, VALUE *argv, VALUE self) {
|
112
130
|
return rb_class_new_instance(argc, argv, rb_cPhoneNumber);
|
113
131
|
}
|
114
132
|
|
115
133
|
extern "C" VALUE rb_phone_number_alloc(VALUE self) {
|
116
|
-
|
134
|
+
void *phone_number_data = ALLOC(PhoneNumber);
|
135
|
+
void *data = ALLOC(PhoneNumberInfo);
|
136
|
+
PhoneNumberInfo *phone_number_info = new (data) PhoneNumberInfo();
|
137
|
+
PhoneNumber *phone_number = new (phone_number_data) PhoneNumber();
|
138
|
+
phone_number_info->phone_number = phone_number;
|
117
139
|
|
118
|
-
|
119
|
-
return Data_Wrap_Struct(self, NULL, &rb_phone_number_dealloc, phone_number_info);
|
140
|
+
return TypedData_Wrap_Struct(self, &phone_number_info_type, phone_number_info);
|
120
141
|
}
|
121
142
|
|
122
143
|
static inline VALUE rb_phone_number_nullify_ivars(VALUE self) {
|
123
144
|
rb_iv_set(self, "@national", Qnil);
|
124
145
|
rb_iv_set(self, "@raw_national", Qnil);
|
146
|
+
rb_iv_set(self, "@dasherized_national", Qnil);
|
125
147
|
rb_iv_set(self, "@international", Qnil);
|
148
|
+
rb_iv_set(self, "@raw_international", Qnil);
|
149
|
+
rb_iv_set(self, "@dasherized_international", Qnil);
|
126
150
|
rb_iv_set(self, "@e164", Qnil);
|
127
151
|
rb_iv_set(self, "@country_code", Qnil);
|
128
152
|
rb_iv_set(self, "@region_code", Qnil);
|
@@ -156,7 +180,7 @@ extern "C" VALUE rb_phone_number_initialize(int argc, VALUE *argv, VALUE self) {
|
|
156
180
|
PhoneNumberInfo *phone_number_info;
|
157
181
|
PhoneNumber parsed_number;
|
158
182
|
|
159
|
-
|
183
|
+
TypedData_Get_Struct(self, PhoneNumberInfo, &phone_number_info_type, phone_number_info);
|
160
184
|
|
161
185
|
const PhoneNumberUtil &phone_util(*PhoneNumberUtil::GetInstance());
|
162
186
|
|
@@ -168,7 +192,7 @@ extern "C" VALUE rb_phone_number_initialize(int argc, VALUE *argv, VALUE self) {
|
|
168
192
|
if (result != PhoneNumberUtil::NO_PARSING_ERROR) {
|
169
193
|
rb_phone_number_nullify_ivars(self);
|
170
194
|
} else {
|
171
|
-
phone_number_info->phone_number
|
195
|
+
phone_number_info->phone_number->Swap(&parsed_number);
|
172
196
|
}
|
173
197
|
|
174
198
|
return self;
|
@@ -177,11 +201,11 @@ extern "C" VALUE rb_phone_number_initialize(int argc, VALUE *argv, VALUE self) {
|
|
177
201
|
static inline VALUE rb_phone_number_format(VALUE self, PhoneNumberUtil::PhoneNumberFormat fmt) {
|
178
202
|
std::string formatted_number;
|
179
203
|
PhoneNumberInfo *phone_number_info;
|
180
|
-
|
204
|
+
TypedData_Get_Struct(self, PhoneNumberInfo, &phone_number_info_type, phone_number_info);
|
181
205
|
|
182
206
|
const PhoneNumberUtil &phone_util(*PhoneNumberUtil::GetInstance());
|
183
|
-
PhoneNumber parsed_number = phone_number_info->phone_number;
|
184
|
-
phone_util.Format(parsed_number, fmt, &formatted_number);
|
207
|
+
PhoneNumber *parsed_number = phone_number_info->phone_number;
|
208
|
+
phone_util.Format(*parsed_number, fmt, &formatted_number);
|
185
209
|
|
186
210
|
return rb_str_new(formatted_number.c_str(), formatted_number.size());
|
187
211
|
}
|
@@ -219,22 +243,76 @@ extern "C" VALUE rb_phone_number_rfc3966(VALUE self) {
|
|
219
243
|
return rb_iv_set(self, "@rfc3966", rb_phone_number_format(self, PhoneNumberUtil::PhoneNumberFormat::RFC3966));
|
220
244
|
}
|
221
245
|
|
246
|
+
VALUE format_by_pattern_national(VALUE self, RepeatedPtrField<NumberFormat> format) {
|
247
|
+
std::string formatted_number;
|
248
|
+
PhoneNumberInfo *phone_number_info;
|
249
|
+
const PhoneNumberUtil &phone_util(*PhoneNumberUtil::GetInstance());
|
250
|
+
TypedData_Get_Struct(self, PhoneNumberInfo, &phone_number_info_type, phone_number_info);
|
251
|
+
|
252
|
+
phone_util.FormatByPattern(*phone_number_info->phone_number, PhoneNumberUtil::NATIONAL, format, &formatted_number);
|
253
|
+
|
254
|
+
return rb_str_new(formatted_number.c_str(), formatted_number.size());
|
255
|
+
}
|
256
|
+
|
222
257
|
extern "C" VALUE rb_phone_number_raw_national(VALUE self) {
|
223
258
|
if (rb_ivar_defined(self, rb_intern("@raw_national"))) {
|
224
259
|
return rb_iv_get(self, "@raw_national");
|
225
260
|
}
|
226
261
|
|
227
|
-
|
262
|
+
VALUE result = format_by_pattern_national(self, raw_national_format);
|
263
|
+
|
264
|
+
return rb_iv_set(self, "@raw_national", result);
|
265
|
+
}
|
266
|
+
|
267
|
+
extern "C" VALUE rb_phone_number_dasherized_national(VALUE self) {
|
268
|
+
if (rb_ivar_defined(self, rb_intern("@dasherized_national"))) {
|
269
|
+
return rb_iv_get(self, "@dasherized_national");
|
270
|
+
}
|
271
|
+
|
272
|
+
VALUE result = format_by_pattern_national(self, dasherized_national_format);
|
273
|
+
|
274
|
+
return rb_iv_set(self, "@dasherized_national", result);
|
275
|
+
}
|
276
|
+
|
277
|
+
extern "C" VALUE rb_phone_number_country_code(VALUE self) {
|
278
|
+
if (rb_ivar_defined(self, rb_intern("@country_code"))) {
|
279
|
+
return rb_iv_get(self, "@country_code");
|
280
|
+
}
|
281
|
+
|
228
282
|
PhoneNumberInfo *phone_number_info;
|
229
|
-
|
230
|
-
Data_Get_Struct(self, PhoneNumberInfo, phone_number_info);
|
283
|
+
TypedData_Get_Struct(self, PhoneNumberInfo, &phone_number_info_type, phone_number_info);
|
231
284
|
|
232
|
-
|
233
|
-
&formatted_number);
|
285
|
+
int code = phone_number_info->phone_number->country_code();
|
234
286
|
|
235
|
-
VALUE result =
|
287
|
+
VALUE result = INT2NUM(code);
|
236
288
|
|
237
|
-
return rb_iv_set(self, "@
|
289
|
+
return rb_iv_set(self, "@country_code", result);
|
290
|
+
}
|
291
|
+
|
292
|
+
extern "C" VALUE rb_phone_number_dasherized_international(VALUE self) {
|
293
|
+
if (rb_ivar_defined(self, rb_intern("@dasherized_international"))) {
|
294
|
+
return rb_iv_get(self, "@dasherized_international");
|
295
|
+
}
|
296
|
+
|
297
|
+
VALUE national = rb_phone_number_dasherized_national(self);
|
298
|
+
VALUE cc = rb_fix2str(rb_phone_number_country_code(self), 10);
|
299
|
+
VALUE dash = rb_str_new("-", 1);
|
300
|
+
VALUE prefix = rb_str_concat(cc, dash);
|
301
|
+
VALUE result = rb_str_concat(prefix, national);
|
302
|
+
|
303
|
+
return rb_iv_set(self, "@dasherized_international", result);
|
304
|
+
}
|
305
|
+
|
306
|
+
extern "C" VALUE rb_phone_number_raw_international(VALUE self) {
|
307
|
+
if (rb_ivar_defined(self, rb_intern("@raw_international"))) {
|
308
|
+
return rb_iv_get(self, "@raw_international");
|
309
|
+
}
|
310
|
+
|
311
|
+
VALUE national = rb_phone_number_raw_national(self);
|
312
|
+
VALUE cc = rb_fix2str(rb_phone_number_country_code(self), 10);
|
313
|
+
VALUE result = rb_str_concat(cc, national);
|
314
|
+
|
315
|
+
return rb_iv_set(self, "@raw_international", result);
|
238
316
|
}
|
239
317
|
|
240
318
|
extern "C" VALUE rb_phone_number_valid_eh(VALUE self) {
|
@@ -244,11 +322,11 @@ extern "C" VALUE rb_phone_number_valid_eh(VALUE self) {
|
|
244
322
|
|
245
323
|
std::string formatted_number;
|
246
324
|
PhoneNumberInfo *phone_number_info;
|
247
|
-
|
325
|
+
TypedData_Get_Struct(self, PhoneNumberInfo, &phone_number_info_type, phone_number_info);
|
248
326
|
|
249
327
|
const PhoneNumberUtil &phone_util(*PhoneNumberUtil::GetInstance());
|
250
328
|
|
251
|
-
if (phone_util.IsValidNumber(phone_number_info->phone_number)) {
|
329
|
+
if (phone_util.IsValidNumber(*phone_number_info->phone_number)) {
|
252
330
|
return rb_iv_set(self, "@valid", Qtrue);
|
253
331
|
} else {
|
254
332
|
return rb_iv_set(self, "@valid", Qfalse);
|
@@ -266,11 +344,11 @@ extern "C" VALUE rb_phone_number_possible_eh(VALUE self) {
|
|
266
344
|
|
267
345
|
std::string formatted_number;
|
268
346
|
PhoneNumberInfo *phone_number_info;
|
269
|
-
|
347
|
+
TypedData_Get_Struct(self, PhoneNumberInfo, &phone_number_info_type, phone_number_info);
|
270
348
|
|
271
349
|
const PhoneNumberUtil &phone_util(*PhoneNumberUtil::GetInstance());
|
272
350
|
|
273
|
-
if (phone_util.IsPossibleNumber(phone_number_info->phone_number)) {
|
351
|
+
if (phone_util.IsPossibleNumber(*phone_number_info->phone_number)) {
|
274
352
|
return rb_iv_set(self, "@possible", Qtrue);
|
275
353
|
} else {
|
276
354
|
return rb_iv_set(self, "@possible", Qfalse);
|
@@ -288,44 +366,38 @@ extern "C" VALUE rb_phone_number_region_code(VALUE self) {
|
|
288
366
|
|
289
367
|
PhoneNumberInfo *phone_number_info;
|
290
368
|
std::string code;
|
291
|
-
|
369
|
+
TypedData_Get_Struct(self, PhoneNumberInfo, &phone_number_info_type, phone_number_info);
|
292
370
|
const PhoneNumberUtil &phone_util(*PhoneNumberUtil::GetInstance());
|
293
371
|
|
294
|
-
phone_util.GetRegionCodeForCountryCode(phone_number_info->phone_number
|
372
|
+
phone_util.GetRegionCodeForCountryCode(phone_number_info->phone_number->country_code(), &code);
|
295
373
|
|
296
374
|
VALUE result = rb_str_new(code.c_str(), code.size());
|
297
375
|
|
298
376
|
return rb_iv_set(self, "@region_code", result);
|
299
377
|
}
|
300
378
|
|
301
|
-
extern "C" VALUE
|
302
|
-
if (
|
303
|
-
return
|
379
|
+
extern "C" VALUE rb_phone_number_match_eh(VALUE self, VALUE other) {
|
380
|
+
if (!rb_obj_is_kind_of(other, rb_cPhoneNumber)) {
|
381
|
+
return Qfalse;
|
304
382
|
}
|
305
383
|
|
306
|
-
|
307
|
-
|
384
|
+
VALUE self_input = rb_iv_get(self, "@input");
|
385
|
+
VALUE other_input = rb_iv_get(other, "@input");
|
308
386
|
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
return rb_iv_set(self, "@country_code", result);
|
314
|
-
}
|
315
|
-
|
316
|
-
extern "C" VALUE rb_phone_number_eql_eh(VALUE self, VALUE other) {
|
317
|
-
if (!rb_obj_is_instance_of(other, rb_cPhoneNumber)) {
|
318
|
-
return Qfalse;
|
387
|
+
// If inputs are the exact same, the result is as well
|
388
|
+
if (rb_eql(self_input, other_input)) {
|
389
|
+
return Qtrue;
|
319
390
|
}
|
320
391
|
|
321
392
|
const PhoneNumberUtil &phone_util(*PhoneNumberUtil::GetInstance());
|
322
393
|
|
323
|
-
PhoneNumberInfo *
|
324
|
-
|
394
|
+
PhoneNumberInfo *self_info;
|
395
|
+
TypedData_Get_Struct(self, PhoneNumberInfo, &phone_number_info_type, self_info);
|
325
396
|
|
326
|
-
PhoneNumberInfo *
|
327
|
-
|
328
|
-
|
397
|
+
PhoneNumberInfo *other_info;
|
398
|
+
TypedData_Get_Struct(other, PhoneNumberInfo, &phone_number_info_type, other_info);
|
399
|
+
|
400
|
+
if (phone_util.IsNumberMatch(*other_info->phone_number, *self_info->phone_number) == PhoneNumberUtil::EXACT_MATCH) {
|
329
401
|
return Qtrue;
|
330
402
|
} else {
|
331
403
|
return Qfalse;
|
@@ -338,14 +410,14 @@ extern "C" VALUE rb_phone_number_type(VALUE self) {
|
|
338
410
|
}
|
339
411
|
|
340
412
|
PhoneNumberInfo *phone_number_info;
|
341
|
-
|
413
|
+
TypedData_Get_Struct(self, PhoneNumberInfo, &phone_number_info_type, phone_number_info);
|
342
414
|
const PhoneNumberUtil &phone_util(*PhoneNumberUtil::GetInstance());
|
343
415
|
|
344
416
|
VALUE result;
|
345
417
|
|
346
418
|
// @see
|
347
419
|
// https://github.com/google/libphonenumber/blob/4e9954edea7cf263532c5dd3861a801104c3f012/cpp/src/phonenumbers/phonenumberutil.h#L91
|
348
|
-
switch (phone_util.GetNumberType(phone_number_info->phone_number)) {
|
420
|
+
switch (phone_util.GetNumberType(*phone_number_info->phone_number)) {
|
349
421
|
case PhoneNumberUtil::PREMIUM_RATE:
|
350
422
|
result = rb_intern("premium_rate");
|
351
423
|
break;
|
@@ -394,15 +466,15 @@ extern "C" VALUE rb_phone_number_area_code(VALUE self) {
|
|
394
466
|
|
395
467
|
const PhoneNumberUtil &phone_util(*PhoneNumberUtil::GetInstance());
|
396
468
|
PhoneNumberInfo *phone_number_info;
|
397
|
-
|
469
|
+
TypedData_Get_Struct(self, PhoneNumberInfo, &phone_number_info_type, phone_number_info);
|
398
470
|
|
399
|
-
PhoneNumber number = phone_number_info->phone_number;
|
471
|
+
PhoneNumber *number = phone_number_info->phone_number;
|
400
472
|
string national_significant_number;
|
401
|
-
phone_util.GetNationalSignificantNumber(number, &national_significant_number);
|
473
|
+
phone_util.GetNationalSignificantNumber(*number, &national_significant_number);
|
402
474
|
string area_code;
|
403
475
|
string subscriber_number;
|
404
476
|
|
405
|
-
int area_code_length = phone_util.GetLengthOfGeographicalAreaCode(number);
|
477
|
+
int area_code_length = phone_util.GetLengthOfGeographicalAreaCode(*number);
|
406
478
|
if (area_code_length > 0) {
|
407
479
|
area_code = national_significant_number.substr(0, area_code_length);
|
408
480
|
subscriber_number = national_significant_number.substr(area_code_length, string::npos);
|
@@ -416,7 +488,23 @@ extern "C" VALUE rb_phone_number_area_code(VALUE self) {
|
|
416
488
|
return rb_iv_set(self, "@area_code", result);
|
417
489
|
}
|
418
490
|
|
491
|
+
extern "C" VALUE rb_phone_number_to_s(VALUE self) { return rb_iv_get(self, "@input"); }
|
492
|
+
|
493
|
+
static inline void setup_formats() {
|
494
|
+
// Raw
|
495
|
+
NumberFormat *raw_fmt = raw_national_format.Add();
|
496
|
+
raw_fmt->set_pattern("(\\d{3})(\\d{3})(\\d{4})");
|
497
|
+
raw_fmt->set_format("$1$2$3");
|
498
|
+
|
499
|
+
// Dasherized
|
500
|
+
NumberFormat *dsh_fmt = dasherized_national_format.Add();
|
501
|
+
dsh_fmt->set_pattern("(\\d{3})(\\d{3})(\\d{4})");
|
502
|
+
dsh_fmt->set_format("$1-$2-$3");
|
503
|
+
}
|
504
|
+
|
419
505
|
extern "C" void Init_mini_phone(void) {
|
506
|
+
setup_formats();
|
507
|
+
|
420
508
|
rb_mMiniPhone = rb_define_module("MiniPhone");
|
421
509
|
|
422
510
|
// Unknown
|
@@ -451,10 +539,13 @@ extern "C" void Init_mini_phone(void) {
|
|
451
539
|
rb_define_method(rb_cPhoneNumber, "e164", reinterpret_cast<VALUE (*)(...)>(rb_phone_number_e164), 0);
|
452
540
|
rb_define_method(rb_cPhoneNumber, "national", reinterpret_cast<VALUE (*)(...)>(rb_phone_number_national), 0);
|
453
541
|
|
454
|
-
// Raw National
|
455
|
-
raw_national_format.Add()->set_format("$1$2$3");
|
456
|
-
|
457
542
|
rb_define_method(rb_cPhoneNumber, "raw_national", reinterpret_cast<VALUE (*)(...)>(rb_phone_number_raw_national), 0);
|
543
|
+
rb_define_method(rb_cPhoneNumber, "raw_international",
|
544
|
+
reinterpret_cast<VALUE (*)(...)>(rb_phone_number_raw_international), 0);
|
545
|
+
rb_define_method(rb_cPhoneNumber, "dasherized_international",
|
546
|
+
reinterpret_cast<VALUE (*)(...)>(rb_phone_number_dasherized_international), 0);
|
547
|
+
rb_define_method(rb_cPhoneNumber, "dasherized_national",
|
548
|
+
reinterpret_cast<VALUE (*)(...)>(rb_phone_number_dasherized_national), 0);
|
458
549
|
rb_define_method(rb_cPhoneNumber, "international", reinterpret_cast<VALUE (*)(...)>(rb_phone_number_international),
|
459
550
|
0);
|
460
551
|
rb_define_method(rb_cPhoneNumber, "rfc3966", reinterpret_cast<VALUE (*)(...)>(rb_phone_number_rfc3966), 0);
|
@@ -463,5 +554,6 @@ extern "C" void Init_mini_phone(void) {
|
|
463
554
|
rb_define_method(rb_cPhoneNumber, "country_code", reinterpret_cast<VALUE (*)(...)>(rb_phone_number_country_code), 0);
|
464
555
|
rb_define_method(rb_cPhoneNumber, "type", reinterpret_cast<VALUE (*)(...)>(rb_phone_number_type), 0);
|
465
556
|
rb_define_method(rb_cPhoneNumber, "area_code", reinterpret_cast<VALUE (*)(...)>(rb_phone_number_area_code), 0);
|
466
|
-
rb_define_method(rb_cPhoneNumber, "
|
557
|
+
rb_define_method(rb_cPhoneNumber, "to_s", reinterpret_cast<VALUE (*)(...)>(rb_phone_number_to_s), 0);
|
558
|
+
rb_define_method(rb_cPhoneNumber, "==", reinterpret_cast<VALUE (*)(...)>(rb_phone_number_match_eh), 1);
|
467
559
|
}
|
data/lib/mini_phone/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mini_phone
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ian Ker-Seymer
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-01-
|
11
|
+
date: 2021-01-22 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Plugs directly in the the Google's native C++ [libphonenumber](https://github.com/google/libphonenumber)
|
14
14
|
for extemely _fast_ and _robust_ phone number parsing, validation, and formatting.
|
@@ -22,10 +22,13 @@ extra_rdoc_files: []
|
|
22
22
|
files:
|
23
23
|
- CHANGELOG.md
|
24
24
|
- CODE_OF_CONDUCT.md
|
25
|
+
- Dockerfile.dev
|
25
26
|
- Gemfile
|
26
27
|
- LICENSE.txt
|
27
28
|
- README.md
|
28
29
|
- Rakefile
|
30
|
+
- debug/memory_plot/memory.rb
|
31
|
+
- debug/memory_plot/plot.sh
|
29
32
|
- ext/mini_phone/extconf.rb
|
30
33
|
- ext/mini_phone/mini_phone.cc
|
31
34
|
- ext/mini_phone/mini_phone.h
|