mns_subscriber 0.6.2 → 0.7.0

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: 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