rsscache 0.1.1 → 0.2.3

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 +141 -31
  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: 84fa149159bb76649987604cc50dd3757ad3f486
4
- data.tar.gz: fa60fefe08b19db3c7d85ce0acc7c8ba2d554175
2
+ SHA256:
3
+ metadata.gz: fa5b1293b303475b5b3ec84c1f5c0d0f99209a8e00ae6b03ff27d84f11ed7da9
4
+ data.tar.gz: 298d687c80dc04d790ec63076b02868e10177ac35e8aef1b7c6981905ca5d5ea
5
5
  SHA512:
6
- metadata.gz: 680703919349df43fac9486865c203f18befddb981c48fafe9205579e34c17c0dcdfa618c4f79a324248a99a91a7c4cc944202543c1fc480820b96f07266a7e5
7
- data.tar.gz: 1913b72ca2e1c593e6dcf2a647e5a61299845f8efa691d60edd75e34e483dddb74ece6b99badcbb27f83886355c7b56d060f5568c2fca0b9f53200cd7c1e21a0
6
+ metadata.gz: bce3194dd3df0f6957769e9a4ac6df20f7420007a586a28372869096e638d2a0e1c504fa0391b89e857e470ad982d85e6a324e083f9ae2d5252077e017dd88d7
7
+ data.tar.gz: 7d38801562845a26c39085a7a1e8ea991af7ec02e0ad014d997bf7c21e39a830a14e04981a11baeb0989ae227823274b085065e43b328e53b95c826f98e68d62
checksums.yaml.gz.sig CHANGED
Binary file
data/lib/rsscache.rb CHANGED
@@ -6,22 +6,63 @@ require 'dynarex'
6
6
  require 'open-uri'
7
7
  require 'simple-rss'
8
8
  require 'fileutils'
9
+ require 'timeout'
9
10
 
10
11
 
11
12
  class RSScache
12
13
 
13
- def initialize(rsslist, feedsfilepath=Dir.pwd)
14
+ attr_reader :err_report, :dx
14
15
 
16
+ def initialize(rsslist=nil, filepath: '.', debug: false)
17
+
18
+ rsslist ||= File.join(filepath, 'rsscache.xml')
15
19
  @dx = open_dynarex(rsslist)
16
- @rsslist, @feedsfilepath = rsslist, feedsfilepath
17
- FileUtils.mkdir_p feedsfilepath
20
+ @filepath = filepath
21
+ @cache_filepath = File.join(filepath, 'rsscache')
22
+ FileUtils.mkdir_p @cache_filepath
23
+
24
+ @err_report = []
25
+ @debug = debug
26
+
27
+ end
28
+
29
+ # Import a list of URLs into the Dynarex document.
30
+ # URLs which already exist are ignored.
31
+ #
32
+ def import(raw_s)
33
+
34
+ s, _ = RXFHelper.read(raw_s)
35
+
36
+ s.strip.lines.each do |raw_url|
37
+
38
+ url = raw_url.chomp
39
+ puts 'url : ' + url.inspect if @debug
40
+ r = @dx.find_by_url url.chomp
41
+
42
+ if r then
43
+ puts 'exists' if @debug
44
+ else
45
+ puts 'new URL found' if @debug
46
+ @dx.create url: url
47
+ end
48
+
49
+ end
18
50
 
51
+ save()
19
52
  end
20
53
 
54
+ # refresh each RSS feed
55
+ #
21
56
  def refresh
22
57
 
58
+ @err_report = []
59
+
60
+ puts '@dx.to_xml' + @dx.to_xml(pretty: true) if @debug
61
+
23
62
  @dx.all.each do |feed|
24
63
 
64
+ puts 'feed:' + feed.inspect if @debug
65
+
25
66
  if feed.next_refresh.empty? or \
26
67
  Time.now >= Time.parse(feed.next_refresh) then
27
68
 
@@ -29,7 +70,7 @@ class RSScache
29
70
 
30
71
  feed.refresh_rate = if feed.refresh_rate.empty? then
31
72
 
32
- 10
73
+ 10
33
74
 
34
75
  else
35
76
 
@@ -51,70 +92,139 @@ class RSScache
51
92
  end
52
93
  end
53
94
 
54
- save_dynarex()
95
+ puts '@dx: ' + @dx.to_xml(pretty: true) if @debug
96
+ save()
55
97
 
56
98
  end
57
99
 
58
100
  alias update refresh
59
101
 
60
- def open_dynarex(x)
102
+ def save()
103
+
104
+ @dx.save File.join(@filepath, 'rsscache.xml')
105
+ File.write File.join(@filepath, 'rsscache.txt'), @dx.to_s
61
106
 
62
- if x.lines.length == 1 and File.exists?(x) and \
63
- File.extname(x) == '.txt'then
64
- Dynarex.new.import x
65
- else
66
- Dynarex.new x
67
- end
68
107
  end
69
108
 
70
- def save_dynarex()
71
109
 
72
- if @rsslist.lines.length == 1 and File.exists?(@rsslist)
110
+ private
73
111
 
74
- if File.extname(@rsslist) == '.txt'then
112
+ def raw_doc(s)
75
113
 
76
- File.write @rsslist, @dx.to_s
114
+ heading = '<?dynarex schema="rsscache[title]/feed(uid, title, ' +
115
+ 'url, refresh_rate, next_refresh, filename)"?>'
77
116
 
78
- else
117
+ raw_dx=<<EOF
118
+ #{heading}
119
+ title: RSS Feeds to be cached
79
120
 
80
- @dx.save
121
+ --+
81
122
 
82
- end
123
+ #{s.strip.lines.map {|x| 'url: ' + x }.join }
124
+ EOF
125
+
126
+ end
127
+
128
+ def fetch(url, timeout: 2)
129
+
130
+ puts 'inside fetch: url: ' + url.inspect if @debug
83
131
 
132
+ begin
133
+ Timeout::timeout(timeout){
134
+
135
+ buffer = URI.open(url).read.force_encoding("utf-8")
136
+ return [buffer, 200]
137
+ }
138
+ rescue Timeout::Error => e
139
+ ['connection timed out', 408]
140
+ rescue OpenURI::HTTPError => e
141
+ ['400 bad request', 400]
84
142
  end
143
+
85
144
  end
86
145
 
87
- # checks for any updates and saves the latest RSS file to
88
- # the cache if there is
146
+ def open_dynarex(raw_s)
147
+
148
+ s, _ = RXFHelper.read(raw_s)
149
+ puts 'inside open_dynarex s: ' + s.inspect if @debug
150
+
151
+ case s
152
+ when /^<?dynarex/
153
+ Dynarex.new.import s
154
+ when /^</
155
+ Dynarex.new s
156
+ else
157
+ Dynarex.new.import raw_doc(s)
158
+ end
159
+
160
+ end
161
+
162
+ # checks for any updates and save the
163
+ # latest RSS file to the cache if there are updates
89
164
  #
90
165
  def updates?(feed)
91
166
 
167
+ if @debug then
168
+ puts 'inside updates?'
169
+ puts 'feed: ' + feed.inspect
170
+ end
171
+
92
172
  # fetch the feeds from the web
93
- rss = SimpleRSS.parse(open(feed.url))
173
+ begin
174
+ buffer, code = fetch(feed.url)
175
+ rescue
176
+ puts 'RSScache::updates?: fetch() warning for feed ' + feed.url \
177
+ + ' ' + ($!).inspect
178
+ return
179
+ end
180
+
181
+ if code == 200 then
182
+ begin
183
+ rss = SimpleRSS.parse(buffer)
184
+ rescue
185
+ puts 'RSScache::updates?: err: 100 SimpleRSS warning for feed ' \
186
+ + feed.url + ' ' + ($!).inspect
187
+ return
188
+ end
189
+ else
190
+ @err_report << [feed.url, code]
191
+ return false
192
+ end
193
+
194
+ if feed.filename.empty? then
94
195
 
95
-
96
- rssfile = if feed.filename.empty? then
97
196
  filename = feed.url[6..-1].gsub(/\W+/,'').\
98
197
  reverse.slice(0,40).reverse.downcase + '.xml'
99
198
  feed.filename = filename
100
- File.join(@feedsfilepath, filename)
199
+
101
200
  end
102
-
201
+
202
+ rssfile = File.join(@cache_filepath, feed.filename)
203
+
103
204
  if File.exists? rssfile then
104
205
 
105
- rss_cache = SimpleRSS.parse File.read(rssfile)
206
+ begin
207
+ rss_cache = SimpleRSS.parse File.read(rssfile)
208
+ rescue
209
+ puts 'RSScache::updates?: err: 200 SimpleRSS warning for feed ' \
210
+ + feed.url + ' ' + ($!).inspect
211
+ FileUtils.rm rssfile
212
+ return false
213
+ end
106
214
  new_rss_items = rss.items - rss_cache.items
107
215
  (File.write rssfile, rss.source; return true) if new_rss_items.any?
108
-
216
+
109
217
  else
110
218
 
111
219
  File.write rssfile, rss.source
112
220
  feed.title = rss.title if feed.title.empty?
113
221
 
114
222
  return true
115
-
223
+
116
224
  end
117
-
225
+
118
226
  return false
119
227
  end
120
- end
228
+
229
+
230
+ 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.1.1
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Robertson
@@ -10,28 +10,32 @@ bindir: bin
10
10
  cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
- MIIDljCCAn6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBIMRIwEAYDVQQDDAlnZW1t
14
- YXN0ZXIxHjAcBgoJkiaJk/IsZAEZFg5qYW1lc3JvYmVydHNvbjESMBAGCgmSJomT
15
- 8ixkARkWAmV1MB4XDTE1MTEwNjE0MzkwM1oXDTE2MTEwNTE0MzkwM1owSDESMBAG
16
- A1UEAwwJZ2VtbWFzdGVyMR4wHAYKCZImiZPyLGQBGRYOamFtZXNyb2JlcnRzb24x
17
- EjAQBgoJkiaJk/IsZAEZFgJldTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
18
- ggEBAMgkQKulRgufn0SSYnKQ+qgJx7DZdJNAqqYbnxQmACxXX1+LBrdhjvIa4f+8
19
- hFEywDRz/chnEGZVkL5el+mgP33rrFKBD85DqHWFNoCeaa9abdyoQFttTnmOwmVS
20
- 8vMqEAqdOsRH5P+86Hi3GxaB4nvjOJ3OI6cPL2hFNTOErjAenRe8GQOoQmnRooor
21
- eqHSi/PJpymK2qAnRMT0YhJcWUPsqX2wyvoqhCdHGWDI3zh05f6IZaK2KO4J+PEj
22
- mS/xsVPqNZei6iaHsjOfkSY0Nquji62PUcfSfTSpz8tm6IiNVzI4RwzOzLSHjfrd
23
- 86jvSW3Zg4+/wV9SpDlqoE5hO70CAwEAAaOBijCBhzAJBgNVHRMEAjAAMAsGA1Ud
24
- DwQEAwIEsDAdBgNVHQ4EFgQUOhUHHP9MNyXcPfRUB25xNPgimREwJgYDVR0RBB8w
25
- HYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1h
26
- c3RlckBqYW1lc3JvYmVydHNvbi5ldTANBgkqhkiG9w0BAQUFAAOCAQEAdGd2rZPC
27
- kfnLVCNDZqAAUBePQN7af/mYKLHDRGhQR2J3+aeFm6DCY5aQJd9Fult1Nf+oHJnI
28
- AJbq8GMkoKc1QQU+YjAIb6UgtL2qXo9VXZ3QXumQgkpbP7p4GQpH1ZQJ8m87bfms
29
- oGDGtNn7F0b5EyTBTgDBBaVdgLDtPOMaED/yclJt6rUP//z3hGwP05NFANcjMw9c
30
- x+u8RcmzdQ19ot55B/mN7gP/BTY6m/WiZWOkrg9NMRjrJTVknbDfL1aKparYCyoi
31
- Fw4DQ6y8iLPuqjr0KqV/BO7FClXyXx4M+1Sejnchk0P5TEPx428bZqGPTakJNidM
32
- 6QO+pqPpZdfWfw==
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
33
37
  -----END CERTIFICATE-----
34
- date: 2015-11-06 00:00:00.000000000 Z
38
+ date: 2021-11-18 00:00:00.000000000 Z
35
39
  dependencies:
36
40
  - !ruby/object:Gem::Dependency
37
41
  name: dynarex
@@ -39,20 +43,20 @@ dependencies:
39
43
  requirements:
40
44
  - - "~>"
41
45
  - !ruby/object:Gem::Version
42
- version: '1.2'
46
+ version: '1.8'
43
47
  - - ">="
44
48
  - !ruby/object:Gem::Version
45
- version: 1.2.90
49
+ version: 1.8.27
46
50
  type: :runtime
47
51
  prerelease: false
48
52
  version_requirements: !ruby/object:Gem::Requirement
49
53
  requirements:
50
54
  - - "~>"
51
55
  - !ruby/object:Gem::Version
52
- version: '1.2'
56
+ version: '1.8'
53
57
  - - ">="
54
58
  - !ruby/object:Gem::Version
55
- version: 1.2.90
59
+ version: 1.8.27
56
60
  - !ruby/object:Gem::Dependency
57
61
  name: simple-rss
58
62
  requirement: !ruby/object:Gem::Requirement
@@ -62,7 +66,7 @@ dependencies:
62
66
  version: '1.3'
63
67
  - - ">="
64
68
  - !ruby/object:Gem::Version
65
- version: 1.3.1
69
+ version: 1.3.3
66
70
  type: :runtime
67
71
  prerelease: false
68
72
  version_requirements: !ruby/object:Gem::Requirement
@@ -72,9 +76,9 @@ dependencies:
72
76
  version: '1.3'
73
77
  - - ">="
74
78
  - !ruby/object:Gem::Version
75
- version: 1.3.1
79
+ version: 1.3.3
76
80
  description:
77
- email: james@r0bertson.co.uk
81
+ email: digital.robertson@gmail.com
78
82
  executables: []
79
83
  extensions: []
80
84
  extra_rdoc_files: []
@@ -100,9 +104,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
100
104
  version: '0'
101
105
  requirements: []
102
106
  rubyforge_project:
103
- rubygems_version: 2.4.8
107
+ rubygems_version: 2.7.10
104
108
  signing_key:
105
109
  specification_version: 4
106
- summary: This gem helps reduce unnessecary requests to webservers by caching RSS feeds
110
+ summary: This gem helps reduce unnecessary requests to webservers by caching RSS feeds
107
111
  where the RSS feeds are updated infrequently
108
112
  test_files: []
metadata.gz.sig CHANGED
Binary file