Module: Helper::CacheLoader
- Defined in:
- lib/helper.rb
Overview
更新時刻を考慮したファイルのローダー
Constant Summary collapse
- DEFAULT_OPTIONS =
{ mode: "r:BOM|UTF-8" }
- @@mutex =
Mutex.new
- @@caches =
{}
- @@result_caches =
{}
Class Method Summary collapse
-
.clear(path = nil) ⇒ Object
指定したファイルのキャッシュを削除する.
-
.generate_key(fullpath, block) ⇒ Object
キャッシュを格納する際に必要なキーを生成する.
-
.load(path, options = DEFAULT_OPTIONS) ⇒ Object
ファイルの更新時刻を考慮してファイルのデータを取得する。 前回取得した時からファイルが変更されていない場合は、キャッシュを返す.
-
.memo(path, options = DEFAULT_OPTIONS, &block) ⇒ Object
ファイルを処理するブロックの結果をキャッシュ化する.
Class Method Details
.clear(path = nil) ⇒ Object
指定したファイルのキャッシュを削除する
path を指定しなかった場合、全てのキャッシュを削除する
521 522 523 524 525 526 527 528 529 530 531 532 |
# File 'lib/helper.rb', line 521 def clear(path = nil) @@mutex.synchronize do if path fullpath = File.(path) @@cache.delete(fullpath) @@result_caches.delete(fullpath) else @@cache.clear @@result_caches.clear end end end |
.generate_key(fullpath, block) ⇒ Object
キャッシュを格納する際に必要なキーを生成する
ブロックはその場所が実行されるたびに違うprocオブジェクトが生成されるため、 同一性判定のために「どのソース」の「何行目」かで判定を行う
511 512 513 514 |
# File 'lib/helper.rb', line 511 def generate_key(fullpath, block) src, line = block.source_location "#{fullpath}:#{src}:#{line}" end |
.load(path, options = DEFAULT_OPTIONS) ⇒ Object
ファイルの更新時刻を考慮してファイルのデータを取得する。 前回取得した時からファイルが変更されていない場合は、キャッシュを返す
options にはファイルを読み込む時に File.read に渡すオプションを指定できる
462 463 464 465 466 467 468 469 470 471 472 473 474 |
# File 'lib/helper.rb', line 462 def load(path, = DEFAULT_OPTIONS) @@mutex.synchronize do fullpath = File.(path) cache_data = @@caches[fullpath] if Helper.file_latest?(fullpath) || !cache_data body = File.read(fullpath, **) @@caches[fullpath] = body return body else return cache_data end end end |
.memo(path, options = DEFAULT_OPTIONS, &block) ⇒ Object
ファイルを処理するブロックの結果をキャッシュ化する
CacheLoader.load がファイルの中身だけをキャッシュ化するのに対して これはブロックの結果をキャッシュする。ファイルが更新されない限り、 ブロックの結果は変わらない
ex.) Helper::CacheLoader.memo(“filepath”) do |data|
# data に関する処理
result # ここで nil を返すと次回も再度読み込まれる
end
489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 |
# File 'lib/helper.rb', line 489 def memo(path, = DEFAULT_OPTIONS, &block) @@mutex.synchronize do fail ArgumentError, "need a block" unless block fullpath = File.(path) key = generate_key(fullpath, block) cache = @@result_caches[key] if Helper.file_latest?(fullpath) || !cache data = File.read(fullpath, **) @@result_caches[key] = result = block.call(data) return result else return cache end end end |