murlsh 0.11.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. data/.htaccess +2 -0
  2. data/README.textile +3 -33
  3. data/Rakefile +12 -5
  4. data/VERSION +1 -1
  5. data/config.ru +10 -4
  6. data/config.yaml +6 -12
  7. data/lib/murlsh/dispatch.rb +0 -6
  8. data/lib/murlsh/img_store.rb +36 -0
  9. data/lib/murlsh/markup.rb +0 -1
  10. data/lib/murlsh/plugin.rb +2 -6
  11. data/lib/murlsh/uri_ask.rb +66 -22
  12. data/lib/murlsh/url.rb +0 -18
  13. data/lib/murlsh/url_body.rb +15 -23
  14. data/lib/murlsh/url_server.rb +5 -5
  15. data/murlsh.gemspec +44 -19
  16. data/plugins/add_post_50_update_feed.rb +17 -3
  17. data/plugins/add_post_50_update_podcast.rb +46 -0
  18. data/plugins/add_post_50_update_rss.rb +18 -2
  19. data/plugins/add_post_60_notify_hubs.rb +3 -1
  20. data/plugins/add_pre_40_convert_mobile.rb +30 -0
  21. data/plugins/add_pre_50_lookup_content_type_title.rb +11 -4
  22. data/plugins/add_pre_60_flickr.rb +38 -0
  23. data/plugins/add_pre_60_github_title.rb +5 -1
  24. data/plugins/add_pre_60_google_code_title.rb +5 -2
  25. data/plugins/add_pre_60_imageshack.rb +31 -0
  26. data/plugins/add_pre_60_imgur.rb +32 -0
  27. data/plugins/add_pre_60_s3_image.rb +34 -0
  28. data/plugins/add_pre_60_twitter.rb +35 -0
  29. data/plugins/add_pre_60_vimeo.rb +35 -0
  30. data/plugins/add_pre_60_youtube.rb +31 -0
  31. data/plugins/html_parse_50_hpricot.rb +2 -0
  32. data/plugins/url_display_add_45_mp3.rb +30 -0
  33. data/plugins/url_display_add_50_hostrec.rb +38 -0
  34. data/plugins/url_display_add_55_content_type.rb +27 -0
  35. data/plugins/url_display_add_60_via.rb +52 -0
  36. data/plugins/url_display_add_65_time.rb +22 -0
  37. data/public/css/jquery.jgrowl.css +0 -3
  38. data/public/css/screen.css +0 -18
  39. data/public/img/thumb/README +0 -0
  40. data/public/js/jquery-1.4.3.min.js +166 -0
  41. data/public/js/js.js +62 -234
  42. data/public/js/twitter-text-1.0.3.js +538 -0
  43. data/spec/img_store_spec.rb +53 -0
  44. data/spec/uri_ask_spec.rb +14 -4
  45. metadata +139 -37
  46. data/lib/murlsh/flickr_server.rb +0 -55
  47. data/lib/murlsh/twitter_server.rb +0 -45
  48. data/lib/murlsh/unwrap_jsonp.rb +0 -15
  49. data/lib/murlsh/xhtml_response.rb +0 -20
  50. data/plugins/hostrec_50_redundant.rb +0 -14
  51. data/plugins/hostrec_60_skip.rb +0 -24
  52. data/plugins/time_50_ago.rb +0 -16
  53. data/plugins/via_50_domain.rb +0 -36
  54. data/public/js/jquery-1.4.2.min.js +0 -154
  55. data/spec/unwrap_json_spec.rb +0 -21
  56. data/spec/xhtml_response_spec.rb +0 -112
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: murlsh
3
3
  version: !ruby/object:Gem::Version
4
- hash: 51
4
+ hash: 23
5
5
  prerelease: false
6
6
  segments:
7
+ - 1
7
8
  - 0
8
- - 11
9
9
  - 0
10
- version: 0.11.0
10
+ version: 1.0.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Matthew M. Boedicker
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-09-21 00:00:00 -04:00
18
+ date: 2010-11-03 00:00:00 -04:00
19
19
  default_executable: murlsh
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -67,9 +67,41 @@ dependencies:
67
67
  type: :runtime
68
68
  version_requirements: *id003
69
69
  - !ruby/object:Gem::Dependency
70
- name: hpricot
70
+ name: flickraw
71
71
  prerelease: false
72
72
  requirement: &id004 !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ hash: 57
78
+ segments:
79
+ - 0
80
+ - 8
81
+ - 3
82
+ version: 0.8.3
83
+ type: :runtime
84
+ version_requirements: *id004
85
+ - !ruby/object:Gem::Dependency
86
+ name: flog
87
+ prerelease: false
88
+ requirement: &id005 !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ hash: 27
94
+ segments:
95
+ - 2
96
+ - 5
97
+ - 0
98
+ version: 2.5.0
99
+ type: :runtime
100
+ version_requirements: *id005
101
+ - !ruby/object:Gem::Dependency
102
+ name: hpricot
103
+ prerelease: false
104
+ requirement: &id006 !ruby/object:Gem::Requirement
73
105
  none: false
74
106
  requirements:
75
107
  - - ">="
@@ -81,11 +113,11 @@ dependencies:
81
113
  - 1
82
114
  version: 0.8.1
83
115
  type: :runtime
84
- version_requirements: *id004
116
+ version_requirements: *id006
85
117
  - !ruby/object:Gem::Dependency
86
118
  name: htmlentities
87
119
  prerelease: false
88
- requirement: &id005 !ruby/object:Gem::Requirement
120
+ requirement: &id007 !ruby/object:Gem::Requirement
89
121
  none: false
90
122
  requirements:
91
123
  - - ">="
@@ -97,11 +129,11 @@ dependencies:
97
129
  - 0
98
130
  version: 4.2.0
99
131
  type: :runtime
100
- version_requirements: *id005
132
+ version_requirements: *id007
101
133
  - !ruby/object:Gem::Dependency
102
134
  name: json
103
135
  prerelease: false
104
- requirement: &id006 !ruby/object:Gem::Requirement
136
+ requirement: &id008 !ruby/object:Gem::Requirement
105
137
  none: false
106
138
  requirements:
107
139
  - - ">="
@@ -113,11 +145,11 @@ dependencies:
113
145
  - 3
114
146
  version: 1.2.3
115
147
  type: :runtime
116
- version_requirements: *id006
148
+ version_requirements: *id008
117
149
  - !ruby/object:Gem::Dependency
118
150
  name: push-notify
119
151
  prerelease: false
120
- requirement: &id007 !ruby/object:Gem::Requirement
152
+ requirement: &id009 !ruby/object:Gem::Requirement
121
153
  none: false
122
154
  requirements:
123
155
  - - ">="
@@ -129,11 +161,11 @@ dependencies:
129
161
  - 0
130
162
  version: 0.1.0
131
163
  type: :runtime
132
- version_requirements: *id007
164
+ version_requirements: *id009
133
165
  - !ruby/object:Gem::Dependency
134
166
  name: rack
135
167
  prerelease: false
136
- requirement: &id008 !ruby/object:Gem::Requirement
168
+ requirement: &id010 !ruby/object:Gem::Requirement
137
169
  none: false
138
170
  requirements:
139
171
  - - ">="
@@ -145,11 +177,11 @@ dependencies:
145
177
  - 0
146
178
  version: 1.0.0
147
179
  type: :runtime
148
- version_requirements: *id008
180
+ version_requirements: *id010
149
181
  - !ruby/object:Gem::Dependency
150
182
  name: rack-cache
151
183
  prerelease: false
152
- requirement: &id009 !ruby/object:Gem::Requirement
184
+ requirement: &id011 !ruby/object:Gem::Requirement
153
185
  none: false
154
186
  requirements:
155
187
  - - ">="
@@ -161,11 +193,27 @@ dependencies:
161
193
  - 2
162
194
  version: 0.5.2
163
195
  type: :runtime
164
- version_requirements: *id009
196
+ version_requirements: *id011
197
+ - !ruby/object:Gem::Dependency
198
+ name: rack-rewrite
199
+ prerelease: false
200
+ requirement: &id012 !ruby/object:Gem::Requirement
201
+ none: false
202
+ requirements:
203
+ - - ">="
204
+ - !ruby/object:Gem::Version
205
+ hash: 19
206
+ segments:
207
+ - 1
208
+ - 0
209
+ - 2
210
+ version: 1.0.2
211
+ type: :runtime
212
+ version_requirements: *id012
165
213
  - !ruby/object:Gem::Dependency
166
214
  name: rack-throttle
167
215
  prerelease: false
168
- requirement: &id010 !ruby/object:Gem::Requirement
216
+ requirement: &id013 !ruby/object:Gem::Requirement
169
217
  none: false
170
218
  requirements:
171
219
  - - ">="
@@ -177,11 +225,11 @@ dependencies:
177
225
  - 0
178
226
  version: 0.3.0
179
227
  type: :runtime
180
- version_requirements: *id010
228
+ version_requirements: *id013
181
229
  - !ruby/object:Gem::Dependency
182
230
  name: sqlite3-ruby
183
231
  prerelease: false
184
- requirement: &id011 !ruby/object:Gem::Requirement
232
+ requirement: &id014 !ruby/object:Gem::Requirement
185
233
  none: false
186
234
  requirements:
187
235
  - - ">="
@@ -193,23 +241,70 @@ dependencies:
193
241
  - 1
194
242
  version: 1.2.1
195
243
  type: :runtime
196
- version_requirements: *id011
244
+ version_requirements: *id014
197
245
  - !ruby/object:Gem::Dependency
198
246
  name: tinyatom
199
247
  prerelease: false
200
- requirement: &id012 !ruby/object:Gem::Requirement
248
+ requirement: &id015 !ruby/object:Gem::Requirement
201
249
  none: false
202
250
  requirements:
203
251
  - - ">="
204
252
  - !ruby/object:Gem::Version
205
- hash: 25
253
+ hash: 23
206
254
  segments:
207
255
  - 0
256
+ - 2
257
+ - 0
258
+ version: 0.2.0
259
+ type: :runtime
260
+ version_requirements: *id015
261
+ - !ruby/object:Gem::Dependency
262
+ name: twitter
263
+ prerelease: false
264
+ requirement: &id016 !ruby/object:Gem::Requirement
265
+ none: false
266
+ requirements:
267
+ - - ">="
268
+ - !ruby/object:Gem::Version
269
+ hash: 35
270
+ segments:
271
+ - 0
272
+ - 9
273
+ - 12
274
+ version: 0.9.12
275
+ type: :runtime
276
+ version_requirements: *id016
277
+ - !ruby/object:Gem::Dependency
278
+ name: vimeo
279
+ prerelease: false
280
+ requirement: &id017 !ruby/object:Gem::Requirement
281
+ none: false
282
+ requirements:
283
+ - - ">="
284
+ - !ruby/object:Gem::Version
285
+ hash: 27
286
+ segments:
208
287
  - 1
288
+ - 2
289
+ - 2
290
+ version: 1.2.2
291
+ type: :runtime
292
+ version_requirements: *id017
293
+ - !ruby/object:Gem::Dependency
294
+ name: rspec
295
+ prerelease: false
296
+ requirement: &id018 !ruby/object:Gem::Requirement
297
+ none: false
298
+ requirements:
299
+ - - ~>
300
+ - !ruby/object:Gem::Version
301
+ hash: 9
302
+ segments:
209
303
  - 1
210
- version: 0.1.1
304
+ - 3
305
+ version: "1.3"
211
306
  type: :runtime
212
- version_requirements: *id012
307
+ version_requirements: *id018
213
308
  description: url sharing site framework with easy adding, title lookup, atom feed, thumbnails and embedding
214
309
  email: matthewm@boedicker.org
215
310
  executables:
@@ -236,51 +331,59 @@ files:
236
331
  - lib/murlsh/etag_add_encoding.rb
237
332
  - lib/murlsh/failproof.rb
238
333
  - lib/murlsh/far_future_expires.rb
239
- - lib/murlsh/flickr_server.rb
240
334
  - lib/murlsh/head_from_get.rb
335
+ - lib/murlsh/img_store.rb
241
336
  - lib/murlsh/markup.rb
242
337
  - lib/murlsh/must_revalidate.rb
243
338
  - lib/murlsh/openlock.rb
244
339
  - lib/murlsh/plugin.rb
245
340
  - lib/murlsh/sqlite3_adapter.rb
246
341
  - lib/murlsh/time_ago.rb
247
- - lib/murlsh/twitter_server.rb
248
- - lib/murlsh/unwrap_jsonp.rb
249
342
  - lib/murlsh/uri.rb
250
343
  - lib/murlsh/uri_ask.rb
251
344
  - lib/murlsh/url.rb
252
345
  - lib/murlsh/url_body.rb
253
346
  - lib/murlsh/url_server.rb
254
- - lib/murlsh/xhtml_response.rb
255
347
  - lib/murlsh/yaml_ordered_hash.rb
256
348
  - murlsh.gemspec
257
349
  - plugins/add_post_50_update_feed.rb
350
+ - plugins/add_post_50_update_podcast.rb
258
351
  - plugins/add_post_50_update_rss.rb
259
352
  - plugins/add_post_60_notify_hubs.rb
353
+ - plugins/add_pre_40_convert_mobile.rb
260
354
  - plugins/add_pre_50_lookup_content_type_title.rb
355
+ - plugins/add_pre_60_flickr.rb
261
356
  - plugins/add_pre_60_github_title.rb
262
357
  - plugins/add_pre_60_google_code_title.rb
263
- - plugins/hostrec_50_redundant.rb
264
- - plugins/hostrec_60_skip.rb
358
+ - plugins/add_pre_60_imageshack.rb
359
+ - plugins/add_pre_60_imgur.rb
360
+ - plugins/add_pre_60_s3_image.rb
361
+ - plugins/add_pre_60_twitter.rb
362
+ - plugins/add_pre_60_vimeo.rb
363
+ - plugins/add_pre_60_youtube.rb
265
364
  - plugins/html_parse_50_hpricot.rb
266
- - plugins/time_50_ago.rb
267
- - plugins/via_50_domain.rb
365
+ - plugins/url_display_add_45_mp3.rb
366
+ - plugins/url_display_add_50_hostrec.rb
367
+ - plugins/url_display_add_55_content_type.rb
368
+ - plugins/url_display_add_60_via.rb
369
+ - plugins/url_display_add_65_time.rb
268
370
  - public/css/jquery.jgrowl.css
269
371
  - public/css/screen.css
372
+ - public/img/thumb/README
270
373
  - public/js/comments.json
271
- - public/js/jquery-1.4.2.min.js
374
+ - public/js/jquery-1.4.3.min.js
272
375
  - public/js/jquery.jgrowl_compressed.js
273
376
  - public/js/js.js
377
+ - public/js/twitter-text-1.0.3.js
274
378
  - public/swf/player_mp3_mini.swf
275
379
  - spec/auth_spec.rb
276
380
  - spec/dispatch_spec.rb
277
381
  - spec/doc_spec.rb
382
+ - spec/img_store_spec.rb
278
383
  - spec/markup_spec.rb
279
- - spec/unwrap_json_spec.rb
280
384
  - spec/uri_ask_spec.rb
281
385
  - spec/uri_spec.rb
282
386
  - spec/url_spec.rb
283
- - spec/xhtml_response_spec.rb
284
387
  - spec/yaml_ordered_hash_spec.rb
285
388
  has_rdoc: true
286
389
  homepage: http://github.com/mmb/murlsh
@@ -317,11 +420,10 @@ signing_key:
317
420
  specification_version: 3
318
421
  summary: url sharing site framework
319
422
  test_files:
320
- - spec/xhtml_response_spec.rb
321
423
  - spec/auth_spec.rb
322
424
  - spec/yaml_ordered_hash_spec.rb
323
- - spec/unwrap_json_spec.rb
324
425
  - spec/uri_ask_spec.rb
426
+ - spec/img_store_spec.rb
325
427
  - spec/dispatch_spec.rb
326
428
  - spec/markup_spec.rb
327
429
  - spec/url_spec.rb
@@ -1,55 +0,0 @@
1
- %w{
2
- digest/sha1
3
- open-uri
4
-
5
- rack
6
-
7
- murlsh
8
- }.each { |m| require m }
9
-
10
- module Murlsh
11
-
12
- # Proxy for Flickr rest API to support conditional get and caching.
13
- #
14
- # Passes along query string with api key added, returns result from Flickr
15
- # with cache-control, etag and last-modified headers set.
16
- class FlickrServer
17
-
18
- include HeadFromGet
19
-
20
- def initialize(config); @config = config; end
21
-
22
- # Proxy a request to the Flickr API.
23
- def get(req)
24
- resp = Rack::Response.new
25
-
26
- if @config['flickr_api_key']
27
- params = req.params.merge('api_key' => @config['flickr_api_key'])
28
-
29
- q = params.map { |k,v| "#{URI.encode(k)}=#{URI.encode(v)}" }.join('&')
30
-
31
- json_wrapped = open("http://api.flickr.com/services/rest/?#{q}") do |f|
32
- f.read
33
- end
34
-
35
- json_parsed = Murlsh::unwrap_jsonp(json_wrapped)
36
-
37
- resp['Cache-Control'] = 'max-age=86400'
38
- resp['Content-Type'] = 'application/json'
39
- resp['ETag'] = "\"#{Digest::SHA1.hexdigest(json_wrapped)}\""
40
- resp['Last-Modified'] = Time.at(
41
- json_parsed['photo']['dates']['lastupdate'].to_i).httpdate
42
-
43
- resp.body = json_wrapped
44
-
45
- resp
46
- else
47
- Rack::Response.new('flickr_api_key not set in config.yaml', 500,
48
- { 'Content-Type' => 'text/plain' })
49
- end
50
-
51
- end
52
-
53
- end
54
-
55
- end
@@ -1,45 +0,0 @@
1
- %w{
2
- digest/sha1
3
- open-uri
4
-
5
- rack
6
-
7
- murlsh
8
- }.each { |m| require m }
9
-
10
- module Murlsh
11
-
12
- # Proxy for Twitter rest API to support conditional get and caching.
13
- #
14
- # Passes along path and query string, returns result from Twitter with
15
- # cache-control, etag and last-modified headers set.
16
- class TwitterServer
17
-
18
- include HeadFromGet
19
-
20
- # Proxy a request to the Twitter API.
21
- def get(req)
22
- resp = Rack::Response.new
23
-
24
- twitter_url = URI.join('http://api.twitter.com',
25
- req.fullpath[/twitter\/(.+)/, 1])
26
-
27
- json_wrapped = open(twitter_url) do |f|
28
- resp['Content-Type'] = f.content_type
29
- f.read
30
- end
31
-
32
- json_parsed = Murlsh::unwrap_jsonp(json_wrapped)
33
-
34
- resp['Cache-Control'] = 'max-age=86400'
35
- resp['ETag'] = "\"#{Digest::SHA1.hexdigest(json_wrapped)}\""
36
- resp['Last-Modified'] = Time.parse(json_parsed['created_at']).httpdate
37
-
38
- resp.body = json_wrapped
39
-
40
- resp
41
- end
42
-
43
- end
44
-
45
- end
@@ -1,15 +0,0 @@
1
- %w{
2
- json
3
- }.each { |m| require m }
4
-
5
- module Murlsh
6
-
7
- module_function
8
-
9
- # Unwrap jsonp to standard json and parse it.
10
- def unwrap_jsonp(jsonp)
11
- json = /.+?\((.+)\)/m.match(jsonp)[1]
12
- JSON.parse(json)
13
- end
14
-
15
- end
@@ -1,20 +0,0 @@
1
- module Murlsh
2
-
3
- # Set the content type correctly based on accept header and user agent.
4
- class XhtmlResponse < Rack::Response
5
-
6
- # Set the content type to application/xhtml+xml for anything that
7
- # claims to accept it, for anything else or IE use text/html.
8
- def set_content_type(http_accept, http_user_agent)
9
- self['Content-Type'] = if http_accept and
10
- http_accept[/((\*|application)\/\*|application\/xhtml\+xml)/i] and
11
- (!http_user_agent or !http_user_agent[/ msie /i])
12
- 'application/xhtml+xml'
13
- else
14
- 'text/html'
15
- end
16
- end
17
-
18
- end
19
-
20
- end
@@ -1,14 +0,0 @@
1
- module Murlsh
2
-
3
- # skip showing host record if domain is contained in title
4
- class Hostrec50Redundant < Plugin
5
-
6
- @hook = 'hostrec'
7
-
8
- def self.run(domain, url, title)
9
- domain unless (title and domain and title.downcase.index(domain))
10
- end
11
-
12
- end
13
-
14
- end
@@ -1,24 +0,0 @@
1
- module Murlsh
2
-
3
- # Skip showing host record for some domains.
4
- class Hostrec60Skip < Plugin
5
-
6
- @hook = 'hostrec'
7
-
8
- def self.run(domain, url, title)
9
- domain unless skips.include?(domain)
10
- end
11
-
12
- @skips = %w{
13
- wikipedia.org
14
- flickr.com
15
- github.com
16
- twitter.com
17
- vimeo.com
18
- youtube.com
19
- }
20
- class << self; attr_reader :skips; end
21
-
22
- end
23
-
24
- end
@@ -1,16 +0,0 @@
1
- %w{
2
- murlsh
3
- }.each { |m| require m }
4
-
5
- module Murlsh
6
-
7
- # show the time as the fuzzy amount of time that has elapsed since then
8
- class Time50Ago < Plugin
9
-
10
- @hook = 'time'
11
-
12
- def self.run(time); time.extend(Murlsh::TimeAgo).ago if time; end
13
-
14
- end
15
-
16
- end
@@ -1,36 +0,0 @@
1
- %w{
2
- murlsh
3
- }.each { |m| require m }
4
-
5
- module Murlsh
6
-
7
- # Convert a via url to its display text.
8
- #
9
- # For most urls the domain is displayed, but for some return custom text.
10
- class Via50Domain < Plugin
11
-
12
- @hook = 'via'
13
-
14
- def self.run(via)
15
- search = via.to_s.gsub(%r{^http://}, '')
16
-
17
- case
18
- when m = search.match(%r{^news\.ycombinator\.com}i)
19
- 'hacker news'
20
- when m = search.match(%r{^www\.reddit\.com/r/([a-z\d]+?)/}i)
21
- "#{m[1]}.reddit"
22
- when m = search.match(%r{^delicious\.com/(\w+)}i)
23
- "delicious/#{m[1]}"
24
- when m = search.match(%r{^twitter\.com/(\w+)}i)
25
- "twitter/#{m[1]}"
26
- when m = search.match(%r{^([a-z\d][a-z\d-]{0,61}[a-z\d])\.tumblr\.com/}i)
27
- "#{m[1]}.tumblr"
28
- else
29
- via.domain || via
30
- end
31
-
32
- end
33
-
34
- end
35
-
36
- end