aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorToshiaki Asai <toshi.alternative@gmail.com>2016-06-21 22:43:07 +0900
committerToshiaki Asai <toshi.alternative@gmail.com>2016-06-21 22:43:07 +0900
commit68e18481d71b03b453cc1ebc432ac6f664f75da0 (patch)
tree26e5a00896825f5a3ba6f1d41485eb395fb8f400
parent74aa1f677b761e44e42cb589502dd0eca968164d (diff)
downloadmikutter-68e18481d71b03b453cc1ebc432ac6f664f75da0.tar.gz
Retrieverの同一性判定にperma_linkを利用せず、uriを利用
perma_linkはWebに限った話なので、perma linkを持たないケースがあるので、 nilを返すことを許容。代わりに、Retriever::Modelは必ずuriメソッドを実装し て、URIを返す
-rw-r--r--core/lib/retriever/model.rb38
-rw-r--r--core/message.rb4
-rw-r--r--core/mui/cairo_cell_renderer_message.rb6
-rw-r--r--core/mui/cairo_inner_tl.rb40
-rw-r--r--core/mui/cairo_timeline.rb2
-rw-r--r--core/system/user.rb11
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
+
+
+
+
+
+
+