murlsh 1.2.1 → 1.3.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.
@@ -8,43 +8,58 @@ module Murlsh
8
8
 
9
9
  include HeadFromGet
10
10
 
11
- def initialize(config)
12
- @config = config
13
- end
11
+ def initialize(config); @config = config; end
14
12
 
15
13
  # Respond to a GET request. Return a page of urls based on the query
16
14
  # string parameters.
17
15
  def get(req)
18
- last_db_update = File::Stat.new(@config['db_file']).mtime
16
+ conditions = Murlsh::SearchConditions.new(req['q']).conditions
17
+ page = [req['p'].to_i, 1].max
18
+ per_page = req['pp'] ? req['pp'].to_i :
19
+ @config.fetch('num_posts_page', 25)
20
+
21
+ result_set = Murlsh::UrlResultSet.new(conditions, page, per_page)
19
22
 
20
23
  resp = Rack::Response.new
21
24
 
22
- resp['Cache-Control'] = 'must-revalidate, max-age=0'
23
25
  resp['Content-Type'] = 'text/html; charset=utf-8'
24
- resp['ETag'] = "W/\"#{last_db_update.to_i}#{req.params.sort}\""
25
- resp['Last-Modified'] = last_db_update.httpdate
26
+ resp.body = Murlsh::UrlBody.new(@config, req, result_set,
27
+ resp['Content-Type'])
26
28
 
27
- resp.body = Murlsh::UrlBody.new(@config, req, resp['Content-Type'])
29
+ resp['Cache-Control'] = 'must-revalidate, max-age=0'
30
+ resp['ETag'] = "\"#{resp.body.md5}\""
28
31
 
29
32
  resp
30
33
  end
31
34
 
32
35
  # Respond to a POST request. Add the new url and return json.
33
36
  def post(req)
34
- auth = req.params['auth']
37
+ auth = req['auth']
35
38
  if user = auth.empty? ? nil : Murlsh::Auth.new(
36
39
  @config.fetch('auth_file')).auth(auth)
37
40
 
38
41
  mu = Murlsh::Url.new do |u|
39
- u.time = if req.params['time']
40
- Time.at(req.params['time'].to_f).utc
42
+ u.url = req['url']
43
+ u.email = user[:email]
44
+ u.name = user[:name]
45
+
46
+ # optional parameters
47
+ unless req['thumbnail'].to_s.empty?
48
+ u.thumbnail_url = req['thumbnail']
49
+ end
50
+
51
+ u.time = if req['time']
52
+ Time.at(req['time'].to_f).utc
41
53
  else
42
54
  Time.now.utc
43
55
  end
44
- u.url = req.params['url']
45
- u.email = user[:email]
46
- u.name = user[:name]
47
- u.via = req.params['via'] unless req.params['via'].to_s.empty?
56
+
57
+ unless req['title'].to_s.empty?
58
+ u.title = req['title']
59
+ u.user_supplied_title = true
60
+ end
61
+
62
+ u.via = req['via'] unless req['via'].to_s.empty?
48
63
  end
49
64
 
50
65
  begin
data/lib/murlsh.rb CHANGED
@@ -1,8 +1,9 @@
1
1
  require 'murlsh/head_from_get'
2
+ require 'murlsh/search_conditions'
2
3
 
3
4
  require 'murlsh/auth'
5
+ require 'murlsh/build_md5'
4
6
  require 'murlsh/build_query'
5
- require 'murlsh/config_server'
6
7
  require 'murlsh/delicious_parse'
7
8
  require 'murlsh/dispatch'
8
9
  require 'murlsh/doc'
@@ -11,6 +12,9 @@ require 'murlsh/failproof'
11
12
  require 'murlsh/far_future_expires'
12
13
  require 'murlsh/image_list'
13
14
  require 'murlsh/img_store'
15
+ require 'murlsh/json_body'
16
+ require 'murlsh/json_server'
17
+ require 'murlsh/jsonp_body'
14
18
  require 'murlsh/markup'
15
19
  require 'murlsh/must_revalidate'
16
20
  require 'murlsh/openlock'
@@ -22,5 +26,6 @@ require 'murlsh/uri_domain'
22
26
  require 'murlsh/uri_get_path_query'
23
27
  require 'murlsh/url_body'
24
28
  require 'murlsh/url'
29
+ require 'murlsh/url_result_set'
25
30
  require 'murlsh/url_server'
26
31
  require 'murlsh/yaml_ordered_hash'
data/murlsh.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{murlsh}
8
- s.version = "1.2.1"
8
+ s.version = "1.3.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Matthew M. Boedicker"]
12
- s.date = %q{2010-12-23}
12
+ s.date = %q{2011-01-15}
13
13
  s.default_executable = %q{murlsh}
14
14
  s.description = %q{url sharing site framework with easy adding, title lookup, atom feed, thumbnails and embedding}
15
15
  s.email = %q{matthewm@boedicker.org}
@@ -28,8 +28,8 @@ Gem::Specification.new do |s|
28
28
  "config.yaml",
29
29
  "lib/murlsh.rb",
30
30
  "lib/murlsh/auth.rb",
31
+ "lib/murlsh/build_md5.rb",
31
32
  "lib/murlsh/build_query.rb",
32
- "lib/murlsh/config_server.rb",
33
33
  "lib/murlsh/delicious_parse.rb",
34
34
  "lib/murlsh/dispatch.rb",
35
35
  "lib/murlsh/doc.rb",
@@ -39,10 +39,14 @@ Gem::Specification.new do |s|
39
39
  "lib/murlsh/head_from_get.rb",
40
40
  "lib/murlsh/image_list.rb",
41
41
  "lib/murlsh/img_store.rb",
42
+ "lib/murlsh/json_body.rb",
43
+ "lib/murlsh/json_server.rb",
44
+ "lib/murlsh/jsonp_body.rb",
42
45
  "lib/murlsh/markup.rb",
43
46
  "lib/murlsh/must_revalidate.rb",
44
47
  "lib/murlsh/openlock.rb",
45
48
  "lib/murlsh/plugin.rb",
49
+ "lib/murlsh/search_conditions.rb",
46
50
  "lib/murlsh/sqlite3_adapter.rb",
47
51
  "lib/murlsh/time_ago.rb",
48
52
  "lib/murlsh/uri_ask.rb",
@@ -50,6 +54,7 @@ Gem::Specification.new do |s|
50
54
  "lib/murlsh/uri_get_path_query.rb",
51
55
  "lib/murlsh/url.rb",
52
56
  "lib/murlsh/url_body.rb",
57
+ "lib/murlsh/url_result_set.rb",
53
58
  "lib/murlsh/url_server.rb",
54
59
  "lib/murlsh/yaml_ordered_hash.rb",
55
60
  "murlsh.gemspec",
@@ -59,6 +64,7 @@ Gem::Specification.new do |s|
59
64
  "plugins/add_post_60_notify_hubs.rb",
60
65
  "plugins/add_pre_40_convert_mobile.rb",
61
66
  "plugins/add_pre_41_unajax_twitter.rb",
67
+ "plugins/add_pre_45_supplied_thumbnail.rb",
62
68
  "plugins/add_pre_50_lookup_content_type_title.rb",
63
69
  "plugins/add_pre_50_media_thumbnail.rb",
64
70
  "plugins/add_pre_50_open_graph_image.rb",
@@ -98,7 +104,7 @@ Gem::Specification.new do |s|
98
104
  ]
99
105
  s.homepage = %q{http://github.com/mmb/murlsh}
100
106
  s.require_paths = ["lib"]
101
- s.rubygems_version = %q{1.3.7}
107
+ s.rubygems_version = %q{1.4.2}
102
108
  s.summary = %q{url sharing site framework}
103
109
  s.test_files = [
104
110
  "spec/auth_spec.rb",
@@ -113,7 +119,6 @@ Gem::Specification.new do |s|
113
119
  ]
114
120
 
115
121
  if s.respond_to? :specification_version then
116
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
117
122
  s.specification_version = 3
118
123
 
119
124
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
@@ -138,7 +143,7 @@ Gem::Specification.new do |s|
138
143
  s.add_runtime_dependency(%q<vimeo>, [">= 1.2.2"])
139
144
  s.add_development_dependency(%q<flog>, [">= 2.5.0"])
140
145
  s.add_development_dependency(%q<rack-test>, ["~> 0.5"])
141
- s.add_development_dependency(%q<rspec>, ["~> 1.3"])
146
+ s.add_development_dependency(%q<rspec>, ["~> 2.0"])
142
147
  else
143
148
  s.add_dependency(%q<activerecord>, [">= 2.3.4"])
144
149
  s.add_dependency(%q<bcrypt-ruby>, [">= 2.1.2"])
@@ -161,7 +166,7 @@ Gem::Specification.new do |s|
161
166
  s.add_dependency(%q<vimeo>, [">= 1.2.2"])
162
167
  s.add_dependency(%q<flog>, [">= 2.5.0"])
163
168
  s.add_dependency(%q<rack-test>, ["~> 0.5"])
164
- s.add_dependency(%q<rspec>, ["~> 1.3"])
169
+ s.add_dependency(%q<rspec>, ["~> 2.0"])
165
170
  end
166
171
  else
167
172
  s.add_dependency(%q<activerecord>, [">= 2.3.4"])
@@ -185,7 +190,7 @@ Gem::Specification.new do |s|
185
190
  s.add_dependency(%q<vimeo>, [">= 1.2.2"])
186
191
  s.add_dependency(%q<flog>, [">= 2.5.0"])
187
192
  s.add_dependency(%q<rack-test>, ["~> 0.5"])
188
- s.add_dependency(%q<rspec>, ["~> 1.3"])
193
+ s.add_dependency(%q<rspec>, ["~> 2.0"])
189
194
  end
190
195
  end
191
196
 
@@ -0,0 +1,32 @@
1
+ require 'cgi'
2
+
3
+ require 'murlsh'
4
+
5
+ module Murlsh
6
+
7
+ # If the user has supplied a thumbnail url, adjust size and store it locally.
8
+ class AddPre45SuppliedThumbnail < Plugin
9
+
10
+ @hook = 'add_pre'
11
+
12
+ StorageDir = File.join(File.dirname(__FILE__), '..', 'public', 'img',
13
+ 'thumb')
14
+
15
+ def self.run(url, config)
16
+ if url.thumbnail_url
17
+ Murlsh::failproof do
18
+ thumb_storage = Murlsh::ImgStore.new(StorageDir,
19
+ :user_agent => config['user_agent'])
20
+
21
+ stored_filename = thumb_storage.store_url(url.thumbnail_url) do |i|
22
+ max_side = config.fetch('thumbnail_max_side', 90)
23
+ i.extend(Murlsh::ImageList).resize_down!(max_side)
24
+ end
25
+ url.thumbnail_url = "img/thumb/#{CGI.escape(stored_filename)}"
26
+ end
27
+ end
28
+ end
29
+
30
+ end
31
+
32
+ end
@@ -19,7 +19,10 @@ module Murlsh
19
19
  end
20
20
 
21
21
  url.content_type = url.ask.content_type(:headers => headers)
22
- url.title = url.ask.title(:headers => headers)
22
+
23
+ unless url.user_supplied_title?
24
+ url.title = url.ask.title(:headers => headers)
25
+ end
23
26
  end
24
27
 
25
28
  end
@@ -1,4 +1,5 @@
1
1
  require 'cgi'
2
+ require 'uri'
2
3
 
3
4
  require 'murlsh'
4
5
 
@@ -15,12 +16,17 @@ module Murlsh
15
16
  def self.run(url, config)
16
17
  if not url.thumbnail_url and url.ask.doc
17
18
  url.ask.doc.xpath_search("//meta[@property='og:image']") do |node|
18
- if node and node['content'] and not node['content'].empty?
19
+ if node and not node['content'].to_s.empty?
20
+ og_image_url = node['content']
19
21
  Murlsh::failproof do
22
+ # youtube leaves out scheme: for some reason
23
+ if og_image_url[%r{^//}]
24
+ og_image_url = "#{URI(url.url).scheme}:#{og_image_url}"
25
+ end
20
26
  thumb_storage = Murlsh::ImgStore.new(StorageDir,
21
27
  :user_agent => config['user_agent'])
22
28
 
23
- stored_filename = thumb_storage.store_url(node['content']) do |i|
29
+ stored_filename = thumb_storage.store_url(og_image_url) do |i|
24
30
  max_side = config.fetch('thumbnail_max_side', 90)
25
31
  i.extend(Murlsh::ImageList).resize_down!(max_side)
26
32
  end
@@ -12,7 +12,7 @@ module Murlsh
12
12
  FlickrRe = %r{^http://(?:www\.)?flickr\.com/photos/[@\w\-]+?/([\d]+)}i
13
13
 
14
14
  def self.run(url, config)
15
- if config['flickr_api_key'] and not config['flickr_api_key'].empty?
15
+ unless url.user_supplied_title? or config['flickr_api_key'].to_s.empty?
16
16
  if photo_id = url.url[FlickrRe, 1]
17
17
  FlickRaw.api_key = config['flickr_api_key']
18
18
  info = flickr.photos.getInfo(:photo_id => photo_id)
@@ -13,7 +13,7 @@ module Murlsh
13
13
  GithubRe = %r{^https?://github\.com/\w+/[\w.-]+$}i
14
14
 
15
15
  def self.run(url, config)
16
- if url.url[GithubRe]
16
+ if not url.user_supplied_title? and url.url.to_s[GithubRe]
17
17
  unless url.ask.description.empty?
18
18
  url.title << " - #{url.ask.description}"
19
19
  end
@@ -13,7 +13,8 @@ module Murlsh
13
13
  GoogleCodeRe = %r{^http://code\.google\.com/p/[\w-]+/$}i
14
14
 
15
15
  def self.run(url, config)
16
- if url.url[GoogleCodeRe] and url.ask.doc
16
+ if (not url.user_supplied_title? and url.url.to_s[GoogleCodeRe] and
17
+ url.ask.doc)
17
18
  url.ask.doc.xpath_search("//a[@id='project_summary_link']") do |node|
18
19
  summary = node ? node.inner_html : nil
19
20
  url.title << " - #{url.ask.decode(summary)}" unless not summary or
@@ -10,7 +10,7 @@ module Murlsh
10
10
  ImgurRe = %r{^http://(?:i\.)?imgur\.com/([a-z\d]+)(\.(?:jpe?g|gif|png))$}i
11
11
 
12
12
  def self.run(url, config)
13
- if match = ImgurRe.match(url.url)
13
+ if not url.user_supplied_title? and match = ImgurRe.match(url.url)
14
14
  url.title = "imgur/#{match[1]}s#{match[2]}"
15
15
  end
16
16
  end
@@ -26,7 +26,7 @@ module Murlsh
26
26
  end
27
27
 
28
28
  url.thumbnail_url = "img/thumb/#{CGI.escape(stored_filename)}"
29
- url.title = match[2]
29
+ url.title = match[2] unless url.user_supplied_title?
30
30
  end
31
31
  end
32
32
 
@@ -12,7 +12,7 @@ module Murlsh
12
12
  TwitterRe = %r{^https?://twitter\.com/\w+/status(?:es)?/(\d+)$}i
13
13
 
14
14
  def self.run(url, config)
15
- if tweet_id = url.url[TwitterRe, 1]
15
+ if not url.user_supplied_title? and tweet_id = url.url[TwitterRe, 1]
16
16
  tweet = Twitter.status(tweet_id)
17
17
 
18
18
  url.title = "@#{tweet.user.screen_name}: #{tweet.text}"
@@ -19,7 +19,9 @@ module Murlsh
19
19
  if id = url.url[VimeoRe, 1]
20
20
  info = Vimeo::Simple::Video.info(id)[0]
21
21
 
22
- url.title = "#{info['title']} by #{info['user_name']}"
22
+ unless url.user_supplied_title?
23
+ url.title = "#{info['title']} by #{info['user_name']}"
24
+ end
23
25
 
24
26
  thumb_storage = Murlsh::ImgStore.new(StorageDir,
25
27
  :user_agent => config['user_agent'])
@@ -23,7 +23,7 @@ module Murlsh
23
23
  chooser = Plumnailer::Chooser.new
24
24
  choice = chooser.choose(url.url)
25
25
 
26
- if choice
26
+ if choice and choice.columns > 31 and choice.rows > 31
27
27
  max_side = config.fetch('thumbnail_max_side', 90)
28
28
  choice.extend(Murlsh::ImageList).resize_down!(max_side)
29
29
 
@@ -103,8 +103,6 @@ div.jGrowl div.jGrowl-closer {
103
103
  @media screen and (max-device-width : 480px) {
104
104
 
105
105
  body {
106
- margin : 0;
107
- padding : 0;
108
106
  font-size : 1.25em;
109
107
  line-height : normal;
110
108
  }
@@ -112,7 +110,7 @@ div.jGrowl div.jGrowl-closer {
112
110
  #urls {
113
111
  margin : 0;
114
112
  padding-left : 0;
115
- width : 290px;
113
+ width : 282px;
116
114
  }
117
115
 
118
116
  #urls>li {
data/public/js/js.js CHANGED
@@ -1,8 +1,7 @@
1
1
  /*global $, document, navigator, window, twttr*/
2
2
 
3
- "use strict";
4
-
5
- var Murlsh = function (config, $, navigator, window, twtter) {
3
+ var Murlsh = function ($, navigator, window, twtter) {
4
+ "use strict";
6
5
 
7
6
  var my = {},
8
7
  hrefRes = {
@@ -37,7 +36,7 @@ var Murlsh = function (config, $, navigator, window, twtter) {
37
36
  }
38
37
 
39
38
  function makeIframe(src) {
40
- return $('<iframe />').attr({
39
+ return $('<iframe />', {
41
40
  src: src,
42
41
  width: 640,
43
42
  height: 385,
@@ -111,7 +110,7 @@ var Murlsh = function (config, $, navigator, window, twtter) {
111
110
  comment,
112
111
  commentElement,
113
112
  i,
114
- ul = $('<ul />').addClass('comments').appendTo(link.parent());
113
+ ul = $('<ul />', { className : 'comments' }).appendTo(link.parent());
115
114
 
116
115
  for (i = 0; i < comments.length; i += 1) {
117
116
  comment = comments[i];
@@ -119,7 +118,7 @@ var Murlsh = function (config, $, navigator, window, twtter) {
119
118
  if (comment.authorAvatar.length > 0) {
120
119
  avatar = img(comment.authorAvatar).appendTo(commentElement);
121
120
  if (comment.authorUrl.length > 0) {
122
- avatar.wrapAll($('<a />').attr('href', comment.authorUrl));
121
+ avatar.wrapAll($('<a />', { href : comment.authorUrl }));
123
122
  }
124
123
  commentElement.append(' ');
125
124
  }
@@ -161,7 +160,7 @@ var Murlsh = function (config, $, navigator, window, twtter) {
161
160
  text : tweetMatch[1]
162
161
  });
163
162
 
164
- formattedTweet = $('<span />').addClass('tweet').append(
163
+ formattedTweet = $('<span />', { className : 'tweet' }).append(
165
164
  tweetLink).append(': ').append(
166
165
  twttr.txt.autoLink(tweetMatch[2]));
167
166
 
@@ -184,11 +183,14 @@ var Murlsh = function (config, $, navigator, window, twtter) {
184
183
  }));
185
184
 
186
185
  if (d.name) {
187
- li.prepend($('<div />', { text : d.name }).addClass('name'));
186
+ li.prepend($('<div />', {
187
+ className : 'name',
188
+ text : d.name
189
+ }));
188
190
  }
189
191
 
190
192
  if (d.email) {
191
- li.prepend($('<div />').addClass('icon').append(
193
+ li.prepend($('<div />', { className : 'icon' }).append(
192
194
  img('http://www.gravatar.com/avatar/' + d.email + '?s=' +
193
195
  iconSize, d.name).attr({
194
196
  width : iconSize,
@@ -201,9 +203,9 @@ var Murlsh = function (config, $, navigator, window, twtter) {
201
203
 
202
204
  my.iphoneInit = function () {
203
205
  window.onorientationchange = function () {
204
- var width = 450;
206
+ var width = 442;
205
207
  if (window.orientation === 0 || window.orientation === 180) {
206
- width = 290;
208
+ width = 282;
207
209
  }
208
210
  $('#urls').width(width);
209
211
  };
@@ -223,46 +225,44 @@ var Murlsh = function (config, $, navigator, window, twtter) {
223
225
  return my;
224
226
  };
225
227
 
226
- $(document).ready(function () {
227
- $.getJSON('config', function (config) {
228
- var murlsh = new Murlsh(config, $, navigator, window, twttr),
229
- urls;
228
+ $(function () {
229
+ "use strict";
230
+ var murlsh = new Murlsh($, navigator, window, twttr), urls;
230
231
 
231
- if (murlsh.isIphone()) {
232
- murlsh.iphoneInit();
233
- }
232
+ if (murlsh.isIphone()) {
233
+ murlsh.iphoneInit();
234
+ }
234
235
 
235
- $('#submit').click(function () {
236
- $.post('url', {
237
- url : $('#url').val(),
238
- via : $('#via').val(),
239
- auth : $('#auth').val()
240
- }, function (d) {
241
- $.each(d, function (i, v) {
242
- var li = murlsh.formatLi(v);
243
- $('#urls > li:first').after(li);
244
- $(li).children('a:first').each(murlsh.addExtra);
245
- });
246
- $('#url').val('');
247
- $('#via').val('');
248
- }, 'json');
249
- });
236
+ $('#submit').click(function () {
237
+ $.post('url', {
238
+ url : $('#url').val(),
239
+ via : $('#via').val(),
240
+ auth : $('#auth').val()
241
+ }, function (d) {
242
+ $.each(d, function (i, v) {
243
+ var li = murlsh.formatLi(v);
244
+ $('#urls > li:first').after(li);
245
+ $(li).children('a:first').each(murlsh.addExtra);
246
+ });
247
+ $('#url').val('');
248
+ $('#via').val('');
249
+ }, 'json');
250
+ });
250
251
 
251
- urls = $('a.m');
252
+ urls = $('a.m');
252
253
 
253
- urls.each(murlsh.addExtra);
254
+ urls.each(murlsh.addExtra);
254
255
 
255
- /*
256
- // experimental comment support, to enable uncomment and edit
257
- // comments.json
258
- $.getJSON('/js/comments.json', function (data) {
259
- urls.each(function () {
260
- var href = $(this).attr('href');
261
- if (href in data) {
262
- murlsh.addComments($(this), data[href]);
263
- }
264
- });
256
+ /*
257
+ // experimental comment support, to enable uncomment and edit
258
+ // comments.json
259
+ $.getJSON('/js/comments.json', function (data) {
260
+ urls.each(function () {
261
+ var href = $(this).attr('href');
262
+ if (href in data) {
263
+ murlsh.addComments($(this), data[href]);
264
+ }
265
265
  });
266
- */
267
266
  });
267
+ */
268
268
  });
data/spec/uri_ask_spec.rb CHANGED
@@ -2,8 +2,6 @@ require 'uri'
2
2
 
3
3
  require 'murlsh'
4
4
 
5
- Dir['plugins/*.rb'].each { |p| require "./#{p}" }
6
-
7
5
  describe Murlsh::UriAsk do
8
6
 
9
7
  def asker(s)
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: 29
5
- prerelease: false
4
+ hash: 27
5
+ prerelease:
6
6
  segments:
7
7
  - 1
8
- - 2
9
- - 1
10
- version: 1.2.1
8
+ - 3
9
+ - 0
10
+ version: 1.3.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-12-23 00:00:00 -05:00
18
+ date: 2011-01-15 00:00:00 -05:00
19
19
  default_executable: murlsh
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -359,11 +359,11 @@ dependencies:
359
359
  requirements:
360
360
  - - ~>
361
361
  - !ruby/object:Gem::Version
362
- hash: 9
362
+ hash: 3
363
363
  segments:
364
- - 1
365
- - 3
366
- version: "1.3"
364
+ - 2
365
+ - 0
366
+ version: "2.0"
367
367
  type: :development
368
368
  version_requirements: *id022
369
369
  description: url sharing site framework with easy adding, title lookup, atom feed, thumbnails and embedding
@@ -385,8 +385,8 @@ files:
385
385
  - config.yaml
386
386
  - lib/murlsh.rb
387
387
  - lib/murlsh/auth.rb
388
+ - lib/murlsh/build_md5.rb
388
389
  - lib/murlsh/build_query.rb
389
- - lib/murlsh/config_server.rb
390
390
  - lib/murlsh/delicious_parse.rb
391
391
  - lib/murlsh/dispatch.rb
392
392
  - lib/murlsh/doc.rb
@@ -396,10 +396,14 @@ files:
396
396
  - lib/murlsh/head_from_get.rb
397
397
  - lib/murlsh/image_list.rb
398
398
  - lib/murlsh/img_store.rb
399
+ - lib/murlsh/json_body.rb
400
+ - lib/murlsh/json_server.rb
401
+ - lib/murlsh/jsonp_body.rb
399
402
  - lib/murlsh/markup.rb
400
403
  - lib/murlsh/must_revalidate.rb
401
404
  - lib/murlsh/openlock.rb
402
405
  - lib/murlsh/plugin.rb
406
+ - lib/murlsh/search_conditions.rb
403
407
  - lib/murlsh/sqlite3_adapter.rb
404
408
  - lib/murlsh/time_ago.rb
405
409
  - lib/murlsh/uri_ask.rb
@@ -407,6 +411,7 @@ files:
407
411
  - lib/murlsh/uri_get_path_query.rb
408
412
  - lib/murlsh/url.rb
409
413
  - lib/murlsh/url_body.rb
414
+ - lib/murlsh/url_result_set.rb
410
415
  - lib/murlsh/url_server.rb
411
416
  - lib/murlsh/yaml_ordered_hash.rb
412
417
  - murlsh.gemspec
@@ -416,6 +421,7 @@ files:
416
421
  - plugins/add_post_60_notify_hubs.rb
417
422
  - plugins/add_pre_40_convert_mobile.rb
418
423
  - plugins/add_pre_41_unajax_twitter.rb
424
+ - plugins/add_pre_45_supplied_thumbnail.rb
419
425
  - plugins/add_pre_50_lookup_content_type_title.rb
420
426
  - plugins/add_pre_50_media_thumbnail.rb
421
427
  - plugins/add_pre_50_open_graph_image.rb
@@ -482,7 +488,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
482
488
  requirements: []
483
489
 
484
490
  rubyforge_project:
485
- rubygems_version: 1.3.7
491
+ rubygems_version: 1.4.2
486
492
  signing_key:
487
493
  specification_version: 3
488
494
  summary: url sharing site framework
@@ -1,32 +0,0 @@
1
- require 'digest/sha1'
2
-
3
- require 'json'
4
- require 'rack'
5
-
6
- module Murlsh
7
-
8
- # Serve a JSON subset of the configuration.
9
- #
10
- # Will include all config keys contained in the config key named config_js.
11
- class ConfigServer
12
-
13
- include HeadFromGet
14
-
15
- def initialize(config)
16
- @config_json =
17
- config.reject { |k,v| !config.fetch('config_js', []).
18
- include?(k) }.to_json
19
-
20
- @headers = {
21
- 'Content-Type' => 'application/json',
22
- 'ETag' => "\"#{Digest::SHA1.hexdigest(@config_json)}\"",
23
- 'Last-Modified' => Time.now.httpdate
24
- }
25
- end
26
-
27
- # Serve a JSON subset of the configuration.
28
- def get(req); Rack::Response.new @config_json, 200, @headers; end
29
-
30
- end
31
-
32
- end