Class: Command::Csv

Inherits:
CommandBase show all
Defined in:
lib/command/csv.rb

Overview

ライブラリのCSVコマンドと混同を避けるために小文字混じり

Instance Attribute Summary

Attributes inherited from CommandBase

#stream_io

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from CommandBase

#disable_logging, #display_help!, execute!, #execute!, #force_change_settings_function, help, #hook_call, #load_local_settings, #tagname_to_ids

Constructor Details

#initializeCsv

Returns a new instance of Csv.



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/command/csv.rb', line 17

def initialize
  super("[optioins]")
  @opt.separator <<-EOS

  ・現在管理している小説の情報をCSV形式で出力したり、逆にインポートが出来ます
  ・インポートするCSVファイルには最低限 url というヘッダーが必要です

  Examples:
narou csv                 # CSV形式でそのまま表示
narou csv -o novels.csv   # novels.csv というファイル名で保存
narou csv -i novels.csv   # ファイルから小説をインポート

  Options:
  EOS
  @opt.on("-o", "--output FILE", "指定したファイル名で保存") { |filename|
    @options["filename"] = filename
    @mode = :output
  }
  @opt.on("-i", "--import FILE", "指定したファイルからインポート") { |filename|
    @options["filename"] = filename
    @mode = :import
  }
end

Class Method Details

.oneline_helpObject



13
14
15
# File 'lib/command/csv.rb', line 13

def self.oneline_help
  "小説リストをCSV形式で出力したりインポートしたりします"
end

Instance Method Details

#execute(argv) ⇒ Object



41
42
43
44
45
46
# File 'lib/command/csv.rb', line 41

def execute(argv)
  @mode = :output
  super

  self.__send__ @mode
end

#generateObject

小説の情報をCSV形式の文字列で取得



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/command/csv.rb', line 61

def generate
  database_values = Database.instance.get_object.values
  CSV.generate do |csv|
    csv << %w(id title author sitename url novel_type tags frozen last_update general_lastup)
    database_values.each do |data|
      tags = data["tags"] || []
      csv << [
        data["id"],
        data["title"],
        data["author"],
        data["sitename"],
        data["toc_url"],
        data["novel_type"] == 2 ? "短編" : "連載",
        tags.join(" "),
        Narou.novel_frozen?(data["id"]),
        data["last_update"].to_i,
        data["general_lastup"].to_i
      ]
    end
  end
end

#import(data = nil) ⇒ Object

CSV形式のファイルからインポートする header行にurlという項目が必要 data にはインポートしたいIOオブジェクトかCSV形式の文字列を指定。 nil なら –import オプションで指定されたファイルから入力



89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/command/csv.rb', line 89

def import(data = nil)
  if data
    source = data
  elsif @options["filename"]
    source = File.read(@options["filename"])
  else
    raise ArgumentError, "need a CSV data"
  end
  csv = CSV.new(source, headers: true, converters: :numeric, header_converters: :symbol)
  table = csv.read
  table[:url].each do |url|
    next unless url
    Download.execute!(url)
    Helper.print_horizontal_rule
  end
rescue CSV::MalformedCSVError => e
  puts "不正なCSVデータです(#{e.message})"
  exit Narou::EXIT_ERROR_CODE
end

#output(stream = nil) ⇒ Object

CSV形式で出力する stream には出力先のIOオブジェクトを指定。nilだったら$stdoutに出力



52
53
54
55
56
# File 'lib/command/csv.rb', line 52

def output(stream = nil)
  stream ||= @options["filename"] ? File.open(@options["filename"], "w:UTF-8") : $stdout
  stream.puts(generate)
  stream.close if @options["filename"]
end