mini_phone 1.0.3 → 1.0.4
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/Rakefile +5 -0
- data/ext/mini_phone/mini_phone.cc +83 -23
- data/lib/mini_phone/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ec6635c4a695331ec847d69f21e79578f5f9ebdddf2752a7f1074fabd33ccfac
|
4
|
+
data.tar.gz: 51aae23c0a2330a9599ee0336ad591e8fa4548c041b0a6aa1710f5834791b5f7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 19540acad836a3102e52aab746c530c8f78613e4d3ac98ba3844c24e156d1a994aa92c5dcfaa3fd831ffe7d0a8ba26aa036a8e23f982545a81a08fac2e0cab6c
|
7
|
+
data.tar.gz: 747484c1f84802be42523c762f213eaa5044257d78546ac8a30c554c101053d6764e264c892fe29df74f265b44afa7829172a697f23996d1443835203266705b
|
data/Rakefile
CHANGED
@@ -32,6 +32,11 @@ task :lint do
|
|
32
32
|
sh 'bundle exec rubocop'
|
33
33
|
end
|
34
34
|
|
35
|
+
task :format do
|
36
|
+
sh 'bundle exec rubocop -A'
|
37
|
+
sh 'clang-format -i ext/**/*.{h,cc}'
|
38
|
+
end
|
39
|
+
|
35
40
|
task deploy: :default do
|
36
41
|
sh 'code -w ./lib/mini_phone/version.rb'
|
37
42
|
version = `ruby -r ./lib/mini_phone/version.rb -e 'print MiniPhone::VERSION'`.strip
|
@@ -20,15 +20,19 @@ extern "C" struct PhoneNumberInfo {
|
|
20
20
|
};
|
21
21
|
|
22
22
|
static inline VALUE is_phone_number_valid(VALUE self, VALUE str, VALUE cc) {
|
23
|
+
if (NIL_P(str) || NIL_P(cc)) {
|
24
|
+
return Qfalse;
|
25
|
+
}
|
26
|
+
|
23
27
|
PhoneNumber parsed_number;
|
24
|
-
PhoneNumberUtil *
|
28
|
+
const PhoneNumberUtil &phone_util(*PhoneNumberUtil::GetInstance());
|
25
29
|
|
26
30
|
std::string phone_number(RSTRING_PTR(str), RSTRING_LEN(str));
|
27
31
|
std::string country_code(RSTRING_PTR(cc), RSTRING_LEN(cc));
|
28
32
|
|
29
|
-
auto result = phone_util
|
33
|
+
auto result = phone_util.ParseAndKeepRawInput(phone_number, country_code, &parsed_number);
|
30
34
|
|
31
|
-
if (result == PhoneNumberUtil::NO_PARSING_ERROR && phone_util
|
35
|
+
if (result == PhoneNumberUtil::NO_PARSING_ERROR && phone_util.IsValidNumber(parsed_number)) {
|
32
36
|
return Qtrue;
|
33
37
|
} else {
|
34
38
|
return Qfalse;
|
@@ -41,6 +45,20 @@ extern "C" VALUE rb_is_phone_number_valid(VALUE self, VALUE str) {
|
|
41
45
|
return is_phone_number_valid(self, str, def_cc);
|
42
46
|
}
|
43
47
|
|
48
|
+
extern "C" VALUE rb_normalize_digits_only(VALUE self, VALUE str) {
|
49
|
+
if (NIL_P(str)) {
|
50
|
+
return Qnil;
|
51
|
+
}
|
52
|
+
|
53
|
+
const PhoneNumberUtil &phone_util(*PhoneNumberUtil::GetInstance());
|
54
|
+
|
55
|
+
std::string phone_number(RSTRING_PTR(str), RSTRING_LEN(str));
|
56
|
+
|
57
|
+
phone_util.NormalizeDigitsOnly(&phone_number);
|
58
|
+
|
59
|
+
return rb_str_new(phone_number.c_str(), phone_number.size());
|
60
|
+
}
|
61
|
+
|
44
62
|
extern "C" VALUE rb_is_phone_number_valid_for_country(VALUE self, VALUE str, VALUE cc) {
|
45
63
|
return is_phone_number_valid(self, str, cc);
|
46
64
|
}
|
@@ -54,16 +72,20 @@ extern "C" VALUE rb_is_phone_number_invalid_for_country(VALUE self, VALUE str, V
|
|
54
72
|
}
|
55
73
|
|
56
74
|
extern "C" VALUE rb_is_phone_number_possible(VALUE self, VALUE str) {
|
75
|
+
if (NIL_P(str)) {
|
76
|
+
return Qnil;
|
77
|
+
}
|
78
|
+
|
57
79
|
PhoneNumber parsed_number;
|
58
|
-
PhoneNumberUtil *
|
80
|
+
const PhoneNumberUtil &phone_util(*PhoneNumberUtil::GetInstance());
|
59
81
|
|
60
82
|
VALUE def_cc = rb_iv_get(rb_mMiniPhone, "@default_country");
|
61
83
|
std::string phone_number(RSTRING_PTR(str), RSTRING_LEN(str));
|
62
84
|
std::string country_code(RSTRING_PTR(def_cc), RSTRING_LEN(def_cc));
|
63
85
|
|
64
|
-
auto result = phone_util
|
86
|
+
auto result = phone_util.Parse(phone_number, country_code, &parsed_number);
|
65
87
|
|
66
|
-
if (result == PhoneNumberUtil::NO_PARSING_ERROR && phone_util
|
88
|
+
if (result == PhoneNumberUtil::NO_PARSING_ERROR && phone_util.IsPossibleNumber(parsed_number)) {
|
67
89
|
return Qtrue;
|
68
90
|
} else {
|
69
91
|
return Qfalse;
|
@@ -75,6 +97,10 @@ extern "C" VALUE rb_is_phone_number_impossible(VALUE self, VALUE str) {
|
|
75
97
|
}
|
76
98
|
|
77
99
|
extern "C" VALUE rb_set_default_country(VALUE self, VALUE str_code) {
|
100
|
+
if (NIL_P(str_code)) {
|
101
|
+
str_code = rb_str_new("ZZ", 2);
|
102
|
+
}
|
103
|
+
|
78
104
|
return rb_iv_set(self, "@default_country", str_code);
|
79
105
|
}
|
80
106
|
|
@@ -104,6 +130,7 @@ static inline VALUE rb_phone_number_nullify_ivars(VALUE self) {
|
|
104
130
|
rb_iv_set(self, "@type", Qnil);
|
105
131
|
rb_iv_set(self, "@valid", Qfalse);
|
106
132
|
rb_iv_set(self, "@possible", Qfalse);
|
133
|
+
rb_iv_set(self, "@area_code", Qnil);
|
107
134
|
|
108
135
|
return Qtrue;
|
109
136
|
}
|
@@ -131,12 +158,12 @@ extern "C" VALUE rb_phone_number_initialize(int argc, VALUE *argv, VALUE self) {
|
|
131
158
|
|
132
159
|
Data_Get_Struct(self, PhoneNumberInfo, phone_number_info);
|
133
160
|
|
134
|
-
PhoneNumberUtil *
|
161
|
+
const PhoneNumberUtil &phone_util(*PhoneNumberUtil::GetInstance());
|
135
162
|
|
136
163
|
std::string phone_number(RSTRING_PTR(str), RSTRING_LEN(str));
|
137
164
|
std::string country_code(RSTRING_PTR(def_cc), RSTRING_LEN(def_cc));
|
138
165
|
|
139
|
-
auto result = phone_util
|
166
|
+
auto result = phone_util.Parse(phone_number, country_code, &parsed_number);
|
140
167
|
|
141
168
|
if (result != PhoneNumberUtil::NO_PARSING_ERROR) {
|
142
169
|
rb_phone_number_nullify_ivars(self);
|
@@ -152,9 +179,9 @@ static inline VALUE rb_phone_number_format(VALUE self, PhoneNumberUtil::PhoneNum
|
|
152
179
|
PhoneNumberInfo *phone_number_info;
|
153
180
|
Data_Get_Struct(self, PhoneNumberInfo, phone_number_info);
|
154
181
|
|
155
|
-
PhoneNumberUtil *
|
182
|
+
const PhoneNumberUtil &phone_util(*PhoneNumberUtil::GetInstance());
|
156
183
|
PhoneNumber parsed_number = phone_number_info->phone_number;
|
157
|
-
phone_util
|
184
|
+
phone_util.Format(parsed_number, fmt, &formatted_number);
|
158
185
|
|
159
186
|
return rb_str_new(formatted_number.c_str(), formatted_number.size());
|
160
187
|
}
|
@@ -199,11 +226,11 @@ extern "C" VALUE rb_phone_number_raw_national(VALUE self) {
|
|
199
226
|
|
200
227
|
std::string formatted_number;
|
201
228
|
PhoneNumberInfo *phone_number_info;
|
202
|
-
PhoneNumberUtil *
|
229
|
+
const PhoneNumberUtil &phone_util(*PhoneNumberUtil::GetInstance());
|
203
230
|
Data_Get_Struct(self, PhoneNumberInfo, phone_number_info);
|
204
231
|
|
205
|
-
phone_util
|
206
|
-
|
232
|
+
phone_util.FormatByPattern(phone_number_info->phone_number, PhoneNumberUtil::NATIONAL, raw_national_format,
|
233
|
+
&formatted_number);
|
207
234
|
|
208
235
|
VALUE result = rb_str_new(formatted_number.c_str(), formatted_number.size());
|
209
236
|
|
@@ -219,9 +246,9 @@ extern "C" VALUE rb_phone_number_valid_eh(VALUE self) {
|
|
219
246
|
PhoneNumberInfo *phone_number_info;
|
220
247
|
Data_Get_Struct(self, PhoneNumberInfo, phone_number_info);
|
221
248
|
|
222
|
-
PhoneNumberUtil *
|
249
|
+
const PhoneNumberUtil &phone_util(*PhoneNumberUtil::GetInstance());
|
223
250
|
|
224
|
-
if (phone_util
|
251
|
+
if (phone_util.IsValidNumber(phone_number_info->phone_number)) {
|
225
252
|
return rb_iv_set(self, "@valid", Qtrue);
|
226
253
|
} else {
|
227
254
|
return rb_iv_set(self, "@valid", Qfalse);
|
@@ -241,9 +268,9 @@ extern "C" VALUE rb_phone_number_possible_eh(VALUE self) {
|
|
241
268
|
PhoneNumberInfo *phone_number_info;
|
242
269
|
Data_Get_Struct(self, PhoneNumberInfo, phone_number_info);
|
243
270
|
|
244
|
-
PhoneNumberUtil *
|
271
|
+
const PhoneNumberUtil &phone_util(*PhoneNumberUtil::GetInstance());
|
245
272
|
|
246
|
-
if (phone_util
|
273
|
+
if (phone_util.IsPossibleNumber(phone_number_info->phone_number)) {
|
247
274
|
return rb_iv_set(self, "@possible", Qtrue);
|
248
275
|
} else {
|
249
276
|
return rb_iv_set(self, "@possible", Qfalse);
|
@@ -262,9 +289,9 @@ extern "C" VALUE rb_phone_number_region_code(VALUE self) {
|
|
262
289
|
PhoneNumberInfo *phone_number_info;
|
263
290
|
std::string code;
|
264
291
|
Data_Get_Struct(self, PhoneNumberInfo, phone_number_info);
|
265
|
-
PhoneNumberUtil *
|
292
|
+
const PhoneNumberUtil &phone_util(*PhoneNumberUtil::GetInstance());
|
266
293
|
|
267
|
-
phone_util
|
294
|
+
phone_util.GetRegionCodeForCountryCode(phone_number_info->phone_number.country_code(), &code);
|
268
295
|
|
269
296
|
VALUE result = rb_str_new(code.c_str(), code.size());
|
270
297
|
|
@@ -291,14 +318,14 @@ extern "C" VALUE rb_phone_number_eql_eh(VALUE self, VALUE other) {
|
|
291
318
|
return Qfalse;
|
292
319
|
}
|
293
320
|
|
294
|
-
PhoneNumberUtil *
|
321
|
+
const PhoneNumberUtil &phone_util(*PhoneNumberUtil::GetInstance());
|
295
322
|
|
296
323
|
PhoneNumberInfo *self_phone_number_info;
|
297
324
|
Data_Get_Struct(self, PhoneNumberInfo, self_phone_number_info);
|
298
325
|
|
299
326
|
PhoneNumberInfo *other_phone_number_info;
|
300
327
|
Data_Get_Struct(other, PhoneNumberInfo, other_phone_number_info);
|
301
|
-
if (phone_util
|
328
|
+
if (phone_util.IsNumberMatch(other_phone_number_info->phone_number, self_phone_number_info->phone_number)) {
|
302
329
|
return Qtrue;
|
303
330
|
} else {
|
304
331
|
return Qfalse;
|
@@ -312,13 +339,13 @@ extern "C" VALUE rb_phone_number_type(VALUE self) {
|
|
312
339
|
|
313
340
|
PhoneNumberInfo *phone_number_info;
|
314
341
|
Data_Get_Struct(self, PhoneNumberInfo, phone_number_info);
|
315
|
-
PhoneNumberUtil *
|
342
|
+
const PhoneNumberUtil &phone_util(*PhoneNumberUtil::GetInstance());
|
316
343
|
|
317
344
|
VALUE result;
|
318
345
|
|
319
346
|
// @see
|
320
347
|
// https://github.com/google/libphonenumber/blob/4e9954edea7cf263532c5dd3861a801104c3f012/cpp/src/phonenumbers/phonenumberutil.h#L91
|
321
|
-
switch (phone_util
|
348
|
+
switch (phone_util.GetNumberType(phone_number_info->phone_number)) {
|
322
349
|
case PhoneNumberUtil::PREMIUM_RATE:
|
323
350
|
result = rb_intern("premium_rate");
|
324
351
|
break;
|
@@ -360,6 +387,35 @@ extern "C" VALUE rb_phone_number_type(VALUE self) {
|
|
360
387
|
return rb_iv_set(self, "@type", ID2SYM(result));
|
361
388
|
}
|
362
389
|
|
390
|
+
extern "C" VALUE rb_phone_number_area_code(VALUE self) {
|
391
|
+
if (rb_ivar_defined(self, rb_intern("@area_code"))) {
|
392
|
+
return rb_iv_get(self, "@area_code");
|
393
|
+
}
|
394
|
+
|
395
|
+
const PhoneNumberUtil &phone_util(*PhoneNumberUtil::GetInstance());
|
396
|
+
PhoneNumberInfo *phone_number_info;
|
397
|
+
Data_Get_Struct(self, PhoneNumberInfo, phone_number_info);
|
398
|
+
|
399
|
+
PhoneNumber number = phone_number_info->phone_number;
|
400
|
+
string national_significant_number;
|
401
|
+
phone_util.GetNationalSignificantNumber(number, &national_significant_number);
|
402
|
+
string area_code;
|
403
|
+
string subscriber_number;
|
404
|
+
|
405
|
+
int area_code_length = phone_util.GetLengthOfGeographicalAreaCode(number);
|
406
|
+
if (area_code_length > 0) {
|
407
|
+
area_code = national_significant_number.substr(0, area_code_length);
|
408
|
+
subscriber_number = national_significant_number.substr(area_code_length, string::npos);
|
409
|
+
} else {
|
410
|
+
area_code = "";
|
411
|
+
subscriber_number = national_significant_number;
|
412
|
+
}
|
413
|
+
|
414
|
+
VALUE result = rb_str_new(area_code.c_str(), area_code.size());
|
415
|
+
|
416
|
+
return rb_iv_set(self, "@area_code", result);
|
417
|
+
}
|
418
|
+
|
363
419
|
extern "C" void Init_mini_phone(void) {
|
364
420
|
rb_mMiniPhone = rb_define_module("MiniPhone");
|
365
421
|
|
@@ -380,6 +436,8 @@ extern "C" void Init_mini_phone(void) {
|
|
380
436
|
rb_define_module_function(rb_mMiniPhone, "default_country", reinterpret_cast<VALUE (*)(...)>(rb_get_default_country),
|
381
437
|
0);
|
382
438
|
rb_define_module_function(rb_mMiniPhone, "parse", reinterpret_cast<VALUE (*)(...)>(rb_phone_number_parse), -1);
|
439
|
+
rb_define_module_function(rb_mMiniPhone, "normalize_digits_only",
|
440
|
+
reinterpret_cast<VALUE (*)(...)>(rb_normalize_digits_only), 1);
|
383
441
|
|
384
442
|
rb_cPhoneNumber = rb_define_class_under(rb_mMiniPhone, "PhoneNumber", rb_cObject);
|
385
443
|
|
@@ -401,7 +459,9 @@ extern "C" void Init_mini_phone(void) {
|
|
401
459
|
0);
|
402
460
|
rb_define_method(rb_cPhoneNumber, "rfc3966", reinterpret_cast<VALUE (*)(...)>(rb_phone_number_rfc3966), 0);
|
403
461
|
rb_define_method(rb_cPhoneNumber, "region_code", reinterpret_cast<VALUE (*)(...)>(rb_phone_number_region_code), 0);
|
462
|
+
rb_define_method(rb_cPhoneNumber, "country", reinterpret_cast<VALUE (*)(...)>(rb_phone_number_region_code), 0);
|
404
463
|
rb_define_method(rb_cPhoneNumber, "country_code", reinterpret_cast<VALUE (*)(...)>(rb_phone_number_country_code), 0);
|
405
464
|
rb_define_method(rb_cPhoneNumber, "type", reinterpret_cast<VALUE (*)(...)>(rb_phone_number_type), 0);
|
465
|
+
rb_define_method(rb_cPhoneNumber, "area_code", reinterpret_cast<VALUE (*)(...)>(rb_phone_number_area_code), 0);
|
406
466
|
rb_define_method(rb_cPhoneNumber, "eql?", reinterpret_cast<VALUE (*)(...)>(rb_phone_number_eql_eh), 1);
|
407
467
|
}
|
data/lib/mini_phone/version.rb
CHANGED