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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/lib/mns_subscriber.rb +321 -203
- metadata +34 -14
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c9a3f061eca9581f000c9fd37c9341da37e29e723a883627b220045bc15daa68
|
4
|
+
data.tar.gz: 2c7ac5bb79b3b0bbc7edaf86c512aa06fd63d258ed2429788ee6d2f18644f26d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7ec27ad80dd5ccf4d69e9156a98ee5fc64870be0789f3d0eeaed9a449d52f1abec50eea61821d3e7ef97184c35882d0f1000a071507c7dd99ab45bba88141d44
|
7
|
+
data.tar.gz: 2adfaff285eb6677b02a0d4b501cf0f60400e91f0a6abe1dcc11a47602f8ae245b35ffbe66884fce01dc769742ce0201b7fe059e1a58ceb233307ce1f0534d2d
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/lib/mns_subscriber.rb
CHANGED
@@ -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
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
48
|
-
@
|
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
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
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
|
-
|
52
|
+
end
|
53
|
+
end
|
61
54
|
|
62
|
-
|
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
|
-
|
65
|
-
|
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('<','<')\
|
156
|
+
.gsub('>','>').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
|
-
|
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
|
-
|
71
|
-
|
72
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
83
|
-
|
84
|
-
update_attributes(:image, subtopic=a[-2], title=msg)
|
187
|
+
msg = ' ' if msg.nil?
|
188
|
+
mtlite = MTLite.new(msg)
|
85
189
|
|
86
|
-
|
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
|
-
|
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
|
-
|
217
|
+
title = mtlite.to_s.lines.first.chomp
|
218
|
+
title = title[0..136] + ' ...' if title.length > 140
|
91
219
|
|
92
|
-
|
93
|
-
|
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
|
-
|
230
|
+
return if return_status == :duplicate
|
96
231
|
|
97
|
-
|
98
|
-
|
232
|
+
rxnotices = RecordxSqlite.new(File.join(topic_dir, 'notices.db'),
|
233
|
+
table: {notices: {id: 0, description: '', message: ''}})
|
99
234
|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
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
|
-
|
108
|
-
|
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
|
-
|
252
|
+
@sps.notice "%s/add: %s/status/%s" % [@timeline, topic, id] if @timeline
|
253
|
+
|
254
|
+
sleep 0.3
|
120
255
|
|
121
|
-
|
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
|
-
|
264
|
+
feed = DailyNotices.new topic_dir, log: @log
|
265
|
+
feed.delete id
|
125
266
|
|
126
|
-
|
127
|
-
|
267
|
+
notices = RecordxSqlite.new(File.join(topic_dir, 'notices.db'),
|
268
|
+
table: 'notices')
|
269
|
+
notices.delete id
|
128
270
|
|
129
|
-
|
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
|
-
|
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
|
-
|
302
|
+
h2 = card[:summary_large_image]
|
134
303
|
|
135
|
-
|
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
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
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
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
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
|
-
|
168
|
-
|
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
|
-
|
175
|
-
|
176
|
-
|
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
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
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
|
-
|
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
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
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
|
-
|
363
|
+
super(host: host, port: port, log: log)
|
210
364
|
|
211
365
|
end
|
212
|
-
|
213
|
-
|
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
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
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.
|
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-
|
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
|