murlsh 1.4.1 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
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