diff options
author | Toshiaki Asai <toshi.alternative@gmail.com> | 2016-06-21 22:43:07 +0900 |
---|---|---|
committer | Toshiaki Asai <toshi.alternative@gmail.com> | 2016-06-21 22:43:07 +0900 |
commit | 68e18481d71b03b453cc1ebc432ac6f664f75da0 (patch) | |
tree | 26e5a00896825f5a3ba6f1d41485eb395fb8f400 | |
parent | 74aa1f677b761e44e42cb589502dd0eca968164d (diff) | |
download | mikutter-68e18481d71b03b453cc1ebc432ac6f664f75da0.tar.gz |
Retrieverの同一性判定にperma_linkを利用せず、uriを利用
perma_linkはWebに限った話なので、perma linkを持たないケースがあるので、
nilを返すことを許容。代わりに、Retriever::Modelは必ずuriメソッドを実装し
て、URIを返す
-rw-r--r-- | core/lib/retriever/model.rb | 38 | ||||
-rw-r--r-- | core/message.rb | 4 | ||||
-rw-r--r-- | core/mui/cairo_cell_renderer_message.rb | 6 | ||||
-rw-r--r-- | core/mui/cairo_inner_tl.rb | 40 | ||||
-rw-r--r-- | core/mui/cairo_timeline.rb | 2 | ||||
-rw-r--r-- | core/system/user.rb | 11 |
6 files changed, 76 insertions, 25 deletions
diff --git a/core/lib/retriever/model.rb b/core/lib/retriever/model.rb index 4aa048a4..f65ecd92 100644 --- a/core/lib/retriever/model.rb +++ b/core/lib/retriever/model.rb @@ -37,6 +37,20 @@ class Retriever::Model else raise ArgumentError.new("incorrect type #{hash.class} #{hash.inspect}") end end end + # Modelのインスタンスのuriスキーム。オーバライドして適切な値にする + # ==== Return + # [String] URIスキーム + memoize def scheme + self.to_s.split('::',2).first.gsub(/\W/,'').downcase.freeze + end + + # Modelのインスタンスのホスト名。オーバライドして適切な値にする + # ==== Return + # [String] ホスト名 + memoize def host + self.to_s.split('::',2).last.split('::').reverse.join('.').gsub(/[^\w\.]/,'').downcase.freeze + end + # モデルのキーを定義します。 # これを継承した実際のモデルから呼び出されることを想定しています def keys=(keys) @@ -114,6 +128,23 @@ class Retriever::Model self.class.store_datum(self) end + # このModelのパーマリンクを返す。 + # パーマリンクはWebのURLで、Web上のリソースでない場合はnilを返す。 + # ==== Return + # 次のいずれか + # [URI::HTTP] パーマリンク + # [nil] パーマリンクが存在しない + def perma_link + nil + end + + # このModelのURIを返す。 + # ==== Return + # [URI::Generic] パーマリンク + def uri + perma_link || URI::Generic.new(self.class.scheme,nil,self.class.host,nil,nil,path,nil,nil,nil) + end + def id @value[:id] end @@ -205,5 +236,12 @@ class Retriever::Model rescue Retriever::InvalidTypeError=>e raise Retriever::InvalidTypeError, e.to_s + "\nin #{datum.inspect} of #{key}" end } result end + + private + # URIがデフォルトで使うpath要素 + memoize def path + @path ||= "/#{SecureRandom.uuid}" + end + end diff --git a/core/message.rb b/core/message.rb index dd86d570..7941c460 100644 --- a/core/message.rb +++ b/core/message.rb @@ -582,7 +582,9 @@ class Message < Retriever::Model # このMessageのパーマリンクを取得する # ==== Return - # パーマリンクのURL(String)か、存在しない場合はnil + # 次のいずれか + # [URI] パーマリンク + # [nil] パーマリンクが存在しない def perma_link if not system? URI.parse("https://twitter.com/#{user[:idname]}/status/#{self[:id]}").freeze end end diff --git a/core/mui/cairo_cell_renderer_message.rb b/core/mui/cairo_cell_renderer_message.rb index 50bfeaa2..bc44d84d 100644 --- a/core/mui/cairo_cell_renderer_message.rb +++ b/core/mui/cairo_cell_renderer_message.rb @@ -7,7 +7,7 @@ require 'gtk2' module Gtk class CellRendererMessage < CellRendererPixbuf type_register - install_property(GLib::Param::String.new("perma_link", "perma_link", "resource perma link", "hoge", GLib::Param::READABLE|GLib::Param::WRITABLE)) + install_property(GLib::Param::String.new("uri", "uri", "Resource URI", "hoge", GLib::Param::READABLE|GLib::Param::WRITABLE)) attr_reader :message @@ -122,8 +122,8 @@ module Gtk Gdk::MiraclePainter.new(message, avail_width).set_tree(@tree) end - def perma_link=(perma_link) - record = @tree.get_record_by_perma_link(perma_link) + def uri=(uri) + record = @tree.get_record_by_uri(uri) if record and record.message return render_message(record.message) else diff --git a/core/mui/cairo_inner_tl.rb b/core/mui/cairo_inner_tl.rb index dde7f426..a464587a 100644 --- a/core/mui/cairo_inner_tl.rb +++ b/core/mui/cairo_inner_tl.rb @@ -15,9 +15,9 @@ class Gtk::TimeLine::InnerTL < Gtk::CRUD type_register('GtkInnerTL') # TLの値を返すときに使う - Record = Struct.new(:perma_link, :message, :order, :miracle_painter) + Record = Struct.new(:uri, :message, :order, :miracle_painter) - PERMA_LINK = 0 + URI = 0 MESSAGE = 1 ORDER = 2 MIRACLE_PAINTER = 3 @@ -53,7 +53,7 @@ class Gtk::TimeLine::InnerTL < Gtk::CRUD cell_renderer_message.tree = self cell_renderer_message }, - :kind => :perma_link, :widget => :text, :type => String, :label => ''}, + :kind => :uri, :widget => :text, :type => String, :label => ''}, {:kind => :text, :widget => :text, :type => Message}, {:kind => :text, :type => Integer}, {:kind => :text, :type => Object} @@ -147,11 +147,11 @@ class Gtk::TimeLine::InnerTL < Gtk::CRUD # _message_ に対応する値の構造体を返す。なければnilを返す。 def get_record_by_message(message) - get_record_by_perma_link(message.perma_link.to_s) end + get_record_by_uri(message.uri.to_s) end # _message_ に対応する値の構造体を返す。なければnilを返す。 - def get_record_by_perma_link(perma_link) - path = get_path_and_iter_by_perma_link(perma_link)[1] + def get_record_by_uri(uri) + path = get_path_and_iter_by_uri(uri)[1] if path get_record(path) end end @@ -167,7 +167,7 @@ class Gtk::TimeLine::InnerTL < Gtk::CRUD # ==== Return # 含まれていれば真 def include?(message) - @iter_dict.has_key?(message.perma_link.to_s) end + @iter_dict.has_key?(message.uri.to_s) end # Gtk::TreeIterの対を再利用できるように登録しておく # ==== Args @@ -175,12 +175,12 @@ class Gtk::TimeLine::InnerTL < Gtk::CRUD # ==== Return # self def set_iter_dict(iter) - perma_link = iter[PERMA_LINK] - if not @iter_dict.has_key?(perma_link) - @iter_dict[perma_link] = iter + uri = iter[URI] + if not @iter_dict.has_key?(uri) + @iter_dict[uri] = iter iters = @iter_dict iter[MIRACLE_PAINTER].signal_connect(:destroy) { - iters.delete(perma_link) + iters.delete(uri) false } end self end @@ -203,7 +203,7 @@ class Gtk::TimeLine::InnerTL < Gtk::CRUD from.extended from.model.each{ |from_model, from_path, from_iter| iter = model.append - iter[PERMA_LINK] = from_iter[PERMA_LINK] + iter[URI] = from_iter[URI] iter[MESSAGE] = from_iter[MESSAGE] iter[ORDER] = from_iter[ORDER] iter[MIRACLE_PAINTER] = from_iter[MIRACLE_PAINTER].set_tree(self) @@ -226,20 +226,20 @@ class Gtk::TimeLine::InnerTL < Gtk::CRUD get_path_and_iter_by_message(message)[2] end # _message_ に対応する Gtk::TreeIter を返す。なければnilを返す。 - def get_iter_by_perma_link(perma_link) - get_path_and_iter_by_perma_link(perma_link)[2] end + def get_iter_by_uri(uri) + get_path_and_iter_by_uri(uri)[2] end # _message_ から [model, path, iter] の配列を返す。見つからなかった場合は空の配列を返す。 def get_path_and_iter_by_message(message) - get_path_and_iter_by_perma_link(message.perma_link.to_s) end + get_path_and_iter_by_uri(message.uri.to_s) end - def get_path_and_iter_by_perma_link(perma_link) - perma_link = perma_link.to_s - iter = @iter_dict[perma_link] + def get_path_and_iter_by_uri(uri) + uri = uri.to_s + iter = @iter_dict[uri] if iter if iter[MIRACLE_PAINTER].destroyed? - warn "destroyed miracle painter in cache (##{perma_link})" - @iter_dict.delete(perma_link) + warn "destroyed miracle painter in cache (##{uri})" + @iter_dict.delete(uri) [] else [model, iter.path, iter] end diff --git a/core/mui/cairo_timeline.rb b/core/mui/cairo_timeline.rb index b657d405..072b5924 100644 --- a/core/mui/cairo_timeline.rb +++ b/core/mui/cairo_timeline.rb @@ -161,7 +161,7 @@ class Gtk::TimeLine scroll_to_zero_lator! if @tl.realized? and @tl.vadjustment.value == 0.0 miracle_painter = @tl.cell_renderer_message.create_miracle_painter(message) iter = @tl.model.append - iter[Gtk::TimeLine::InnerTL::PERMA_LINK] = message.perma_link.to_s + iter[Gtk::TimeLine::InnerTL::URI] = message.uri.to_s iter[Gtk::TimeLine::InnerTL::MESSAGE] = message iter[Gtk::TimeLine::InnerTL::ORDER] = get_order(message) iter[Gtk::TimeLine::InnerTL::MIRACLE_PAINTER] = miracle_painter diff --git a/core/system/user.rb b/core/system/user.rb index 70873e2d..3f3b8e79 100644 --- a/core/system/user.rb +++ b/core/system/user.rb @@ -20,4 +20,15 @@ class Mikutter::System::User < Retriever::Model def system? true end + def idname + self[:idname] + end + end + + + + + + + |