mns_subscriber 0.6.0 → 0.7.1

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: 55df9bad963044ed01313c1c749b43e8ae3d746a9107dbb3bb9c9ff938837f91
4
- data.tar.gz: 706bda2bdeba756c74e945f0b73f810de3c7cadef841f48692e80ca17a53dc8a
3
+ metadata.gz: e2ddc06764160255bf154806e01be715caa37041f21966e01d79b75e6329639b
4
+ data.tar.gz: 18c8c1b25c56b449761ab622742219a5b10a7f485e907902027d3303c0c2e069
5
5
  SHA512:
6
- metadata.gz: 7ddd48242e49bc872922772f622c4f3f33e32718a8b4e09b880506a9f1b8be3c074428620757e8fa32b2af6db32123846b896019050b80fa412e6e448f784bc5
7
- data.tar.gz: 79b6e558a22ba819116dffac11a1c873a8d5982730f2f0f2159cde9cecd109e673e4c300d4386c4f435f07104215007f5bbc1c405bdaa8713e37b7dda550647f
6
+ metadata.gz: 12c18783de474d14ba80b5baefaea3aad9c1dae802ae48e1c0d80cf4787c07a07f394c12b1619390aac611cf804757c733d0f429cf0903eadc4d1b543b81c4d3
7
+ data.tar.gz: a0779ad109d9f9347ec6f298a5ca490a54507294c542d8c27908df8835debd5d3f846fcae13e8626d37d791d684ae178fe1dab03ebc1b2fda871f60a65ef2042
checksums.yaml.gz.sig CHANGED
Binary file
@@ -7,179 +7,444 @@ require 'mtlite'
7
7
  require 'sps-sub'
8
8
  require 'daily_notices'
9
9
  require 'recordx_sqlite'
10
+ require 'easyimg_utils'
10
11
 
11
12
 
12
- class MNSSubscriber < SPSSub
13
-
14
- def initialize(host: 'sps', port: 59000, dir: '.', options: {},
15
- timeline: nil, log: nil)
16
-
17
- @log = log
18
- log.info 'mns_subscriber/initialize: active' if log
19
-
20
- # note: a valid url_base must be provided
21
-
22
- @options = {
23
- url_base: 'http://yourwebsitehere.co.uk/',
24
- dx_xslt: '/xsl/dynarex.xsl',
25
- rss_xslt: '/xsl/feed.xsl',
26
- target_page: :page,
27
- target_xslt: '/xsl/page.xsl'
28
- }.merge(options)
29
-
30
- super(host: host, port: port, log: log)
31
- @filepath, @timeline = dir, timeline
32
-
33
- @index = nil
13
+ module MNSSubscriber
34
14
 
35
- end
15
+ class NoticeMgr
16
+ include RXFHelperModule
17
+ using ColouredText
36
18
 
37
- def subscribe(topic='notice/*')
38
- super(topic)
39
- end
19
+ def initialize(sps=nil, dir: '.', options: {}, timeline: nil,
20
+ hashtag_url: nil, log: nil, debug: false)
40
21
 
41
- private
42
-
43
- def ontopic(topic, msg)
44
-
45
- @log.info 'mns_subscriber/ontopic: topic: ' + topic.inspect if @topic
46
-
47
- a = topic.split('/')
48
- puts "%s: %s %s" % [topic, Time.now.to_s, msg.inspect]
49
-
50
-
51
- case a.last.to_sym
52
-
53
- when :profile
54
-
55
- update_attributes(:description, subtopic=a[-2], profile=msg)
56
-
57
- when :link
58
-
59
- update_attributes(:link, subtopic=a[-2], link=msg)
60
-
61
- when :title
62
-
63
- update_attributes(:title, subtopic=a[-2], title=msg)
64
-
65
- when :image
66
-
67
- update_attributes(:image, subtopic=a[-2], title=msg)
68
-
69
- when :delete
70
-
71
- delete_notice(subtopic=a[-2], msg)
72
-
73
- else
74
-
75
- subtopic, id = a[1..-1]
76
- add_notice(subtopic, msg, id)
77
-
78
- end
22
+ @sps, @log, @debug = sps, log, debug
79
23
 
80
- end
24
+ # note: a valid url_base must be provided
25
+ @options = {
26
+ url_base: 'http://yourwebsitehere.co.uk/',
27
+ dx_xslt: '/xsl/dynarex.xsl',
28
+ rss_xslt: '/xsl/feed.xsl',
29
+ target_page: :page,
30
+ target_xslt: '/xsl/page.xsl',
31
+ local_media_path: '/home/user/media',
32
+ url_media_path: 'http://media.yourwebsitehere.co.uk/'
33
+ }.merge(options)
34
+
35
+
36
+ @filepath, @timeline = dir, timeline
37
+
38
+ @index = nil
39
+ @hashtags = nil
40
+
41
+
42
+ if hashtag_url then
43
+
44
+ @hashtag_url = @options[:url_base] + hashtag_url.sub(/^\//,'')
45
+
46
+ hashtag_path = File.join(dir, 'hashtag')
47
+ tagdb = File.join(hashtag_path, 'index.db')
48
+ FileX.mkdir_p File.dirname(tagdb)
81
49
 
82
- def add_notice(topic, raw_msg, raw_id=Time.now)
83
-
84
- @log.info 'mns_subscriber/add_notice: active' if @log
85
- topic_dir = File.join(@filepath, topic)
86
- notices = DailyNotices.new topic_dir, @options.merge(identifier: topic,
87
- title: topic.capitalize + ' daily notices', log: @log)
88
-
89
- id = (raw_id || Time.now).to_i
90
-
91
- # strip out any JSON from the end of the message
92
- msg, raw_json = raw_msg.split(/(?=\{.*)/)
93
-
94
- mtlite = MTLite.new(msg)
95
-
96
- desc = if mtlite.to_html(para: false) =~ /<\w+/ then
97
- mtlite.to_html(para: true, ignore_domainlabel:true)
98
- else
99
- mtlite.to_s
50
+ h = {hashtags: {id: '', tag: '', topic: '', noticeid: ''}}
51
+ @hashtags = RecordxSqlite.new(tagdb, table: h )
52
+
53
+ end
100
54
  end
101
-
102
- title = mtlite.to_s.lines.first.chomp
103
- title = title[0..136] + ' ...' if title.length > 140
104
-
105
- h = {
106
- title: title,
107
- description: desc,
108
- topic: topic
109
- }
110
-
111
- return_status = notices.add(item: h, id: id.to_s)
112
-
113
- return if return_status == :duplicate
114
-
115
- rxnotices = RecordxSqlite.new(File.join(topic_dir, 'notices.db'),
116
- table: {notices: {id: 0, message: ''}})
117
-
118
- begin
119
- rxnotices.create id: id.to_s, message: msg
120
- rescue
121
- puts 'warning: rxnotices.create -> ' + ($!).inspect
55
+
56
+ def incoming(topic, msg)
57
+
58
+ a = topic.split('/')
59
+ context = a.last.to_sym
60
+
61
+ case context
62
+ when :profile
63
+
64
+ #update_attributes(:description, subtopic=a[-2], profile=msg)
65
+ h = JSON.parse msg, symbolize_names: true
66
+ update_profile(subtopic=a[-2], h)
67
+
68
+ when :link
69
+ puts 'we have a link' if @debug
70
+ update_attributes(:link, subtopic=a[-2], link=msg)
71
+
72
+ when :title
73
+
74
+ update_attributes(:title, subtopic=a[-2], title=msg)
75
+
76
+ when :image
77
+ #puts 'we have an image'
78
+ update_attributes(:image, subtopic=a[-2], title=msg)
79
+
80
+ when :delete
81
+
82
+ delete_notice(subtopic=a[-2], msg)
83
+
84
+ when :json
85
+
86
+ # JSON contains a message and 1 or more media files
87
+ h = JSON.parse msg, symbolize_names: true
88
+ puts 'h: ' + h.inspect if @debug
89
+
90
+ subtopic = a[-2]
91
+
92
+ t = Time.now
93
+ id = t.to_i.to_s + t.strftime("%2N")
94
+
95
+ filepath = File.join(@options[:local_media_path], 'images')
96
+
97
+ a = h[:files].map.with_index do |f,i|
98
+
99
+ # is f an Array object containing various sized images of the 1 file?
100
+ a2 = f.is_a?(Array) ? f : [f]
101
+
102
+ scale = a2.map do |imgfile|
103
+
104
+ scale = imgfile[/(_\w+)\.\w+$/,1].to_s
105
+ file = "%s%s%s" % [(id.to_i + i+1).to_s(36).reverse, scale, File.extname(imgfile)]
106
+ dest = File.join(filepath, file)
107
+
108
+ FileX.cp imgfile, dest
109
+ FileX.chmod 0755, dest
110
+
111
+ file
112
+
113
+ end
114
+ puts 'scale: ' + scale.inspect
115
+ index = scale[2] ? 2 : (scale[1] ? 1 : 0)
116
+ file1 = scale[index]
117
+
118
+ dir = File.extname(file1) =~ /\.(?:jpg|png)/ ? 'images' : ''
119
+ url = [@options[:url_media_path], dir, file1].join('/')
120
+
121
+ href = [@options[:url_base].sub(/\/$/,''), subtopic, 'status', id,
122
+ 'photo', (i+1).to_s ].join('/')
123
+ # find the best y position for the image letterbox view
124
+ pct = EasyImgUtils.new(a2[index]).best_viewport
125
+ pct2 = (pct / 10.0).to_i * 10
126
+
127
+ align = if pct < 35 then
128
+
129
+ if pct < 10 then
130
+ :top
131
+ else
132
+ 'y' + pct2.to_s
133
+ end
134
+
135
+ elsif pct >= 70
136
+ :bottom
137
+ else
138
+ #'y' + pct.to_s
139
+ :center
140
+ end
141
+
142
+ {url: url, align: align}
143
+
144
+ end
145
+
146
+
147
+ card = if h[:card] then
148
+
149
+ puts 'h[:card]: ' + h[:card].inspect
150
+ puts 'a: ' + a.inspect
151
+
152
+ if h[:card][:summary_large_image] then
153
+
154
+ h[:card][:summary_large_image][:img] = a[2][:url] if a.any?
155
+ h[:card]
156
+
157
+ elsif h[:card][:summary]
158
+
159
+ h[:card][:summary][:img] = a[0][:url] if a.any?
160
+ h[:card]
161
+
162
+ end
163
+
164
+ elsif a.any?
165
+ {images: a}
166
+ end
167
+ puts 'before build'
168
+ #puts ('card: ' + card.inspect).debug
169
+
170
+ h[:msg] += build(card) if card
171
+ add_notice(subtopic, h[:msg].gsub('<','&lt;')\
172
+ .gsub('>','&gt;').gsub("\r",''), id,
173
+ (card ? card.to_json : nil))
174
+
175
+ else
176
+
177
+ subtopic, id = a[1..-1]
178
+ add_notice(subtopic, msg, id)
179
+
180
+ end
122
181
  end
123
-
124
- if raw_json then
125
-
126
- record = JSON.parse(raw_json)
127
- index = RecordxSqlite.new(File.join(topic_dir, 'index.db'),
128
- table: {items: record})
129
- index.create record
130
-
131
- update_index_xml(index, topic_dir)
132
-
182
+
183
+ private
184
+
185
+ def add_notice(topic, raw_msg, raw_id=nil, card=nil)
186
+
187
+ @log.info 'mns_subscriber/add_notice: active' if @log
188
+ topic_dir = File.join(@filepath, 'u', topic)
189
+
190
+ options = @options.clone
191
+ options.delete :local_media_path
192
+ options.delete :url_media_path
193
+
194
+ notices = DailyNotices.new topic_dir, options.merge(identifier: topic,
195
+ title: topic.capitalize + ' daily notices', log: @log)
196
+
197
+ t = Time.now
198
+ id = (raw_id || t.to_i.to_s + t.strftime("%2N")).to_i
199
+
200
+ # strip out any JSON from the end of the message
201
+ msg, raw_json = raw_msg.split(/(?=\{.*)/)
202
+
203
+ msg = ' ' if msg.nil?
204
+ mtlite = MTLite.new(msg)
205
+
206
+ desc = if mtlite.to_html(para: false) =~ /<\w+/ then
207
+ mtlite.to_html(para: true, ignore_domainlabel:true)
208
+ else
209
+ mtlite.to_s
210
+ end
211
+
212
+ if @hashtag_url then
213
+
214
+ tags = desc.scan(/(?<= #)\w+/)
215
+
216
+ desc.gsub!(/ [#\$][a-zA-Z]\w+/) do |rawx|
217
+
218
+ x = rawx.lstrip
219
+ baseurl = x[0] == '#' ? @hashtag_url : 'search?q='
220
+ url = baseurl + CGI.escape(x.sub(/^#/,''))
221
+ " <a href='%s'>%s</a>" % [url, x]
222
+
223
+ end
224
+
225
+ # add the record to the database
226
+ tags.each do |tag|
227
+
228
+ t = Time.now
229
+ id2 = (t.to_i.to_s + t.strftime("%2N")).to_i
230
+ h = {id: id2, tag: tag, topic: topic, noticeid: id}
231
+
232
+ @hashtags.create h if @hashtags
233
+
234
+ end
235
+
236
+ end
237
+
238
+ title = mtlite.to_s.lines.first.chomp
239
+ title = title[0..136] + ' ...' if title.length > 140
240
+
241
+ h = {
242
+ title: title,
243
+ description: desc,
244
+ topic: topic,
245
+ card: card
246
+ }
247
+ #puts 'inside add_notice h: ' + h.inspect
248
+ return_status = notices.add(item: h, id: id.to_s)
249
+ #puts 'return_status: ' + return_status.inspect
250
+
251
+ return if return_status == :duplicate
252
+
253
+ rxnotices = RecordxSqlite.new(File.join(topic_dir, 'notices.db'),
254
+ table: {notices: {id: 0, description: '', message: ''}})
255
+
256
+ begin
257
+ rxnotices.create id: id.to_s, description: desc, message: msg
258
+ rescue
259
+ puts 'warning: rxnotices.create -> ' + ($!).inspect
260
+ end
261
+
262
+ if raw_json then
263
+
264
+ record = JSON.parse(raw_json)
265
+ index = RecordxSqlite.new(File.join(topic_dir, 'index.db'),
266
+ table: {items: record})
267
+ index.create record
268
+
269
+ update_index_xml(index, topic_dir)
270
+
271
+ end
272
+
273
+ @sps.notice "%s/add: %s/status/%s" % [@timeline, topic, id] if @timeline
274
+
275
+ sleep 0.3
276
+
133
277
  end
134
-
135
- self.notice "%s/add: %s/status/%s" % [@timeline, topic, id] if @timeline
136
-
137
- sleep 0.3
138
-
139
- end
140
-
141
- def delete_notice(topic, msg)
142
-
143
- topic_dir = File.join(@filepath, topic)
144
-
145
- notices = RecordxSqlite.new(File.join(topic_dir, 'notices.db'),
146
- table: 'notices')
147
- id = msg.to_i
148
- notices.delete id
149
-
150
- indexdb = File.join(topic_dir, 'index.db')
151
-
152
- if File.exists? indexdb then
153
-
154
- index = RecordxSqlite.new(indexdb, table: 'items')
155
- index.delete id
156
- update_index_xml(index, topic_dir)
278
+
279
+ def delete_notice(topic, msg)
280
+
281
+ topic_dir = File.join(@filepath, topic)
282
+
283
+ id = msg.to_i
284
+
285
+ feed = DailyNotices.new topic_dir, log: @log
286
+ feed.delete id
287
+
288
+ notices = RecordxSqlite.new(File.join(topic_dir, 'notices.db'),
289
+ table: 'notices')
290
+ notices.delete id
291
+
292
+ indexdb = File.join(topic_dir, 'index.db')
293
+
294
+ if File.exists? indexdb then
295
+
296
+ index = RecordxSqlite.new(indexdb, table: 'items')
297
+ index.delete id
298
+ update_index_xml(index, topic_dir)
299
+ end
300
+
157
301
  end
158
-
159
- end
160
-
161
- def update_index_xml(index, topic_dir)
162
-
163
- # create the index.xml file
164
-
165
- a = index.order(:desc).first(15)
166
- a2 = a.map {|x| h = x.to_h; id = h.delete(:id); {item_id: id}.merge(h)}
167
-
168
- dx = Dynarex.new
169
- dx.import a2
170
- dx.order ='descending'
171
-
172
- dx.save File.join(topic_dir, 'index.xml')
173
-
302
+
303
+ # builds the HTML for a given card
304
+ #
305
+ def build(card)
306
+ puts 'inside build'
307
+
308
+ #return card.inspect
309
+ #next unless card.is_a? Hash
310
+
311
+ if card.is_a? Hash then
312
+
313
+ card2 = case card.keys.first
314
+ when :images
315
+
316
+ card[:images].map.with_index do |img, i|
317
+
318
+ "<img class='img1' src='%s'/>" % img[:url]
319
+
320
+ end.join
321
+
322
+ when :summary_large_image
323
+
324
+ h2 = card[:summary_large_image]
325
+
326
+ rawdesc = h2[:desc]
327
+
328
+ desc = rawdesc.length > 147 ? rawdesc[0..147] + '...' : rawdesc
329
+ site = h2[:url][/https?:\/\/([^\/]+)/,1].sub(/^www\./,'')
330
+ title = h2[:title]
331
+ img = h2[:img]
332
+ url = h2[:url]
333
+
334
+ # The following Card HTML template is for use with the RSS feed.
335
+ # The actual HTML template for the card is rendered dynamically
336
+ # from the web server.
337
+ "
338
+ <div class='card'><a href='#{url}' target='_blank'>" +
339
+ "<div class='top-crop center'><img src='#{img}'/></div>" +
340
+ "<span class='title'>#{title}</span></a><p>#{desc}</p>" +
341
+ "<span class='link'><span class='linkurl'>#{site}</span></span></div>"
342
+
343
+ when :summary
344
+
345
+ h2 = card[:summary]
346
+ puts 'h2: ' + h2.inspect
347
+ rawdesc = h2[:desc]
348
+
349
+ desc = rawdesc.length > 120 ? rawdesc[0..120] + '...' : rawdesc
350
+ site = h2[:url][/https?:\/\/([^\/]+)(?=\/)/,1].sub(/^www\./,'')
351
+ title = h2[:title]
352
+ img = h2[:img]
353
+ url = h2[:url]
354
+
355
+ # The following Card HTML template is for use with the RSS feed.
356
+ # The actual HTML template for the card is rendered dynamically
357
+ # from the web server.
358
+
359
+ "<div class='card2'><a href='#{url}' target='_blank'><div><div id='col1'>" +
360
+ "<img src='#{img}'></div><div id='col2'><div id='content'>" +
361
+ "<span class='title'>#{title}</span><span class='desc'>#{desc}</span>" +
362
+ "<span class='link'><span class='linkurl'>#{site}</span></span></div>" +
363
+ "</div></div></a></div>"
364
+
365
+ end
366
+ end
367
+
368
+ end
369
+
370
+ def update_index_xml(index, topic_dir)
371
+
372
+ # create the index.xml file
373
+
374
+ a = index.order(:desc).first(15)
375
+ a2 = a.map {|x| h = x.to_h; id = h.delete(:id); {item_id: id}.merge(h)}
376
+
377
+ dx = Dynarex.new
378
+ dx.import a2
379
+ dx.order ='descending'
380
+
381
+ dx.save File.join(topic_dir, 'index.xml')
382
+
383
+ end
384
+
385
+ def update_attributes(attribute, topic, value)
386
+
387
+ topic_dir = File.join(@filepath, topic)
388
+ notices = DailyNotices.new topic_dir, @options.merge(identifier: topic)
389
+ notices.method((attribute.to_s + '=').to_sym).call(value)
390
+ notices.save
391
+
392
+ end
393
+
394
+ def update_profile(topic, h)
395
+
396
+ topic_dir = File.join(@filepath, topic)
397
+ notices = DailyNotices.new topic_dir, @options.merge(identifier: topic)
398
+
399
+ valid_keys = %i(title identifier image bio location website banner_image)
400
+
401
+ h.each_pair do |key, value|
402
+
403
+ next unless valid_keys.include? key
404
+
405
+ attribute = key.to_s
406
+ notices.method((attribute + '=').to_sym).call(value)
407
+
408
+ end
409
+
410
+ notices.save
411
+
412
+ end
413
+
414
+
174
415
  end
175
416
 
176
- def update_attributes(attribute, topic, value)
177
-
178
- topic_dir = File.join(@filepath, topic)
179
- notices = DailyNotices.new topic_dir, @options.merge(identifier: topic)
180
- notices.method((attribute.to_s + '=').to_sym).call(value)
181
- notices.save
182
-
417
+ class Client < SPSSub
418
+
419
+ def initialize(host: 'sps', port: 59000, dir: '.', options: {},
420
+ timeline: nil, log: nil, hashtag_url: nil)
421
+
422
+ @log = log
423
+ log.info 'mns_subscriber/initialize: active' if log
424
+ @nm = NoticeMgr.new(self, dir: dir, options: options, timeline: timeline,
425
+ hashtag_url: hashtag_url, debug: true)
426
+
427
+ super(host: host, port: port, log: log)
428
+
429
+ end
430
+
431
+ def subscribe(topic='notice/*')
432
+ super(topic)
433
+ end
434
+
435
+ private
436
+
437
+ def ontopic(topic, msg)
438
+
439
+ @log.info 'mns_subscriber/ontopic: topic: ' + topic.inspect if @topic
440
+
441
+ a = topic.split('/')
442
+ #puts "%s: %s %s" % [topic, Time.now.to_s, msg.inspect]
443
+
444
+ @nm.incoming topic, msg
445
+
446
+ end
447
+
183
448
  end
184
449
 
185
450
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mns_subscriber
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Robertson
@@ -35,28 +35,28 @@ cert_chain:
35
35
  yOAycOYzp7fxmPl3/HV5D0YOJwuy1XslA50GQJwq12A5vMyUGUCHuxH/zKZcM/zr
36
36
  0QZaKiVqq5ZeGvni0eQSavhQ
37
37
  -----END CERTIFICATE-----
38
- date: 2021-02-24 00:00:00.000000000 Z
38
+ date: 2022-01-17 00:00:00.000000000 Z
39
39
  dependencies:
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: mtlite
42
42
  requirement: !ruby/object:Gem::Requirement
43
43
  requirements:
44
- - - ">="
45
- - !ruby/object:Gem::Version
46
- version: 0.4.0
47
44
  - - "~>"
48
45
  - !ruby/object:Gem::Version
49
46
  version: '0.4'
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: 0.4.1
50
50
  type: :runtime
51
51
  prerelease: false
52
52
  version_requirements: !ruby/object:Gem::Requirement
53
53
  requirements:
54
- - - ">="
55
- - !ruby/object:Gem::Version
56
- version: 0.4.0
57
54
  - - "~>"
58
55
  - !ruby/object:Gem::Version
59
56
  version: '0.4'
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: 0.4.1
60
60
  - !ruby/object:Gem::Dependency
61
61
  name: sps-sub
62
62
  requirement: !ruby/object:Gem::Requirement
@@ -81,44 +81,64 @@ dependencies:
81
81
  name: daily_notices
82
82
  requirement: !ruby/object:Gem::Requirement
83
83
  requirements:
84
- - - ">="
85
- - !ruby/object:Gem::Version
86
- version: 0.7.0
87
84
  - - "~>"
88
85
  - !ruby/object:Gem::Version
89
86
  version: '0.7'
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: 0.7.2
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: 0.7.0
97
94
  - - "~>"
98
95
  - !ruby/object:Gem::Version
99
96
  version: '0.7'
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: 0.7.2
100
100
  - !ruby/object:Gem::Dependency
101
101
  name: recordx_sqlite
102
102
  requirement: !ruby/object:Gem::Requirement
103
103
  requirements:
104
- - - ">="
105
- - !ruby/object:Gem::Version
106
- version: 0.3.0
107
104
  - - "~>"
108
105
  - !ruby/object:Gem::Version
109
106
  version: '0.3'
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: 0.3.3
110
110
  type: :runtime
111
111
  prerelease: false
112
112
  version_requirements: !ruby/object:Gem::Requirement
113
113
  requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '0.3'
114
117
  - - ">="
115
118
  - !ruby/object:Gem::Version
116
- version: 0.3.0
119
+ version: 0.3.3
120
+ - !ruby/object:Gem::Dependency
121
+ name: easyimg_utils
122
+ requirement: !ruby/object:Gem::Requirement
123
+ requirements:
117
124
  - - "~>"
118
125
  - !ruby/object:Gem::Version
119
- version: '0.3'
126
+ version: '0.7'
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ version: 0.7.4
130
+ type: :runtime
131
+ prerelease: false
132
+ version_requirements: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - "~>"
135
+ - !ruby/object:Gem::Version
136
+ version: '0.7'
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: 0.7.4
120
140
  description:
121
- email: james@jamesrobertson.eu
141
+ email: digital.robertson@gmail.com
122
142
  executables: []
123
143
  extensions: []
124
144
  extra_rdoc_files: []
metadata.gz.sig CHANGED
Binary file