Module: QueryStream::DataResolver

Defined in:
lib/query_stream/data_resolver.rb

Overview

データファイル探索・読み込みモジュール

Constant Summary collapse

EXTENSIONS =

サポートする拡張子(優先順位順)

%w[.yml .yaml .json].freeze

Class Method Summary collapse

Class Method Details

.find_with_extensions(base_name, data_dir) ⇒ String?

指定名ですべての拡張子を試行する

Parameters:

  • base_name (String)

    拡張子なしファイル名

  • data_dir (String)

    データディレクトリ

Returns:

  • (String, nil)

    見つかったファイルパス、または nil



65
66
67
68
69
70
71
# File 'lib/query_stream/data_resolver.rb', line 65

def find_with_extensions(base_name, data_dir)
  EXTENSIONS.each do |ext|
    path = File.join(data_dir, "#{base_name}#{ext}")
    return path if File.exist?(path)
  end
  nil
end

.load_records(file_path) ⇒ Array<Hash>

レコード群をファイルから読み込む

Parameters:

  • file_path (String)

    データファイルパス

Returns:

  • (Array<Hash>)

    レコード群(シンボルキー)



49
50
51
52
53
54
55
56
57
58
59
# File 'lib/query_stream/data_resolver.rb', line 49

def load_records(file_path)
  records = case File.extname(file_path).downcase
            when '.json'
              JSON.parse(File.read(file_path, encoding: 'utf-8'), symbolize_names: true)
            else
              YAML.load_file(file_path, symbolize_names: true)
            end

  records = [records] if records.is_a?(Hash)
  records
end

.resolve(source_name, data_dir) ⇒ String?

データファイルのパスを解決する指定名そのまま → 複数形(末尾に s を付与)→ 単数形の順で探索する

Parameters:

  • source_name (String)

    データ名(単数形または複数形)

  • data_dir (String)

    データディレクトリ

Returns:

  • (String, nil)

    見つかったファイルパス、または nil



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/query_stream/data_resolver.rb', line 27

def resolve(source_name, data_dir)
  # そのまま試行
  found = find_with_extensions(source_name, data_dir)
  return found if found

  # 複数形を試行(単数形→複数形: book → books)
  found = find_with_extensions("#{source_name}s", data_dir)
  return found if found

  # 単数形を試行(複数形→単数形: books → book)
  singular = Singularize.call(source_name)
  if singular != source_name
    found = find_with_extensions(singular, data_dir)
    return found if found
  end

  nil
end