Class: Vivlio::Starter::CLI::ReviewQueueManager

Inherits:
Object
  • Object
show all
Defined in:
lib/vivlio/starter/cli/index/review_queue_manager.rb

Constant Summary collapse

QUEUE_FILE =
'config/index_review_queue.yml'
REJECTED_FILE =
'config/index_glossary_rejected.yml'

Instance Method Summary collapse

Constructor Details

#initializeReviewQueueManager

Returns a new instance of ReviewQueueManager.



30
31
32
33
# File 'lib/vivlio/starter/cli/index/review_queue_manager.rb', line 30

def initialize
  @queue_cache = nil
  @rejected_cache = nil
end

Instance Method Details

#clear_cache!Object

キャッシュをクリア



228
229
230
231
# File 'lib/vivlio/starter/cli/index/review_queue_manager.rb', line 228

def clear_cache!
  @queue_cache = nil
  @rejected_cache = nil
end

#clear_terms(term_names) ⇒ Object

指定した用語をキューから削除

Parameters:

  • term_names (Array<String>)

    削除する用語名のリスト



73
74
75
76
77
# File 'lib/vivlio/starter/cli/index/review_queue_manager.rb', line 73

def clear_terms(term_names)
  queue = load_queue
  remaining = queue.reject { |c| term_names.include?(c['term']) }
  save_queue(remaining)
end

#list_rejected_termsObject

リジェクト済み候補の一覧表示



149
150
151
152
153
154
155
156
157
158
159
160
161
# File 'lib/vivlio/starter/cli/index/review_queue_manager.rb', line 149

def list_rejected_terms
  rejected = 

  if rejected.empty?
    Common.log_info('リジェクト済み候補はありません')
    return
  end

  Common.log_always "\nリジェクト済み候補:"
  rejected.each_with_index do |term, idx|
    Common.log_always "#{idx + 1}. #{term['term']} (#{term['yomi']})"
  end
end

#load_queueArray<Hash>

レビューキューを読み込み

Returns:

  • (Array<Hash>)

    候補のリスト



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/vivlio/starter/cli/index/review_queue_manager.rb', line 52

def load_queue
  return @queue_cache if @queue_cache

  unless File.exist?(QUEUE_FILE)
    @queue_cache = []
    return @queue_cache
  end

  begin
    data = YAML.load_file(QUEUE_FILE)
    @queue_cache = data['candidates'] || []
  rescue StandardError => e
    Common.log_warn("#{QUEUE_FILE} の読み込みに失敗しました: #{e.message}")
    @queue_cache = []
  end

  @queue_cache
end

#load_rejected_termsArray<String>

リジェクト済み用語名のリストを取得

Returns:

  • (Array<String>)

    用語名のリスト



123
124
125
# File 'lib/vivlio/starter/cli/index/review_queue_manager.rb', line 123

def load_rejected_terms
  .map { |t| t['term'] }
end

#load_rejected_terms_with_metadataArray<Hash>

リジェクト済み候補(メタデータ付き)を取得

Returns:

  • (Array<Hash>)

    リジェクト済み候補のリスト



129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# File 'lib/vivlio/starter/cli/index/review_queue_manager.rb', line 129

def 
  return @rejected_cache if @rejected_cache

  unless File.exist?(REJECTED_FILE)
    @rejected_cache = []
    return @rejected_cache
  end

  begin
    data = YAML.load_file(REJECTED_FILE)
    @rejected_cache = data['rejected_terms'] || []
  rescue StandardError => e
    Common.log_warn("#{REJECTED_FILE} の読み込みに失敗しました: #{e.message}")
    @rejected_cache = []
  end

  @rejected_cache
end

#rejected_countInteger

リジェクト済み候補の件数

Returns:

  • (Integer)

    件数



223
224
225
# File 'lib/vivlio/starter/cli/index/review_queue_manager.rb', line 223

def rejected_count
  load_rejected_terms.size
end

#reset_rejected!Object

リジェクト履歴を全てクリア



197
198
199
200
201
202
203
204
205
206
# File 'lib/vivlio/starter/cli/index/review_queue_manager.rb', line 197

def reset_rejected!
  unless File.exist?(REJECTED_FILE)
    Common.log_info('リジェクト済み候補はありません')
    return
  end

  FileUtils.rm_f(REJECTED_FILE)
  @rejected_cache = nil
  Common.log_success('リジェクト履歴をクリアしました')
end

#save_queue(candidates) ⇒ Object

レビューキューを保存

Parameters:

  • candidates (Array<Hash>)

    候補のリスト



37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/vivlio/starter/cli/index/review_queue_manager.rb', line 37

def save_queue(candidates)
  FileUtils.mkdir_p(File.dirname(QUEUE_FILE))

  data = {
    'generated_at' => Time.now.strftime('%Y-%m-%d %H:%M:%S'),
    'pending_count' => candidates.size,
    'candidates' => candidates
  }
  File.write(QUEUE_FILE, data.to_yaml, encoding: 'utf-8')

  @queue_cache = candidates
end

#save_rejected_terms(rejected_terms) ⇒ Object

リジェクト済み候補を保存

Parameters:

  • rejected_terms (Array<Hash>)

    リジェクトする用語のリスト



81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/vivlio/starter/cli/index/review_queue_manager.rb', line 81

def save_rejected_terms(rejected_terms)
  return if rejected_terms.nil? || rejected_terms.empty?

  FileUtils.mkdir_p(File.dirname(REJECTED_FILE))

  # 既存のリジェクト済みリストを読み込み
  existing = 

  # 新規リジェクトを追加(スコア・文脈も保存)
  rejected_terms.each do |term|
    term_name = term['term'] || term[:term]
    next if term_name.nil? || term_name.empty?

    next if existing.any? { |t| t['term'] == term_name }

    entry = {
      'term' => term_name,
      'yomi' => term['yomi'] || term[:yomi] || term_name,
      'rejected_at' => Time.now.strftime('%Y-%m-%d %H:%M:%S')
    }
    # スコアがあれば保存
    score = term['score'] || term[:score]
    entry['score'] = score if score
    # 文脈があれば保存
    contexts = term['contexts'] || term[:contexts]
    entry['contexts'] = contexts if contexts&.any?

    existing << entry
  end

  # 保存
  data = {
    'rejected_at' => Time.now.strftime('%Y-%m-%d %H:%M:%S'),
    'rejected_terms' => existing
  }
  File.write(REJECTED_FILE, data.to_yaml, encoding: 'utf-8')

  @rejected_cache = nil # キャッシュをクリア
end

#unreject_term!(term_or_number) ⇒ Boolean

リジェクト解除

Parameters:

  • term_or_number (String)

    用語名または番号

Returns:

  • (Boolean)

    成功したか



166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
# File 'lib/vivlio/starter/cli/index/review_queue_manager.rb', line 166

def unreject_term!(term_or_number)
  rejected = 

  if rejected.empty?
    Common.log_warn('リジェクト済み候補がありません')
    return false
  end

  # 番号または用語名で検索
  target = if term_or_number.match?(/^\d+$/)
             idx = term_or_number.to_i - 1
             idx >= 0 && idx < rejected.size ? rejected[idx] : nil
           else
             rejected.find { |t| t['term'] == term_or_number }
           end

  unless target
    Common.log_error("#{term_or_number}」が見つかりません")
    return false
  end

  # リジェクトリストから削除
  rejected.delete(target)
  save_rejected_terms_data(rejected)

  Common.log_success("#{target['term']}」をリジェクトから解除しました")
  Common.log_info('次回の vs index:auto で再び候補として表示されます')
  true
end

#unreject_term_by_name!(term_name) ⇒ Boolean

用語名でリジェクト解除(内部用)

Parameters:

  • term_name (String)

    用語名

Returns:

  • (Boolean)

    成功したか



211
212
213
214
215
216
217
218
219
# File 'lib/vivlio/starter/cli/index/review_queue_manager.rb', line 211

def unreject_term_by_name!(term_name)
  rejected = 
  target = rejected.find { |t| t['term'] == term_name }
  return false unless target

  rejected.delete(target)
  save_rejected_terms_data(rejected)
  true
end