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