radiant-rss_reader-extension 1.0.0 → 1.0.1
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.
- data/Gemfile +132 -0
- data/Gemfile.lock +266 -0
- data/README.md +1 -1
- data/lib/radiant-rss_reader-extension.rb +3 -3
- data/lib/rss_reader/page_extensions.rb +44 -0
- data/lib/{rss_reader.rb → rss_reader/tags.rb} +19 -46
- data/rss_reader_extension.rb +2 -1
- data/spec/controllers/site_controller_spec.rb +85 -0
- data/spec/datasets/rss_reader_pages_dataset.rb +100 -0
- data/spec/models/page_extensions_spec.rb +66 -0
- metadata +16 -9
data/Gemfile
ADDED
@@ -0,0 +1,132 @@
|
|
1
|
+
source 'http://devwww.con-way.com/gemserver/'
|
2
|
+
# source 'https://rubygems.org'
|
3
|
+
|
4
|
+
# If you make any changes in this file, please run `bundle install`.
|
5
|
+
# If new versions of your installed gems are available, run `bundle update`
|
6
|
+
|
7
|
+
gem 'rake', '~> 10.0.2'
|
8
|
+
gem 'radiant', '~> 1.1.4'
|
9
|
+
|
10
|
+
# Other dependencies
|
11
|
+
gem "curb"
|
12
|
+
gem "maxcdn"
|
13
|
+
gem "yajl-ruby"
|
14
|
+
gem "system_timer"
|
15
|
+
gem 'compass-rails', '~> 1.0.3'
|
16
|
+
gem 'iconv', :platform => :mri_19
|
17
|
+
gem 'mime-types', '< 2.0'
|
18
|
+
|
19
|
+
if RUBY_PLATFORM =~ /darwin/ # tested on Mavericks
|
20
|
+
gem "libv8", "~> 3.16.14.3", :platform => :mri_19
|
21
|
+
gem "therubyracer", "~> 0.12.1", :platform => :mri_19 # javascript runtime
|
22
|
+
else
|
23
|
+
## compatible on production Linux servers
|
24
|
+
gem "libv8", "3.3.10.2"
|
25
|
+
gem "therubyracer", "0.10.2" # javascript runtime
|
26
|
+
end
|
27
|
+
|
28
|
+
# SQLite is the default database connection but only suitable for local use
|
29
|
+
# gem 'sqlite3', '~> 1.3.5'
|
30
|
+
|
31
|
+
# To use MySQL
|
32
|
+
# gem 'mysql', '~> 2.8.1'
|
33
|
+
|
34
|
+
# Postgres
|
35
|
+
# gem 'pg', '~> 0.11.0'
|
36
|
+
|
37
|
+
# Default Extensions
|
38
|
+
gem 'radiant-archive-extension', '~> 1.0.7'
|
39
|
+
# gem 'radiant-clipped-extension', '~> 1.1.0'
|
40
|
+
gem 'radiant-debug-extension', '~> 1.0.2'
|
41
|
+
gem 'radiant-exporter-extension', '~> 1.1.0'
|
42
|
+
gem 'radiant-markdown_filter-extension', '~> 1.0.2'
|
43
|
+
gem 'radiant-sheets-extension', '~> 1.1.0'
|
44
|
+
gem 'radiant-snippets-extension', '~> 1.1.2'
|
45
|
+
gem 'radiant-site_templates-extension', '~> 1.0.6'
|
46
|
+
gem 'radiant-smarty_pants_filter-extension', '~> 1.0.2'
|
47
|
+
gem 'radiant-textile_filter-extension', '~> 1.0.4'
|
48
|
+
|
49
|
+
|
50
|
+
# Language packs
|
51
|
+
# gem 'radiant-dutch_language_pack-extension', '~> 1.0.1'
|
52
|
+
# gem 'radiant-french_language_pack-extension', '~> 1.0.0'
|
53
|
+
# gem 'radiant-german_language_pack-extension', '~> 1.0.1'
|
54
|
+
# gem 'radiant-italian_language_pack-extension', '~> 1.0.0'
|
55
|
+
# gem 'radiant-japanese_language_pack-extension', '~> 1.0.0'
|
56
|
+
# gem 'radiant-russian_language_pack-extension', '~> 1.0.0'
|
57
|
+
|
58
|
+
# A standard gem extension
|
59
|
+
# gem 'radiant-example-extension', :version => '~> 1.0.0'
|
60
|
+
gem 'radiant-banner_rotator-extension'
|
61
|
+
gem 'radiant-cache_by_page-extension'
|
62
|
+
gem 'radiant-concurrent_draft-extension'
|
63
|
+
gem 'radiant-copy_move-extension'
|
64
|
+
# gem 'radiant-file_sytem-extension', :git => 'git@github.com:avonderluft/radiant-file-system-extension.git' # no gemspec
|
65
|
+
gem 'radiant-help-extension'
|
66
|
+
gem 'radiant-import_export-extension'
|
67
|
+
gem 'radiant-language_redirect-extension'
|
68
|
+
gem 'radiant-mailer-extension'
|
69
|
+
gem 'radiant-page_group_permissions-extension'
|
70
|
+
gem 'radiant-page_list_view-extension'
|
71
|
+
# gem 'radiant-polls-extension'
|
72
|
+
gem 'radiant-rss_reader-extension'
|
73
|
+
gem 'radiant-settings-extension'
|
74
|
+
gem 'radiant-sitemap_search-extension'
|
75
|
+
gem 'radiant-templates-extension'
|
76
|
+
|
77
|
+
# Your own forked extension
|
78
|
+
# gem 'radiant-modified-extension', :git => 'git://github.com/your/fork.git'
|
79
|
+
|
80
|
+
# Gems you need for production, but not in your test or development environment
|
81
|
+
group :production do
|
82
|
+
gem 'ruby-oci8'
|
83
|
+
gem 'activerecord-oracle_enhanced-adapter'
|
84
|
+
end
|
85
|
+
|
86
|
+
# A local extension in development
|
87
|
+
# gem 'radiant-new-extension', :path => '/path/to/extension/root'
|
88
|
+
|
89
|
+
# Gems you would like to have in your development environment
|
90
|
+
group :development do
|
91
|
+
# you may need to install the mysql gem below manually on OSX with:
|
92
|
+
# $ ARCHFLAGS="-arch x86_64" gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config
|
93
|
+
# If that does not work, try $ brew install mysql
|
94
|
+
gem 'mysql', '~> 2.8.1'
|
95
|
+
# gem 'passenger', '3.0.14' # not needed for prod, using apache module
|
96
|
+
gem 'jeweler'
|
97
|
+
gem 'wirble'
|
98
|
+
gem 'hirb'
|
99
|
+
gem 'pry'
|
100
|
+
gem 'ruby18_source_location', :platforms => :mri_18
|
101
|
+
gem "binding_of_caller", :platform => :ruby_19
|
102
|
+
gem "better_errors", :platform => :ruby_19
|
103
|
+
end
|
104
|
+
|
105
|
+
# If you're running tests or specs
|
106
|
+
group :test do
|
107
|
+
gem "test-unit", "~> 1.2.3"
|
108
|
+
gem 'cucumber-rails', '~> 0.3.2'
|
109
|
+
gem 'database_cleaner', '~> 0.6.5'
|
110
|
+
gem 'webrat', '~> 0.7.3'
|
111
|
+
gem 'rspec-rails', '~> 1.3.3'
|
112
|
+
gem 'sqlite3', '~> 1.3.4'
|
113
|
+
gem 'ZenTest', '~> 4.6.2', :platforms => [:mri_18, :mri_19]
|
114
|
+
# gem 'ZenTest', '~> 4.9.5'
|
115
|
+
# For Ruby 1.8.7
|
116
|
+
gem 'rdoc', '~> 3.12.2', :platforms => :mri_18
|
117
|
+
gem 'rdoc-data', '3.12', :platforms => :mri_18
|
118
|
+
# Custom
|
119
|
+
gem 'autotest', '~>4.4.5'
|
120
|
+
# gem 'autotest-fsevent', '~>0.2.3' # not compatible with Mavericks
|
121
|
+
gem 'autotest-growl', '~>0.2.6'
|
122
|
+
gem 'autotest-rails', '~>4.1.0'
|
123
|
+
gem 'syntax', '~>1.0.0'
|
124
|
+
# Get rid of some deprecation warnings when running specs
|
125
|
+
# Rubygems
|
126
|
+
if (defined?(Deprecate))
|
127
|
+
Deprecate.skip = true
|
128
|
+
elsif (defined?(Gem::Deprecate))
|
129
|
+
Gem::Deprecate.skip = true
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,266 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://devwww.con-way.com/gemserver/
|
3
|
+
specs:
|
4
|
+
RedCloth (4.2.9)
|
5
|
+
ZenTest (4.6.2)
|
6
|
+
actionmailer (2.3.18)
|
7
|
+
actionpack (= 2.3.18)
|
8
|
+
actionpack (2.3.18)
|
9
|
+
activesupport (= 2.3.18)
|
10
|
+
rack (~> 1.1.0)
|
11
|
+
activerecord (2.3.18)
|
12
|
+
activesupport (= 2.3.18)
|
13
|
+
activerecord-oracle_enhanced-adapter (1.4.2)
|
14
|
+
activeresource (2.3.18)
|
15
|
+
activesupport (= 2.3.18)
|
16
|
+
activesupport (2.3.18)
|
17
|
+
acts_as_tree (0.1.1)
|
18
|
+
addressable (2.3.6)
|
19
|
+
autotest (4.4.6)
|
20
|
+
ZenTest (>= 4.4.1)
|
21
|
+
autotest-growl (0.2.16)
|
22
|
+
autotest-rails (4.1.2)
|
23
|
+
ZenTest (~> 4.5)
|
24
|
+
better_errors (0.9.0)
|
25
|
+
coderay (>= 1.0.0)
|
26
|
+
erubis (>= 2.6.6)
|
27
|
+
binding_of_caller (0.7.1)
|
28
|
+
debug_inspector (>= 0.0.1)
|
29
|
+
bluecloth (2.1.0)
|
30
|
+
builder (3.2.2)
|
31
|
+
chunky_png (1.3.0)
|
32
|
+
coderay (1.0.9)
|
33
|
+
coffee-script (2.2.0)
|
34
|
+
coffee-script-source
|
35
|
+
execjs
|
36
|
+
coffee-script-source (1.7.0)
|
37
|
+
compass (0.12.2)
|
38
|
+
chunky_png (~> 1.2)
|
39
|
+
fssm (>= 0.2.7)
|
40
|
+
sass (~> 3.1)
|
41
|
+
compass-rails (1.0.3)
|
42
|
+
compass (>= 0.12.2, < 0.14)
|
43
|
+
cucumber (1.3.14)
|
44
|
+
builder (>= 2.1.2)
|
45
|
+
diff-lcs (>= 1.1.3)
|
46
|
+
gherkin (~> 2.12)
|
47
|
+
multi_json (>= 1.7.5, < 2.0)
|
48
|
+
multi_test (>= 0.1.1)
|
49
|
+
cucumber-rails (0.3.2)
|
50
|
+
cucumber (>= 0.8.0)
|
51
|
+
curb (0.8.5)
|
52
|
+
curb-fu (0.6.2)
|
53
|
+
curb (>= 0.5.4.0)
|
54
|
+
rack-test (>= 0.2.0)
|
55
|
+
database_cleaner (0.6.7)
|
56
|
+
debug_inspector (0.0.2)
|
57
|
+
delocalize (0.2.6)
|
58
|
+
diff-lcs (1.2.5)
|
59
|
+
erubis (2.7.0)
|
60
|
+
execjs (2.0.2)
|
61
|
+
faraday (0.9.0.rc7)
|
62
|
+
multipart-post (>= 1.2, < 3)
|
63
|
+
fssm (0.2.10)
|
64
|
+
gherkin (2.12.2)
|
65
|
+
multi_json (~> 1.3)
|
66
|
+
git (1.2.6)
|
67
|
+
haml (3.1.8)
|
68
|
+
highline (1.6.20)
|
69
|
+
hirb (0.7.1)
|
70
|
+
hoe (3.7.1)
|
71
|
+
rake (>= 0.8, < 11.0)
|
72
|
+
iconv (1.0.4)
|
73
|
+
jeweler (1.8.4)
|
74
|
+
bundler (~> 1.0)
|
75
|
+
git (>= 1.2.5)
|
76
|
+
rake
|
77
|
+
rdoc
|
78
|
+
json (1.8.1)
|
79
|
+
jwt (0.1.11)
|
80
|
+
multi_json (>= 1.5)
|
81
|
+
libv8 (3.16.14.3)
|
82
|
+
maxcdn (0.1.4)
|
83
|
+
curb-fu
|
84
|
+
json
|
85
|
+
signet
|
86
|
+
method_source (0.8.2)
|
87
|
+
mime-types (1.25.1)
|
88
|
+
multi_json (1.8.4)
|
89
|
+
multi_test (0.1.1)
|
90
|
+
multipart-post (2.0.0)
|
91
|
+
mysql (2.8.1)
|
92
|
+
nokogiri (1.5.10)
|
93
|
+
pry (0.9.12)
|
94
|
+
coderay (~> 1.0.5)
|
95
|
+
method_source (~> 0.8)
|
96
|
+
slop (~> 3.4)
|
97
|
+
rack (1.1.6)
|
98
|
+
rack-cache (1.2)
|
99
|
+
rack (>= 0.4)
|
100
|
+
rack-test (0.6.2)
|
101
|
+
rack (>= 1.0)
|
102
|
+
radiant (1.1.4)
|
103
|
+
RedCloth (~> 4.2.0)
|
104
|
+
acts_as_tree (~> 0.1.1)
|
105
|
+
bundler (>= 1.0.0)
|
106
|
+
compass (~> 0.12.2)
|
107
|
+
compass-rails (~> 1.0.3)
|
108
|
+
delocalize (~> 0.2.3)
|
109
|
+
haml (~> 3.1.1)
|
110
|
+
highline (~> 1.6.10)
|
111
|
+
rack (~> 1.1.6)
|
112
|
+
rack-cache (~> 1.2)
|
113
|
+
radius (~> 0.7.3)
|
114
|
+
rails (~> 2.3.18)
|
115
|
+
rake (>= 0.8.7)
|
116
|
+
rdoc (>= 3.9.2)
|
117
|
+
stringex (~> 1.3.0)
|
118
|
+
tzinfo (~> 0.3.31)
|
119
|
+
will_paginate (~> 2.3.11)
|
120
|
+
radiant-archive-extension (1.0.7)
|
121
|
+
radiant-banner_rotator-extension (1.0.3)
|
122
|
+
radiant (>= 0.9.1)
|
123
|
+
radiant-cache_by_page-extension (1.0.3)
|
124
|
+
radiant (>= 0.9.1)
|
125
|
+
radiant-concurrent_draft-extension (1.0.11)
|
126
|
+
radiant (>= 1.0.0.rc2)
|
127
|
+
radiant-copy_move-extension (2.4.5)
|
128
|
+
radiant (>= 1.0.0.rc2)
|
129
|
+
radiant-debug-extension (1.0.2)
|
130
|
+
radiant-exporter-extension (1.1.0)
|
131
|
+
radiant-help-extension (1.1.3)
|
132
|
+
radiant-import_export-extension (1.0.0)
|
133
|
+
radiant-language_redirect-extension (1.0.1)
|
134
|
+
radiant (>= 1.1.3)
|
135
|
+
radiant-mailer-extension (1.0.6)
|
136
|
+
radiant-markdown_filter-extension (1.0.2)
|
137
|
+
bluecloth (~> 2.1.0)
|
138
|
+
radiant-page_group_permissions-extension (1.0.1)
|
139
|
+
radiant (>= 0.9.1)
|
140
|
+
radiant-page_list_view-extension (1.0.3)
|
141
|
+
radiant (>= 0.9.1)
|
142
|
+
radiant-rss_reader-extension (1.0.0)
|
143
|
+
ruby-feedparser (= 0.7.0)
|
144
|
+
radiant-settings-extension (1.1.2)
|
145
|
+
radiant (>= 0.9.1)
|
146
|
+
radiant-sheets-extension (1.1.0)
|
147
|
+
coffee-script (~> 2.2.0)
|
148
|
+
sass (~> 3.2.1)
|
149
|
+
radiant-site_templates-extension (1.0.6)
|
150
|
+
radiant-sitemap_search-extension (1.0.4)
|
151
|
+
radiant (>= 1.0.0.rc2)
|
152
|
+
radiant-smarty_pants_filter-extension (1.0.2)
|
153
|
+
rubypants (~> 0.2.0)
|
154
|
+
radiant-snippets-extension (1.1.3)
|
155
|
+
radiant-templates-extension (1.0.8)
|
156
|
+
radiant (>= 1.0.0.rc2)
|
157
|
+
radiant-textile_filter-extension (1.0.4)
|
158
|
+
RedCloth (~> 4.2.0)
|
159
|
+
radius (0.7.4)
|
160
|
+
rails (2.3.18)
|
161
|
+
actionmailer (= 2.3.18)
|
162
|
+
actionpack (= 2.3.18)
|
163
|
+
activerecord (= 2.3.18)
|
164
|
+
activeresource (= 2.3.18)
|
165
|
+
activesupport (= 2.3.18)
|
166
|
+
rake (>= 0.8.3)
|
167
|
+
rake (10.0.2)
|
168
|
+
rdoc (3.12.2)
|
169
|
+
json (~> 1.4)
|
170
|
+
rdoc-data (3.12)
|
171
|
+
rdoc (> 2.5, < 4.0)
|
172
|
+
ref (1.0.5)
|
173
|
+
rspec (1.3.2)
|
174
|
+
rspec-rails (1.3.4)
|
175
|
+
rack (>= 1.0.0)
|
176
|
+
rspec (~> 1.3.1)
|
177
|
+
ruby-feedparser (0.7)
|
178
|
+
ruby-oci8 (2.1.5)
|
179
|
+
ruby18_source_location (0.2)
|
180
|
+
rubypants (0.2.0)
|
181
|
+
sass (3.2.12)
|
182
|
+
signet (0.5.0)
|
183
|
+
addressable (>= 2.2.3)
|
184
|
+
faraday (>= 0.9.0.rc5)
|
185
|
+
jwt (>= 0.1.5)
|
186
|
+
multi_json (>= 1.0.0)
|
187
|
+
slop (3.4.4)
|
188
|
+
sqlite3 (1.3.8)
|
189
|
+
stringex (1.3.3)
|
190
|
+
syntax (1.0.0)
|
191
|
+
system_timer (1.2.4)
|
192
|
+
test-unit (1.2.3)
|
193
|
+
hoe (>= 1.5.1)
|
194
|
+
therubyracer (0.12.1)
|
195
|
+
libv8 (~> 3.16.14.0)
|
196
|
+
ref
|
197
|
+
tzinfo (0.3.38)
|
198
|
+
webrat (0.7.3)
|
199
|
+
nokogiri (>= 1.2.0)
|
200
|
+
rack (>= 1.0)
|
201
|
+
rack-test (>= 0.5.3)
|
202
|
+
will_paginate (2.3.16)
|
203
|
+
wirble (0.1.3)
|
204
|
+
yajl-ruby (1.2.0)
|
205
|
+
|
206
|
+
PLATFORMS
|
207
|
+
ruby
|
208
|
+
|
209
|
+
DEPENDENCIES
|
210
|
+
ZenTest (~> 4.6.2)
|
211
|
+
activerecord-oracle_enhanced-adapter
|
212
|
+
autotest (~> 4.4.5)
|
213
|
+
autotest-growl (~> 0.2.6)
|
214
|
+
autotest-rails (~> 4.1.0)
|
215
|
+
better_errors
|
216
|
+
binding_of_caller
|
217
|
+
compass-rails (~> 1.0.3)
|
218
|
+
cucumber-rails (~> 0.3.2)
|
219
|
+
curb
|
220
|
+
database_cleaner (~> 0.6.5)
|
221
|
+
hirb
|
222
|
+
iconv
|
223
|
+
jeweler
|
224
|
+
libv8 (~> 3.16.14.3)
|
225
|
+
maxcdn
|
226
|
+
mime-types (< 2.0)
|
227
|
+
mysql (~> 2.8.1)
|
228
|
+
pry
|
229
|
+
radiant (~> 1.1.4)
|
230
|
+
radiant-archive-extension (~> 1.0.7)
|
231
|
+
radiant-banner_rotator-extension
|
232
|
+
radiant-cache_by_page-extension
|
233
|
+
radiant-concurrent_draft-extension
|
234
|
+
radiant-copy_move-extension
|
235
|
+
radiant-debug-extension (~> 1.0.2)
|
236
|
+
radiant-exporter-extension (~> 1.1.0)
|
237
|
+
radiant-help-extension
|
238
|
+
radiant-import_export-extension
|
239
|
+
radiant-language_redirect-extension
|
240
|
+
radiant-mailer-extension
|
241
|
+
radiant-markdown_filter-extension (~> 1.0.2)
|
242
|
+
radiant-page_group_permissions-extension
|
243
|
+
radiant-page_list_view-extension
|
244
|
+
radiant-rss_reader-extension
|
245
|
+
radiant-settings-extension
|
246
|
+
radiant-sheets-extension (~> 1.1.0)
|
247
|
+
radiant-site_templates-extension (~> 1.0.6)
|
248
|
+
radiant-sitemap_search-extension
|
249
|
+
radiant-smarty_pants_filter-extension (~> 1.0.2)
|
250
|
+
radiant-snippets-extension (~> 1.1.2)
|
251
|
+
radiant-templates-extension
|
252
|
+
radiant-textile_filter-extension (~> 1.0.4)
|
253
|
+
rake (~> 10.0.2)
|
254
|
+
rdoc (~> 3.12.2)
|
255
|
+
rdoc-data (= 3.12)
|
256
|
+
rspec-rails (~> 1.3.3)
|
257
|
+
ruby-oci8
|
258
|
+
ruby18_source_location
|
259
|
+
sqlite3 (~> 1.3.4)
|
260
|
+
syntax (~> 1.0.0)
|
261
|
+
system_timer
|
262
|
+
test-unit (~> 1.2.3)
|
263
|
+
therubyracer (~> 0.12.1)
|
264
|
+
webrat (~> 0.7.3)
|
265
|
+
wirble
|
266
|
+
yajl-ruby
|
data/README.md
CHANGED
@@ -62,7 +62,7 @@ You can sort items and group headers by date, title, content, creator, or link (
|
|
62
62
|
* BJ Clark (bjclark@scidept.com, http://www.scidept.com/)
|
63
63
|
* Loren Johnson (loren@fn-group.com, http://www.fn-group.com)
|
64
64
|
|
65
|
-
#### Update to new Extension Architecture, Gemify
|
65
|
+
#### Update to new Extension Architecture, Gemify, Add Tests
|
66
66
|
|
67
67
|
* Andrew vonderLuft (avonderluft@avlux.net, https://avlux.net)
|
68
68
|
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module RadiantRssReaderExtension
|
2
|
-
VERSION = "1.0.
|
2
|
+
VERSION = "1.0.1"
|
3
3
|
SUMMARY = "RSS Reader for Radiant CMS"
|
4
4
|
DESCRIPTION = "This extension uses the ruby-feedparser gem to read external RSS feeds, cache them, and easily display them in your pages."
|
5
5
|
URL = "https://github.com/radiant/radiant-rss_reader-extension"
|
6
|
-
AUTHORS = ["Andrew vonderLuft"
|
7
|
-
EMAIL = ["avonderluft@avlux.net"
|
6
|
+
AUTHORS = ["Andrew vonderLuft"]
|
7
|
+
EMAIL = ["avonderluft@avlux.net"]
|
8
8
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'uri'
|
2
|
+
require 'net/http'
|
3
|
+
require 'net/https'
|
4
|
+
require 'feedparser/feedparser'
|
5
|
+
|
6
|
+
module RssReader::PageExtensions
|
7
|
+
|
8
|
+
def fetch_rss(uri, cache_time)
|
9
|
+
c = File.join(ActionController::Base.page_cache_directory, uri.tr(':/','_'))
|
10
|
+
if (cached_feed = feed_for(IO.read(c)) rescue nil)
|
11
|
+
return cached_feed if File.mtime(c) > (Time.now - cache_time)
|
12
|
+
since = File.mtime(c).httpdate
|
13
|
+
else
|
14
|
+
since = "1970-01-01 00:00:00"
|
15
|
+
end
|
16
|
+
u = URI::parse(uri)
|
17
|
+
begin
|
18
|
+
http = Net::HTTP.new(u.host, u.port)
|
19
|
+
http.use_ssl = true if u.port == 443
|
20
|
+
answer = http.get("#{u.request_uri}", {"If-Modified-Since" => since, 'User-Agent' => "RadiantCMS rss_reader Extension #{RadiantRssReaderExtension::VERSION}"} )
|
21
|
+
feed = feed_for(answer.body)
|
22
|
+
rescue
|
23
|
+
return cached_feed
|
24
|
+
end
|
25
|
+
case answer.code
|
26
|
+
when '304'
|
27
|
+
return cached_feed
|
28
|
+
when '200'
|
29
|
+
File.open(c,'w+') { |fp| fp << answer.body }
|
30
|
+
return feed
|
31
|
+
else
|
32
|
+
raise StandardError, "#{answer.code} #{answer.message}"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def feed_for(str)
|
37
|
+
FeedParser::Feed.new(str)
|
38
|
+
end
|
39
|
+
|
40
|
+
def cache?
|
41
|
+
false
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
@@ -1,52 +1,10 @@
|
|
1
|
-
|
2
|
-
require 'net/http'
|
3
|
-
require 'net/https'
|
4
|
-
require 'feedparser/feedparser'
|
5
|
-
|
6
|
-
module RssReader
|
1
|
+
module RssReader::Tags
|
7
2
|
include Radiant::Taggable
|
8
3
|
|
9
|
-
def fetch_rss(uri, cache_time)
|
10
|
-
c = File.join(ActionController::Base.page_cache_directory, uri.tr(':/','_'))
|
11
|
-
if (cached_feed = feed_for(IO.read(c)) rescue nil)
|
12
|
-
return cached_feed if File.mtime(c) > (Time.now - cache_time)
|
13
|
-
since = File.mtime(c).httpdate
|
14
|
-
else
|
15
|
-
since = "1970-01-01 00:00:00"
|
16
|
-
end
|
17
|
-
u = URI::parse(uri)
|
18
|
-
begin
|
19
|
-
http = Net::HTTP.new(u.host, u.port)
|
20
|
-
http.use_ssl = true if u.port == 443
|
21
|
-
answer = http.get("#{u.request_uri}", {"If-Modified-Since" => since, 'User-Agent' => "RadiantCMS rss_reader Extension #{RadiantRssReaderExtension::VERSION}"} )
|
22
|
-
feed = feed_for(answer.body)
|
23
|
-
rescue
|
24
|
-
return cached_feed
|
25
|
-
end
|
26
|
-
case answer.code
|
27
|
-
when '304'
|
28
|
-
return cached_feed
|
29
|
-
when '200'
|
30
|
-
File.open(c,'w+') { |fp| fp << answer.body }
|
31
|
-
return feed
|
32
|
-
else
|
33
|
-
raise StandardError, "#{answer.code} #{answer.message}"
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def feed_for(str)
|
38
|
-
FeedParser::Feed.new(str)
|
39
|
-
end
|
40
|
-
|
41
|
-
def cache?
|
42
|
-
false
|
43
|
-
end
|
44
|
-
|
45
4
|
tag "feed" do |tag|
|
46
5
|
tag.expand
|
47
6
|
end
|
48
7
|
|
49
|
-
|
50
8
|
desc %{
|
51
9
|
Iterates through items in an rss feed provided as an absolute url to the @url@ attribute.
|
52
10
|
|
@@ -55,10 +13,14 @@ module RssReader
|
|
55
13
|
* @cache_time@: length of time to cache the feed before seeing if it's been updated
|
56
14
|
* @order@: works just like SQL 'ORDER BY' clauses, e.g. order='creator date desc' orders first by creator ascending, then date descending
|
57
15
|
* @limit@: only return the first x items (after any ordering)
|
16
|
+
* @if_title_contains@: only return items whose title contains search term
|
17
|
+
* @unless_title_contains@: only return items whose title does not contain search term
|
18
|
+
* @if_content_contains@: only return items whose content contains search term
|
19
|
+
* @unless_content_contains@: only return items whose content does not contain search term
|
58
20
|
|
59
21
|
*Usage:*
|
60
22
|
|
61
|
-
<pre><code><r:
|
23
|
+
<pre><code><r:feed:items url="http://somefeed.com/rss" [cache_time="3600"] [order="creator date desc"] [limit="5"] [if_title_contains="include text"] [unless_title_contains="exclude text"] [if_content_contains="include text"] [unless_content_contains="exclude text"]>...</r:feed:items></code></pre>
|
62
24
|
}
|
63
25
|
tag "feed:items" do |tag|
|
64
26
|
attr = tag.attr.symbolize_keys
|
@@ -76,6 +38,18 @@ module RssReader
|
|
76
38
|
end
|
77
39
|
end
|
78
40
|
end
|
41
|
+
if attr[:if_title_contains]
|
42
|
+
items = items.select { |item| item.title.downcase.include?(attr[:if_title_contains].downcase) }
|
43
|
+
end
|
44
|
+
if attr[:unless_title_contains]
|
45
|
+
items = items.select { |item| ! item.title.downcase.include?(attr[:unless_title_contains].downcase) }
|
46
|
+
end
|
47
|
+
if attr[:if_content_contains]
|
48
|
+
items = items.select { |item| item.content.downcase.include?(attr[:if_content_contains].downcase) }
|
49
|
+
end
|
50
|
+
if attr[:unless_content_contains]
|
51
|
+
items = items.select { |item| ! item.content.downcase.include?(attr[:unless_content_contains].downcase) }
|
52
|
+
end
|
79
53
|
if attr[:limit]
|
80
54
|
items = items.slice(0,attr[:limit].to_i)
|
81
55
|
end
|
@@ -186,5 +160,4 @@ module RssReader
|
|
186
160
|
tag.locals.item.creator
|
187
161
|
end
|
188
162
|
|
189
|
-
end
|
190
|
-
|
163
|
+
end
|
data/rss_reader_extension.rb
CHANGED
@@ -8,6 +8,7 @@ class RssReaderExtension < Radiant::Extension
|
|
8
8
|
def activate
|
9
9
|
cache_dir = ActionController::Base.page_cache_directory
|
10
10
|
Dir.mkdir(cache_dir) unless File.exist?(cache_dir)
|
11
|
-
Page.send :include, RssReader
|
11
|
+
Page.send :include, RssReader::PageExtensions
|
12
|
+
Page.send :include, RssReader::Tags
|
12
13
|
end
|
13
14
|
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
include Webrat::Matchers
|
3
|
+
|
4
|
+
describe SiteController do
|
5
|
+
dataset :rss_reader_pages
|
6
|
+
|
7
|
+
it "should read RSS feed generated by Radiant" do
|
8
|
+
get :show_page, :url => 'news-feed'
|
9
|
+
response.should be_success
|
10
|
+
response.body.should include('http://www.example.com/news/article-3/')
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "fetching and formatting feeds" do
|
14
|
+
|
15
|
+
begin
|
16
|
+
pages = Page.find_by_slug('news-feed-pages').children
|
17
|
+
rescue NoMethodError => error_msg
|
18
|
+
puts "\n<h1>Unable to access pages - feed pages depend on viable internet connection.</h1>\n\n"
|
19
|
+
end
|
20
|
+
|
21
|
+
pages.each do |page|
|
22
|
+
|
23
|
+
describe "on #{page.title}" do
|
24
|
+
|
25
|
+
before :each do
|
26
|
+
get :show_page, :url => "news-feed-pages/#{page.slug}"
|
27
|
+
end
|
28
|
+
it "should render page from external feed" do
|
29
|
+
response.should be_success
|
30
|
+
end
|
31
|
+
it "should have the usual feed parts" do
|
32
|
+
[:title, :uri, :link, :content].each do |attr|
|
33
|
+
response.body.should have_selector('div', :class => "#{attr}") do |att|
|
34
|
+
att.should_not be_blank
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "fetching, formatting and filtering feeds" do
|
43
|
+
|
44
|
+
term = 'extension'
|
45
|
+
|
46
|
+
[1,2,3].each do |num|
|
47
|
+
it "should limit to #{num} feed item with attribute 'limit=\"#{num}\"'" do
|
48
|
+
get :show_page, :url => "news-feed-page-limit-#{num}"
|
49
|
+
response.should be_success
|
50
|
+
response.body.should have_selector('div', :class => "title", :count => num)
|
51
|
+
response.body.should have_selector('div', :class => "content", :count => num)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
it "should retrieve only items with '#{term}' in the title" do
|
55
|
+
get :show_page, :url => "news-feed-page-by-words-in-title"
|
56
|
+
response.should be_success
|
57
|
+
response.body.should have_selector('div', :class => "title") do |title|
|
58
|
+
title.should contain("#{term}")
|
59
|
+
end
|
60
|
+
end
|
61
|
+
it "should retrieve only items without '#{term}' in the title" do
|
62
|
+
get :show_page, :url => "news-feed-page-by-words-not-in-title"
|
63
|
+
response.should be_success
|
64
|
+
response.body.should have_selector('div', :class => "title") do |title|
|
65
|
+
title.should_not contain("#{term}")
|
66
|
+
end
|
67
|
+
end
|
68
|
+
it "should retrieve only items with '#{term}' in the content" do
|
69
|
+
get :show_page, :url => "news-feed-page-by-words-in-content"
|
70
|
+
response.should be_success
|
71
|
+
response.body.should have_selector('div', :class => "content") do |content|
|
72
|
+
content.should contain("#{term}")
|
73
|
+
end
|
74
|
+
end
|
75
|
+
it "should retrieve only items without '#{term}' in the content" do
|
76
|
+
get :show_page, :url => "news-feed-page-by-words-not-in-content"
|
77
|
+
response.should be_success
|
78
|
+
response.body.should have_selector('div', :class => "content") do |content|
|
79
|
+
content.should_not contain("#{term}")
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
class RssReaderPagesDataset < Dataset::Base
|
2
|
+
uses :pages
|
3
|
+
|
4
|
+
def load
|
5
|
+
|
6
|
+
create_page "News Feed", :body => <<-CONTENT
|
7
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
8
|
+
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
|
9
|
+
<channel>
|
10
|
+
<title>Current News</title>
|
11
|
+
<link>http://www.example.com<r:url /></link>
|
12
|
+
<language>en-us</language>
|
13
|
+
<ttl>120</ttl>
|
14
|
+
<description>News Articles</description>
|
15
|
+
<r:find url="/news/">
|
16
|
+
<r:children:each limit="10" order="desc">
|
17
|
+
<item>
|
18
|
+
<title><r:title /></title>
|
19
|
+
<description><r:escape_html><r:content part="main_content" /></r:escape_html></description>
|
20
|
+
<pubDate><r:rfc1123_date /></pubDate>
|
21
|
+
<guid>http://www.example.com<r:url /></guid>
|
22
|
+
<link>http://www.example.com<r:url /></link>
|
23
|
+
</item>
|
24
|
+
</r:children:each>
|
25
|
+
</r:find>
|
26
|
+
</channel>
|
27
|
+
</rss>
|
28
|
+
CONTENT
|
29
|
+
|
30
|
+
feed_urls = []
|
31
|
+
feed_urls << "https://github.com/radiant/radiant-rss_reader-extension/commits/master.atom"
|
32
|
+
feed_urls << "http://rubygems.org/gems/radiant-rss_reader-extension/versions.atom"
|
33
|
+
feed_urls << "http://radiantcms.org/rss.xml"
|
34
|
+
|
35
|
+
create_page "News Feed Pages" do
|
36
|
+
feed_urls.each do |feed_url|
|
37
|
+
create_page "News Feed Page #{feed_urls.index(feed_url).to_s}", :body => <<-CONTENT
|
38
|
+
<r:feed:items url="#{feed_url}" order="date desc">
|
39
|
+
<div class="title"><r:feed:title /></div>
|
40
|
+
<div class="uri"><r:feed:uri /></div>
|
41
|
+
<div class="link"><r:feed:link /></div>
|
42
|
+
<div class="content"><r:feed:content/></div>
|
43
|
+
</r:feed:items>
|
44
|
+
CONTENT
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
feed_url = feed_urls.last
|
49
|
+
|
50
|
+
create_page "News Feed Page Limit 1", :body => <<-CONTENT
|
51
|
+
<r:feed:items url="#{feed_url}" order="date desc" limit="1">
|
52
|
+
<div class="title"><r:feed:title /></div>
|
53
|
+
<div class="content"><r:feed:content/></div>
|
54
|
+
</r:feed:items>
|
55
|
+
CONTENT
|
56
|
+
|
57
|
+
create_page "News Feed Page Limit 2", :body => <<-CONTENT
|
58
|
+
<r:feed:items url="#{feed_url}" order="date desc" limit="2">
|
59
|
+
<div class="title"><r:feed:title /></div>
|
60
|
+
<div class="content"><r:feed:content/></div>
|
61
|
+
</r:feed:items>
|
62
|
+
CONTENT
|
63
|
+
|
64
|
+
create_page "News Feed Page Limit 3", :body => <<-CONTENT
|
65
|
+
<r:feed:items url="#{feed_url}" order="date desc" limit="3">
|
66
|
+
<div class="title"><r:feed:title /></div>
|
67
|
+
<div class="content"><r:feed:content/></div>
|
68
|
+
</r:feed:items>
|
69
|
+
CONTENT
|
70
|
+
|
71
|
+
create_page "News Feed Page By Words in Title", :body => <<-CONTENT
|
72
|
+
<r:feed:items url="#{feed_url}" order="date desc" if_title_contains="extension">
|
73
|
+
<div class="title"><r:feed:title /></div>
|
74
|
+
<div class="content"><r:feed:content/></div>
|
75
|
+
</r:feed:items>
|
76
|
+
CONTENT
|
77
|
+
|
78
|
+
create_page "News Feed Page By Words not in Title", :body => <<-CONTENT
|
79
|
+
<r:feed:items url="#{feed_url}" order="date desc" unless_title_contains="extension">
|
80
|
+
<div class="title"><r:feed:title /></div>
|
81
|
+
<div class="content"><r:feed:content/></div>
|
82
|
+
</r:feed:items>
|
83
|
+
CONTENT
|
84
|
+
|
85
|
+
create_page "News Feed Page By Words in Content", :body => <<-CONTENT
|
86
|
+
<r:feed:items url="#{feed_url}" order="date desc" if_content_contains="extension">
|
87
|
+
<div class="title"><r:feed:title /></div>
|
88
|
+
<div class="content"><r:feed:content/></div>
|
89
|
+
</r:feed:items>
|
90
|
+
CONTENT
|
91
|
+
|
92
|
+
create_page "News Feed Page By Words not in Content", :body => <<-CONTENT
|
93
|
+
<r:feed:items url="#{feed_url}" order="date desc" unless_content_contains="extension">
|
94
|
+
<div class="title"><r:feed:title /></div>
|
95
|
+
<div class="content"><r:feed:content/></div>
|
96
|
+
</r:feed:items>
|
97
|
+
CONTENT
|
98
|
+
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "RssReader::PageExtensions" do
|
4
|
+
dataset :rss_reader_pages
|
5
|
+
|
6
|
+
describe "Feed Page" do
|
7
|
+
before :all do
|
8
|
+
@page = pages(:news_feed)
|
9
|
+
end
|
10
|
+
it "should be valid" do
|
11
|
+
@page.should be_valid
|
12
|
+
@page.published?.should be_true
|
13
|
+
end
|
14
|
+
it "should have 1 page part" do
|
15
|
+
@page.parts.count.should == 1
|
16
|
+
end
|
17
|
+
it "should have XML content" do
|
18
|
+
@page.parts[0].content.should include('<?xml version="1.0" encoding="UTF-8"?>')
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
feeds = {}
|
23
|
+
feeds['atom'] = "http://rubygems.org/gems/radiant-rss_reader-extension/versions.atom"
|
24
|
+
feeds['rss'] = "http://radiantcms.org/rss.xml"
|
25
|
+
|
26
|
+
feeds.each_pair do |feed_type,feed_url|
|
27
|
+
|
28
|
+
describe "#{feed_type.capitalize} Feed" do
|
29
|
+
before :all do
|
30
|
+
@page = pages(:home)
|
31
|
+
@feed = @page.fetch_rss("#{feed_url}", 900)
|
32
|
+
end
|
33
|
+
[:title, :encoding, :xml].each do |attr|
|
34
|
+
it "should have #{attr}" do
|
35
|
+
@feed.send("#{attr}").should_not be_blank
|
36
|
+
end
|
37
|
+
end
|
38
|
+
it "should have correct type" do
|
39
|
+
@feed.type.should == feed_type
|
40
|
+
end
|
41
|
+
it "should have at least one item" do
|
42
|
+
@feed.items.count.should > 0
|
43
|
+
end
|
44
|
+
describe "First Item" do
|
45
|
+
before :all do
|
46
|
+
@item = @feed.items[0]
|
47
|
+
end
|
48
|
+
[:title, :xml, :content, :link].each do |attr|
|
49
|
+
it "should have #{attr}" do
|
50
|
+
@item.send("#{attr}").should_not be_blank
|
51
|
+
end
|
52
|
+
end
|
53
|
+
it "should have a valid date" do
|
54
|
+
ParseDate.parsedate("#{@item.date}")[0].should_not be_nil
|
55
|
+
end
|
56
|
+
it "should have at least 1 creator" do
|
57
|
+
@item.creators.count.should > 0
|
58
|
+
end
|
59
|
+
it "should have a valid link" do
|
60
|
+
@item.link.should include(feed_url[0..10])
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
metadata
CHANGED
@@ -1,24 +1,24 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: radiant-rss_reader-extension
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 21
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 1.0.
|
9
|
+
- 1
|
10
|
+
version: 1.0.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Andrew vonderLuft
|
14
|
-
- Loren Johnson
|
15
14
|
autorequire:
|
16
15
|
bindir: bin
|
17
16
|
cert_chain: []
|
18
17
|
|
19
|
-
date: 2014-
|
18
|
+
date: 2014-08-09 00:00:00 Z
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
21
|
+
prerelease: false
|
22
22
|
type: :runtime
|
23
23
|
requirement: &id001 !ruby/object:Gem::Requirement
|
24
24
|
none: false
|
@@ -32,12 +32,10 @@ dependencies:
|
|
32
32
|
- 0
|
33
33
|
version: 0.7.0
|
34
34
|
version_requirements: *id001
|
35
|
-
prerelease: false
|
36
35
|
name: ruby-feedparser
|
37
36
|
description: This extension uses the ruby-feedparser gem to read external RSS feeds, cache them, and easily display them in your pages.
|
38
37
|
email:
|
39
38
|
- avonderluft@avlux.net
|
40
|
-
- loren@hellovenado.com
|
41
39
|
executables: []
|
42
40
|
|
43
41
|
extensions: []
|
@@ -51,13 +49,19 @@ files:
|
|
51
49
|
- cucumber.yml
|
52
50
|
- features/support/env.rb
|
53
51
|
- features/support/paths.rb
|
52
|
+
- Gemfile
|
53
|
+
- Gemfile.lock
|
54
54
|
- lib/radiant-rss_reader-extension.rb
|
55
|
-
- lib/rss_reader.rb
|
55
|
+
- lib/rss_reader/page_extensions.rb
|
56
|
+
- lib/rss_reader/tags.rb
|
56
57
|
- lib/tasks/rss_reader_extension_tasks.rake
|
57
58
|
- radiant-rss_reader-extension.gemspec
|
58
59
|
- Rakefile
|
59
60
|
- README.md
|
60
61
|
- rss_reader_extension.rb
|
62
|
+
- spec/controllers/site_controller_spec.rb
|
63
|
+
- spec/datasets/rss_reader_pages_dataset.rb
|
64
|
+
- spec/models/page_extensions_spec.rb
|
61
65
|
- spec/spec.opts
|
62
66
|
- spec/spec_helper.rb
|
63
67
|
homepage: https://github.com/radiant/radiant-rss_reader-extension
|
@@ -89,11 +93,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
89
93
|
requirements: []
|
90
94
|
|
91
95
|
rubyforge_project:
|
92
|
-
rubygems_version: 1.8.
|
96
|
+
rubygems_version: 1.8.24
|
93
97
|
signing_key:
|
94
98
|
specification_version: 3
|
95
99
|
summary: RSS Reader for Radiant CMS
|
96
100
|
test_files:
|
101
|
+
- spec/controllers/site_controller_spec.rb
|
102
|
+
- spec/datasets/rss_reader_pages_dataset.rb
|
103
|
+
- spec/models/page_extensions_spec.rb
|
97
104
|
- spec/spec.opts
|
98
105
|
- spec/spec_helper.rb
|
99
106
|
- features/support/env.rb
|