narou 2.9.5 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of narou might be problematic. Click here for more details.

Files changed (112) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +7 -0
  3. data/.reek +34 -0
  4. data/.rspec +1 -0
  5. data/.rubocop.yml +9 -1
  6. data/ChangeLog.md +90 -0
  7. data/Gemfile +4 -0
  8. data/README.md +85 -8
  9. data/lib/command/convert.rb +1 -1
  10. data/lib/command/list.rb +59 -73
  11. data/lib/command/list/novel_decorator.rb +107 -0
  12. data/lib/command/send.rb +23 -13
  13. data/lib/command/setting.rb +5 -1
  14. data/lib/command/update.rb +104 -138
  15. data/lib/command/update/general_lastup_updater.rb +105 -0
  16. data/lib/command/update/interval.rb +29 -0
  17. data/lib/command/web.rb +1 -1
  18. data/lib/commandbase.rb +24 -17
  19. data/lib/converterbase.rb +10 -5
  20. data/lib/database.rb +16 -5
  21. data/lib/device.rb +5 -1
  22. data/lib/device/library/linux.rb +68 -8
  23. data/lib/downloader.rb +24 -23
  24. data/lib/extension.rb +16 -3
  25. data/lib/helper.rb +26 -3
  26. data/lib/html.rb +1 -1
  27. data/lib/inspector.rb +9 -0
  28. data/lib/inventory.rb +20 -6
  29. data/lib/logger.rb +8 -2
  30. data/lib/mailer.rb +2 -1
  31. data/lib/narou.rb +28 -18
  32. data/lib/narou/api.rb +62 -31
  33. data/lib/novelconverter.rb +8 -1
  34. data/lib/novelinfo.rb +8 -7
  35. data/lib/novelsetting.rb +1 -0
  36. data/lib/progressbar.rb +6 -2
  37. data/lib/sitesetting.rb +2 -1
  38. data/lib/version.rb +1 -1
  39. data/lib/web/appserver.rb +72 -9
  40. data/lib/web/public/resources/narou.library.js +130 -13
  41. data/lib/web/public/resources/narou.ui.js +96 -9
  42. data/lib/web/settingmessages.rb +2 -1
  43. data/lib/web/views/_about.haml +15 -2
  44. data/lib/web/views/index.haml +12 -3
  45. data/lib/web/views/layout.haml +2 -1
  46. data/lib/web/views/style.scss +12 -0
  47. data/narou.gemspec +88 -11
  48. data/narou.rb +7 -1
  49. data/preset/mail_setting.yaml +40 -6
  50. data/webnovel/kakuyomu.jp.yaml +8 -8
  51. metadata +95 -139
  52. data/spec/README.txt +0 -4
  53. data/spec/convert_spec.rb +0 -119
  54. data/spec/converterbase_spec.rb +0 -298
  55. data/spec/data/convert_test/auto_indent/correct_test_auto_indent.txt +0 -28
  56. data/spec/data/convert_test/auto_indent/test_auto_indent.txt +0 -32
  57. data/spec/data/convert_test/auto_join_bracket/correct_test_auto_join_bracket.txt +0 -24
  58. data/spec/data/convert_test/auto_join_bracket/test_auto_join_bracket.txt +0 -28
  59. data/spec/data/convert_test/auto_join_line/correct_test_auto_join_line.txt +0 -43
  60. data/spec/data/convert_test/auto_join_line/test_auto_join_line.txt +0 -59
  61. data/spec/data/convert_test/convert_page_break/correct_test_convert_page_break.txt +0 -22
  62. data/spec/data/convert_test/convert_page_break/setting.ini +0 -5
  63. data/spec/data/convert_test/convert_page_break/test_convert_page_break.txt +0 -60
  64. data/spec/data/convert_test/double_dash_to_image/correct_test_double_dash_to_image.txt +0 -14
  65. data/spec/data/convert_test/double_dash_to_image/setting.ini +0 -1
  66. data/spec/data/convert_test/double_dash_to_image/test_double_dash_to_image.txt +0 -12
  67. data/spec/data/convert_test/english/correct_test_english.txt +0 -27
  68. data/spec/data/convert_test/english/test_english.txt +0 -27
  69. data/spec/data/convert_test/force_indent_special_chapter/correct_test_force_indent_special_chapter.txt +0 -64
  70. data/spec/data/convert_test/force_indent_special_chapter/test_force_indent_special_chapter.txt +0 -61
  71. data/spec/data/convert_test/horizontal_ellipsis/correct_test_horizontal_ellipsis.txt +0 -53
  72. data/spec/data/convert_test/horizontal_ellipsis/test_horizontal_ellipsis.txt +0 -57
  73. data/spec/data/convert_test/insert_separator/correct_test_insert_separator.txt +0 -13
  74. data/spec/data/convert_test/insert_separator/setting.ini +0 -3
  75. data/spec/data/convert_test/insert_separator/test_insert_separator.txt +0 -12
  76. data/spec/data/convert_test/insert_separator_and_replace_txt/correct_test_insert_separator_and_replace_txt.txt +0 -12
  77. data/spec/data/convert_test/insert_separator_and_replace_txt/setting.ini +0 -3
  78. data/spec/data/convert_test/insert_separator_and_replace_txt/test_insert_separator_and_replace_txt.txt +0 -11
  79. data/spec/data/convert_test/kanji_num/correct_test_kanji_num.txt +0 -50
  80. data/spec/data/convert_test/kanji_num/test_kanji_num.txt +0 -56
  81. data/spec/data/convert_test/nonokagi/correct_test_nonokagi.txt +0 -30
  82. data/spec/data/convert_test/nonokagi/test_nonokagi.txt +0 -34
  83. data/spec/data/convert_test/replace/correct_test_replace.txt +0 -13
  84. data/spec/data/convert_test/replace/test_replace.txt +0 -14
  85. data/spec/data/convert_test/ruby/correct_test_ruby.txt +0 -161
  86. data/spec/data/convert_test/ruby/test_ruby.txt +0 -205
  87. data/spec/data/convert_test/ruby_youon/correct_test_ruby_youon.txt +0 -13
  88. data/spec/data/convert_test/ruby_youon/setting.ini +0 -2
  89. data/spec/data/convert_test/ruby_youon/test_ruby_youon.txt +0 -14
  90. data/spec/data/convert_test/sesame/correct_test_sesame.txt +0 -41
  91. data/spec/data/convert_test/sesame/test_sesame.txt +0 -52
  92. data/spec/data/convert_test/to_odd_leader/correct_test_to_odd_leader.txt +0 -21
  93. data/spec/data/convert_test/to_odd_leader/test_to_odd_leader.txt +0 -21
  94. data/spec/data/html_test.html +0 -5
  95. data/spec/data/html_test.txt +0 -4
  96. data/spec/data/test.ini +0 -10
  97. data/spec/device_spec.rb +0 -39
  98. data/spec/downloader_spec.rb +0 -37
  99. data/spec/eventable_spec.rb +0 -172
  100. data/spec/exit_code_spec.rb +0 -67
  101. data/spec/generator/convert_spec_gen.rb +0 -96
  102. data/spec/generator/num_to_kanji_test_gen.rb +0 -33
  103. data/spec/helper_spec.rb +0 -90
  104. data/spec/html_spec.rb +0 -83
  105. data/spec/ini_spec.rb +0 -145
  106. data/spec/input_spec.rb +0 -76
  107. data/spec/logger_spec.rb +0 -92
  108. data/spec/novelinfo_spec.rb +0 -15
  109. data/spec/novelsetting_spec.rb +0 -35
  110. data/spec/num_to_kanji_spec.rb +0 -2482
  111. data/spec/spec_helper.rb +0 -16
  112. data/spec/worker_spec.rb +0 -75
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: aec577773e278bf063bc2d4312e5b0756b6fed17
4
- data.tar.gz: 2dd3643848b6f6c62c17a184d0eab3069f8aa9d1
3
+ metadata.gz: 1cabce3f355f2c95df4744fc220712459beead27
4
+ data.tar.gz: 7e9747fd610ebfacdc1902983cc15652030c1316
5
5
  SHA512:
6
- metadata.gz: 564a5a1adda1be0b07e3cc80caca7d71479098c7d4ae6e85c85fce047421b57341d82746b8cdc7e43beeeae3bf6749ac68c802223fdc00bed10ffaa03dcb4691
7
- data.tar.gz: 52d40b770819b24b2564bce2567c28b487e2b27d3eefce6c9857b8c69b21078d8b4456cff8cf74cd769011655ba704e5695120b8f23f2d52a83d079e31ab0411
6
+ metadata.gz: 5c9e20d2a3607ca480deb607b4d85725616049a8df00f93bc34ca1c1ea0136c033bebcffc3d3ea9b6383a9e9e94fe7e078a5823fec6f1ecf903b803825a97d67
7
+ data.tar.gz: b06844ba3d860dc992732420bc503fe961ef92337c5c9329a5e26cb8e9705f9e3ee363952e239a9a892a2a7b6210019ae5de445cd8b7e4b7f4d15a84b5879542
data/.gitignore CHANGED
@@ -3,6 +3,7 @@
3
3
  #
4
4
  .backup/
5
5
  小説データ/
6
+ 小説データ/
6
7
  kindlestrip.py
7
8
  kindlegen.exe
8
9
  t.rb
@@ -11,6 +12,7 @@ AozoraEpub3*
11
12
  TODO.txt
12
13
  MEMO.txt
13
14
  .narou/
15
+ .narousetting/
14
16
  *.zip
15
17
  debug
16
18
  .DS_Store
@@ -33,6 +35,11 @@ tags
33
35
  archive
34
36
  commitversion
35
37
 
38
+ .test_dot_narou/
39
+ .test_novel_data/
40
+
41
+ mail_setting.yaml
42
+
36
43
  #
37
44
  # for gem
38
45
  #
data/.reek ADDED
@@ -0,0 +1,34 @@
1
+ # vim: set ft=yaml :
2
+ ---
3
+ # クラスコメントはなくてもいい
4
+ IrresponsibleModule:
5
+ enabled: false
6
+
7
+ # メソッドの複雑さは rubocop でチェックする
8
+ TooManyStatements:
9
+ enabled: false
10
+
11
+ DuplicateMethodCall:
12
+ max_calls: 2
13
+
14
+ NestedIterators:
15
+ max_allowed_nesting: 3
16
+
17
+ TooManyMethods:
18
+ enabled: false
19
+
20
+ # Narou.rb ではクラス変数は使用許可
21
+ ClassVariable:
22
+ enabled: false
23
+
24
+ UtilityFunction:
25
+ enabled: false
26
+
27
+ FeatureEnvy:
28
+ enabled: false
29
+
30
+ UncommunicativeVariableName:
31
+ accept:
32
+ - _
33
+ - e
34
+ - i
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ -cr spec_helper
@@ -5,7 +5,9 @@ AllCops:
5
5
  Exclude:
6
6
  - "小説データ/**/*"
7
7
  - "trash/**/*"
8
+ - "narou.gemspec"
8
9
  DisplayCopNames: true
10
+ TargetRubyVersion: 2.1
9
11
 
10
12
  Metrics/ClassLength:
11
13
  CountComments: false
@@ -22,7 +24,7 @@ Metrics/BlockNesting:
22
24
  Max: 3
23
25
 
24
26
  Metrics/CyclomaticComplexity:
25
- Max: 10
27
+ Max: 8
26
28
 
27
29
  Metrics/LineLength:
28
30
  Max: 140
@@ -208,3 +210,9 @@ Lint/UnderscorePrefixedVariableName:
208
210
 
209
211
  Style/EmptyLinesAroundClassBody:
210
212
  Enabled: false
213
+
214
+ Style/FrozenStringLiteralComment:
215
+ Enabled: false
216
+
217
+ Style/MultilineOperationIndentation:
218
+ Enabled: false
@@ -2,6 +2,96 @@
2
2
  更新履歴 - ChangeLog
3
3
  ====================
4
4
 
5
+ 3.0.0 : 2016/11/25
6
+ -------------------
7
+ #### 追加機能
8
+ - update コマンドに --ignore-all オプションを追加しました
9
+ + 更新対象小説を指定しない場合の全件アップデート処理を無効にします
10
+ + `narou l | narou u --ignore-all` のように PIPE で繋いだ時、処理件数が偶然
11
+ 0件になった場合に意図せず全件更新にならない為に使用します
12
+ - コマンド使用時に `^tag:NAME` でタグの除外指定が出来るようになりました。
13
+ 先に実装された WEB UI での除外検索は `-tag:NAME` ですが、コマンドラインでは
14
+ -tag とするとオプションと誤認識されてしまう問題があり、^ に変更しました。
15
+ + これに合わせて、WEB UI でも ^tag: を使えるようになります(従来の -tag も
16
+ 使えます)
17
+ - WEB UI 関連
18
+ - Update ボタンに「タグを指定して更新」を追加しました
19
+ - Update ボタンの「最新話更新日を確認」を刷新しました。なろうAPIを使用して
20
+ 一括で更新されたかを確認することた出来るようになります
21
+ + コマンドライン版の `narou update --gl` も同様の機能に変わっています。
22
+ 詳細は narou u -h を参照
23
+ + > “実際に小説のデータが修正されてからなろうAPIに反映されるまで平均5分
24
+ 程度(最大2時間)の誤差があります。”
25
+
26
+ ([公式サイト](http://dev.syosetu.com/man/api/)から引用)
27
+ + ダイアログ内の各チェックリストの項目を独立させたものが、「な」「他」
28
+ 「(更新アイコン)」ボタンに独立させてあります。詳細はマウスホーバーの説明
29
+ を参照
30
+ + 最新話掲載日を確認した結果、新着がありそうな小説には「最新話掲載日」の
31
+ 日付の左上あたりに目印が表示されます
32
+ - 小説リストに「話数」を追加しました
33
+ - 小説リストに「更新チェック日」を追加しました
34
+ - Linux でも Eject ボタンに対応しました
35
+ + デスクトップにログインした状態での udisks-daemon または udisksd による
36
+ 自動マウントにのみ対応しています
37
+ + 使用中のデスクトップの外部で `narou web` を動かしている場合(例えばOS
38
+ 起動時に自動起動させた場合やログインし直した場合)、権限の問題により
39
+ Eject が効かない場合があります
40
+ - 設定に `normalize-filename` を追加しました。ファイル名をNFCで正規化します。
41
+ Dropbox 使用時などに合成文字列関係で問題がある場合などに使用して下さい。
42
+ 正規化後のファイル名が以前の物と変わった場合、別ファイルと認識されるので理解
43
+ の上で有効にして下さい
44
+ - 調査ログ保存時にエラー・警告・INFOの個数を表示するようにしました。
45
+ (`convert.inspect` が false の場合)
46
+ - setting.ini の title_date_format に、小説のタグを埋め込める書式 $ntag を追加
47
+ しました。小説にタグがついている場合、全てのタグをカンマ区切りで埋め込めます
48
+
49
+ #### 仕様変更
50
+ - WEB UI の小説リストの初期表示状態を項目数増加に伴い整理しました
51
+ + 初期ソートを「最新話掲載日」に変更
52
+ + 種別、DL、更新チェック日、話数は初期状態では非表示
53
+ + 項目追加に伴い表示のカスタマイズがリセットされるので再設定をお願いします
54
+ - 現在ユーザーフォルダに保存されている .narousetting フォルダ(グローバル設定用)
55
+ を .narou フォルダと同じ場所に移動/コピーした場合、そちらを優先して読みに
56
+ 行くようになりました
57
+ + 全てのデータが一つのフォルダにまとめることが出来るようになるので、別PCへの
58
+ データ移行がしやすくなります
59
+ + また、現在はサーバー設定がグローバル設定で保存されているため、小説フォルダ
60
+ を分けても WEB UI サーバのアドレスが同じになってしまっていましたが、別々の
61
+ アドレス/ポートにすることが可能になります
62
+ - 複数のタグを同時に指定した場合、同じ小説が複数回対象になっていたのを一度のみ
63
+ 対象になるように変更しました
64
+ + 例) A と B というタグをもつ小説があったとして、`narou u A B` で二度更新され
65
+ てしまっていたのが、一度のみ更新されるようになる
66
+ - send --without-freeze オプションを指定時、対象小説を指定した場合でも凍結時は
67
+ 送信されなくなりました。(send.without-freeze を設定していても同じ)
68
+ + WEB UI ではこれまでと同様に一括時のみ凍結済みは送信されず、個別指定時は凍結
69
+ 済みでも送信出来ます
70
+ - send --without-freeze オプションの短縮形として -w を設定しました
71
+ - send で送信時、対象小説を指定した/しないに関わらずタイムスタンプを必ず比較
72
+ して新しければ送信するように変更しました
73
+ + 必ず送信したい場合は --force オプションを指定して下さい
74
+ - 栞のバックアップ・レストア時にタイムスタンプを見て新しい場合のみコピーする
75
+ ように変更しました
76
+
77
+ #### 修正内容
78
+ - カクヨムの情報が一部取得出来なくなっていた
79
+ - mail コマンド送信時に添付ファイルに @ が付いている場合、全角の@に置換する様
80
+ にしました
81
+ - WEB UI でタグ検索時にフィルター末尾に自動で半角空白を挿入するようにしました
82
+ - list コマンドで検索やタグによる絞り込みと<limit>の指定による表示個数を制限
83
+ を併用した場合に、<limit>で指定した分のみしか絞り込み対象になっていなかった
84
+ - list --filter series を指定時に一つも連載小説が表示されていなかった
85
+ - Linux 環境で send コマンドが送信出来ない場合があった #119
86
+ - 小説IDが一桁の場合に、download.use-subdirectory で作られるサブフォルダに半角
87
+ スペースが含まれてしまっていた
88
+ - WEB UI のフィルターのおいて、本来表示されない内部データにまでマッチングして
89
+ しまう不具合
90
+ - update.logging オプションが有効な場合に、アップデートをしない時でもログを
91
+ 保存してしまう場合がある不具合
92
+ - その他動作の安定性を向上などの細かい修正
93
+
94
+
5
95
  2.9.5 : 2016/07/01
6
96
  ------------------
7
97
  #### 仕様変更
data/Gemfile CHANGED
@@ -7,6 +7,10 @@ gemspec
7
7
 
8
8
  gem "rspec"
9
9
  gem "rspec-core"
10
+ gem "rspec-retry"
11
+ gem "timecop"
10
12
  gem "pry"
13
+ gem "pry-byebug"
11
14
  gem "better_errors"
12
15
  gem "binding_of_caller"
16
+ gem "awesome_print"
data/README.md CHANGED
@@ -33,17 +33,94 @@ Narou.rb ― 「小説家になろう」「小説を読もう!」ダウンロ
33
33
  更新履歴 - ChangeLog
34
34
  --------------------
35
35
 
36
- 2.9.5 : 2016/07/01
37
- ------------------
36
+ 3.0.0 : 2016/11/25
37
+ -------------------
38
+ #### 追加機能
39
+ - update コマンドに --ignore-all オプションを追加しました
40
+ + 更新対象小説を指定しない場合の全件アップデート処理を無効にします
41
+ + `narou l | narou u --ignore-all` のように PIPE で繋いだ時、処理件数が偶然
42
+ 0件になった場合に意図せず全件更新にならない為に使用します
43
+ - コマンド使用時に `^tag:NAME` でタグの除外指定が出来るようになりました。
44
+ 先に実装された WEB UI での除外検索は `-tag:NAME` ですが、コマンドラインでは
45
+ -tag とするとオプションと誤認識されてしまう問題があり、^ に変更しました。
46
+ + これに合わせて、WEB UI でも ^tag: を使えるようになります(従来の -tag も
47
+ 使えます)
48
+ - WEB UI 関連
49
+ - Update ボタンに「タグを指定して更新」を追加しました
50
+ - Update ボタンの「最新話更新日を確認」を刷新しました。なろうAPIを使用して
51
+ 一括で更新されたかを確認することた出来るようになります
52
+ + コマンドライン版の `narou update --gl` も同様の機能に変わっています。
53
+ 詳細は narou u -h を参照
54
+ + > “実際に小説のデータが修正されてからなろうAPIに反映されるまで平均5分
55
+ 程度(最大2時間)の誤差があります。”
56
+
57
+ ([公式サイト](http://dev.syosetu.com/man/api/)から引用)
58
+ + ダイアログ内の各チェックリストの項目を独立させたものが、「な」「他」
59
+ 「(更新アイコン)」ボタンに独立させてあります。詳細はマウスホーバーの説明
60
+ を参照
61
+ + 最新話掲載日を確認した結果、新着がありそうな小説には「最新話掲載日」の
62
+ 日付の左上あたりに目印が表示されます
63
+ - 小説リストに「話数」を追加しました
64
+ - 小説リストに「更新チェック日」を追加しました
65
+ - Linux でも Eject ボタンに対応しました
66
+ + デスクトップにログインした状態での udisks-daemon または udisksd による
67
+ 自動マウントにのみ対応しています
68
+ + 使用中のデスクトップの外部で `narou web` を動かしている場合(例えばOS
69
+ 起動時に自動起動させた場合やログインし直した場合)、権限の問題により
70
+ Eject が効かない場合があります
71
+ - 設定に `normalize-filename` を追加しました。ファイル名をNFCで正規化します。
72
+ Dropbox 使用時などに合成文字列関係で問題がある場合などに使用して下さい。
73
+ 正規化後のファイル名が以前の物と変わった場合、別ファイルと認識されるので理解
74
+ の上で有効にして下さい
75
+ - 調査ログ保存時にエラー・警告・INFOの個数を表示するようにしました。
76
+ (`convert.inspect` が false の場合)
77
+ - setting.ini の title_date_format に、小説のタグを埋め込める書式 $ntag を追加
78
+ しました。小説にタグがついている場合、全てのタグをカンマ区切りで埋め込めます
79
+
38
80
  #### 仕様変更
39
- - WEB UI の Eject ボタンを押した際に、即時取り出しではなく一旦キューに積む様に
40
- 変更しました。これにより変換が終了したら取り外すということが可能になります
41
- + すぐに取り外したい場合は Eject ボタン横のドロップダウンメニューから可能です
42
- - Windows でも Eject ボタンに対応しました
81
+ - WEB UI の小説リストの初期表示状態を項目数増加に伴い整理しました
82
+ + 初期ソートを「最新話掲載日」に変更
83
+ + 種別、DL、更新チェック日、話数は初期状態では非表示
84
+ + 項目追加に伴い表示のカスタマイズがリセットされるので再設定をお願いします
85
+ - 現在ユーザーフォルダに保存されている .narousetting フォルダ(グローバル設定用)
86
+ を .narou フォルダと同じ場所に移動/コピーした場合、そちらを優先して読みに
87
+ 行くようになりました
88
+ + 全てのデータが一つのフォルダにまとめることが出来るようになるので、別PCへの
89
+ データ移行がしやすくなります
90
+ + また、現在はサーバー設定がグローバル設定で保存されているため、小説フォルダ
91
+ を分けても WEB UI サーバのアドレスが同じになってしまっていましたが、別々の
92
+ アドレス/ポートにすることが可能になります
93
+ - 複数のタグを同時に指定した場合、同じ小説が複数回対象になっていたのを一度のみ
94
+ 対象になるように変更しました
95
+ + 例) A と B というタグをもつ小説があったとして、`narou u A B` で二度更新され
96
+ てしまっていたのが、一度のみ更新されるようになる
97
+ - send --without-freeze オプションを指定時、対象小説を指定した場合でも凍結時は
98
+ 送信されなくなりました。(send.without-freeze を設定していても同じ)
99
+ + WEB UI ではこれまでと同様に一括時のみ凍結済みは送信されず、個別指定時は凍結
100
+ 済みでも送信出来ます
101
+ - send --without-freeze オプションの短縮形として -w を設定しました
102
+ - send で送信時、対象小説を指定した/しないに関わらずタイムスタンプを必ず比較
103
+ して新しければ送信するように変更しました
104
+ + 必ず送信したい場合は --force オプションを指定して下さい
105
+ - 栞のバックアップ・レストア時にタイムスタンプを見て新しい場合のみコピーする
106
+ ように変更しました
43
107
 
44
108
  #### 修正内容
45
- - Windows 環境において、kindlegen を実行時に何も実行されず mobi ファイルが作成
46
- 出来ない場合がある
109
+ - カクヨムの情報が一部取得出来なくなっていた
110
+ - mail コマンド送信時に添付ファイルに @ が付いている場合、全角の@に置換する様
111
+ にしました
112
+ - WEB UI でタグ検索時にフィルター末尾に自動で半角空白を挿入するようにしました
113
+ - list コマンドで検索やタグによる絞り込みと<limit>の指定による表示個数を制限
114
+ を併用した場合に、<limit>で指定した分のみしか絞り込み対象になっていなかった
115
+ - list --filter series を指定時に一つも連載小説が表示されていなかった
116
+ - Linux 環境で send コマンドが送信出来ない場合があった #119
117
+ - 小説IDが一桁の場合に、download.use-subdirectory で作られるサブフォルダに半角
118
+ スペースが含まれてしまっていた
119
+ - WEB UI のフィルターのおいて、本来表示されない内部データにまでマッチングして
120
+ しまう不具合
121
+ - update.logging オプションが有効な場合に、アップデートをしない時でもログを
122
+ 保存してしまう場合がある不具合
123
+ - その他動作の安定性を向上などの細かい修正
47
124
 
48
125
  ----
49
126
 
@@ -103,7 +103,7 @@ module Command
103
103
  @opt.separator <<-EOS
104
104
 
105
105
  Configuration:
106
- --no-epub, --no-mobi, --no-strip, --no-open , --inspect は narou setting コマンドで恒常的な設定にすることが可能です。
106
+ --no-epub, --no-mobi, --no-strip, --no-zip, --no-open , --inspect は narou setting コマンドで恒常的な設定にすることが可能です。
107
107
  convert.copy-to を設定すれば変換したEPUB/MOBIを指定のフォルダに自動でコピー出来ます。
108
108
  device で設定した端末が接続されていた場合、対応するデータを自動送信します。
109
109
  詳しくは narou setting --help を参照して下さい。
@@ -4,10 +4,12 @@
4
4
  #
5
5
 
6
6
  require_relative "../database"
7
+ require_relative "list/novel_decorator"
7
8
 
8
9
  module Command
9
10
  class List < CommandBase
10
- ANNOTATION_COLOR_TIME_LIMIT = 6 * 60 * 60 # 更新してから何秒まで色を変更するか
11
+ # 更新してから何秒まで色を変更するか
12
+ ANNOTATION_COLOR_TIME_LIMIT = 6 * 60 * 60
11
13
 
12
14
  # MEMO: 0 は昔の小説を凍結したままな場合、novel_type が設定されていないので、
13
15
  # nil.to_i → 0 という互換性維持のため
@@ -15,10 +17,13 @@ module Command
15
17
 
16
18
  FILTERS_TYPE = Hash[*%w(series 連載 ss 短編 frozen 凍結 nonfrozen 非凍結)]
17
19
 
20
+ attr_reader :options
21
+
18
22
  def self.oneline_help
19
23
  "現在管理している小説の一覧を表示します"
20
24
  end
21
25
 
26
+ # rubocop:disable Metrics/MethodLength
22
27
  def initialize
23
28
  super("[<limit>] [options]")
24
29
  @opt.separator <<-EOS
@@ -81,7 +86,7 @@ module Command
81
86
  }
82
87
  @opt.on("-f", "--filter VAL", String,
83
88
  "表示を絞るためのフィルター。スペース区切りで複数可\n" \
84
- "#{' '*25}#{filter_type_help}") { |filter|
89
+ "#{' ' * 25}#{filter_type_help}") { |filter|
85
90
  @options["filters"] = filter.downcase.split
86
91
  }
87
92
  @opt.on("-g", "--grep VAL", String,
@@ -119,7 +124,7 @@ module Command
119
124
  apply_sum = filters.inject(0) do |sum, item|
120
125
  apply = case item
121
126
  when "series"
122
- novel_type == 0 && novel_type == 1
127
+ novel_type == 0 || novel_type == 1
123
128
  when "ss"
124
129
  novel_type == 2
125
130
  when "frozen"
@@ -138,26 +143,33 @@ module Command
138
143
 
139
144
  def header
140
145
  [
141
- " ID ",
142
- @options["general-lastup"] ? " 掲載日 " : " 更新日 ",
143
- @options["kind"] ? "種別" : nil,
144
- @options["author"] ? "作者名" : nil,
145
- @options["site"] ? "サイト名" : nil,
146
- " タイトル"
146
+ " ID ",
147
+ @options["general-lastup"] ? " 掲載日 " : " 更新日 ",
148
+ @options["kind"] ? "種別" : nil,
149
+ @options["author"] ? "作者名" : nil,
150
+ @options["site"] ? "サイト名" : nil,
151
+ " タイトル"
147
152
  ].compact.join(" | ")
148
153
  end
149
154
 
150
155
  def view_date_type
151
- @options["general-lastup"] ? "general_lastup" : "last_update"
156
+ @_view_data_type ||= @options["general-lastup"] ? "general_lastup" : "last_update"
157
+ end
158
+
159
+ def now
160
+ @now ||= Time.now
161
+ end
162
+
163
+ def output_list(novels, limit)
164
+ took_lines = Hash[decorate_lines(novels).take(limit)]
165
+ output_lines(took_lines)
152
166
  end
153
167
 
154
- def output_list(novels)
155
- now = Time.now
156
- today = now.strftime("%y/%m/%d")
168
+ def decorate_lines(novels)
157
169
  filters = @options["filters"] || []
158
170
  selected_lines = {}
159
- view_date_type_key = view_date_type
160
171
  novels.each do |novel|
172
+ novel_decorator = NovelDecorator.new(novel, self)
161
173
  novel_type = novel["novel_type"].to_i
162
174
  id = novel["id"]
163
175
  frozen = Narou.novel_frozen?(id)
@@ -169,80 +181,54 @@ module Command
169
181
  if @options["tags"]
170
182
  next unless valid_tags?(novel, @options["tags"])
171
183
  end
172
- disp_id = ((frozen ? "*" : "") + id.to_s).rjust(4)
173
- disp_id = disp_id.sub("*", "<bold><cyan>*</cyan></bold>") if frozen
174
- tags = novel["tags"] || []
175
- selected_lines[id] = [
176
- disp_id,
177
- novel[view_date_type_key].strftime("%y/%m/%d").tap { |s|
178
- new_arrivals_date = novel["new_arrivals_date"]
179
- last_update = novel["last_update"]
180
- if new_arrivals_date && new_arrivals_date >= last_update \
181
- && new_arrivals_date + ANNOTATION_COLOR_TIME_LIMIT >= now
182
- # 新着表示色
183
- s.replace "<bold><magenta>#{s}</magenta></bold>"
184
- elsif last_update + ANNOTATION_COLOR_TIME_LIMIT >= now
185
- # 更新だけあった色
186
- s.replace "<bold><green>#{s}</green></bold>"
187
- end
188
- },
189
- @options["kind"] ? NOVEL_TYPE_LABEL[novel_type] : nil,
190
- @options["author"] ? novel["author"].escape : nil,
191
- @options["site"] ? novel["sitename"].escape : nil,
192
- novel["title"].escape + (!@options["kind"] && novel_type == 2 ?
193
- " <bold><black>(#{NOVEL_TYPE_LABEL[novel_type]})</black></bold>" :
194
- "") +
195
- (tags.include?("end") ? " <bold><black>(完結)</black></bold>" : "") +
196
- (tags.include?("404") ? " <bold><black>(削除)</black></bold>" : ""),
197
- @options["url"] ? novel["toc_url"].escape : nil,
198
- @options["tags"] || @options["all-tags"] ?
199
- tags.empty? ? nil : tags.map{ |tag|
200
- color = Tag.get_color(tag)
201
- "<bold><#{color}>#{tag.escape}</#{color}></bold>"
202
- }.join(",") : nil,
203
- ].compact.join(" | ")
184
+ selected_lines[id] = novel_decorator.decorate_line
204
185
  end
205
- if @options["grep"]
206
- @options["grep"].each do |search_word|
207
- selected_lines.keep_if { |_, line|
208
- if search_word =~ /^-(.+)/
209
- # NOT検索
210
- !line.include?($1)
211
- else
212
- line.include?(search_word)
213
- end
214
- }
215
- end
186
+ grep(selected_lines)
187
+ end
188
+
189
+ def grep(selected_lines)
190
+ return selected_lines unless @options["grep"]
191
+ @options["grep"].each do |search_word|
192
+ selected_lines.keep_if { |_, line|
193
+ if search_word =~ /^-(.+)/
194
+ # NOT検索
195
+ !line.include?($1)
196
+ else
197
+ line.include?(search_word)
198
+ end
199
+ }
216
200
  end
201
+ selected_lines
202
+ end
203
+
204
+ def output_lines(took_lines)
217
205
  if STDOUT.tty?
218
206
  puts header
219
- puts selected_lines.values.join("\n").termcolor
207
+ puts took_lines.values.join("\n").termcolor
208
+ elsif @options["echo"]
209
+ # pipeにそのまま出力するときはansicolorコードが邪魔なので削除
210
+ puts header
211
+ puts TermColorLight.strip_tag(took_lines.values.join("\n"))
220
212
  else
221
- if @options["echo"]
222
- # pipeにそのまま出力するときはansicolorコードが邪魔なので削除
223
- puts header
224
- puts TermColorLight.strip_tag(selected_lines.values.join("\n"))
225
- else
226
- # pipeに接続するときはIDを渡す
227
- puts selected_lines.keys.join(" ")
228
- end
213
+ # pipeに接続するときはIDを渡す
214
+ puts took_lines.keys.join(" ")
229
215
  end
230
216
  end
231
217
 
232
218
  def execute(argv)
233
219
  super
234
220
  database_values = Database.instance.get_object.values
235
- if !argv.empty? && argv.first =~ /^\d+$/
236
- num = argv.first.to_i
237
- else
238
- num = database_values.size
239
- end
221
+ limit =
222
+ if !argv.empty? && argv.first =~ /^\d+$/
223
+ argv.first.to_i
224
+ else
225
+ database_values.size
226
+ end
240
227
  if @options["latest"]
241
228
  database_values = Database.instance.sort_by(view_date_type)
242
229
  end
243
230
  database_values.reverse! if @options["reverse"]
244
- novels = database_values[0, num]
245
- output_list(novels)
231
+ output_list(database_values, limit)
246
232
  end
247
233
  end
248
234
  end