rsscache 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (6) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data/lib/rsscache.rb +109 -70
  4. data.tar.gz.sig +0 -0
  5. metadata +35 -31
  6. metadata.gz.sig +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 93d9d21a9a587043e1db22b3f64164308c755eee
4
- data.tar.gz: 5e81b40fe30dc757fd46797d03bf670ba553206d
2
+ SHA256:
3
+ metadata.gz: d7b8a75b9f765464f14794c0c83f576de028b66d3bd676cfcad0cbe146b2544d
4
+ data.tar.gz: 955f0ce59bd22e3974b95df6a19cd59e1a7cdcaaa0b269e8db33cd706db64eef
5
5
  SHA512:
6
- metadata.gz: cfd87ca7214dde36963ee7a2bede8a41e1bf164a67159c688f93a34e83e80138a53f1d3a2eead31e1436bd9f4e12935333960e23a666982d1619743f077c8874
7
- data.tar.gz: 7ac379f1d015f2a068616d4a0abd576124937c40cdf4e071bf7439580884ad384bcb428f72743f2e03f3eec6849291720865d439a80bccd90b836fa75e1a9f84
6
+ metadata.gz: a2113381445334a113e6461dd977ee58b0a382811f1454fca0cab627431945e4af1f813127d9fcf5381eb7dd1e0700581193e7daa00eb6706cad5e4b77509b0e
7
+ data.tar.gz: 4f745332d263530b6087ab344b0bdedbeff9d5eb59203fe94a8d589c377839050657dbfa5bb0f5fdeafc659e55630690c2b00d2aaac71bb048e2549e0ab703da
checksums.yaml.gz.sig CHANGED
Binary file
data/lib/rsscache.rb CHANGED
@@ -1,36 +1,39 @@
1
1
  #!/usr/bin/env ruby
2
- #
2
+
3
3
  # file: rsscache.rb
4
4
 
5
5
  require 'dynarex'
6
6
  require 'open-uri'
7
7
  require 'simple-rss'
8
- require 'fileutils'
9
8
  require 'timeout'
9
+ require 'rxfreadwrite'
10
10
 
11
11
 
12
12
  class RSScache
13
-
14
- attr_reader :err_report
13
+ include RXFReadWrite
14
+
15
+ attr_reader :err_report, :dx
15
16
 
16
- def initialize(rsslist, feedsfilepath='.', debug: true)
17
+ def initialize(rsslist=nil, filepath: '.', debug: false)
17
18
 
19
+ rsslist ||= File.join(filepath, 'rsscache.xml')
18
20
  @dx = open_dynarex(rsslist)
19
- @rsslist, @feedsfilepath = rsslist, feedsfilepath
20
- FileUtils.mkdir_p feedsfilepath
21
-
21
+ @filepath = filepath
22
+ @cache_filepath = File.join(filepath, 'rsscache')
23
+ FileX.mkdir_p @cache_filepath
24
+
22
25
  @err_report = []
23
26
  @debug = debug
24
27
 
25
28
  end
26
-
27
- # Import a list of URLs into the Dynarex document.
29
+
30
+ # Import a list of URLs into the Dynarex document.
28
31
  # URLs which already exist are ignored.
29
32
  #
30
33
  def import(raw_s)
31
-
32
- s, _ = RXFHelper.read(raw_s)
33
-
34
+
35
+ s, _ = RXFReader.read(raw_s)
36
+
34
37
  s.strip.lines.each do |raw_url|
35
38
 
36
39
  url = raw_url.chomp
@@ -43,24 +46,24 @@ class RSScache
43
46
  puts 'new URL found' if @debug
44
47
  @dx.create url: url
45
48
  end
46
-
47
- end
48
-
49
- save_dynarex()
49
+
50
+ end
51
+
52
+ save()
50
53
  end
51
54
 
52
55
  # refresh each RSS feed
53
56
  #
54
57
  def refresh
55
-
58
+
56
59
  @err_report = []
57
60
 
58
61
  puts '@dx.to_xml' + @dx.to_xml(pretty: true) if @debug
59
-
62
+
60
63
  @dx.all.each do |feed|
61
-
64
+
62
65
  puts 'feed:' + feed.inspect if @debug
63
-
66
+
64
67
  if feed.next_refresh.empty? or \
65
68
  Time.now >= Time.parse(feed.next_refresh) then
66
69
 
@@ -68,7 +71,7 @@ class RSScache
68
71
 
69
72
  feed.refresh_rate = if feed.refresh_rate.empty? then
70
73
 
71
- 10
74
+ 10
72
75
 
73
76
  else
74
77
 
@@ -89,104 +92,140 @@ class RSScache
89
92
 
90
93
  end
91
94
  end
95
+
92
96
  puts '@dx: ' + @dx.to_xml(pretty: true) if @debug
93
- save_dynarex()
97
+ save()
94
98
 
95
99
  end
96
100
 
97
101
  alias update refresh
98
102
 
99
- def open_dynarex(x)
103
+ def save()
104
+
105
+ @dx.save File.join(@filepath, 'rsscache.xml')
106
+ FileX.write File.join(@filepath, 'rsscache.txt'), @dx.to_s
100
107
 
101
- if x.lines.length == 1 and File.exists?(x) and \
102
- File.extname(x) == '.txt' then
103
- Dynarex.new.import x
104
- else
105
- Dynarex.new x
106
- end
107
108
  end
108
109
 
109
- def save_dynarex()
110
110
 
111
- if @rsslist.lines.length == 1 and File.exists?(@rsslist)
111
+ private
112
112
 
113
- if File.extname(@rsslist) == '.txt'then
113
+ def raw_doc(s)
114
114
 
115
- File.write @rsslist, @dx.to_s
115
+ heading = '<?dynarex schema="rsscache[title]/feed(uid, title, ' +
116
+ 'url, refresh_rate, next_refresh, filename)"?>'
116
117
 
117
- else
118
+ raw_dx=<<EOF
119
+ #{heading}
120
+ title: RSS Feeds to be cached
118
121
 
119
- @dx.save
122
+ --+
120
123
 
121
- end
124
+ #{s.strip.lines.map {|x| 'url: ' + x }.join }
125
+ EOF
126
+
127
+ end
128
+
129
+ def fetch(url, timeout: 2)
122
130
 
131
+ puts 'inside fetch: url: ' + url.inspect if @debug
132
+
133
+ begin
134
+ Timeout::timeout(timeout){
135
+
136
+ buffer = URI.open(url).read.force_encoding("utf-8")
137
+ return [buffer, 200]
138
+ }
139
+ rescue Timeout::Error => e
140
+ ['connection timed out', 408]
141
+ rescue OpenURI::HTTPError => e
142
+ ['400 bad request', 400]
143
+ end
144
+
145
+ end
146
+
147
+ def open_dynarex(raw_s)
148
+
149
+ s, _ = RXFReader.read(raw_s)
150
+ puts 'inside open_dynarex s: ' + s.inspect if @debug
151
+
152
+ case s
153
+ when /^<?dynarex/
154
+ Dynarex.new.import s
155
+ when /^</
156
+ Dynarex.new s
157
+ else
158
+ Dynarex.new.import raw_doc(s)
123
159
  end
160
+
124
161
  end
125
162
 
126
- # checks for any updates and saves the latest RSS file to
127
- # the cache if there is
163
+ # checks for any updates and save the
164
+ # latest RSS file to the cache if there are updates
128
165
  #
129
166
  def updates?(feed)
130
167
 
131
168
  if @debug then
132
- puts 'inside updates?'
169
+ puts 'inside updates?'
133
170
  puts 'feed: ' + feed.inspect
134
171
  end
135
-
172
+
136
173
  # fetch the feeds from the web
137
- buffer, code = fetch(feed.url)
174
+ begin
175
+ buffer, code = fetch(feed.url)
176
+ rescue
177
+ puts 'RSScache::updates?: fetch() warning for feed ' + feed.url \
178
+ + ' ' + ($!).inspect
179
+ return
180
+ end
138
181
 
139
182
  if code == 200 then
140
- rss = SimpleRSS.parse(buffer)
183
+ begin
184
+ rss = SimpleRSS.parse(buffer)
185
+ rescue
186
+ puts 'RSScache::updates?: err: 100 SimpleRSS warning for feed ' \
187
+ + feed.url + ' ' + ($!).inspect
188
+ return
189
+ end
141
190
  else
142
191
  @err_report << [feed.url, code]
143
192
  return false
144
193
  end
145
194
 
146
195
  if feed.filename.empty? then
147
-
196
+
148
197
  filename = feed.url[6..-1].gsub(/\W+/,'').\
149
198
  reverse.slice(0,40).reverse.downcase + '.xml'
150
199
  feed.filename = filename
151
200
 
152
201
  end
153
-
154
- rssfile = File.join(@feedsfilepath, feed.filename)
155
202
 
156
- if File.exists? rssfile then
203
+ rssfile = File.join(@cache_filepath, feed.filename)
204
+
205
+ if FileX.exists? rssfile then
157
206
 
158
- rss_cache = SimpleRSS.parse File.read(rssfile)
207
+ begin
208
+ rss_cache = SimpleRSS.parse FileX.read(rssfile)
209
+ rescue
210
+ puts 'RSScache::updates?: err: 200 SimpleRSS warning for feed ' \
211
+ + feed.url + ' ' + ($!).inspect
212
+ FileX.rm rssfile
213
+ return false
214
+ end
159
215
  new_rss_items = rss.items - rss_cache.items
160
- (File.write rssfile, rss.source; return true) if new_rss_items.any?
161
-
216
+ (FileX.write rssfile, rss.source; return true) if new_rss_items.any?
217
+
162
218
  else
163
219
 
164
- File.write rssfile, rss.source
220
+ FileX.write rssfile, rss.source
165
221
  feed.title = rss.title if feed.title.empty?
166
222
 
167
223
  return true
168
-
224
+
169
225
  end
170
-
226
+
171
227
  return false
172
228
  end
173
-
174
- private
175
-
176
- def fetch(url, timeout: 2)
177
229
 
178
- begin
179
- Timeout::timeout(timeout){
180
230
 
181
- buffer = open(url).read
182
- return [buffer, 200]
183
- }
184
- rescue Timeout::Error => e
185
- ['connection timed out', 408]
186
- rescue OpenURI::HTTPError => e
187
- ['400 bad request', 400]
188
- end
189
-
190
- end
191
-
192
231
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rsscache
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Robertson
@@ -10,27 +10,32 @@ bindir: bin
10
10
  cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
- MIIDXjCCAkagAwIBAgIBATANBgkqhkiG9w0BAQUFADAsMSowKAYDVQQDDCFnZW1t
14
- YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMTgwMjA0MTUwMTQ0WhcN
15
- MTkwMjA0MTUwMTQ0WjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
- cnRzb24vREM9ZXUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCc92mR
17
- T6m1I0JF3lENRDv6liYXqJiStrmml5LWAEzI1kDXEXIeNziO9Jlo74rHwtrZxeJ0
18
- vuPBwXwDsoLEz1uz94hq1cfgRXXrj6K9A5YA8fQAvsFyKqxaS3Dtg5heQbgv5DUl
19
- p2dzrc057LaES5E5bdBmH2DVHoaHGyya17u4T2sz42gKkv3CURgRopj05JF3a0AZ
20
- WFE/N1xbD7ioffsKuPbGds6eL1eYk0qajutC0KIaRUqiTgzaTmntS1mDdz7nJMRM
21
- 7bVGP3cI1XfAGj/IqqfnapgYsVurPw9pzYGgBgH3XT/lKZW+xWfxpzkZH/ydpaF9
22
- XU61J04M6xm9pPMFAgMBAAGjgYowgYcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAw
23
- HQYDVR0OBBYEFCTDqdNBDLPNgRVZx02eHi9sOV7vMCYGA1UdEQQfMB2BG2dlbW1h
24
- c3RlckBqYW1lc3JvYmVydHNvbi5ldTAmBgNVHRIEHzAdgRtnZW1tYXN0ZXJAamFt
25
- ZXNyb2JlcnRzb24uZXUwDQYJKoZIhvcNAQEFBQADggEBABRCQKjdYT2lYH/XVGjB
26
- XabbdBuro3lsCqzm95wtF2qTyw60gNpXuP+FBbQbnf4YMrYe4N8+lDXdY6xs8KMP
27
- F8CoEBQSS0FqX1p4PT+5IDFEq/5Mmu46P9ZTS3bC5jlClr+IyclMdWl8yElWfer8
28
- 1KXDv1bwr1yjhc0vgAmnnUzk+V9fgDHQf58sTPlDa1k0T396x+BJ3i0xnLTOi2iU
29
- 0sAYj5+mVEGRx284sLHwgieDyxrLQMdPhDBnx5pPgJaQCw8xMS1S8DSX4gQAj+PK
30
- 5tiFhikiYyE9RjMYlZVwdfKc9yEGPhxY2J3V8RufP3HE6GHrV2lk5d9yFVcEqq+q
31
- T1k=
13
+ MIIEXjCCAsagAwIBAgIBATANBgkqhkiG9w0BAQsFADAsMSowKAYDVQQDDCFnZW1t
14
+ YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMjExMTE4MTk1NDM3WhcN
15
+ MjIxMTE4MTk1NDM3WjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
+ cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDl/WSn
17
+ rif0WGHmqi3lDo4hCKqsnTvQJFFBoYyGPd8nQPrXd1D6+o0B8qbihDaayk0itqVF
18
+ MAZpErc/X7G49/DsFHsCIggXezeu52Pjwos99kGla6qJoPUwP9uC4SMbUXrbfDOD
19
+ ONtkhEscM1vjZWfQketPUXxEpoQjQAgvEWP6JJ1wHIKf8zuxGgnOqXeyeMmI92sm
20
+ 8zOo/Tph2scpEePy8LMxj1t7WY2IKnHAjVI2bwv0t4iqzoBTGArsoKFa9CJvlEPn
21
+ KC+XCfbOyPHDYZ9rMp1VjuzE73FNvLaZyemytRITy/xZcnCRJuQJ1M5lmG1k7VGo
22
+ h12tG5hepRnU+y5eYbc7locMlm+BA0zJO6h76O16ssTXdPGmWIx0bqvH+tnE3Y1p
23
+ ge/EpMmSPaY4DwpCrUOVB2lXkWEvCTxaEUfigbro+tNnGrlolMLzYunGh/rIPwf6
24
+ JlPQofTjBLEZZ4HnvsZrcpDbKg1UAJ8DRKuGMO8vW3+SIluXMoDfkDSornsCAwEA
25
+ AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUMZkI563V
26
+ qEbcdqMHGxFBtvTHazwwJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
27
+ c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1hc3RlckBqYW1lc3JvYmVydHNvbi5ldTAN
28
+ BgkqhkiG9w0BAQsFAAOCAYEAGq7ekyOf3MP2SWidstI5qt1pOcyY0IsjJbU9KWiS
29
+ K9mCa3DxPks6EFHswXTEBb91S/523He3iHw3XIx0wNgDycH6/hxXoylhG37He/RG
30
+ UZVIYjs7TaVqHpslQkGcO0/tGXzQ35mooF8XiB88l08sBiEunZU3quCwG0ja6A0V
31
+ VOZ/0X3SqdOgrhagTMsjDnz7ssiP/H6hIAoFBhF7D3X+Vavo6wMhSwGMoeFmQh67
32
+ CUipnJc6MBLlq8AxZcTYhulLOxTjefUxpbPxLV+pubf9xyG4rjkpv7lMap6wENLS
33
+ KzCP36ihBrIbQ6QFi1stEPDDXMNiIYbT4liyv1Ij0VUfnhZ8XtdlTrDzTeTQ2JjA
34
+ RAxFbgUVr0H2AyzRphwLN5UUUGYhsZOS4G+ObMbXYFHTDBlJBj0GIYi7yt48E6FE
35
+ G9akldSLDKgsN9vmwihdlnktMrNa8HUDxodpx5FFzXDsza/qaExLHJA4hPkbgeiC
36
+ 4DQl3q4AK/bNTpTtJNtNQxts
32
37
  -----END CERTIFICATE-----
33
- date: 2018-02-04 00:00:00.000000000 Z
38
+ date: 2022-02-22 00:00:00.000000000 Z
34
39
  dependencies:
35
40
  - !ruby/object:Gem::Dependency
36
41
  name: dynarex
@@ -38,20 +43,20 @@ dependencies:
38
43
  requirements:
39
44
  - - "~>"
40
45
  - !ruby/object:Gem::Version
41
- version: '1.2'
46
+ version: '1.9'
42
47
  - - ">="
43
48
  - !ruby/object:Gem::Version
44
- version: 1.2.90
49
+ version: 1.9.5
45
50
  type: :runtime
46
51
  prerelease: false
47
52
  version_requirements: !ruby/object:Gem::Requirement
48
53
  requirements:
49
54
  - - "~>"
50
55
  - !ruby/object:Gem::Version
51
- version: '1.2'
56
+ version: '1.9'
52
57
  - - ">="
53
58
  - !ruby/object:Gem::Version
54
- version: 1.2.90
59
+ version: 1.9.5
55
60
  - !ruby/object:Gem::Dependency
56
61
  name: simple-rss
57
62
  requirement: !ruby/object:Gem::Requirement
@@ -61,7 +66,7 @@ dependencies:
61
66
  version: '1.3'
62
67
  - - ">="
63
68
  - !ruby/object:Gem::Version
64
- version: 1.3.1
69
+ version: 1.3.3
65
70
  type: :runtime
66
71
  prerelease: false
67
72
  version_requirements: !ruby/object:Gem::Requirement
@@ -71,9 +76,9 @@ dependencies:
71
76
  version: '1.3'
72
77
  - - ">="
73
78
  - !ruby/object:Gem::Version
74
- version: 1.3.1
79
+ version: 1.3.3
75
80
  description:
76
- email: james@jamesrobertson.eu
81
+ email: digital.robertson@gmail.com
77
82
  executables: []
78
83
  extensions: []
79
84
  extra_rdoc_files: []
@@ -98,10 +103,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
98
103
  - !ruby/object:Gem::Version
99
104
  version: '0'
100
105
  requirements: []
101
- rubyforge_project:
102
- rubygems_version: 2.6.13
106
+ rubygems_version: 3.2.22
103
107
  signing_key:
104
108
  specification_version: 4
105
- summary: This gem helps reduce unnessecary requests to webservers by caching RSS feeds
109
+ summary: This gem helps reduce unnecessary requests to webservers by caching RSS feeds
106
110
  where the RSS feeds are updated infrequently
107
111
  test_files: []
metadata.gz.sig CHANGED
Binary file