mns_subscriber 0.6.1 → 0.7.2

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