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 を指定しなかった場合、全てのキャッシュを削除する
454 455 456 457 458 459 460 461 462 463 464 465 |
# File 'lib/helper.rb', line 454 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オブジェクトが生成されるため、 同一性判定のために「どのソース」の「何行目」かで判定を行う
444 445 446 447 |
# File 'lib/helper.rb', line 444 def generate_key(fullpath, block) src, line = block.source_location "#{fullpath}:#{src}:#{line}" end |
.load(path, options = DEFAULT_OPTIONS) ⇒ Object
ファイルの更新時刻を考慮してファイルのデータを取得する。 前回取得した時からファイルが変更されていない場合は、キャッシュを返す
options にはファイルを読み込む時に File.read に渡すオプションを指定できる
395 396 397 398 399 400 401 402 403 404 405 406 407 |
# File 'lib/helper.rb', line 395 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
422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 |
# File 'lib/helper.rb', line 422 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 |