tdiary 4.1.1 → 4.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -1
  3. data/ChangeLog +42 -0
  4. data/Gemfile +2 -11
  5. data/Gemfile.lock +64 -61
  6. data/README.md +4 -2
  7. data/doc/HOWTO-authenticate-in-rack.md +96 -8
  8. data/doc/HOWTO-testing-tDiary.md +1 -1
  9. data/doc/INSTALL-paas.md +19 -54
  10. data/doc/README.en.md +1 -1
  11. data/doc/README.md +1 -1
  12. data/js/comment_ajax.js +1 -1
  13. data/lib/tdiary/application/configuration.rb +5 -9
  14. data/lib/tdiary/application.rb +59 -36
  15. data/lib/tdiary/cli.rb +9 -3
  16. data/lib/tdiary/core_ext.rb +1 -1
  17. data/lib/tdiary/diary_container.rb +55 -0
  18. data/lib/tdiary/environment.rb +3 -0
  19. data/lib/tdiary/plugin/00default.rb +4 -3
  20. data/lib/tdiary/plugin/05referer.rb +9 -7
  21. data/lib/tdiary/plugin.rb +13 -2
  22. data/lib/tdiary/rack/auth/basic.rb +1 -1
  23. data/lib/tdiary/rack/auth/omniauth/authorization.rb +64 -0
  24. data/lib/tdiary/rack/auth/omniauth.rb +78 -46
  25. data/lib/tdiary/rack/auth.rb +20 -0
  26. data/lib/tdiary/rack/session.rb +35 -0
  27. data/lib/tdiary/rack.rb +2 -5
  28. data/lib/tdiary/style.rb +2 -1
  29. data/lib/tdiary/tasks/assets.rake +1 -1
  30. data/lib/tdiary/tasks/release.rake +18 -7
  31. data/lib/tdiary/version.rb +1 -1
  32. data/lib/tdiary.rb +1 -0
  33. data/misc/paas/heroku/Gemfile.local +8 -0
  34. data/misc/paas/heroku/app.json +19 -0
  35. data/misc/paas/heroku/config.ru +6 -0
  36. data/misc/paas/heroku/tasks/mongodb.rake +12 -0
  37. data/misc/paas/heroku/tdiary.conf +14 -14
  38. data/misc/plugin/amazon.rb +9 -1
  39. data/misc/plugin/category.rb +1 -19
  40. data/misc/plugin/category_autocomplete.rb +2 -2
  41. data/misc/plugin/comment_ajax.rb +2 -0
  42. data/misc/plugin/comment_emoji_autocomplete.rb +2 -2
  43. data/misc/plugin/comment_mail-smtp.rb +23 -8
  44. data/misc/plugin/makerss.rb +5 -1
  45. data/misc/plugin/recent_comment3.rb +1 -5
  46. data/misc/plugin/recent_list.rb +1 -5
  47. data/misc/plugin/theme_online.rb +8 -2
  48. data/spec/acceptance/save_conf_plugin_spec.rb +2 -2
  49. data/spec/core/application_spec.rb +65 -0
  50. data/spec/core/diary_container_spec.rb +71 -0
  51. data/spec/core/plugin_spec.rb +13 -0
  52. data/spec/fixtures/tdiary.conf.gem +2 -2
  53. data/spec/fixtures/tdiary.conf.rack +2 -2
  54. data/spec/fixtures/tdiary.conf.secure +2 -2
  55. data/spec/fixtures/tdiary.conf.webrick +2 -2
  56. data/spec/spec_helper.rb +5 -4
  57. metadata +15 -6
  58. data/lib/tdiary/application/extensions/omniauth.rb +0 -22
  59. data/misc/paas/heroku/Gemfile +0 -20
  60. data/misc/paas/heroku/Gemfile.lock +0 -74
@@ -34,24 +34,35 @@ def make_tarball( repo, version = nil )
34
34
  sh "chmod +x index.rb index.fcgi update.rb update.fcgi"
35
35
  sh 'rake doc'
36
36
  Bundler.with_clean_env do
37
- sh "bundle --path .bundle --without coffee:server:development:test"
37
+ sh "bundle --path .bundle --without coffee:development:test"
38
38
  end
39
+
40
+ # reduce filesize
41
+ Dir.glob('.bundle/ruby/*/cache/*').each do |file|
42
+ # cached gem file
43
+ rm_rf file
44
+ end
45
+ Dir.glob('.bundle/ruby/*/gems/*/*/').each do |dir|
46
+ # spec, fixtures etc..
47
+ rm_rf dir unless File.basename(dir).match(/lib|data/)
48
+ end
49
+
39
50
  Dir.chdir '.bundle/ruby' do
40
51
  v = `ls`.chomp
41
52
  case v
53
+ when '2.2.0'
54
+ FileUtils.cp_r '2.2.0', '2.0.0'
55
+ FileUtils.cp_r '2.2.0', '2.1.0'
42
56
  when '2.1.0'
43
- FileUtils.cp_r '2.1.0', '1.9.1'
44
57
  FileUtils.cp_r '2.1.0', '2.0.0'
58
+ FileUtils.cp_r '2.1.0', '2.2.0'
45
59
  when '2.0.0'
46
- FileUtils.cp_r '2.0.0', '1.9.1'
47
60
  FileUtils.cp_r '2.0.0', '2.1.0'
48
- when '1.9.1'
49
- FileUtils.cp_r '1.9.1', '2.0.0'
50
- FileUtils.cp_r '1.9.1', '2.1.0'
61
+ FileUtils.cp_r '2.0.0', '2.2.0'
51
62
  else
63
+ FileUtils.cp_r v, '2.2.0'
52
64
  FileUtils.cp_r v, '2.1.0'
53
65
  FileUtils.cp_r v, '2.0.0'
54
- FileUtils.cp_r v, '1.9.1'
55
66
  FileUtils.rm_rf v
56
67
  end
57
68
  end
@@ -1,3 +1,3 @@
1
1
  module TDiary
2
- VERSION = '4.1.1'
2
+ VERSION = '4.1.2'
3
3
  end
data/lib/tdiary.rb CHANGED
@@ -50,6 +50,7 @@ module TDiary
50
50
  # Diary model class
51
51
  autoload :Style, 'tdiary/style'
52
52
  autoload :Comment, 'tdiary/comment'
53
+ autoload :DiaryContainer, 'tdiary/diary_container'
53
54
 
54
55
  # Routing and Dispatch
55
56
  autoload :Dispatcher, 'tdiary/dispatcher'
@@ -0,0 +1,8 @@
1
+ ruby '2.2.0'
2
+ gem 'thin', require: false
3
+ gem 'tdiary-io-mongodb', github: 'tdiary/tdiary-io-mongodb'
4
+ gem 'tdiary-contrib', github: 'tdiary/tdiary-contrib'
5
+ gem 'omniauth'
6
+ gem 'omniauth-twitter'
7
+ gem 'dalli'
8
+ gem 'memcachier'
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "tDiary",
3
+ "website": "http://www.tdiary.org/",
4
+ "repository": "https://github.com/tdiary/tdiary-core/tree/heroku",
5
+ "addons": [
6
+ "sendgrid",
7
+ "memcachier",
8
+ "mongolab"
9
+ ],
10
+ "scripts": {
11
+ "postdeploy": "bundle exec rake mongodb:index"
12
+ },
13
+ "env": {
14
+ "TWITTER_KEY": "",
15
+ "TWITTER_SECRET": "",
16
+ "TWITTER_NAME": "",
17
+ "RACK_ENV": "production"
18
+ }
19
+ }
@@ -0,0 +1,6 @@
1
+ $:.unshift( File.join(File::dirname( __FILE__ ), 'lib' ).untaint )
2
+ require 'tdiary/application'
3
+
4
+ use ::Rack::Reloader unless ENV['RACK_ENV'] == 'production'
5
+ base_dir = '/'
6
+ run TDiary::Application.new( base_dir )
@@ -0,0 +1,12 @@
1
+ namespace :mongodb do
2
+ desc "make index into mongoDB"
3
+ task :index do
4
+ require 'erb'
5
+ require 'tdiary'
6
+ conf = TDiary::Config.new
7
+ TDiary::DiaryContainer.new(conf, '2015', '01')
8
+ TDiary::IO::MongoDB::Diary.create_indexes
9
+ TDiary::IO::MongoDB::Comment.create_indexes
10
+ TDiary::IO::MongoDB::Plugin.create_indexes
11
+ end
12
+ end
@@ -1,9 +1,13 @@
1
+ #
2
+ # tdiary.conf for Heroku
3
+ #
1
4
  require 'tempfile'
2
5
  @data_path = Dir.tmpdir
3
6
 
4
7
  @style = 'Wiki'
5
8
 
6
- @io_class = TDiary::IO::Rdb
9
+ @io_class = TDiary::IO::MongoDB
10
+ @database_url = ENV['MONGOLAB_URI']
7
11
 
8
12
  @index = './'
9
13
  @update = 'update.rb'
@@ -21,21 +25,17 @@ require 'tempfile'
21
25
 
22
26
  @options['apply_plugin'] = true
23
27
  @options['sp.path'] = ['misc/plugin']
24
- @options['style.path'] = ['misc/style/gfm', 'tdiary/style']
25
- @options['sp.selected'] =
26
- "amazon.rb
27
- append-css.rb
28
- calendar2.rb
29
- dropdown_calendar.rb
30
- footnote.rb
31
- highlight.rb
32
- image.rb
33
- jdate.rb
34
- kw.rb
35
- my-ex.rb
36
- "
28
+ @options['sp.selected'] = %w(amazon.rb append-css.rb calendar2.rb comment_ajax.rb comment_mail-smtp.rb dropdown_calendar.rb footnote.rb highlight.rb html_anchor.rb jdate.rb makerss.rb kw.rb my-ex.rb theme_online.rb ).join("\n")
37
29
 
38
30
  @options['dropdown_calendar.label'] = ''
31
+
32
+ @options['comment_mail.smtp_host'] = 'smtp.sendgrid.net'
33
+ @options['comment_mail.smtp_port'] = 587
34
+ @options['comment_mail.user_name'] = ENV['SENDGRID_USERNAME']
35
+ @options['comment_mail.password'] = ENV['SENDGRID_PASSWORD']
36
+ @options['comment_mail.authentication'] = :plain
37
+ @options['comment_mail.starttls'] = true
38
+
39
39
  @options['spamfilter.bad_comment_patts'] = "(href=|casino|gambling|betting|fastsearch\\.eu\\.com|ganzao|poker|holdem|hold.em|roulette|drug|tramadol|viagra|fioricet|oxycontin|biaxin|aldara|business cards|home depot|slot.?machine|insurance|getblog2|video-game|Good site|internet-all\\.com|deai|tdfms|comu2|omaha)\r\n"
40
40
  @options['spamfilter.bad_ip_addrs'] = ""
41
41
  @options['spamfilter.bad_mail_patts'] = "(mu@alloha\\.info|mumu2004@mail\\.com|zhongleibo|dfd@12\\.com|anonimous|aol\\.|yahoo\\.|google\\.|hotmail\\.|msn\\.|leroy\\.|ablare\\.|gmx\\.|lorazepam|\\.co$)"
@@ -46,6 +46,8 @@ if @conf['amazon.bitly'] and @conf['bitly.login'] and @conf['bitly.key'] then
46
46
  add_js_setting( '$tDiary.plugin.bitly.apiKey', "'#{@conf['bitly.key']}'" )
47
47
  end
48
48
 
49
+ class AmazonRedirectError < StandardError; end
50
+
49
51
  def amazon_fetch( url, limit = 10 )
50
52
  raise ArgumentError, 'HTTP redirect too deep' if limit == 0
51
53
 
@@ -57,6 +59,8 @@ def amazon_fetch( url, limit = 10 )
57
59
  res.body
58
60
  when Net::HTTPRedirection
59
61
  amazon_fetch( res['location'].untaint, limit - 1 )
62
+ when Net::HTTPForbidden, Net::HTTPServiceUnavailable
63
+ raise AmazonRedirectError.new( limit.to_s )
60
64
  else
61
65
  raise ArgumentError, res.error!
62
66
  end
@@ -78,10 +82,14 @@ def amazon_call_ecs( asin, id_type, country )
78
82
  url << "&ResponseGroup=Medium"
79
83
  url << "&Version=#{@amazon_require_version}"
80
84
 
85
+ limit = 10
81
86
  begin
82
- Timeout.timeout( 10 ) do
87
+ Timeout.timeout( limit ) do
83
88
  amazon_fetch( url )
84
89
  end
90
+ rescue AmazonRedirectError
91
+ limit = $!.message.to_i
92
+ retry
85
93
  rescue ArgumentError
86
94
  end
87
95
  end
@@ -208,20 +208,6 @@ end
208
208
 
209
209
  module Category
210
210
 
211
- #
212
- # CGI (mock-up CGI class for Cache::recreate)
213
- #
214
- class CGI
215
- attr_reader :params
216
- def initialize
217
- @params = Hash.new([])
218
- end
219
- def referer; nil; end
220
- def user_agent; nil; end
221
- def mobile_agent?; nil; end
222
- def request_method; 'GET'; end
223
- end
224
-
225
211
  #
226
212
  # Info
227
213
  #
@@ -487,17 +473,13 @@ class Cache
487
473
  # (re)create category cache
488
474
  #
489
475
  def recreate(years)
490
- cgi = Category::CGI::new
491
-
492
476
  list = []
493
477
  @plugin.__send__(:transaction, 'category') do |db|
494
478
  db.keys.each {|key|db.delete(key)}
495
479
 
496
480
  years.each do |y, ms|
497
481
  ms.each do |m|
498
- ym = "#{y}#{m}"
499
- cgi.params['date'] = [ym]
500
- m = TDiaryMonthWithoutFilter.new(cgi, '', @conf)
482
+ m = DiaryContainer::find_by_month(@conf, "#{y}#{m}")
501
483
  m.diaries.each do |ymd, diary|
502
484
  next if !diary.visible? or !diary.categorizable?
503
485
  categorized = categorize_diary(diary)
@@ -9,10 +9,10 @@
9
9
 
10
10
  if !@cgi.mobile_agent? && /\A(?:form|preview|append|edit|update)\z/ =~ @mode
11
11
  add_header_proc do
12
- %Q|<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css"/>|
12
+ %Q|<link rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css"/>|
13
13
  end
14
14
 
15
- enable_js('http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js')
15
+ enable_js('//ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js')
16
16
  enable_js('caretposition.js')
17
17
  enable_js('category_autocomplete.js')
18
18
 
@@ -1,5 +1,7 @@
1
1
  if @mode == 'day' and not bot? then
2
2
  enable_js('comment_ajax.js')
3
+ add_js_setting('$tDiary.plugin.comment_ajax')
4
+ add_js_setting('$tDiary.plugin.comment_ajax.theme', %Q["#{theme_url}"])
3
5
  end
4
6
 
5
7
  # Local Variables:
@@ -9,10 +9,10 @@
9
9
 
10
10
  if !@cgi.mobile_agent? && /\A(?:day)\z/ =~ @mode
11
11
  add_header_proc do
12
- %Q|<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css"/>|
12
+ %Q|<link rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css"/>|
13
13
  end
14
14
 
15
- enable_js('http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js')
15
+ enable_js('//ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js')
16
16
  enable_js('caretposition.js')
17
17
  enable_js('comment_emoji_autocomplete.js')
18
18
 
@@ -2,7 +2,7 @@
2
2
  # comment_mail-smtp.rb
3
3
  #
4
4
  # SMTPプロトコルを使ってツッコミをメールで知らせる
5
- # 入れるだけで動作する
5
+ # 同一ホスト内にSMTPサーバがある場合は有効にするだけで動作する
6
6
  #
7
7
  # Options:
8
8
  # 設定画面から指定できるもの(ツッコミメール系プラグイン共通):
@@ -25,18 +25,33 @@
25
25
  # @options['comment_mail.smtp_port']
26
26
  # それぞれ、メール送信に使うSMTPサーバのホスト名とポート番号。
27
27
  # 無指定時はそれぞれ「'localhost'」と「25」。
28
+ # 以下は通常は不要。必要に応じて指定する:
29
+ # @options['comment_mail.user_name']
30
+ # @options['comment_mail.password']
31
+ # SMTP認証が必要な場合のユーザ名とパスワード
32
+ # @options['comment_mail.authentication']
33
+ # SMTP認証の方式。:plainや:loginなど(Mail gemに指定できるもの)
34
+ # @options['comment_mail.starttls']
35
+ # TLSに自動接続する(true/false) (Mail gem)
28
36
  #
29
- # Copyright (c) 2003 TADA Tadashi <sho@spc.gr.jp>
37
+ # Copyright (c) 2015 TADA Tadashi <t@tdtds.jp>
30
38
  # You can distribute this file under the GPL2 or any later version.
31
39
  #
32
40
  def comment_mail( text, to )
33
41
  begin
34
- require 'net/smtp'
35
- host = @conf['comment_mail.smtp_host'] || 'localhost'
36
- port = @conf['comment_mail.smtp_port'] || 25
37
- Net::SMTP.start( host, port ) do |smtp|
38
- smtp.send_mail( text.force_encoding( 'US-ASCII' ), @conf.author_mail.untaint, to )
39
- end
42
+ require 'mail'
43
+
44
+ mail = Mail.new( text )
45
+ delivery_opts = {
46
+ address: @conf['comment_mail.smtp_host'] || 'localhost',
47
+ port: @conf['comment_mail.smtp_port'] || 25,
48
+ authentication: @conf['comment_mail.authentication'],
49
+ user_name: @conf['comment_mail.user_name'],
50
+ password: @conf['comment_mail.password'],
51
+ enable_starttls_auto: @conf['comment_mail.starttls']
52
+ }.delete_if{|k,v| v == nil}
53
+ mail.delivery_method( :smtp, delivery_opts )
54
+ mail.deliver
40
55
  rescue
41
56
  $stderr.puts $!
42
57
  end
@@ -28,7 +28,7 @@
28
28
  # Distributed under the GPL2 or any later version.
29
29
  #
30
30
 
31
- if /^append|replace|comment|showcomment$/ =~ @mode then
31
+ if /^append|replace|comment|showcomment|startup$/ =~ @mode then
32
32
  unless @conf.description
33
33
  @conf.description = @conf['whatsnew_list.rdf.description']
34
34
  end
@@ -486,6 +486,10 @@ add_edit_proc do
486
486
  HTML
487
487
  end
488
488
 
489
+ add_startup_proc do
490
+ makerss_update
491
+ end
492
+
489
493
  def replace_entities( text )
490
494
  unless @xml_entity_table then
491
495
  @xml_entity_table = {
@@ -95,13 +95,9 @@ def recent_comment3(ob_max = 'OBSOLUTE' ,sep = 'OBSOLUTE',ob_date_format = 'OBSO
95
95
  if entries.size == 0
96
96
  notfound_msg
97
97
  else
98
- cgi = CGI::new
99
- def cgi.referer; nil; end
100
-
101
98
  tree_order.each do |entry_date|
102
99
  a_entry = @index + anchor(entry_date)
103
- cgi.params['date'] = [entry_date]
104
- diary = TDiaryDayWithoutFilter::new(cgi, '', @conf)
100
+ diary = DiaryContainer::find_by_day(@conf, entry_date)
105
101
  title = diary.diaries[entry_date].title.gsub( /<[^>]*>/, '' ) if diary
106
102
 
107
103
  if title.nil? || title.length == 0 || title.strip.delete(' ').delete(' ').length == 0 then
@@ -28,14 +28,10 @@ def recent_list( days = 30, date_format = nil, title_with_body = nil, show_size
28
28
 
29
29
  result = %Q|<ul class="recent-list">\n|
30
30
 
31
- cgi = CGI::new
32
- def cgi.referer; nil; end
33
-
34
31
  catch(:exit) {
35
32
  @years.keys.sort.reverse_each do |year|
36
33
  @years[year].sort.reverse_each do |month|
37
- cgi.params['date'] = ["#{year}#{month}"]
38
- m = TDiaryMonthWithoutFilter::new(cgi, '', @conf)
34
+ m = DiaryContainer::find_by_month(@conf, "#{year}#{month}")
39
35
  m.diaries.keys.sort.reverse_each do |date|
40
36
  next unless m.diaries[date].visible?
41
37
  result << %Q|<li><a href="#{@index}#{anchor date}">#{m.diaries[date].date.strftime(date_format)}</a>\n|
@@ -1,5 +1,8 @@
1
1
  # theme_online.rb: choice theme from online repository on tDiary.org
2
2
  #
3
+ # options:
4
+ # @options['theme_online.url']: top level URL of another theme site
5
+ #
3
6
  # Copyright (C) 2014 by TADA Tadashi <t@tdtds.jp>
4
7
  # You can distribute and/or modify it under GPL2 or any later version.
5
8
  #
@@ -7,8 +10,10 @@ require 'json'
7
10
  require 'open-uri'
8
11
 
9
12
  def theme_list_online(list)
13
+ url = @options['theme_online.url'] || 'http://theme.tdiary.org/'
14
+ url = "http:#{url}" if url =~ %r|\A//|
10
15
  begin
11
- online_list = JSON.load(open('http://theme.tdiary.org/themes.json', &:read))['themes']
16
+ online_list = JSON.load(open(File.join(url, 'themes.json'), &:read))['themes']
12
17
  list + online_list.keys.map do |t|
13
18
  title = online_list[t]['title']
14
19
  label = t == title ? '' : " (#{title})"
@@ -21,5 +26,6 @@ def theme_list_online(list)
21
26
  end
22
27
 
23
28
  def theme_url_online(theme)
24
- "http://theme.tdiary.org/#{h theme}/#{h theme}.css"
29
+ url = @options['theme_online.url'] || 'http://theme.tdiary.org/'
30
+ File.join(url, "#{h theme}/#{h theme}.css")
25
31
  end
@@ -56,8 +56,8 @@ feature 'プラグイン選択設定の利用' do
56
56
 
57
57
  expect(page.body).to be_include('caretposition.js')
58
58
  expect(page.body).to be_include('category_autocomplete.js')
59
- expect(page.body).to be_include('http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js')
60
- expect(page.body).not_to be_include('http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js?')
59
+ expect(page.body).to be_include('//ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js')
60
+ expect(page.body).not_to be_include('//ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js?')
61
61
  end
62
62
  end
63
63
  # Local Variables:
@@ -0,0 +1,65 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+ require 'rack/test'
4
+ require 'tdiary/application'
5
+
6
+ describe TDiary::Application do
7
+ include Rack::Test::Methods
8
+
9
+ before do
10
+ end
11
+
12
+ describe '#call' do
13
+ let(:app) { TDiary::Application.new }
14
+
15
+ context "when is accessed to index"
16
+ it do
17
+ get '/'
18
+ expect(last_response.status).to eq 200
19
+ end
20
+
21
+ context "when is accessed to update" do
22
+ it do
23
+ get '/update.rb'
24
+ expect(last_response.status).to eq 401
25
+ end
26
+ end
27
+
28
+ context "with base_dir" do
29
+ let(:app) { TDiary::Application.new('/diary') }
30
+
31
+ it do
32
+ get '/diary/'
33
+ expect(last_response.status).to eq 200
34
+ end
35
+
36
+ context "when access to root directory" do
37
+ it do
38
+ get '/'
39
+ expect(last_response.status).to eq 404
40
+ end
41
+ end
42
+ end
43
+
44
+ context "when the application raises exception" do
45
+ before do
46
+ allow(TDiary::Dispatcher).to receive_message_chain(:index).and_return(
47
+ lambda {|env| raise StandardError.new }
48
+ )
49
+ end
50
+
51
+ it do
52
+ get '/'
53
+ expect(last_response.status).to eq 500
54
+ expect(last_response.body).to match(/^StandardError/)
55
+ end
56
+ end
57
+ end
58
+ end
59
+
60
+ # Local Variables:
61
+ # mode: ruby
62
+ # indent-tabs-mode: t
63
+ # tab-width: 3
64
+ # ruby-indent-level: 3
65
+ # End:
@@ -0,0 +1,71 @@
1
+ require 'spec_helper'
2
+
3
+ require 'tdiary'
4
+ require 'tdiary/cache/file'
5
+ require 'tdiary/io/default'
6
+ require 'tdiary/diary_container'
7
+
8
+ describe TDiary::DiaryContainer do
9
+ let(:conf) { TDiary::Configuration.new }
10
+ let(:today) { Time.local(2005, 1, 20, 12, 0, 0) }
11
+
12
+ let(:tdiary_conf_org) { File.join(TDiary::root, "spec/fixtures/tdiary.conf.webrick") }
13
+ let(:tdiary_conf) { File.join(TDiary::root, "tdiary.conf") }
14
+
15
+ before do
16
+ # create sample confing
17
+ FileUtils.cp_r tdiary_conf_org, tdiary_conf, verbose: false
18
+
19
+ # create sample diary
20
+ tdiary = DummyTDiary.new
21
+ tdiary.conf = conf
22
+ io = TDiary::IO::Default.new(tdiary)
23
+ io.transaction(today) do |diaries|
24
+ date = today.strftime('%Y%m%d')
25
+ diary = io.diary_factory(date, "foo", "", "wiki")
26
+ diaries[date] = diary.append("bar")
27
+ TDiary::TDiaryBase::DIRTY_DIARY
28
+ end
29
+ end
30
+
31
+ after do
32
+ FileUtils.rm_f tdiary_conf
33
+ ["/tmp/data/#{today.year}"].each do |dir|
34
+ FileUtils.rm_rf File.join(TDiary.root, dir)
35
+ end
36
+ end
37
+
38
+ context "with find_by_month" do
39
+ let(:diary) { TDiary::DiaryContainer.find_by_month(conf, "200501") }
40
+ it { expect(diary).to be_a_kind_of TDiary::DiaryContainer }
41
+
42
+ describe "#conf" do
43
+ subject { diary.conf }
44
+ it { expect(subject).to be_a_kind_of TDiary::Configuration }
45
+ end
46
+
47
+ describe "#diaries" do
48
+ subject { diary.diaries }
49
+ it { expect(subject).to be_a_kind_of Hash }
50
+ it { expect(subject.keys).to include('20050120') }
51
+ it { expect(subject.values).to include(be_a_kind_of TDiary::Style::WikiDiary) }
52
+ end
53
+ end
54
+
55
+ context "with find_by_day" do
56
+ let(:diary) { TDiary::DiaryContainer.find_by_day(conf, "20050120") }
57
+ it { expect(diary).to be_a_kind_of TDiary::DiaryContainer }
58
+
59
+ describe "#conf" do
60
+ subject { diary.conf }
61
+ it { expect(subject).to be_a_kind_of TDiary::Configuration }
62
+ end
63
+
64
+ describe "#diaries" do
65
+ subject { diary.diaries }
66
+ it { expect(subject).to be_a_kind_of Hash }
67
+ it { expect(subject.keys).to include('20050120') }
68
+ it { expect(subject.values).to include(be_a_kind_of TDiary::Style::WikiDiary) }
69
+ end
70
+ end
71
+ end
@@ -379,6 +379,19 @@ describe TDiary::Plugin do
379
379
  it { expect { subject }.to raise_error }
380
380
  end
381
381
  end
382
+
383
+ describe '#startup_proc' do
384
+ let (:proc) { lambda { "some plugin" } }
385
+ let (:app) { lambda { "tdiary application" } }
386
+ before do
387
+ @plugin.__send__(:add_startup_proc, &proc)
388
+ end
389
+
390
+ it 'add_startup_procで登録したブロックが実行されること' do
391
+ expect(proc).to receive(:call).with(app)
392
+ @plugin.__send__(:startup_proc, app)
393
+ end
394
+ end
382
395
  end
383
396
 
384
397
  # Local Variables:
@@ -38,8 +38,8 @@ recent_list.rb
38
38
  "
39
39
 
40
40
  @options['dropdown_calendar.label'] = ''
41
- @options['makerss.file'] = 'public/index.rdf'
42
- @options['makerss.no_comments.file'] = 'public/no_comments.rdf'
41
+ @options['makerss.file'] = 'index.rdf'
42
+ @options['makerss.no_comments.file'] = 'no_comments.rdf'
43
43
 
44
44
  @options['spamfilter.bad_comment_patts'] = "(href=|casino|gambling|betting|fastsearch\\.eu\\.com|ganzao|poker|holdem|hold.em|roulette|drug|tramadol|viagra|fioricet|oxycontin|biaxin|aldara|business cards|home depot|slot.?machine|insurance|getblog2|video-game|Good site|internet-all\\.com|deai|tdfms|comu2|omaha)\r\n"
45
45
  @options['spamfilter.bad_ip_addrs'] = ""
@@ -38,8 +38,8 @@ recent_list.rb
38
38
  "
39
39
 
40
40
  @options['dropdown_calendar.label'] = ''
41
- @options['makerss.file'] = 'public/index.rdf'
42
- @options['makerss.no_comments.file'] = 'public/no_comments.rdf'
41
+ @options['makerss.file'] = 'index.rdf'
42
+ @options['makerss.no_comments.file'] = 'no_comments.rdf'
43
43
 
44
44
  @options['spamfilter.bad_comment_patts'] = "(href=|casino|gambling|betting|fastsearch\\.eu\\.com|ganzao|poker|holdem|hold.em|roulette|drug|tramadol|viagra|fioricet|oxycontin|biaxin|aldara|business cards|home depot|slot.?machine|insurance|getblog2|video-game|Good site|internet-all\\.com|deai|tdfms|comu2|omaha)\r\n"
45
45
  @options['spamfilter.bad_ip_addrs'] = ""
@@ -37,8 +37,8 @@ my-ex.rb
37
37
  "
38
38
 
39
39
  @options['dropdown_calendar.label'] = ''
40
- @options['makerss.file'] = 'public/index.rdf'
41
- @options['makerss.no_comments.file'] = 'public/no_comments.rdf'
40
+ @options['makerss.file'] = 'index.rdf'
41
+ @options['makerss.no_comments.file'] = 'no_comments.rdf'
42
42
 
43
43
  @options['spamfilter.bad_comment_patts'] = "(href=|casino|gambling|betting|fastsearch\\.eu\\.com|ganzao|poker|holdem|hold.em|roulette|drug|tramadol|viagra|fioricet|oxycontin|biaxin|aldara|business cards|home depot|slot.?machine|insurance|getblog2|video-game|Good site|internet-all\\.com|deai|tdfms|comu2|omaha)\r\n"
44
44
  @options['spamfilter.bad_ip_addrs'] = ""
@@ -39,8 +39,8 @@ recent_list.rb
39
39
  "
40
40
 
41
41
  @options['dropdown_calendar.label'] = ''
42
- @options['makerss.file'] = 'public/index.rdf'
43
- @options['makerss.no_comments.file'] = 'public/no_comments.rdf'
42
+ @options['makerss.file'] = 'index.rdf'
43
+ @options['makerss.no_comments.file'] = 'no_comments.rdf'
44
44
 
45
45
  @options['spamfilter.bad_comment_patts'] = "(href=|casino|gambling|betting|fastsearch\\.eu\\.com|ganzao|poker|holdem|hold.em|roulette|drug|tramadol|viagra|fioricet|oxycontin|biaxin|aldara|business cards|home depot|slot.?machine|insurance|getblog2|video-game|Good site|internet-all\\.com|deai|tdfms|comu2|omaha)\r\n"
46
46
  @options['spamfilter.bad_ip_addrs'] = ""
data/spec/spec_helper.rb CHANGED
@@ -26,10 +26,11 @@ RSpec.configure do |config|
26
26
  end
27
27
 
28
28
  class DummyTDiary
29
- def conf
30
- conf = DummyConf.new
31
- conf.data_path = TDiary.root + "/tmp/"
32
- conf
29
+ attr_accessor :conf
30
+
31
+ def initialize
32
+ @conf = DummyConf.new
33
+ @conf.data_path = TDiary.root + "/tmp/"
33
34
  end
34
35
 
35
36
  def ignore_parser_cache