murlsh 0.11.0 → 1.0.0

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.
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