contacts_txt 0.3.1 → 0.4.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9abd4607e4765b8edaa26fa9880f4152f5187868ce84e11308fcc6b3918c734d
4
- data.tar.gz: 39609f542c37597a33cb42723488431cbd19cfec2c873919d69581d5f5c9d2c1
3
+ metadata.gz: bf478e02d22813b059b002369a94120ffa7db0c98e7ee02f7eb5a7604f000e36
4
+ data.tar.gz: 0e220217e01429b1b35c059df1e8459100ee4003a618c8634dcafd09ca30baeb
5
5
  SHA512:
6
- metadata.gz: e99e8c0f20abedcbc47487dceea18a24f6166c84ebb8bff71f9bbfbf064979e8e4fcb2343642a08f566863bebe9034d654aff136114a4652393fc93aee3f4504
7
- data.tar.gz: b6524180f0d62331a283a181534ab742f050f7d228e10973ee4a7899e20ac70702b8d9927be103bbd04984866441f394f57d9203e12f68058a3bdb99832e1df7
6
+ metadata.gz: 71e031cd9bef37e5d93c634832d2ba450a17605cbbf5c088898a73b1678cb0c477bfce0eddfa60604c784805b3126bd8e1305ebc494e78927aea4024339e0752
7
+ data.tar.gz: 1d0686e575cd7242676541d2ad093a113c5ffd95666f56450d1139376d4d399ecd6c67e7b547f9118e02cc4f7e42620e93dd2752b550f445c43cab008d216a0c
checksums.yaml.gz.sig CHANGED
Binary file
data/lib/contacts_txt.rb CHANGED
@@ -3,26 +3,27 @@
3
3
  # file: contacts_txt.rb
4
4
 
5
5
  require 'dynarex'
6
+ require 'rxfreadwrite'
6
7
 
7
8
 
8
9
  class ContactsTxt
9
- include RXFHelperModule
10
+ include RXFReadWriteModule
10
11
 
11
12
  attr_reader :to_s
12
-
13
- def initialize(src=nil, fields: %w(role organisation mobile
14
- sms email dob tags address notes note mobile2 ),
13
+
14
+ def initialize(src=nil, fields: %w(role organisation mobile
15
+ sms email dob tags address notes note mobile2 ),
15
16
  username: nil, password: nil, debug: false)
16
-
17
+
17
18
  @debug = debug
18
19
  @fields = %w(fullname firstname lastname tel) | fields
19
20
 
20
21
  txt, type = if src then
21
- RXFHelper.read(src, username: username, password: password)
22
+ RXFReader.read(src, username: username, password: password)
22
23
  else
23
24
  ['', :unknown]
24
25
  end
25
-
26
+
26
27
  case type
27
28
  when :file
28
29
  @path, @filename = File.dirname(src), File.basename(src)
@@ -33,100 +34,100 @@ class ContactsTxt
33
34
  when :unknown
34
35
  @path, @filename = '.', 'contacts.txt'
35
36
  end
36
-
37
+
37
38
  @dx = txt.lines.length > 1 ? import_to_dx(txt) : new_dx()
38
39
 
39
40
  end
40
-
41
+
41
42
  def all()
42
43
  @dx.all
43
44
  end
44
-
45
+
45
46
  def dx()
46
47
  @dx
47
48
  end
48
-
49
+
49
50
  def find_by_id(id)
50
-
51
+
51
52
  @dx.find_by_id id
52
-
53
+
53
54
  end
54
-
55
+
55
56
  def find_by_mobile(raw_number, countrycode='44')
56
57
 
57
58
  number = Regexp.new raw_number.sub(/^(?:0|#{countrycode})/,'').gsub(/[ -]*/,'')
58
-
59
- @dx.all.find {|x| x.mobile.gsub(/[ -]*/,'') =~ number }
60
59
 
61
- end
62
-
60
+ @dx.all.find {|x| x.mobile.gsub(/[ -]*/,'') =~ number }
61
+
62
+ end
63
+
63
64
  def find_by_name(s)
64
65
 
65
66
  # Appending a hashtag to the name can help with finding the specific record
66
- # e.g. 'Peter#plumber' or 'Peter #plumber'
67
-
67
+ # e.g. 'Peter#plumber' or 'Peter #plumber'
68
+
68
69
  raw_name, tag = s.split('#',2).map(&:strip)
69
-
70
+
70
71
  name = Regexp.new "\b#{raw_name}\b|#{raw_name}", Regexp::IGNORECASE
71
72
  puts 'name: ' + name.inspect if @debug
72
-
73
- a = @dx.all.select do |x|
73
+
74
+ a = @dx.all.select do |x|
74
75
  x.fullname =~ name or x.firstname =~ name or x.lastname =~ name
75
76
  end
76
-
77
+
77
78
  if tag then
78
- a.find {|x| x.tags.split.map(&:downcase).include? tag.downcase }
79
+ a.find {|x| x.tags.split.map(&:downcase).include? tag.downcase }
79
80
  else
80
81
  a
81
82
  end
82
83
 
83
- end
84
-
84
+ end
85
+
85
86
  def find_by_sms(raw_number, countrycode='44')
86
87
 
87
88
  number = Regexp.new raw_number\
88
89
  .sub(/^(?:0|#{countrycode})/,'').gsub(/[ -]*/,'')
89
-
90
+
90
91
  @dx.all.find {|x| x.sms.gsub(/[ -]*/,'') =~ number \
91
- or x.mobile.gsub(/[ -]*/,'') =~ number }
92
+ or x.mobile.gsub(/[ -]*/,'') =~ number }
92
93
 
93
- end
94
-
95
- # find using the tel, mobile, or mobile2 fields
94
+ end
95
+
96
+ # find using the tel, mobile, or mobile2 fields
96
97
  #
97
98
  def find_by_telno(raw_number)
98
99
 
99
100
  number = Regexp.new raw_number.gsub(/[ -]*/,'')
100
-
101
+
101
102
  @dx.all.find do |x|
102
-
103
+
103
104
  numbers = %i(tel mobile mobile2).map do |y|
104
105
  x.method(y).call.gsub(/[ -]*/,'') if x.respond_to? y
105
106
  end
106
-
107
+
107
108
  puts 'numbers: ' + numbers.inspect if @debug
108
109
  numbers.grep(number).any?
109
110
  end
110
111
 
111
- end
112
+ end
112
113
 
113
114
  # returns a Dynarex object
114
- #
115
+ #
115
116
  def email_list()
116
117
  @dx.filter {|x| x.email.length > 0}
117
118
  end
118
-
119
+
119
120
  def list_names()
120
-
121
+
121
122
  @dx.all.inject([]) do |r, x|
122
123
  x.fullname.length >= 1 ? r << x.fullname : r
123
124
  end
124
125
 
125
126
  end
126
-
127
+
127
128
  def mobile_list()
128
129
  @dx.filter {|x| x.mobile.length > 0}
129
- end
130
+ end
130
131
 
131
132
  def multi_tel_index()
132
133
 
@@ -137,7 +138,7 @@ class ContactsTxt
137
138
  end
138
139
  next unless tel
139
140
  "%s %s" % [x.fullname, x.method(tel).call]
140
- end.compact
141
+ end.compact
141
142
 
142
143
 
143
144
  # group by first name
@@ -152,8 +153,8 @@ class ContactsTxt
152
153
  c.each do |k, v|
153
154
 
154
155
  puts "k: %s v: %s" % [k, v]
155
- v.concat(r2[k]) if r2[k]
156
-
156
+ v.concat(r2[k]) if r2[k]
157
+
157
158
  end
158
159
 
159
160
  h = c.sort.each {|k,v| v.uniq!}.to_h
@@ -170,9 +171,9 @@ class ContactsTxt
170
171
  out << "\n" + (name.length >= 29 ? name[0..26] + '...' : name)
171
172
  tel = (' ' + ' ' * (26 - phone.length)) + 't: ' + phone
172
173
  out << tel + "\n"
173
- out << ('-' * 30)
174
+ out << ('-' * 30)
174
175
 
175
- end
176
+ end
176
177
 
177
178
  end
178
179
 
@@ -181,17 +182,17 @@ class ContactsTxt
181
182
  end
182
183
 
183
184
  def save(filename=@filename)
184
-
185
+
185
186
  s = dx_to_s(@dx)
186
187
  FileX.write File.join(@path, filename), s
187
188
  @dx.save File.join(@path, filename.sub(/\.txt$/,'.xml'))
188
-
189
+
189
190
  end
190
-
191
+
191
192
  def to_dx()
192
193
  @dx
193
194
  end
194
-
195
+
195
196
  def to_s()
196
197
  dx_to_s @dx
197
198
  end
@@ -199,9 +200,9 @@ class ContactsTxt
199
200
  private
200
201
 
201
202
  def dx_to_s(dx)
202
-
203
+
203
204
  rows = dx.all.map do |row|
204
-
205
+
205
206
  h = row.to_h
206
207
 
207
208
  fullname = h.delete :fullname
@@ -211,11 +212,11 @@ class ContactsTxt
211
212
 
212
213
  ([fullname] + a.map {|x| x.join(': ') }).join("\n")
213
214
  end
214
-
215
+
215
216
  "<?contacts fields='%s'?>\n\n%s" % [@fields, rows.join("\n\n")]
216
-
217
+
217
218
  end
218
-
219
+
219
220
  def import_to_dx(raw_s)
220
221
 
221
222
  s = if raw_s =~ /<?contacts / then
@@ -227,50 +228,50 @@ class ContactsTxt
227
228
  found = s2[/(?<=#{keyword}=['"])[^'"]+/]
228
229
  found ? r.merge(keyword.to_sym => found) : r
229
230
  end
230
-
231
+
231
232
  h = {
232
- fields: @fields.join(', '),
233
- }.merge attributes
233
+ fields: @fields.join(', '),
234
+ }.merge attributes
234
235
 
235
- @fields = h[:fields].split(/ *, */)
236
+ @fields = h[:fields].split(/ *, */)
236
237
 
237
238
  if h[:root] then
238
- "\n\n" + h[:root] + "\n" +
239
+ "\n\n" + h[:root] + "\n" +
239
240
  raw_contacts.strip.lines.map {|line| ' ' + line}.join
240
241
  else
241
242
  raw_contacts
242
243
  end
243
-
244
+
244
245
  else
245
-
246
+
246
247
  raw_s.lstrip.lines[2..-1].join.strip
247
248
 
248
249
  end
249
250
 
250
251
  new_dx().import "--+\n" + s.split(/\s+(?=^[\w\s\(\)]+$)/)\
251
- .map {|x| 'fullname: ' + x }.join("\n")
252
-
252
+ .map {|x| 'fullname: ' + x }.join("\n")
253
+
253
254
  end
254
-
255
+
255
256
  def new_dx()
256
-
257
+
257
258
  Dynarex.new "contacts/contact(#{@fields.join ', '})"
258
-
259
+
259
260
  end
260
261
 
261
262
  end
262
263
 
263
264
  class ContactsTxtAgent < ContactsTxt
264
-
265
+
265
266
  def find_mobile_by_name(s)
266
-
267
+
267
268
  result = find_by_name(s)
268
269
 
269
- r = validate(result)
270
-
270
+ r = validate(result)
271
+
271
272
  numbers = [r.sms.empty? ? r.mobile : r.sms, r.mobile].uniq\
272
273
  .map {|x| x.sub(/\([^\)]+\)/,'').strip}
273
-
274
+
274
275
  h = {}
275
276
  h[:msg] = if numbers.length > 1 then
276
277
  "The SMS number for %s is %s and the mobile number is %s" % \
@@ -285,30 +286,30 @@ class ContactsTxtAgent < ContactsTxt
285
286
  end
286
287
 
287
288
  h[:tags] = r.tags.to_s
288
- h
289
+ h
289
290
  end
290
-
291
+
291
292
  def find_tel_by_name(s)
292
-
293
+
293
294
  result = find_by_name(s)
294
- r = validate(result)
295
-
295
+ r = validate(result)
296
+
296
297
  h = {}
297
-
298
+
298
299
  if r.tel.empty? then
299
300
  return find_mobile_by_name(s)
300
301
  else
301
302
  h[:msg] = "The telephone number for %s is %s" % [r.fullname, r.tel]
302
303
  end
303
-
304
+
304
305
  h[:tags] = r.tags.to_s
305
- h
306
+ h
306
307
  end
307
308
 
308
309
  private
309
-
310
+
310
311
  def validate(result)
311
-
312
+
312
313
  case result.class.to_s
313
314
  when 'RecordX'
314
315
  result
@@ -316,8 +317,8 @@ class ContactsTxtAgent < ContactsTxt
316
317
  result.first
317
318
  when 'NilClass'
318
319
  return "I couldn't find that name."
319
- end
320
-
320
+ end
321
+
321
322
  end
322
-
323
+
323
324
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: contacts_txt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Robertson
@@ -11,31 +11,31 @@ cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
13
  MIIEXjCCAsagAwIBAgIBATANBgkqhkiG9w0BAQsFADAsMSowKAYDVQQDDCFnZW1t
14
- YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMjAwMTA1MTUxNjU1WhcN
15
- MjEwMTA0MTUxNjU1WjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
- cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCjBEU5
17
- 87uGRPHAB6oJBWp9y6sv/xAllgf0n0JW2CVWO7AA7D6lY3ExRen5Xsj+fZbGvZNC
18
- qljgtkY1TbBN7jDNtWXUKDG/wfkM6eqDoSMSWTiyGuVPtLQ8n9v9RwjLgtZjlsVk
19
- Adn+QT/t2bhO7haxX/sVqIe215G1OljM7DNPx4eqLJx5D0WMhQyfYPn3Z0CV0cdV
20
- Rz9cG64nCgCo88azMnhYKAEJrGlU+LTHvu84vaSFhyEm2uFpwMIFE+QhJ5HiWMl+
21
- i3hhJyswv6L1SPf24e6UgYUwYwy5syeWvwfVnplt7OQr5HlBvoFpqTQEPGTBiHsE
22
- tXUWZEUbvpgw9bSP5KBDFc8h8rHyMjl1t8FpsS5F41SgCLawSgouXOiE5nwAzND7
23
- SYe09anLJ280DNCog4yQcLCH4CQFNJU8PY33sSkxD4Y0ymNlS0Zf7jAPWPaGHXLN
24
- 9rMG43G0W1C65EY8RsqtJljRI3BPQQ+LJZCXc/CZJ/otv3X0dAkIKiMJbRkCAwEA
25
- AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUwxyqw31/
26
- OQZ4wD1Ueat8/DEscZUwJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
14
+ YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMjIwMjIzMTk0ODIwWhcN
15
+ MjMwMjIzMTk0ODIwWjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
+ cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDlecEA
17
+ 1V+ZCFfCwQwbOZ9S2Tn+ggDp85hVOoHZyfA+E6MMOShj1CE22RDfbyrAal+Z01C5
18
+ dol4wfM2s3x3QGwU/BhwoBs1el3beCkqEf86/bAfBMZ7TsxP8NcxeaQYxd4XUW52
19
+ f0UTA6EgM65L4F+K6vBWD76vjHwO6Z+hF9BrVVvifuT1jNykZ/PoDncs4nZaQKFP
20
+ yCtrrfjq9WOVG+ueHSm1+7rWqxBO2jH95Nlyfe2t2Q27gOz4hpcU6tyCGEb5Liz/
21
+ za+SUVNKbv8kxVBoQYYDMyHgZeS5YN1qlkxXSjSrUAIpp4eUHxaKMo6lTcXPXRPA
22
+ CezHTFC1cn276L80YXTj0Gw2Jp9On2AJXifKZ11nlOs+gBSS32r8UiqptAGe97Py
23
+ PotM+fYUjH7yunVnvsPIN+EC08vAhXCrMfFnvCuuyeSv8KKUFxmIeZE1Fn29MooE
24
+ Qd6QI6SJGWQ918Vj1NE4Lo/EKtgl5opL4cVPRzrH7yH82oyQiI/7NiemwrMCAwEA
25
+ AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUaABOt2ER
26
+ TZ9I1b5uj7HkRf+YVr4wJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
27
27
  c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1hc3RlckBqYW1lc3JvYmVydHNvbi5ldTAN
28
- BgkqhkiG9w0BAQsFAAOCAYEAOYA65DRMrJ9boX70+jES8O+2Rb6dRl2S7qOsNHqh
29
- 6ABXUYPSEFIg3TjxmOmoKqenfqH0EDv0nKmtCH3Sx7gYoClRgoAWXcVY+IAJV7RV
30
- C2U68mMwEaFC4I1AazFH4QiU4KWVDRcSlXMDRHV4woccXl0DuKBKTR/P8d2Bb20Z
31
- lB3lMzRWwCsVGeSNca3uIfxyP+kWU0c+rNV4wa6oE6+xC0aVkYZk4f2K7mk1D37V
32
- +z1sDmCsb57rSch74/9Wenof/LnOUbUQth2NzJCdIreYaWR4maJEtHXHUq8glNsY
33
- BivuQJVyHs/VvJ5b3/+l79zPdwOrPqZc3kSI4Pkd88ORXBwKjdSPi9elu1BmLU3M
34
- vD5QednPC6Uz+TsskfllqEFDePfvEZbdIxgDeDjcodiGw1hVkvjsxrarBfqW/ozO
35
- qmCJIuCwTOavNpNa1QrbiPivF5XoxOM1dEMfedK9qPxJhfovq0ZnfkMZW1R3/Qk7
36
- N1r4i3xYGxWWiZWLrlorY10U
28
+ BgkqhkiG9w0BAQsFAAOCAYEABS1c63h+vQL2hjWs7BvQM6vFxp1T4RDvviUqLUBt
29
+ YAg1/vWquUZ0PVi+Hf9gAaSumDjBb7qbbkn3Y2j/aV7wpG/yFtBoknIqihp7oH7/
30
+ wqGlntx9baORy7chaaBRA4CB4gGUFQ0wYHCBrHmj9zvfFWXnnRoFa06JIHm2DmOB
31
+ 41DwQiiLflNj4iYbLzNQSI5X0iRu3H8zcAp45HJNF2LBrY32b8U+4Uf1w9QOJ4Io
32
+ bXdjMDxNnHEj2+V2yaq4J8v0o/xEE0Qv2TEeXyiv2fvIRz5VsS3ayYv+rHVmxGuo
33
+ VuXOnyLlTUjeB0IakaSYdBFWW3uno+fds/mIBL9VtmZzPJ4UhirVs0t4GvftJ2oT
34
+ weBCjBPmFwYPtn66vFgOaUHK421yIA2FC+AQO/pOOSgngHz0pm08NMpcTeTaufKu
35
+ x9gWyaB0gatLOaqUuwj8jCICpzNLo20JZQyEav2hZDxdB1EQjxq9jZrMaxwW3lF/
36
+ zHoZFKaw47O+Nd14HCqMVZUt
37
37
  -----END CERTIFICATE-----
38
- date: 2020-01-05 00:00:00.000000000 Z
38
+ date: 2022-02-23 00:00:00.000000000 Z
39
39
  dependencies:
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: dynarex
@@ -43,22 +43,22 @@ dependencies:
43
43
  requirements:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: '1.8'
46
+ version: '1.9'
47
47
  - - ">="
48
48
  - !ruby/object:Gem::Version
49
- version: 1.8.21
49
+ version: 1.9.6
50
50
  type: :runtime
51
51
  prerelease: false
52
52
  version_requirements: !ruby/object:Gem::Requirement
53
53
  requirements:
54
54
  - - "~>"
55
55
  - !ruby/object:Gem::Version
56
- version: '1.8'
56
+ version: '1.9'
57
57
  - - ">="
58
58
  - !ruby/object:Gem::Version
59
- version: 1.8.21
59
+ version: 1.9.6
60
60
  description:
61
- email: james@jamesrobertson.eu
61
+ email: digital.robertson@gmail.com
62
62
  executables: []
63
63
  extensions: []
64
64
  extra_rdoc_files: []
@@ -83,7 +83,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
83
83
  - !ruby/object:Gem::Version
84
84
  version: '0'
85
85
  requirements: []
86
- rubygems_version: 3.0.3
86
+ rubygems_version: 3.2.22
87
87
  signing_key:
88
88
  specification_version: 4
89
89
  summary: Reads a contacts.txt file
metadata.gz.sig CHANGED
Binary file