murlsh 1.4.1 → 1.5.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 (63) hide show
  1. data/.gitignore +4 -0
  2. data/.htaccess +0 -3
  3. data/Gemfile +41 -0
  4. data/README.textile +68 -6
  5. data/Rakefile +65 -152
  6. data/config.ru +13 -2
  7. data/config.yaml +9 -4
  8. data/db/migrate/20110213023123_init.rb +20 -0
  9. data/lib/murlsh/atom_body.rb +78 -0
  10. data/lib/murlsh/atom_server.rb +38 -0
  11. data/lib/murlsh/auth.rb +12 -0
  12. data/lib/murlsh/build_query.rb +1 -1
  13. data/lib/murlsh/cat_files.rb +17 -0
  14. data/lib/murlsh/delicious_parse.rb +1 -0
  15. data/lib/murlsh/dispatch.rb +25 -11
  16. data/lib/murlsh/etag_add_encoding.rb +1 -1
  17. data/lib/murlsh/feed_body.rb +36 -0
  18. data/lib/murlsh/img_store.rb +27 -28
  19. data/lib/murlsh/install.rb +1 -0
  20. data/lib/murlsh/json_body.rb +5 -2
  21. data/lib/murlsh/json_server.rb +9 -13
  22. data/lib/murlsh/m3u_body.rb +28 -0
  23. data/lib/murlsh/m3u_server.rb +50 -0
  24. data/lib/murlsh/markup.rb +1 -1
  25. data/lib/murlsh/plugin.rb +5 -0
  26. data/lib/murlsh/podcast_server.rb +44 -0
  27. data/lib/murlsh/pop_server.rb +78 -0
  28. data/lib/murlsh/random_server.rb +41 -0
  29. data/lib/murlsh/rss_body.rb +46 -0
  30. data/lib/murlsh/rss_server.rb +38 -0
  31. data/lib/murlsh/search_conditions.rb +2 -2
  32. data/lib/murlsh/uri_ask.rb +2 -2
  33. data/lib/murlsh/url_body.rb +21 -6
  34. data/lib/murlsh/url_result_set.rb +2 -2
  35. data/lib/murlsh/url_server.rb +19 -16
  36. data/lib/murlsh/write_ordered_hash.rb +17 -0
  37. data/lib/murlsh.rb +13 -2
  38. data/murlsh.gemspec +41 -194
  39. data/plugins/add_post_60_notify_hubs.rb +3 -2
  40. data/plugins/add_pre_30_unajax_twitter.rb +1 -1
  41. data/plugins/add_pre_40_thumbnail_shortcuts.rb +23 -0
  42. data/plugins/add_pre_45_supplied_thumbnail.rb +4 -9
  43. data/plugins/add_pre_50_media_thumbnail.rb +4 -9
  44. data/plugins/add_pre_50_open_graph_image.rb +4 -8
  45. data/plugins/add_pre_60_github_title.rb +1 -1
  46. data/plugins/add_pre_65_html_thumb.rb +3 -8
  47. data/plugins/add_pre_65_img_thumb.rb +4 -9
  48. data/plugins/avatar_50_gravatar.rb +2 -1
  49. data/plugins/store_asset_40_s3.rb +40 -0
  50. data/plugins/store_asset_50_local.rb +22 -0
  51. data/public/js/js.js +0 -7
  52. data/spec/auth_spec.rb +7 -0
  53. data/spec/cat_files_spec.rb +49 -0
  54. data/spec/img_store_spec.rb +24 -8
  55. metadata +119 -76
  56. data/VERSION +0 -1
  57. data/lib/murlsh/build_md5.rb +0 -12
  58. data/lib/murlsh/head_from_get.rb +0 -15
  59. data/plugins/add_post_50_update_feed.rb +0 -84
  60. data/plugins/add_post_50_update_m3u.rb +0 -35
  61. data/plugins/add_post_50_update_podcast.rb +0 -44
  62. data/plugins/add_post_50_update_rss.rb +0 -51
  63. data/plugins/add_pre_60_s3_image.rb +0 -35
@@ -0,0 +1,46 @@
1
+ require 'rss/maker'
2
+
3
+ require 'murlsh'
4
+
5
+ module Murlsh
6
+
7
+ # Rss feed builder.
8
+ class RssBody
9
+ include Murlsh::FeedBody
10
+
11
+ # Rss feed builder.
12
+ def build
13
+ if defined?(@body)
14
+ @body
15
+ else
16
+ feed = RSS::Maker.make('2.0') do |f|
17
+ f.channel.title = f.channel.description = feed_title
18
+ f.channel.link = feed_url
19
+
20
+ f.items.do_sort = true
21
+
22
+ urls.each do |mu|
23
+ Murlsh::Plugin.hooks('url_display_pre') do |p|
24
+ p.run mu, req, config
25
+ end
26
+
27
+ i = f.items.new_item
28
+ i.title = mu.title_stripped
29
+ i.link = mu.url
30
+ i.date = mu.time
31
+
32
+ if EnclosureContentTypes.include? mu.content_type
33
+ i.enclosure.url = mu.url
34
+ i.enclosure.type = mu.content_type
35
+ i.enclosure.length = mu.content_length
36
+ end
37
+ end
38
+ end
39
+
40
+ @body = feed
41
+ end
42
+ end
43
+
44
+ end
45
+
46
+ end
@@ -0,0 +1,38 @@
1
+ require 'uri'
2
+
3
+ require 'rack'
4
+
5
+ require 'murlsh'
6
+
7
+ module Murlsh
8
+
9
+ # Serve RSS feed.
10
+ class RssServer
11
+
12
+ def initialize(config); @config = config; end
13
+
14
+ # Respond to a GET request for RSS feed.
15
+ def get(req)
16
+ conditions = Murlsh::SearchConditions.new(req['q']).conditions
17
+ page = 1
18
+ per_page = config.fetch('num_posts_feed', 25)
19
+
20
+ result_set = Murlsh::UrlResultSet.new(conditions, page, per_page)
21
+ urls = result_set.results
22
+
23
+ feed_url = URI.join(config.fetch('root_url'), 'rss.rss')
24
+ body = Murlsh::RssBody.new(config, req, feed_url, urls)
25
+
26
+ resp = Rack::Response.new(body, 200,
27
+ 'Cache-Control' => 'must-revalidate, max-age=0',
28
+ 'Content-Type' => 'application/rss+xml')
29
+ if u = body.updated
30
+ resp['Last-Modified'] = u.httpdate
31
+ end
32
+ resp
33
+ end
34
+
35
+ attr_reader :config
36
+ end
37
+
38
+ end
@@ -17,8 +17,8 @@ module Murlsh
17
17
  likes = []
18
18
  params = []
19
19
  search_cols.product(tokens).each do |col,tok|
20
- likes << "#{col} LIKE ?"
21
- params << "%#{tok}%"
20
+ likes << "LOWER(#{col}) LIKE ?"
21
+ params << "%#{tok.downcase}%"
22
22
  end
23
23
  [likes.join(' OR ')].push(*params)
24
24
  else
@@ -17,14 +17,14 @@ module Murlsh
17
17
  # Options:
18
18
  # * :failproof - if true hide all exceptions and return empty string on failure
19
19
  # * :headers - hash of headers to send in request
20
- def content_length(options={}); header 'content-length', options; end
20
+ def content_length(options={}); header('content-length', options); end
21
21
 
22
22
  # Get the content type.
23
23
  #
24
24
  # Options:
25
25
  # * :failproof - if true hide all exceptions and return empty string on failure
26
26
  # * :headers - hash of headers to send in request
27
- def content_type(options={}); header 'content-type', options; end
27
+ def content_type(options={}); header('content-type', options); end
28
28
 
29
29
  # Get the HTML title.
30
30
  #
@@ -5,7 +5,6 @@ module Murlsh
5
5
 
6
6
  # Url list page builder.
7
7
  class UrlBody < Builder::XmlMarkup
8
- include Murlsh::BuildMd5
9
8
  include Murlsh::Markup
10
9
 
11
10
  def initialize(config, req, result_set, content_type='text/html')
@@ -44,18 +43,22 @@ module Murlsh
44
43
  @body = html(:lang => 'en') {
45
44
  headd
46
45
  body {
47
- self.p(:id => 'menu') { home_link ; text! ' | ' ; feed_link }
46
+ menu
48
47
  search_form
49
48
  quick_search
50
49
  ul(:id => 'urls') {
51
50
  last = nil
52
51
 
53
52
  @result_set.results.each do |mu|
53
+ Murlsh::Plugin.hooks('url_display_pre') do |p|
54
+ p.run mu, @req, @config
55
+ end
56
+
54
57
  li {
55
58
  unless mu.same_author?(last)
56
59
  avatar_url = Murlsh::Plugin.hooks('avatar').inject(
57
60
  nil) do |url_so_far,plugin|
58
- plugin.run(url_so_far, mu, @config)
61
+ plugin.run url_so_far, mu, @config
59
62
  end
60
63
  div(:class => 'icon') {
61
64
  murlsh_img :src => avatar_url, :text => mu.name
@@ -119,6 +122,15 @@ module Murlsh
119
122
  (@req['q'] ? " /#{@req['q']}" : ''))
120
123
  end
121
124
 
125
+ # Menu builder.
126
+ def menu
127
+ self.p(:id => 'menu') {
128
+ home_link ; text! ' | '
129
+ feed_link ; text! ' | '
130
+ random_link
131
+ }
132
+ end
133
+
122
134
  # Home link builder.
123
135
  def home_link; a 'Home', :href => @config.fetch('root_url'); end
124
136
 
@@ -127,6 +139,9 @@ module Murlsh
127
139
  a 'Feed', :href => @config.fetch('feed_file'), :class => 'feed'
128
140
  end
129
141
 
142
+ # Random link builder.
143
+ def random_link; a 'Random', :href => 'random', :rel => 'nofollow'; end
144
+
130
145
  # Quick search list builder.
131
146
  def quick_search
132
147
  if @config['quick_search']
@@ -148,7 +163,7 @@ module Murlsh
148
163
 
149
164
  # Search form builder.
150
165
  def search_form
151
- form(:action => '', :method => 'get') {
166
+ form(:action => @config.fetch('root_url'), :method => 'get') {
152
167
  fieldset {
153
168
  form_input :id => 'q', :size => 32, :value => @req['q']
154
169
  form_input :type => 'submit', :value => 'Search'
@@ -171,7 +186,7 @@ module Murlsh
171
186
 
172
187
  # Url add form builder.
173
188
  def add_form
174
- form(:action => '', :method => 'post') {
189
+ form(:action => 'url', :method => 'post') {
175
190
  fieldset(:id => 'add') {
176
191
  self.p { form_input :id => 'url', :label => 'Add URL', :size => 32 }
177
192
  self.p { form_input :id => 'via', :label => 'Via', :size => 32 }
@@ -191,7 +206,7 @@ module Murlsh
191
206
  def powered_by
192
207
  self.p {
193
208
  text! 'Powered by '
194
- a 'murlsh', :href => 'http://github.com/mmb/murlsh/'
209
+ a 'murlsh', :href => 'https://github.com/mmb/murlsh'
195
210
  }
196
211
  end
197
212
 
@@ -23,14 +23,14 @@ module Murlsh
23
23
  end
24
24
 
25
25
  def prev_page
26
- unless instance_variable_defined? :@prev_page
26
+ unless instance_variable_defined?(:@prev_page)
27
27
  @prev_page = page - 1 if (2..total_pages) === page
28
28
  end
29
29
  @prev_page
30
30
  end
31
31
 
32
32
  def next_page
33
- unless instance_variable_defined? :@next_page
33
+ unless instance_variable_defined?(:@next_page)
34
34
  @next_page = page + 1 if page < total_pages
35
35
  end
36
36
  @next_page
@@ -6,8 +6,6 @@ module Murlsh
6
6
  # Build responses for HTTP requests.
7
7
  class UrlServer
8
8
 
9
- include HeadFromGet
10
-
11
9
  def initialize(config); @config = config; end
12
10
 
13
11
  # Respond to a GET request. Return a page of urls based on the query
@@ -16,28 +14,24 @@ module Murlsh
16
14
  conditions = Murlsh::SearchConditions.new(req['q']).conditions
17
15
  page = [req['p'].to_i, 1].max
18
16
  per_page = req['pp'] ? req['pp'].to_i :
19
- @config.fetch('num_posts_page', 25)
17
+ config.fetch('num_posts_page', 25)
20
18
 
19
+ content_type = 'text/html; charset=utf-8'
21
20
  result_set = Murlsh::UrlResultSet.new(conditions, page, per_page)
22
21
 
23
- resp = Rack::Response.new
24
-
25
- resp['Content-Type'] = 'text/html; charset=utf-8'
26
- resp.body = Murlsh::UrlBody.new(@config, req, result_set,
27
- resp['Content-Type'])
22
+ body = Murlsh::UrlBody.new(config, req, result_set, content_type)
28
23
 
24
+ resp = Rack::Response.new
25
+ resp.write(body.build)
29
26
  resp['Cache-Control'] = 'must-revalidate, max-age=0'
30
- resp['ETag'] = "\"#{resp.body.md5}\""
27
+ resp['Content-Type'] = content_type
31
28
 
32
29
  resp
33
30
  end
34
31
 
35
32
  # Respond to a POST request. Add the new url and return json.
36
33
  def post(req)
37
- auth = req['auth']
38
- if user = auth.empty? ? nil : Murlsh::Auth.new(
39
- @config.fetch('auth_file')).auth(auth)
40
-
34
+ if user = auth_from_req(req)
41
35
  mu = Murlsh::Url.new do |u|
42
36
  u.url = req['url']
43
37
  u.email = user[:email]
@@ -45,7 +39,7 @@ module Murlsh
45
39
 
46
40
  # optional parameters
47
41
  unless req['thumbnail'].to_s.empty?
48
- u.thumbnail_url = req['thumbnail']
42
+ u.thumbnail_url = req['thumbnail']
49
43
  end
50
44
 
51
45
  u.time = if req['time']
@@ -65,9 +59,9 @@ module Murlsh
65
59
  begin
66
60
  # validate before add_pre plugins have run and also after (in save!)
67
61
  raise ActiveRecord::RecordInvalid.new(mu) unless mu.valid?
68
- Murlsh::Plugin.hooks('add_pre') { |p| p.run mu, @config }
62
+ Murlsh::Plugin.hooks('add_pre') { |p| p.run mu, config }
69
63
  mu.save!
70
- Murlsh::Plugin.hooks('add_post') { |p| p.run mu, @config }
64
+ Murlsh::Plugin.hooks('add_post') { |p| p.run mu, config }
71
65
  response_body, response_code = [mu], 200
72
66
  rescue ActiveRecord::RecordInvalid => error
73
67
  response_body = {
@@ -84,6 +78,15 @@ module Murlsh
84
78
  'Content-Type' => 'application/json' })
85
79
  end
86
80
 
81
+ # Authorize a user from a request.
82
+ def auth_from_req(req)
83
+ secret = req['auth']
84
+
85
+ secret.to_s.empty? ? nil : Murlsh::Auth.new(
86
+ config.fetch('auth_file')).auth(secret)
87
+ end
88
+
89
+ attr_reader :config
87
90
  end
88
91
 
89
92
  end
@@ -0,0 +1,17 @@
1
+ require 'murlsh'
2
+
3
+ module Murlsh
4
+
5
+ module_function
6
+
7
+ # Sort a hash by key and write it to a file as YAML.
8
+ def write_ordered_hash(h, path)
9
+ h.extend(Murlsh::YamlOrderedHash)
10
+ h.each_value do |v|
11
+ v.extend(Murlsh::YamlOrderedHash) if v.is_a?(Hash)
12
+ end
13
+
14
+ open(path, 'w') { |f| YAML.dump(h, f) }
15
+ end
16
+
17
+ end
data/lib/murlsh.rb CHANGED
@@ -1,10 +1,10 @@
1
- require 'murlsh/head_from_get'
2
1
  require 'murlsh/search_conditions'
3
2
 
3
+ require 'murlsh/atom_server'
4
4
  require 'murlsh/ask'
5
5
  require 'murlsh/auth'
6
- require 'murlsh/build_md5'
7
6
  require 'murlsh/build_query'
7
+ require 'murlsh/cat_files'
8
8
  require 'murlsh/cp_r_safe'
9
9
  require 'murlsh/delicious_parse'
10
10
  require 'murlsh/dispatch'
@@ -12,16 +12,24 @@ require 'murlsh/doc'
12
12
  require 'murlsh/etag_add_encoding'
13
13
  require 'murlsh/failproof'
14
14
  require 'murlsh/far_future_expires'
15
+ require 'murlsh/feed_body'
15
16
  require 'murlsh/image_list'
16
17
  require 'murlsh/img_store'
17
18
  require 'murlsh/install'
18
19
  require 'murlsh/json_body'
19
20
  require 'murlsh/json_server'
20
21
  require 'murlsh/jsonp_body'
22
+ require 'murlsh/m3u_body'
23
+ require 'murlsh/m3u_server'
21
24
  require 'murlsh/markup'
22
25
  require 'murlsh/must_revalidate'
23
26
  require 'murlsh/openlock'
27
+ require 'murlsh/podcast_server'
24
28
  require 'murlsh/plugin'
29
+ require 'murlsh/pop_server'
30
+ require 'murlsh/random_server'
31
+ require 'murlsh/rss_body'
32
+ require 'murlsh/rss_server'
25
33
  require 'murlsh/search_grammar'
26
34
  require 'murlsh/time_ago'
27
35
  require 'murlsh/uri_ask'
@@ -31,4 +39,7 @@ require 'murlsh/url_body'
31
39
  require 'murlsh/url'
32
40
  require 'murlsh/url_result_set'
33
41
  require 'murlsh/url_server'
42
+ require 'murlsh/write_ordered_hash'
34
43
  require 'murlsh/yaml_ordered_hash'
44
+
45
+ require 'murlsh/atom_body'
data/murlsh.gemspec CHANGED
@@ -1,201 +1,48 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
1
  # -*- encoding: utf-8 -*-
5
2
 
6
3
  Gem::Specification.new do |s|
7
- s.name = %q{murlsh}
8
- s.version = "1.4.1"
4
+ s.name = 'murlsh'
5
+ s.version = '1.5.0'
6
+ s.summary = 'Host your bookmarks or maintain a link blog'
7
+ s.description = s.summary
8
+ s.homepage = 'https://github.com/mmb/murlsh'
9
+ s.authors = ['Matthew M. Boedicker']
10
+ s.email = %w{matthewm@boedicker.org}
9
11
 
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Matthew M. Boedicker"]
12
- s.date = %q{2011-02-01}
13
- s.default_executable = %q{murlsh}
14
- s.description = %q{Host your bookmarks or maintain a link blog}
15
- s.email = %q{matthewm@boedicker.org}
16
- s.executables = ["murlsh"]
17
- s.extra_rdoc_files = [
18
- "README.textile"
19
- ]
20
- s.files = [
21
- ".htaccess",
22
- "COPYING",
23
- "README.textile",
24
- "Rakefile",
25
- "VERSION",
26
- "bin/murlsh",
27
- "config.ru",
28
- "config.yaml",
29
- "lib/murlsh.rb",
30
- "lib/murlsh/ask.rb",
31
- "lib/murlsh/auth.rb",
32
- "lib/murlsh/build_md5.rb",
33
- "lib/murlsh/build_query.rb",
34
- "lib/murlsh/cp_r_safe.rb",
35
- "lib/murlsh/delicious_parse.rb",
36
- "lib/murlsh/dispatch.rb",
37
- "lib/murlsh/doc.rb",
38
- "lib/murlsh/etag_add_encoding.rb",
39
- "lib/murlsh/failproof.rb",
40
- "lib/murlsh/far_future_expires.rb",
41
- "lib/murlsh/head_from_get.rb",
42
- "lib/murlsh/image_list.rb",
43
- "lib/murlsh/img_store.rb",
44
- "lib/murlsh/install.rb",
45
- "lib/murlsh/json_body.rb",
46
- "lib/murlsh/json_server.rb",
47
- "lib/murlsh/jsonp_body.rb",
48
- "lib/murlsh/markup.rb",
49
- "lib/murlsh/must_revalidate.rb",
50
- "lib/murlsh/openlock.rb",
51
- "lib/murlsh/plugin.rb",
52
- "lib/murlsh/search_conditions.rb",
53
- "lib/murlsh/search_grammar.rb",
54
- "lib/murlsh/search_grammar.treetop",
55
- "lib/murlsh/time_ago.rb",
56
- "lib/murlsh/uri_ask.rb",
57
- "lib/murlsh/uri_domain.rb",
58
- "lib/murlsh/uri_get_path_query.rb",
59
- "lib/murlsh/url.rb",
60
- "lib/murlsh/url_body.rb",
61
- "lib/murlsh/url_result_set.rb",
62
- "lib/murlsh/url_server.rb",
63
- "lib/murlsh/yaml_ordered_hash.rb",
64
- "murlsh.gemspec",
65
- "plugins/add_post_50_update_feed.rb",
66
- "plugins/add_post_50_update_m3u.rb",
67
- "plugins/add_post_50_update_podcast.rb",
68
- "plugins/add_post_50_update_rss.rb",
69
- "plugins/add_post_60_notify_hubs.rb",
70
- "plugins/add_pre_30_unajax_twitter.rb",
71
- "plugins/add_pre_35_url_clean.rb",
72
- "plugins/add_pre_40_convert_mobile.rb",
73
- "plugins/add_pre_45_supplied_thumbnail.rb",
74
- "plugins/add_pre_50_lookup_content_type_title.rb",
75
- "plugins/add_pre_50_media_thumbnail.rb",
76
- "plugins/add_pre_50_open_graph_image.rb",
77
- "plugins/add_pre_60_github_title.rb",
78
- "plugins/add_pre_60_google_code_title.rb",
79
- "plugins/add_pre_60_imgur.rb",
80
- "plugins/add_pre_60_s3_image.rb",
81
- "plugins/add_pre_60_twitter.rb",
82
- "plugins/add_pre_65_html_thumb.rb",
83
- "plugins/add_pre_65_img_thumb.rb",
84
- "plugins/avatar_50_gravatar.rb",
85
- "plugins/url_display_add_45_audio.rb",
86
- "plugins/url_display_add_50_hostrec.rb",
87
- "plugins/url_display_add_55_content_type.rb",
88
- "plugins/url_display_add_60_via.rb",
89
- "plugins/url_display_add_65_time.rb",
90
- "public/css/jquery.jgrowl.css",
91
- "public/css/screen.css",
92
- "public/img/thumb/.gitignore",
93
- "public/js/jquery-1.5.min.js",
94
- "public/js/jquery.jgrowl_compressed.js",
95
- "public/js/js.js",
96
- "public/js/twitter-text-1.3.1.js",
97
- "spec/auth_spec.rb",
98
- "spec/dispatch_spec.rb",
99
- "spec/doc_spec.rb",
100
- "spec/img_store_spec.rb",
101
- "spec/markup_spec.rb",
102
- "spec/uri_ask_spec.rb",
103
- "spec/uri_domain_spec.rb",
104
- "spec/url_spec.rb",
105
- "spec/yaml_ordered_hash_spec.rb"
106
- ]
107
- s.homepage = %q{http://github.com/mmb/murlsh}
108
- s.require_paths = ["lib"]
109
- s.rubygems_version = %q{1.4.2}
110
- s.summary = %q{Host your bookmarks or maintain a link blog}
111
- s.test_files = [
112
- "spec/auth_spec.rb",
113
- "spec/dispatch_spec.rb",
114
- "spec/doc_spec.rb",
115
- "spec/img_store_spec.rb",
116
- "spec/markup_spec.rb",
117
- "spec/uri_ask_spec.rb",
118
- "spec/uri_domain_spec.rb",
119
- "spec/url_spec.rb",
120
- "spec/yaml_ordered_hash_spec.rb"
121
- ]
12
+ s.required_rubygems_version = '>= 1.3.6'
122
13
 
123
- if s.respond_to? :specification_version then
124
- s.specification_version = 3
14
+ %w{
15
+ activerecord >= 2.3.4
16
+ aws-s3 ~> 0.6
17
+ bcrypt-ruby >= 2.1.2
18
+ builder > 0
19
+ htmlentities >= 4.2.0
20
+ json >= 1.2.3
21
+ nokogiri ~> 1.0
22
+ plumnailer >= 0.1.3
23
+ postrank-uri ~> 1.0
24
+ public_suffix_service ~> 0.0
25
+ push-notify >= 0.1.0
26
+ rack >= 1.0.0
27
+ rack-cache >= 0.5.2
28
+ rack-rewrite >= 1.0.2
29
+ rack-throttle >= 0.3.0
30
+ rmagick >= 1.15.14
31
+ rmail ~> 1.0
32
+ sqlite3 ~> 1.3
33
+ tinyatom >= 0.3.4
34
+ treetop ~> 1.4
35
+ twitter >= 0.9.12
36
+ }.each_slice(3) { |g,o,v| s.add_dependency(g, "#{o} #{v}") }
125
37
 
126
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
127
- s.add_runtime_dependency(%q<activerecord>, [">= 2.3.4"])
128
- s.add_runtime_dependency(%q<bcrypt-ruby>, [">= 2.1.2"])
129
- s.add_runtime_dependency(%q<builder>, [">= 2.1.2"])
130
- s.add_runtime_dependency(%q<htmlentities>, [">= 4.2.0"])
131
- s.add_runtime_dependency(%q<json>, [">= 1.2.3"])
132
- s.add_runtime_dependency(%q<nokogiri>, ["~> 1.0"])
133
- s.add_runtime_dependency(%q<plumnailer>, [">= 0.1.0"])
134
- s.add_runtime_dependency(%q<postrank-uri>, ["~> 1.0"])
135
- s.add_runtime_dependency(%q<public_suffix_service>, ["~> 0.0"])
136
- s.add_runtime_dependency(%q<push-notify>, [">= 0.1.0"])
137
- s.add_runtime_dependency(%q<rack>, [">= 1.0.0"])
138
- s.add_runtime_dependency(%q<rack-cache>, [">= 0.5.2"])
139
- s.add_runtime_dependency(%q<rack-rewrite>, [">= 1.0.2"])
140
- s.add_runtime_dependency(%q<rack-throttle>, [">= 0.3.0"])
141
- s.add_runtime_dependency(%q<rmagick>, [">= 1.15.14"])
142
- s.add_runtime_dependency(%q<sqlite3>, ["~> 1.3"])
143
- s.add_runtime_dependency(%q<tinyatom>, [">= 0.3.3"])
144
- s.add_runtime_dependency(%q<treetop>, ["~> 1.4"])
145
- s.add_runtime_dependency(%q<twitter>, [">= 0.9.12"])
146
- s.add_development_dependency(%q<fakeweb>, ["~> 1.3"])
147
- s.add_development_dependency(%q<flog>, [">= 2.5.0"])
148
- s.add_development_dependency(%q<rack-test>, ["~> 0.5"])
149
- s.add_development_dependency(%q<rspec>, ["~> 2.0"])
150
- else
151
- s.add_dependency(%q<activerecord>, [">= 2.3.4"])
152
- s.add_dependency(%q<bcrypt-ruby>, [">= 2.1.2"])
153
- s.add_dependency(%q<builder>, [">= 2.1.2"])
154
- s.add_dependency(%q<htmlentities>, [">= 4.2.0"])
155
- s.add_dependency(%q<json>, [">= 1.2.3"])
156
- s.add_dependency(%q<nokogiri>, ["~> 1.0"])
157
- s.add_dependency(%q<plumnailer>, [">= 0.1.0"])
158
- s.add_dependency(%q<postrank-uri>, ["~> 1.0"])
159
- s.add_dependency(%q<public_suffix_service>, ["~> 0.0"])
160
- s.add_dependency(%q<push-notify>, [">= 0.1.0"])
161
- s.add_dependency(%q<rack>, [">= 1.0.0"])
162
- s.add_dependency(%q<rack-cache>, [">= 0.5.2"])
163
- s.add_dependency(%q<rack-rewrite>, [">= 1.0.2"])
164
- s.add_dependency(%q<rack-throttle>, [">= 0.3.0"])
165
- s.add_dependency(%q<rmagick>, [">= 1.15.14"])
166
- s.add_dependency(%q<sqlite3>, ["~> 1.3"])
167
- s.add_dependency(%q<tinyatom>, [">= 0.3.3"])
168
- s.add_dependency(%q<treetop>, ["~> 1.4"])
169
- s.add_dependency(%q<twitter>, [">= 0.9.12"])
170
- s.add_dependency(%q<fakeweb>, ["~> 1.3"])
171
- s.add_dependency(%q<flog>, [">= 2.5.0"])
172
- s.add_dependency(%q<rack-test>, ["~> 0.5"])
173
- s.add_dependency(%q<rspec>, ["~> 2.0"])
174
- end
175
- else
176
- s.add_dependency(%q<activerecord>, [">= 2.3.4"])
177
- s.add_dependency(%q<bcrypt-ruby>, [">= 2.1.2"])
178
- s.add_dependency(%q<builder>, [">= 2.1.2"])
179
- s.add_dependency(%q<htmlentities>, [">= 4.2.0"])
180
- s.add_dependency(%q<json>, [">= 1.2.3"])
181
- s.add_dependency(%q<nokogiri>, ["~> 1.0"])
182
- s.add_dependency(%q<plumnailer>, [">= 0.1.0"])
183
- s.add_dependency(%q<postrank-uri>, ["~> 1.0"])
184
- s.add_dependency(%q<public_suffix_service>, ["~> 0.0"])
185
- s.add_dependency(%q<push-notify>, [">= 0.1.0"])
186
- s.add_dependency(%q<rack>, [">= 1.0.0"])
187
- s.add_dependency(%q<rack-cache>, [">= 0.5.2"])
188
- s.add_dependency(%q<rack-rewrite>, [">= 1.0.2"])
189
- s.add_dependency(%q<rack-throttle>, [">= 0.3.0"])
190
- s.add_dependency(%q<rmagick>, [">= 1.15.14"])
191
- s.add_dependency(%q<sqlite3>, ["~> 1.3"])
192
- s.add_dependency(%q<tinyatom>, [">= 0.3.3"])
193
- s.add_dependency(%q<treetop>, ["~> 1.4"])
194
- s.add_dependency(%q<twitter>, [">= 0.9.12"])
195
- s.add_dependency(%q<fakeweb>, ["~> 1.3"])
196
- s.add_dependency(%q<flog>, [">= 2.5.0"])
197
- s.add_dependency(%q<rack-test>, ["~> 0.5"])
198
- s.add_dependency(%q<rspec>, ["~> 2.0"])
199
- end
200
- end
38
+ %w{
39
+ fakeweb ~> 1.3
40
+ flog >= 2.5.0
41
+ rack-test ~> 0.5
42
+ rspec ~> 2.0
43
+ }.each_slice(3) { |g,o,v| s.add_development_dependency(g, "#{o} #{v}") }
201
44
 
45
+ s.files = `git ls-files`.split("\n")
46
+ s.test_files = `git ls-files spec/*`.split("\n")
47
+ s.executables = %w{murlsh}
48
+ end
@@ -15,9 +15,10 @@ module Murlsh
15
15
  unless hubs.empty?
16
16
  require 'push-notify'
17
17
 
18
- feed_url = URI.join(config['root_url'], config['feed_file'])
18
+ feed_url = URI.join(config.fetch('root_url'), config.fetch('feed_file'))
19
19
  begin
20
- PushNotify::Content.new(feed_url).tell(*hubs.map { |h| h['publish_url'] })
20
+ PushNotify::Content.new(feed_url).tell(
21
+ *hubs.map { |h| h.fetch('publish_url') })
21
22
  rescue Exception
22
23
  end
23
24
  end
@@ -10,7 +10,7 @@ module Murlsh
10
10
  TwitterAjaxRe = %r{^(https?://twitter\.com/)#!/}i
11
11
 
12
12
  def self.run(url, config)
13
- url.url.sub!(TwitterAjaxRe, '\1')
13
+ url.url.sub! TwitterAjaxRe, '\1'
14
14
  url.via.sub!(TwitterAjaxRe, '\1') if url.via
15
15
  end
16
16
 
@@ -0,0 +1,23 @@
1
+ module Murlsh
2
+
3
+ # Shortcuts for user-specified thumbnail urls.
4
+ #
5
+ # These keys can be passed in as the 'thumbnail' parameter when adding a url
6
+ # and they will be converted to the corresponding url.
7
+ class AddPre40ThumbnailShortcuts < Plugin
8
+
9
+ @hook = 'add_pre'
10
+
11
+ Shortcuts = {
12
+ # 'trollin' => 'http://imagehost.com/trollface.jpg',
13
+ }
14
+
15
+ def self.run(url, config)
16
+ if Shortcuts.key?(url.thumbnail_url)
17
+ url.thumbnail_url = Shortcuts[url.thumbnail_url]
18
+ end
19
+ end
20
+
21
+ end
22
+
23
+ end