livejournal 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -1
- data/lib/livejournal/database.rb +17 -17
- data/lib/livejournal/entry.rb +13 -10
- data/lib/livejournal/friends.rb +25 -4
- data/test/comments-xml.rb +2 -0
- data/test/database.rb +1 -1
- data/test/roundtrip.rb +6 -5
- metadata +2 -2
data/Rakefile
CHANGED
data/lib/livejournal/database.rb
CHANGED
@@ -27,24 +27,24 @@
|
|
27
27
|
require 'sqlite3'
|
28
28
|
|
29
29
|
module LiveJournal
|
30
|
-
class DatabaseError < RuntimeError; end
|
31
|
-
|
32
30
|
# An interface for an SQLite database dump.
|
33
31
|
class Database
|
34
|
-
|
32
|
+
class Error < RuntimeError; end
|
33
|
+
|
34
|
+
EXPECTED_DATABASE_VERSION = "3"
|
35
35
|
SCHEMA = %q{
|
36
36
|
CREATE TABLE meta (
|
37
37
|
key TEXT PRIMARY KEY,
|
38
|
-
value TEXT
|
38
|
+
value TEXT
|
39
39
|
);
|
40
40
|
CREATE TABLE entry (
|
41
41
|
itemid INTEGER PRIMARY KEY,
|
42
42
|
anum INTEGER,
|
43
43
|
subject TEXT,
|
44
44
|
event TEXT,
|
45
|
-
moodid INTEGER, mood TEXT, music TEXT, taglist TEXT,
|
46
|
-
pickeyword TEXT, preformatted INTEGER, backdated INTEGER,
|
47
|
-
comments INTEGER, year INTEGER, month INTEGER, day INTEGER,
|
45
|
+
moodid INTEGER, mood TEXT, music TEXT, location TEXT, taglist TEXT,
|
46
|
+
pickeyword TEXT, preformatted INTEGER, backdated INTEGER,
|
47
|
+
comments INTEGER, year INTEGER, month INTEGER, day INTEGER,
|
48
48
|
timestamp INTEGER, security INTEGER
|
49
49
|
);
|
50
50
|
CREATE INDEX dateindex ON entry (year, month, day);
|
@@ -92,7 +92,7 @@ module LiveJournal
|
|
92
92
|
# Existing database!
|
93
93
|
version = self.version
|
94
94
|
unless version == EXPECTED_DATABASE_VERSION
|
95
|
-
raise
|
95
|
+
raise Error, "Database version mismatch -- db has #{version.inspect}, expected #{EXPECTED_DATABASE_VERSION.inspect}"
|
96
96
|
end
|
97
97
|
end
|
98
98
|
|
@@ -178,7 +178,7 @@ module LiveJournal
|
|
178
178
|
|
179
179
|
# Store an Entry.
|
180
180
|
def store_entry entry
|
181
|
-
sql = 'INSERT OR REPLACE INTO entry VALUES (' + ("?, " *
|
181
|
+
sql = 'INSERT OR REPLACE INTO entry VALUES (' + ("?, " * 17) + '?)'
|
182
182
|
@db.execute(sql, *entry.to_database_row)
|
183
183
|
end
|
184
184
|
|
@@ -244,19 +244,19 @@ module LiveJournal
|
|
244
244
|
@itemid, @anum = row[0].to_i, row[1].to_i
|
245
245
|
@subject, @event = row[2], row[3]
|
246
246
|
@moodid, @mood = row[4].nil? ? nil : row[4].to_i, row[5]
|
247
|
-
@music, @taglist, @pickeyword = row[6], row[7], row[8]
|
247
|
+
@music, @location, @taglist, @pickeyword = row[6], row[7], row[8], row[9]
|
248
248
|
@taglist = if @taglist then @taglist.split(/, /) else [] end
|
249
|
-
@preformatted, @backdated = !row[
|
250
|
-
@comments = case Database::optional_to_i(row[
|
249
|
+
@preformatted, @backdated = !row[10].nil?, !row[11].nil?
|
250
|
+
@comments = case Database::optional_to_i(row[12])
|
251
251
|
when nil; :normal
|
252
252
|
when 1; :none
|
253
253
|
when 2; :noemail
|
254
|
-
else raise
|
254
|
+
else raise Database::Error, "Bad comments value: #{row[12].inspect}"
|
255
255
|
end
|
256
256
|
|
257
|
-
@time = Time.at(row[
|
257
|
+
@time = Time.at(row[16].to_i).utc
|
258
258
|
|
259
|
-
case Database::optional_to_i(row[
|
259
|
+
case Database::optional_to_i(row[17])
|
260
260
|
when nil
|
261
261
|
@security = :public
|
262
262
|
when 0
|
@@ -265,7 +265,7 @@ module LiveJournal
|
|
265
265
|
@security = :friends
|
266
266
|
else
|
267
267
|
@security = :custom
|
268
|
-
@allowmask = row[
|
268
|
+
@allowmask = row[17]
|
269
269
|
end
|
270
270
|
|
271
271
|
self
|
@@ -283,7 +283,7 @@ module LiveJournal
|
|
283
283
|
when :custom; @allowmask
|
284
284
|
end
|
285
285
|
[@itemid, @anum, @subject, @event,
|
286
|
-
@moodid, @mood, @music, @taglist.join(', '), @pickeyword,
|
286
|
+
@moodid, @mood, @music, @location, @taglist.join(', '), @pickeyword,
|
287
287
|
@preformatted ? 1 : nil, @backdated ? 1 : nil, comments,
|
288
288
|
@time.year, @time.mon, @time.day, @time.to_i, security]
|
289
289
|
end
|
data/lib/livejournal/entry.rb
CHANGED
@@ -46,7 +46,8 @@ module LiveJournal
|
|
46
46
|
|
47
47
|
class Entry
|
48
48
|
attr_accessor :itemid, :anum, :subject, :event, :moodid, :mood
|
49
|
-
attr_accessor :music, :
|
49
|
+
attr_accessor :music, :location, :taglist, :pickeyword
|
50
|
+
attr_accessor :preformatted, :backdated
|
50
51
|
attr_accessor :comments # values: {:normal, :none, :noemail}
|
51
52
|
attr_reader :time # a Ruby Time object
|
52
53
|
attr_accessor :security # values: {:public, :private, :friends, :custom}
|
@@ -60,6 +61,7 @@ module LiveJournal
|
|
60
61
|
@moodid = nil
|
61
62
|
@mood = nil
|
62
63
|
@music = nil
|
64
|
+
@location = nil
|
63
65
|
@taglist = []
|
64
66
|
@pickeyword = nil
|
65
67
|
@preformatted = false
|
@@ -72,23 +74,21 @@ module LiveJournal
|
|
72
74
|
@props = {}
|
73
75
|
end
|
74
76
|
|
75
|
-
def
|
76
|
-
[:subject, :event, :moodid,
|
77
|
-
:
|
77
|
+
def equivalent_to?(other)
|
78
|
+
[:subject, :event, :moodid,
|
79
|
+
:mood, :music, :location, :taglist, :pickeyword,
|
80
|
+
:preformatted, :backdated, :comments, :time, :security, :allowmask,
|
78
81
|
:screening, :props].each do |attr|
|
79
82
|
return false if send(attr) != other.send(attr)
|
80
83
|
end
|
81
|
-
# compare time fields one-by-one because livejournal ignores the
|
82
|
-
# "seconds" field.
|
83
|
-
[:year, :mon, :day, :hour, :min, :zone].each do |attr|
|
84
|
-
return false if @time.send(attr) != other.time.send(attr)
|
85
|
-
end
|
86
84
|
return true
|
87
85
|
end
|
88
86
|
|
89
87
|
def time=(time)
|
90
88
|
raise RuntimeError, "Must use GMT times everywhere to reduce confusion. See LiveJournal::coerce_gmt for details." unless time.gmt?
|
91
|
-
|
89
|
+
components = time.to_a
|
90
|
+
components[0] = 0 # set seconds to zero
|
91
|
+
@time = Time.gm *components
|
92
92
|
end
|
93
93
|
|
94
94
|
def from_request(req)
|
@@ -123,6 +123,8 @@ module LiveJournal
|
|
123
123
|
@moodid = value.to_i
|
124
124
|
when 'current_music'
|
125
125
|
@music = value
|
126
|
+
when 'current_location'
|
127
|
+
@location = value
|
126
128
|
when 'taglist'
|
127
129
|
@taglist = value.split(/, /).sort
|
128
130
|
when 'picture_keyword'
|
@@ -213,6 +215,7 @@ module LiveJournal
|
|
213
215
|
{ 'current_mood' => self.mood,
|
214
216
|
'current_moodid' => self.moodid,
|
215
217
|
'current_music' => self.music,
|
218
|
+
'current_location' => self.location,
|
216
219
|
'picture_keyword' => self.pickeyword,
|
217
220
|
'taglist' => self.taglist.join(', '),
|
218
221
|
'opt_preformatted' => self.preformatted ? 1 : 0,
|
data/lib/livejournal/friends.rb
CHANGED
@@ -29,7 +29,12 @@ module LiveJournal
|
|
29
29
|
# See LiveJournal::Request::Friends to get an array of these.
|
30
30
|
class Friend
|
31
31
|
attr_accessor :username, :fullname
|
32
|
-
|
32
|
+
# as HTML color, like '#ff0000'
|
33
|
+
attr_accessor :background, :foreground
|
34
|
+
# bitfield of friend groups this friend is a member of
|
35
|
+
attr_accessor :groupmask
|
36
|
+
# friend type. possible values: :community, :news, :syndicated, :shared, :user
|
37
|
+
attr_accessor :type
|
33
38
|
def initialize
|
34
39
|
@username = nil
|
35
40
|
@fullname = nil
|
@@ -44,7 +49,16 @@ module LiveJournal
|
|
44
49
|
@foreground = req['fg']
|
45
50
|
@background = req['bg']
|
46
51
|
@groupmask = req['groupmask']
|
47
|
-
@type =
|
52
|
+
@type =
|
53
|
+
case req['type']
|
54
|
+
when 'community'; :community
|
55
|
+
when 'news'; :news
|
56
|
+
when 'syndicated'; :syndicated
|
57
|
+
when 'shared'; :shared
|
58
|
+
when nil; :user
|
59
|
+
else raise LiveJournal::Request::ProtocolException.new(
|
60
|
+
"unknown friend type: #{req['type']}")
|
61
|
+
end
|
48
62
|
self
|
49
63
|
end
|
50
64
|
def to_s
|
@@ -54,18 +68,25 @@ module LiveJournal
|
|
54
68
|
|
55
69
|
module Request
|
56
70
|
class Friends < Req
|
57
|
-
attr_reader :friends
|
58
|
-
|
71
|
+
attr_reader :friends, :friendofs
|
72
|
+
# Allowed options:
|
73
|
+
# :include_friendofs => true:: also fill out @friendofs in single request
|
74
|
+
def initialize(user, opts={})
|
59
75
|
super(user, 'getfriends')
|
60
76
|
@friends = nil
|
77
|
+
@friendofs = nil
|
78
|
+
@request['includefriendof'] = true if opts.has_key? :include_friendofs
|
61
79
|
end
|
62
80
|
# Returns an array of LiveJournal::Friend.
|
63
81
|
def run
|
64
82
|
super
|
65
83
|
@friends = build_array('friend') { |r| Friend.new.from_request(r) }
|
84
|
+
@friendofs = build_array('friendof') { |r| Friend.new.from_request(r) }
|
66
85
|
@friends
|
67
86
|
end
|
68
87
|
end
|
88
|
+
|
89
|
+
# See Friends to fetch both friends and friend-ofs in one request.
|
69
90
|
class FriendOfs < Req
|
70
91
|
attr_reader :friendofs
|
71
92
|
def initialize(user)
|
data/test/comments-xml.rb
CHANGED
data/test/database.rb
CHANGED
data/test/roundtrip.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
#!/usr/bin/ruby
|
2
2
|
|
3
|
-
|
3
|
+
$:.unshift '../lib'
|
4
|
+
|
4
5
|
require 'livejournal/entry'
|
5
6
|
require 'test/unit'
|
6
7
|
|
@@ -15,10 +16,9 @@ class TC_RoundTrip < Test::Unit::TestCase
|
|
15
16
|
postevent = Request::PostEvent.new(@user, entry)
|
16
17
|
postevent.run
|
17
18
|
|
18
|
-
getevents = Request::GetEvents.new(@user,
|
19
|
-
:itemid => entry.itemid)
|
19
|
+
getevents = Request::GetEvents.new(@user, :itemid => entry.itemid)
|
20
20
|
new_entry = getevents.run
|
21
|
-
|
21
|
+
assert(entry.equivalent_to?(new_entry), "#{entry.inspect}\n=>\n#{new_entry.inspect}")
|
22
22
|
|
23
23
|
delete = Request::EditEvent.new(@user, entry, :delete => true)
|
24
24
|
delete.run
|
@@ -27,7 +27,7 @@ class TC_RoundTrip < Test::Unit::TestCase
|
|
27
27
|
def test_roundtrip
|
28
28
|
e = Entry.new
|
29
29
|
e.subject = 'subject'
|
30
|
-
e.event = 'event here'
|
30
|
+
e.event = 'event here ' + Time.now.to_s
|
31
31
|
e.time = LiveJournal::coerce_gmt Time.now
|
32
32
|
roundtrip e
|
33
33
|
|
@@ -38,6 +38,7 @@ class TC_RoundTrip < Test::Unit::TestCase
|
|
38
38
|
e.comments = :noemail
|
39
39
|
e.preformatted = true
|
40
40
|
e.security = :friends
|
41
|
+
e.location = "test"
|
41
42
|
roundtrip e
|
42
43
|
end
|
43
44
|
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: livejournal
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.
|
7
|
-
date: 2006-
|
6
|
+
version: 0.3.0
|
7
|
+
date: 2006-07-25 00:00:00 +09:00
|
8
8
|
summary: module for interacting with livejournal
|
9
9
|
require_paths:
|
10
10
|
- lib
|