1# frozen_string_literal: true
2
3require "regexp-examples"
4
5class Rantly
6 module Data
7 module Extensions
8 REGEXP_EXAMPLES_OPTS = {
9 max_group_results: 10,
10 max_repeater_variance: 10
11 }.freeze
12
13 # @see https://github.com/mnestorov/regex-patterns
14 # @return [String]
15 FRENCH_PHONE = /\+33[1-9]\d{8}/.freeze
16 # @return [String]
17 GERMAN_PHONE = /\+49[1-9]\d{3,12}/.freeze
18 # @return [String]
19 UK_PHONE = /\+44[1-9]\d{9,10}/.freeze
20 # @return [String]
21 SPANISH_PHONE = /\+34[6-9]\d{8}/.freeze
22 # @return [String]
23 ITALIAN_PHONE = /\+39[0-9]{9,10}/.freeze
24
25 # @return [String]
26 def french_phone
27 FRENCH_PHONE.random_example(**REGEXP_EXAMPLES_OPTS)
28 end
29
30 # @return [String]
31 def german_phone
32 GERMAN_PHONE.random_example(**REGEXP_EXAMPLES_OPTS)
33 end
34
35 # @return [String]
36 def uk_phone
37 UK_PHONE.random_example(**REGEXP_EXAMPLES_OPTS)
38 end
39
40 # @return [String]
41 def spanish_phone
42 SPANISH_PHONE.random_example(**REGEXP_EXAMPLES_OPTS)
43 end
44
45 # @return [String]
46 def italian_phone
47 ITALIAN_PHONE.random_example(**REGEXP_EXAMPLES_OPTS)
48 end
49
50 # @return [String]
51 def non_nanp_phone
52 send(
53 choose(
54 :french_phone, :german_phone, :uk_phone,
55 :spanish_phone, :italian_phone
56 )
57 )
58 end
59
60 # @note https://stackoverflow.com/questions/6478875/regular-expression-matching-e-164-formatted-phone-numbers
61 # @return [String]
62 def nanpa_phone
63 "+1" +
64 sized(1) { string(/[2-9]/) } +
65 sized(2) { string(/[0-9]/) } +
66 sized(1) { string(/[2-9]/) } +
67 sized(6) { string(/[0-9]/) }
68 end
69
70 # @note https://stackoverflow.com/questions/4894198/how-to-generate-a-random-date-in-ruby
71 # @return [String]
72 def iso8601(from = 0.0, to = Time.now)
73 value { Time.at(from + float * (to.to_f - from.to_f)).iso8601 }
74 end
75
76 # @return [String]
77 def bare_jid
78 local = sized(range(3, 12)) { string(:alnum) }
79 domain = sized(range(3, 8)) { string(:lower) }
80 "#{local}@#{domain}.example.com"
81 end
82
83 # @return [String]
84 def bw_message_id
85 sized(range(6, 19)) { string(:alnum) }
86 end
87
88 # @return [String]
89 def shortcode
90 range(10000, 999999).to_s
91 end
92
93 # @return [Array<String>]
94 HTTP_ESCAPABLE = " &=?/+@#".chars.freeze
95
96 # @return [String]
97 def maybe_http_escapable_string
98 base = sized(range(3, 8)) { string(:alnum) }
99 choose(
100 base,
101 base + choose(*HTTP_ESCAPABLE) +
102 sized(range(1, 5)) { string(:alnum) }
103 )
104 end
105
106 # @return [String]
107 def media_url
108 user_id = sized(range(3, 10)) { string(:alnum) }
109 name = sized(range(3, 12)) { string(:alnum) }
110 ext = choose(".jpg", ".png", ".gif", ".mp4", ".pdf", ".smil", ".txt", ".xml")
111 "https://messaging.bandwidth.com/api/v2/users/#{user_id}/media/#{name}#{ext}"
112 end
113 end
114 end
115
116 include Data::Extensions
117end