tumblrb 1.0.6 → 2.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.rvmrc +1 -0
- data/Gemfile +6 -3
- data/Gemfile.lock +46 -0
- data/README.mkd +51 -21
- data/lib/tumblr.rb +27 -26
- data/lib/tumblr/api.rb +49 -0
- data/lib/tumblr/blog.rb +97 -0
- data/lib/tumblr/config.rb +25 -0
- data/lib/tumblr/middleware/params.rb +10 -0
- data/lib/tumblr/middleware/parsing.rb +34 -0
- data/lib/tumblr/object.rb +172 -0
- data/lib/tumblr/objects/answer.rb +5 -0
- data/lib/tumblr/objects/audio.rb +6 -0
- data/lib/tumblr/objects/chat.rb +10 -0
- data/lib/tumblr/objects/link.rb +5 -0
- data/lib/tumblr/objects/photo.rb +22 -0
- data/lib/tumblr/objects/post.rb +89 -0
- data/lib/tumblr/objects/text.rb +5 -0
- data/lib/tumblr/objects/user.rb +7 -0
- data/lib/tumblr/objects/video.rb +11 -0
- data/lib/tumblr/query.rb +48 -0
- data/lib/tumblr/quote.rb +2 -18
- data/lib/tumblr/version.rb +1 -1
- data/tumblrb.gemspec +13 -25
- metadata +54 -25
- data/lib/tumblr/answer.rb +0 -21
- data/lib/tumblr/audio.rb +0 -21
- data/lib/tumblr/conversation.rb +0 -35
- data/lib/tumblr/item.rb +0 -110
- data/lib/tumblr/link.rb +0 -21
- data/lib/tumblr/page.rb +0 -39
- data/lib/tumblr/photo.rb +0 -37
- data/lib/tumblr/regular.rb +0 -21
- data/lib/tumblr/user.rb +0 -11
- data/lib/tumblr/video.rb +0 -23
metadata
CHANGED
@@ -2,15 +2,15 @@
|
|
2
2
|
name: tumblrb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version:
|
5
|
+
version: 2.0.1
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
|
-
-
|
8
|
+
- thegorgon
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-10-
|
13
|
+
date: 2011-10-25 00:00:00 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activesupport
|
@@ -24,25 +24,25 @@ dependencies:
|
|
24
24
|
type: :runtime
|
25
25
|
version_requirements: *id001
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
|
-
name:
|
27
|
+
name: json
|
28
28
|
prerelease: false
|
29
29
|
requirement: &id002 !ruby/object:Gem::Requirement
|
30
30
|
none: false
|
31
31
|
requirements:
|
32
32
|
- - ~>
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version: 1.
|
34
|
+
version: 1.6.0
|
35
35
|
type: :runtime
|
36
36
|
version_requirements: *id002
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
|
-
name:
|
38
|
+
name: faraday
|
39
39
|
prerelease: false
|
40
40
|
requirement: &id003 !ruby/object:Gem::Requirement
|
41
41
|
none: false
|
42
42
|
requirements:
|
43
43
|
- - ~>
|
44
44
|
- !ruby/object:Gem::Version
|
45
|
-
version: 0.7.
|
45
|
+
version: 0.7.5
|
46
46
|
type: :runtime
|
47
47
|
version_requirements: *id003
|
48
48
|
- !ruby/object:Gem::Dependency
|
@@ -51,12 +51,34 @@ dependencies:
|
|
51
51
|
requirement: &id004 !ruby/object:Gem::Requirement
|
52
52
|
none: false
|
53
53
|
requirements:
|
54
|
-
- -
|
54
|
+
- - ~>
|
55
55
|
- !ruby/object:Gem::Version
|
56
|
-
version:
|
56
|
+
version: 2.2.0
|
57
57
|
type: :runtime
|
58
58
|
version_requirements: *id004
|
59
|
-
|
59
|
+
- !ruby/object:Gem::Dependency
|
60
|
+
name: redis-objects
|
61
|
+
prerelease: false
|
62
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
63
|
+
none: false
|
64
|
+
requirements:
|
65
|
+
- - ~>
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: 0.5.0
|
68
|
+
type: :runtime
|
69
|
+
version_requirements: *id005
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: will_paginate
|
72
|
+
prerelease: false
|
73
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ~>
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: 3.0.0
|
79
|
+
type: :runtime
|
80
|
+
version_requirements: *id006
|
81
|
+
description: A simple blogging platform built on Tumblr and Redis
|
60
82
|
email:
|
61
83
|
- jessereiss@gmail.com
|
62
84
|
executables: []
|
@@ -66,23 +88,31 @@ extensions: []
|
|
66
88
|
extra_rdoc_files: []
|
67
89
|
|
68
90
|
files:
|
69
|
-
-
|
70
|
-
- LICENSE.mkd
|
91
|
+
- .rvmrc
|
71
92
|
- Gemfile
|
72
|
-
-
|
93
|
+
- Gemfile.lock
|
94
|
+
- LICENSE.mkd
|
95
|
+
- README.mkd
|
73
96
|
- lib/tumblr.rb
|
74
|
-
- lib/tumblr/
|
75
|
-
- lib/tumblr/
|
76
|
-
- lib/tumblr/
|
77
|
-
- lib/tumblr/
|
78
|
-
- lib/tumblr/
|
79
|
-
- lib/tumblr/
|
80
|
-
- lib/tumblr/
|
97
|
+
- lib/tumblr/api.rb
|
98
|
+
- lib/tumblr/blog.rb
|
99
|
+
- lib/tumblr/config.rb
|
100
|
+
- lib/tumblr/middleware/params.rb
|
101
|
+
- lib/tumblr/middleware/parsing.rb
|
102
|
+
- lib/tumblr/object.rb
|
103
|
+
- lib/tumblr/objects/answer.rb
|
104
|
+
- lib/tumblr/objects/audio.rb
|
105
|
+
- lib/tumblr/objects/chat.rb
|
106
|
+
- lib/tumblr/objects/link.rb
|
107
|
+
- lib/tumblr/objects/photo.rb
|
108
|
+
- lib/tumblr/objects/post.rb
|
109
|
+
- lib/tumblr/objects/text.rb
|
110
|
+
- lib/tumblr/objects/user.rb
|
111
|
+
- lib/tumblr/objects/video.rb
|
112
|
+
- lib/tumblr/query.rb
|
81
113
|
- lib/tumblr/quote.rb
|
82
|
-
- lib/tumblr/regular.rb
|
83
|
-
- lib/tumblr/user.rb
|
84
114
|
- lib/tumblr/version.rb
|
85
|
-
-
|
115
|
+
- tumblrb.gemspec
|
86
116
|
homepage: https://github.com/thegorgon/tumblrb
|
87
117
|
licenses: []
|
88
118
|
|
@@ -91,7 +121,6 @@ rdoc_options: []
|
|
91
121
|
|
92
122
|
require_paths:
|
93
123
|
- lib
|
94
|
-
- lib
|
95
124
|
required_ruby_version: !ruby/object:Gem::Requirement
|
96
125
|
none: false
|
97
126
|
requirements:
|
@@ -107,7 +136,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
107
136
|
requirements: []
|
108
137
|
|
109
138
|
rubyforge_project: tumblrb
|
110
|
-
rubygems_version: 1.8.
|
139
|
+
rubygems_version: 1.8.11
|
111
140
|
signing_key:
|
112
141
|
specification_version: 3
|
113
142
|
summary: Ruby wrapper for the Tumblr API
|
data/lib/tumblr/answer.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
module Tumblr
|
2
|
-
class Answer < Item
|
3
|
-
attr_accessor :question, :answer
|
4
|
-
|
5
|
-
def as_json
|
6
|
-
super.merge!({
|
7
|
-
:question => question,
|
8
|
-
:answer => answer
|
9
|
-
})
|
10
|
-
end
|
11
|
-
|
12
|
-
private
|
13
|
-
|
14
|
-
def parse_xml_node(node)
|
15
|
-
super(node)
|
16
|
-
self.caption = node.css('question').first.try(:content)
|
17
|
-
self.source = node.css('answer').first.try(:content)
|
18
|
-
self
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
data/lib/tumblr/audio.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
module Tumblr
|
2
|
-
class Audio < Item
|
3
|
-
attr_accessor :caption, :player
|
4
|
-
|
5
|
-
def as_json
|
6
|
-
super.merge!({
|
7
|
-
:caption => caption,
|
8
|
-
:player => player
|
9
|
-
})
|
10
|
-
end
|
11
|
-
|
12
|
-
private
|
13
|
-
|
14
|
-
def parse_xml_node(node)
|
15
|
-
super(node)
|
16
|
-
self.caption = node.css('audio-caption').first.try(:content)
|
17
|
-
self.source = node.css('audio-player').first.try(:content)
|
18
|
-
self
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
data/lib/tumblr/conversation.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
module Tumblr
|
2
|
-
class Conversation < Item
|
3
|
-
attr_accessor :title, :text, :lines
|
4
|
-
|
5
|
-
class Line < Struct.new(:name, :label, :content)
|
6
|
-
def as_json
|
7
|
-
{
|
8
|
-
:name => name,
|
9
|
-
:label => label,
|
10
|
-
:content => content
|
11
|
-
}
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
def as_json
|
16
|
-
super.merge!({
|
17
|
-
:title => title,
|
18
|
-
:text => text,
|
19
|
-
:lines => lines.map { |l| l.as_json }
|
20
|
-
})
|
21
|
-
end
|
22
|
-
|
23
|
-
private
|
24
|
-
|
25
|
-
def self.parse_xml_node(node)
|
26
|
-
super(node)
|
27
|
-
self.title = node.css('conversation-title').first.try(:content)
|
28
|
-
self.text = node.css('conversation-text').first.try(:content)
|
29
|
-
self.lines = node.css("convesation line").collect do |line|
|
30
|
-
Line.new(line["name"], line["label"], label.content)
|
31
|
-
end
|
32
|
-
self
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
data/lib/tumblr/item.rb
DELETED
@@ -1,110 +0,0 @@
|
|
1
|
-
module Tumblr
|
2
|
-
class Item
|
3
|
-
PAGE_SIZE = 20
|
4
|
-
attr_accessor :id, :slug, :type, :date, :format, :xml
|
5
|
-
attr_accessor :tags
|
6
|
-
|
7
|
-
def self.paginate(params={})
|
8
|
-
params[:num] = params[:per_page].to_i > 0 ? params[:per_page].to_i : PAGE_SIZE
|
9
|
-
params[:start] = ([params[:page].to_i, 1].max - 1) * params[:num]
|
10
|
-
params.delete(:limit)
|
11
|
-
params.delete(:page)
|
12
|
-
if Tumblr.user
|
13
|
-
params[:email] = Tumblr.user.email
|
14
|
-
params[:password] = Tumblr.user.password
|
15
|
-
end
|
16
|
-
page_xml = xml(params)
|
17
|
-
items = parse(page_xml)
|
18
|
-
page_meta = page_xml.at("posts")
|
19
|
-
if page_meta
|
20
|
-
Tumblr::Page.new(items, page_meta["start"], page_meta["total"], params[:num])
|
21
|
-
else
|
22
|
-
Tumblr::Page.new(items, 0, items.length, params[:num])
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def self.find(id)
|
27
|
-
paginate(:page => 1, :per_page => 1).first
|
28
|
-
end
|
29
|
-
|
30
|
-
def self.all(params={})
|
31
|
-
parse(xml(params))
|
32
|
-
end
|
33
|
-
|
34
|
-
def self.xml(params={})
|
35
|
-
Nokogiri::XML(raw(params))
|
36
|
-
end
|
37
|
-
|
38
|
-
def self.raw(params={})
|
39
|
-
curl = Curl::Easy.perform(url(params))
|
40
|
-
curl.body_str
|
41
|
-
end
|
42
|
-
|
43
|
-
def self.find(id)
|
44
|
-
parse(xml(:id => id.to_i)).first
|
45
|
-
end
|
46
|
-
|
47
|
-
def to_param
|
48
|
-
"#{id}-#{slug}"
|
49
|
-
end
|
50
|
-
|
51
|
-
def date_string
|
52
|
-
date.strftime("%B %d, %Y")
|
53
|
-
end
|
54
|
-
|
55
|
-
def dom_class
|
56
|
-
self.class.to_s.split("::").last.underscore
|
57
|
-
end
|
58
|
-
|
59
|
-
def as_json
|
60
|
-
{
|
61
|
-
:id => id,
|
62
|
-
:slug => slug,
|
63
|
-
:date => date,
|
64
|
-
:type => type,
|
65
|
-
:format => format,
|
66
|
-
:tags => tags
|
67
|
-
}
|
68
|
-
end
|
69
|
-
|
70
|
-
private
|
71
|
-
|
72
|
-
def self.url(params)
|
73
|
-
url = "http://#{Tumblr.blog}/api/read"
|
74
|
-
if params.keys.length > 0
|
75
|
-
query = Addressable::URI.new
|
76
|
-
values = {}
|
77
|
-
params.each do |key, value|
|
78
|
-
values[key.to_s] = value.to_s
|
79
|
-
end
|
80
|
-
query.query_values = values
|
81
|
-
url += "?#{query.query}"
|
82
|
-
end
|
83
|
-
url
|
84
|
-
end
|
85
|
-
|
86
|
-
def self.parse(xml)
|
87
|
-
xml.css("posts post").collect do |post|
|
88
|
-
object_class = "Tumblr::#{post['type'].classify}".constantize rescue nil
|
89
|
-
if object_class
|
90
|
-
object = object_class.new
|
91
|
-
object.send(:parse_xml_node, post)
|
92
|
-
object
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
def parse_xml_node(node)
|
98
|
-
self.xml = node.to_s
|
99
|
-
self.id = node['id']
|
100
|
-
self.type = node['type']
|
101
|
-
self.slug = node['slug']
|
102
|
-
self.date = Time.at(node['unix-timestamp'].to_i)
|
103
|
-
self.format = node['format']
|
104
|
-
self.tags = node.css("tag").collect do |tag|
|
105
|
-
tag.content
|
106
|
-
end
|
107
|
-
self
|
108
|
-
end
|
109
|
-
end
|
110
|
-
end
|
data/lib/tumblr/link.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
module Tumblr
|
2
|
-
class Link < Item
|
3
|
-
attr_accessor :text, :url
|
4
|
-
|
5
|
-
def as_json
|
6
|
-
super.merge!({
|
7
|
-
:text => text,
|
8
|
-
:url => url
|
9
|
-
})
|
10
|
-
end
|
11
|
-
|
12
|
-
private
|
13
|
-
|
14
|
-
def parse_xml_node(node)
|
15
|
-
super(node)
|
16
|
-
self.text = node.css('link-text').first.try(:content)
|
17
|
-
self.source = node.css('link-url').first.try(:content)
|
18
|
-
self
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
data/lib/tumblr/page.rb
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
module Tumblr
|
2
|
-
class Page
|
3
|
-
include Enumerable
|
4
|
-
attr_accessor :items, :start, :total, :page_size
|
5
|
-
|
6
|
-
def initialize(items, start, total, page_size)
|
7
|
-
self.items = items
|
8
|
-
self.start = start.to_i
|
9
|
-
self.total = total.to_i
|
10
|
-
self.page_size = page_size.to_i
|
11
|
-
end
|
12
|
-
|
13
|
-
def page
|
14
|
-
(start / page_size).floor + 1
|
15
|
-
end
|
16
|
-
|
17
|
-
def success?
|
18
|
-
items.count > 0
|
19
|
-
end
|
20
|
-
|
21
|
-
def next_page
|
22
|
-
(total - start) > page_size ? page + 1 : nil
|
23
|
-
end
|
24
|
-
|
25
|
-
def previous_page
|
26
|
-
page > 1 ? page - 1 : nil
|
27
|
-
end
|
28
|
-
|
29
|
-
[:size, :count, :length].each do |m|
|
30
|
-
define_method m do
|
31
|
-
@items.send(m)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def each(&block)
|
36
|
-
items.each(&block)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
data/lib/tumblr/photo.rb
DELETED
@@ -1,37 +0,0 @@
|
|
1
|
-
module Tumblr
|
2
|
-
class Photo < Item
|
3
|
-
attr_accessor :caption, :sizes
|
4
|
-
|
5
|
-
class Size < Struct.new(:url, :max_width)
|
6
|
-
def as_json
|
7
|
-
{
|
8
|
-
:url => url,
|
9
|
-
:max_width => max_width
|
10
|
-
}
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def max_size
|
15
|
-
sizes.last
|
16
|
-
end
|
17
|
-
|
18
|
-
def as_json
|
19
|
-
super.merge!({
|
20
|
-
:caption => caption,
|
21
|
-
:sizes => sizes.map { |size| size.as_json }
|
22
|
-
})
|
23
|
-
end
|
24
|
-
|
25
|
-
private
|
26
|
-
|
27
|
-
def parse_xml_node(node)
|
28
|
-
super(node)
|
29
|
-
self.caption = node.css('photo-caption').first.try(:content)
|
30
|
-
self.sizes = node.css("photo-url").collect do |size|
|
31
|
-
Size.new(size.content, size['max-width'].to_i)
|
32
|
-
end
|
33
|
-
self.sizes.sort! { |s1, s2| s1.max_width <=> s2.max_width }
|
34
|
-
self
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
data/lib/tumblr/regular.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
module Tumblr
|
2
|
-
class Regular < Item
|
3
|
-
attr_accessor :title, :body
|
4
|
-
|
5
|
-
def as_json
|
6
|
-
super.merge!({
|
7
|
-
:title => title,
|
8
|
-
:body => body
|
9
|
-
})
|
10
|
-
end
|
11
|
-
|
12
|
-
private
|
13
|
-
|
14
|
-
def parse_xml_node(node)
|
15
|
-
super(node)
|
16
|
-
self.title = node.css('regular-title').first.try(:content)
|
17
|
-
self.body = node.css('regular-body').first.try(:content)
|
18
|
-
self
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|