socialcastr 0.1.3 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.markdown +5 -0
- data/examples/free_parse_messages.rb +87 -0
- data/examples/parse_messages.rb +2 -2
- data/lib/socialcastr/base.rb +40 -46
- data/lib/socialcastr/comment.rb +0 -14
- data/lib/socialcastr/like.rb +0 -4
- data/lib/socialcastr/message.rb +12 -54
- data/lib/socialcastr/sax/active_resource.rb +119 -0
- data/lib/socialcastr/version.rb +1 -1
- data/lib/socialcastr.rb +28 -33
- data/spec/base_spec.rb +7 -25
- data/spec/message_spec.rb +16 -13
- metadata +7 -19
- data/lib/socialcastr/attachment.rb +0 -10
- data/lib/socialcastr/avatar_list.rb +0 -9
- data/lib/socialcastr/collection.rb +0 -30
- data/lib/socialcastr/external_resource.rb +0 -14
- data/lib/socialcastr/flag.rb +0 -5
- data/lib/socialcastr/group.rb +0 -9
- data/lib/socialcastr/group_membership.rb +0 -6
- data/lib/socialcastr/media_file.rb +0 -12
- data/lib/socialcastr/recipient.rb +0 -11
- data/lib/socialcastr/source.rb +0 -8
- data/lib/socialcastr/stream.rb +0 -10
- data/lib/socialcastr/tag.rb +0 -5
- data/lib/socialcastr/thumbnail_list.rb +0 -8
- data/lib/socialcastr/user.rb +0 -11
data/README.markdown
CHANGED
@@ -45,6 +45,11 @@ SocialCast gem is a ruby interface to the SocialCast REST API
|
|
45
45
|
|
46
46
|
This is just the first draft of the wrapper. It can be improved in many, many ways.
|
47
47
|
The API is not completely covered either: some of interesing stuff, like message and comments attachments have been left out.
|
48
|
+
One current limitation is that the parser will refuse to consider
|
49
|
+
elements that contain a dot, so I'm excluding those deliberately for the
|
50
|
+
time being (see
|
51
|
+
lib/socialcastr/sax/active_resource.rb#start_element).
|
52
|
+
|
48
53
|
Feel free to help (see Contributing below)
|
49
54
|
|
50
55
|
## TODO
|
@@ -0,0 +1,87 @@
|
|
1
|
+
$:.unshift("./lib")
|
2
|
+
require "rubygems"
|
3
|
+
require "nokogiri"
|
4
|
+
|
5
|
+
class ActiveResourceXML < Nokogiri::XML::SAX::Document
|
6
|
+
attr_accessor :doc
|
7
|
+
def initialize
|
8
|
+
@types = []
|
9
|
+
@values = []
|
10
|
+
@doc = nil
|
11
|
+
end
|
12
|
+
|
13
|
+
def parse_attrs(attrs=[])
|
14
|
+
type = "hash"
|
15
|
+
attrs.each do |attr|
|
16
|
+
case attr[0]
|
17
|
+
when "type"
|
18
|
+
type = attr[1]
|
19
|
+
when "nil"
|
20
|
+
@nil = true
|
21
|
+
end
|
22
|
+
end
|
23
|
+
return type
|
24
|
+
end
|
25
|
+
|
26
|
+
def start_element name, attrs = []
|
27
|
+
type = parse_attrs(attrs)
|
28
|
+
unless @nil
|
29
|
+
@types.push type
|
30
|
+
case type
|
31
|
+
when "array"
|
32
|
+
@values.push Array.new
|
33
|
+
when "hash"
|
34
|
+
@values.push Hash.new
|
35
|
+
else
|
36
|
+
@values.push ""
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def characters(s)
|
42
|
+
return if s =~ /^[\s\n\t]*$/
|
43
|
+
@types[-1] = "string"
|
44
|
+
@values[-1] = s
|
45
|
+
end
|
46
|
+
|
47
|
+
def end_element name
|
48
|
+
if @nil
|
49
|
+
@nil = false
|
50
|
+
else
|
51
|
+
value = @values.pop
|
52
|
+
type = @types.pop
|
53
|
+
|
54
|
+
if @values[-1]
|
55
|
+
if @types[-1] == "array"
|
56
|
+
@values[-1].push value
|
57
|
+
else
|
58
|
+
@values[-1][name] = value
|
59
|
+
end
|
60
|
+
else
|
61
|
+
@doc = { name => value }
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
class Message
|
69
|
+
def self.parse(xml="")
|
70
|
+
source= ActiveResourceXML.new
|
71
|
+
parser = Nokogiri::XML::SAX::Parser.new(source)
|
72
|
+
parser.parse(xml)
|
73
|
+
return source
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
|
78
|
+
xml = File.read("/Users/bru/Downloads/socialcast.xml")
|
79
|
+
start_time = Time.new
|
80
|
+
document = Message.parse(xml)
|
81
|
+
end_time = Time.new
|
82
|
+
|
83
|
+
puts "File parsed in #{end_time - start_time} seconds"
|
84
|
+
puts "Found #{document.doc["messages"].size} messages"
|
85
|
+
|
86
|
+
|
87
|
+
|
data/examples/parse_messages.rb
CHANGED
@@ -8,9 +8,9 @@ Socialcastr.configuration do |config|
|
|
8
8
|
config.domain = "domain"
|
9
9
|
end
|
10
10
|
|
11
|
-
xml = File.read("
|
11
|
+
xml = File.read("/Users/bru/Downloads/socialcast.xml")
|
12
12
|
start_time = Time.new
|
13
|
-
messages = Socialcastr::Message.
|
13
|
+
messages = Socialcastr::Message.parse(xml)
|
14
14
|
end_time = Time.new
|
15
15
|
|
16
16
|
puts "Found #{messages.count} messages in #{end_time - start_time} seconds"
|
data/lib/socialcastr/base.rb
CHANGED
@@ -1,21 +1,11 @@
|
|
1
|
-
require '
|
2
|
-
|
1
|
+
require 'nokogiri'
|
2
|
+
require 'socialcastr/sax/active_resource'
|
3
3
|
module Socialcastr
|
4
4
|
class Base
|
5
|
-
include SAXMachine
|
6
|
-
|
7
5
|
def initialize(arguments={})
|
6
|
+
@data = {}
|
8
7
|
arguments.map do |k,v|
|
9
|
-
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
def id
|
14
|
-
begin
|
15
|
-
tmp_id = send self.class.id_attribute
|
16
|
-
tmp_id.to_i unless tmp_id.nil?
|
17
|
-
rescue
|
18
|
-
nil
|
8
|
+
@data[k.to_s] = v
|
19
9
|
end
|
20
10
|
end
|
21
11
|
|
@@ -36,9 +26,7 @@ module Socialcastr
|
|
36
26
|
end
|
37
27
|
|
38
28
|
def copy_attributes_from_object(object=nil)
|
39
|
-
object.
|
40
|
-
instance_variable_set(v, object.instance_variable_get(v))
|
41
|
-
end
|
29
|
+
@data = object.instance_variable_get("@data")
|
42
30
|
end
|
43
31
|
|
44
32
|
def new?
|
@@ -59,17 +47,48 @@ module Socialcastr
|
|
59
47
|
|
60
48
|
def to_params
|
61
49
|
params = {}
|
62
|
-
|
63
|
-
params[param_name(
|
50
|
+
@data.each_pair do |k,v|
|
51
|
+
params[param_name(k)] = v
|
64
52
|
end
|
65
53
|
params
|
66
54
|
end
|
67
55
|
|
68
56
|
def param_name(variable_name)
|
69
|
-
"#{self.class.model_name.downcase}[#{variable_name
|
57
|
+
"#{self.class.model_name.downcase}[#{variable_name}]"
|
58
|
+
end
|
59
|
+
|
60
|
+
def method_name(s)
|
61
|
+
s.to_s.gsub("_","-")
|
62
|
+
end
|
63
|
+
|
64
|
+
def id
|
65
|
+
return @data["id"]
|
66
|
+
end
|
67
|
+
|
68
|
+
def method_missing(method, *args, &block)
|
69
|
+
if method.to_s =~ /=$/
|
70
|
+
@data[method_name(method.to_s.sub(/=$/,''))] = *args
|
71
|
+
else
|
72
|
+
return @data[method_name(method)] unless @data[method_name(method)].nil?
|
73
|
+
end
|
70
74
|
end
|
71
75
|
|
72
76
|
class << self
|
77
|
+
def parse(xml="")
|
78
|
+
source = SAX::ActiveResource.new
|
79
|
+
Nokogiri::XML::SAX::Parser.new(source).parse(xml)
|
80
|
+
case source.data
|
81
|
+
when Hash
|
82
|
+
return from_hash(source.data)
|
83
|
+
else
|
84
|
+
return source.data
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def from_hash(h)
|
89
|
+
new.tap { |object| object.instance_variable_set("@data", h) }
|
90
|
+
end
|
91
|
+
|
73
92
|
def api
|
74
93
|
@api ||= Socialcastr.api
|
75
94
|
end
|
@@ -95,7 +114,7 @@ module Socialcastr
|
|
95
114
|
def find_every(options)
|
96
115
|
(prefix_options, query_options) = parse_options(options)
|
97
116
|
path = collection_path(prefix_options)
|
98
|
-
|
117
|
+
parse(api.get(path, query_options))
|
99
118
|
end
|
100
119
|
|
101
120
|
def all(*arguments)
|
@@ -140,31 +159,6 @@ module Socialcastr
|
|
140
159
|
def collection_name
|
141
160
|
model_name.downcase + "s"
|
142
161
|
end
|
143
|
-
|
144
|
-
def parse_collection(data)
|
145
|
-
collection_class.parse(data)
|
146
|
-
end
|
147
|
-
|
148
|
-
def id_attribute
|
149
|
-
model_name.downcase + "_id"
|
150
|
-
end
|
151
|
-
|
152
|
-
def collection_class
|
153
|
-
return @collection_class if @collection_class
|
154
|
-
class_name = model_name + "List"
|
155
|
-
model_class = self
|
156
|
-
c_element = model_name.downcase.to_sym
|
157
|
-
c_name = collection_name.to_sym
|
158
|
-
klass = Object.const_set(class_name,Class.new(Socialcastr::Collection))
|
159
|
-
klass.class_eval do
|
160
|
-
collection_of c_element, :as => c_name, :class => model_class
|
161
|
-
end
|
162
|
-
return @collection_class = klass
|
163
|
-
end
|
164
|
-
|
165
|
-
def id_element(name=:id)
|
166
|
-
element name, :as => id_attribute.to_sym
|
167
|
-
end
|
168
162
|
end
|
169
163
|
end
|
170
164
|
end
|
data/lib/socialcastr/comment.rb
CHANGED
@@ -1,19 +1,5 @@
|
|
1
1
|
module Socialcastr
|
2
2
|
class Comment < Base
|
3
|
-
element :editable
|
4
|
-
elements :attachment, :as => :attachments, :class => Socialcastr::Attachment
|
5
|
-
element :likable
|
6
|
-
element :deletable
|
7
|
-
elements :like, :as => :likes, :class => Socialcastr::Like
|
8
|
-
element :permalink_url
|
9
|
-
element :text
|
10
|
-
element :user, :class => Socialcastr::User
|
11
|
-
element :thumbnail_url
|
12
|
-
element :url
|
13
|
-
element :likes_count
|
14
|
-
element :"created-at", :as => :created_at
|
15
|
-
element :id
|
16
|
-
|
17
3
|
def unlikable_by?(api_id)
|
18
4
|
self.likes.map{|l| l.unlikable_by?(api_id)}.any?
|
19
5
|
end
|
data/lib/socialcastr/like.rb
CHANGED
data/lib/socialcastr/message.rb
CHANGED
@@ -1,74 +1,29 @@
|
|
1
1
|
module Socialcastr
|
2
|
-
class Message < Base
|
3
|
-
|
4
|
-
id_element :id
|
5
|
-
element :title
|
6
|
-
element :body
|
7
|
-
element :url
|
8
|
-
element "permalink-url", :as => :permalink_url
|
9
|
-
element :action
|
10
|
-
element "external-url", :as => :external_url
|
11
|
-
element :icon
|
12
|
-
element :likable
|
13
|
-
element "created-at", :as => :created_at
|
14
|
-
element "updated-at", :as => :updated_at
|
15
|
-
element "last-interacted-at", :as => :last_interacted_at
|
16
|
-
element "player-url", :as => :player_url
|
17
|
-
element "thumbnail-url", :as => :thumbnail_url
|
18
|
-
element "player-params", :as => :player_params
|
19
|
-
element :user, :class => Socialcastr::User
|
20
|
-
#element :group, :class => Socialcastr::Group
|
21
|
-
elements :group, :as => :groups, :class => Socialcastr::Group
|
22
|
-
element :source, :class => Socialcastr::Source
|
23
|
-
|
24
|
-
element :editable
|
25
|
-
element :rating
|
26
|
-
element "category-id", :as => :category_id
|
27
|
-
element :subscribed
|
28
|
-
# element :ratings_average
|
29
|
-
element :flag, :class => Socialcastr::Flag
|
30
|
-
element :deletable
|
31
|
-
element "comments-count", :as => :comments_count
|
32
|
-
element :verb
|
33
|
-
element "in-reply-to", :as => :in_reply_to
|
34
|
-
element :watchable
|
35
|
-
element "contains-url-only", :as => :contains_url_only
|
36
|
-
# element :target_user
|
37
|
-
element :ratable
|
38
|
-
element "message-type", :as => :message_type
|
39
|
-
elements :recipient, :as => :recipients, :class => Socialcastr::Recipient
|
40
2
|
|
41
|
-
|
42
|
-
elements :tag, :as => :tags, :class => Socialcastr::Tag
|
43
|
-
elements :like, :as => :likes, :class => Socialcastr::Like
|
44
|
-
elements "external-resource", :as => :external_resources, :class => Socialcastr::ExternalResource
|
45
|
-
elements "media-file", :as => :media_files, :class => Socialcastr::MediaFile
|
46
|
-
element "likes-count", :as => :likes_count
|
47
|
-
element :hidden
|
48
|
-
|
49
|
-
elements :comment, :as => :comments, :class => Socialcastr::Comment
|
3
|
+
class Message < Base
|
50
4
|
|
51
5
|
def flag!
|
52
6
|
return true if flagged?
|
53
|
-
flag
|
7
|
+
self.flag = Socialcastr::Flag.parse(api.post(element_path + "/flags"))
|
54
8
|
end
|
55
9
|
|
56
10
|
def flagged?
|
57
|
-
!flag.id.nil?
|
11
|
+
self.flag && !self.flag.id.nil?
|
58
12
|
end
|
59
13
|
|
60
14
|
def unflag!
|
61
15
|
return unless flagged?
|
62
|
-
api.delete(element_path + "/flags/#{flag.id}")
|
63
|
-
|
16
|
+
api.delete(element_path + "/flags/#{self.flag.id}")
|
17
|
+
self.flag = nil
|
64
18
|
end
|
65
19
|
|
66
20
|
def like!
|
21
|
+
self.likes ||= []
|
67
22
|
likes << Like.parse(api.post(element_path + "/likes"))
|
68
23
|
end
|
69
24
|
|
70
25
|
def unlike!
|
71
|
-
likes.reject! do |l|
|
26
|
+
self.likes.reject! do |l|
|
72
27
|
l.unlikable && api.delete(element_path + "/likes/#{l.id}")
|
73
28
|
end
|
74
29
|
end
|
@@ -79,8 +34,11 @@ module Socialcastr
|
|
79
34
|
end
|
80
35
|
|
81
36
|
|
82
|
-
def self.search(arguments={})
|
83
|
-
|
37
|
+
def self.search(query, arguments={})
|
38
|
+
puts "searching for #{query}"
|
39
|
+
xml = api.get(collection_path + "/search", { :q => query}.merge(arguments))
|
40
|
+
puts "Got a response xml of #{xml.length} bytes"
|
41
|
+
return parse(xml)
|
84
42
|
end
|
85
43
|
end
|
86
44
|
end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
class Boolean
|
2
|
+
def initialize(string)
|
3
|
+
return true if string == "true"
|
4
|
+
return false
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
class String
|
9
|
+
def contains_dot?
|
10
|
+
self =~ /\./
|
11
|
+
end
|
12
|
+
|
13
|
+
def all_spaces?
|
14
|
+
self =~ /^[\s\n\t]*$/
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
module Socialcastr
|
19
|
+
module SAX
|
20
|
+
|
21
|
+
class ActiveResource < Nokogiri::XML::SAX::Document
|
22
|
+
attr_accessor :data
|
23
|
+
|
24
|
+
def initialize
|
25
|
+
@types = []
|
26
|
+
@values = []
|
27
|
+
@data= nil
|
28
|
+
end
|
29
|
+
|
30
|
+
def cdata_block(s)
|
31
|
+
characters(s)
|
32
|
+
end
|
33
|
+
|
34
|
+
HASH = 104 # 'h'
|
35
|
+
ARRAY = 97 # 'a'
|
36
|
+
INTEGER = 105 # 'i'
|
37
|
+
BOOLEAN = 98 # 'b'
|
38
|
+
STRING = 115 # 's'
|
39
|
+
|
40
|
+
def container_type
|
41
|
+
@types[-1]
|
42
|
+
end
|
43
|
+
|
44
|
+
def container_value
|
45
|
+
@values[-1]
|
46
|
+
end
|
47
|
+
|
48
|
+
def parse_attrs_and_get_type(attrs=[])
|
49
|
+
type = HASH
|
50
|
+
attrs.each do |attr|
|
51
|
+
case attr[0]
|
52
|
+
when "type"
|
53
|
+
type = attr[1][0]
|
54
|
+
when "nil"
|
55
|
+
@nil = true
|
56
|
+
end
|
57
|
+
end
|
58
|
+
return type
|
59
|
+
end
|
60
|
+
|
61
|
+
def start_element name, attrs = []
|
62
|
+
if name.contains_dot? # [FIXME] we can't evaluate strings inside elements like <html.title>
|
63
|
+
@nil = true
|
64
|
+
return nil
|
65
|
+
end
|
66
|
+
type = parse_attrs_and_get_type(attrs)
|
67
|
+
unless @nil
|
68
|
+
@types.push type
|
69
|
+
@values.push nil
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def characters string
|
74
|
+
return if @nil
|
75
|
+
return if (string.all_spaces? && (container_type != STRING || container_value.nil?))
|
76
|
+
@types[-1] = STRING if container_type == HASH
|
77
|
+
@values[-1] = container_value ? container_value + string : string
|
78
|
+
end
|
79
|
+
|
80
|
+
def end_element name
|
81
|
+
if @nil
|
82
|
+
@nil = false
|
83
|
+
else
|
84
|
+
value = @values.pop
|
85
|
+
type = @types.pop
|
86
|
+
|
87
|
+
# return if value.nil?
|
88
|
+
|
89
|
+
case type
|
90
|
+
when HASH
|
91
|
+
element = Socialcastr.const_get(Socialcastr.to_class_name(name)).from_hash(value || {})
|
92
|
+
when INTEGER
|
93
|
+
element = value.to_i
|
94
|
+
when BOOLEAN
|
95
|
+
element = Boolean.new(value)
|
96
|
+
when ARRAY
|
97
|
+
element = value || []
|
98
|
+
else
|
99
|
+
element = value
|
100
|
+
end
|
101
|
+
|
102
|
+
if container_type
|
103
|
+
if container_type == ARRAY
|
104
|
+
# @values[-1] ||= []
|
105
|
+
# @values[-1].push element
|
106
|
+
@values[-1] ? @values[-1].push(element) : @values[-1] = [element]
|
107
|
+
else # Hash
|
108
|
+
# @values[-1] ||= {}
|
109
|
+
# @values[-1][name] = element
|
110
|
+
@values[-1] ? @values[-1][name]=element : @values[-1] = { name => element }
|
111
|
+
end
|
112
|
+
else # Root Node
|
113
|
+
@data = element
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
data/lib/socialcastr/version.rb
CHANGED
data/lib/socialcastr.rb
CHANGED
@@ -2,23 +2,9 @@ $LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__))) unless $LOAD_PATH.i
|
|
2
2
|
|
3
3
|
require 'socialcastr/exceptions'
|
4
4
|
require 'socialcastr/base'
|
5
|
-
require 'socialcastr/collection'
|
6
5
|
require 'socialcastr/api'
|
7
|
-
require 'socialcastr/attachment'
|
8
|
-
require 'socialcastr/avatar_list'
|
9
|
-
require 'socialcastr/user'
|
10
|
-
require 'socialcastr/flag'
|
11
6
|
require 'socialcastr/like'
|
12
7
|
require 'socialcastr/comment'
|
13
|
-
require 'socialcastr/group'
|
14
|
-
require 'socialcastr/group_membership'
|
15
|
-
require 'socialcastr/stream'
|
16
|
-
require 'socialcastr/source'
|
17
|
-
require 'socialcastr/tag'
|
18
|
-
require 'socialcastr/recipient'
|
19
|
-
require 'socialcastr/thumbnail_list'
|
20
|
-
require 'socialcastr/media_file'
|
21
|
-
require 'socialcastr/external_resource'
|
22
8
|
require 'socialcastr/message'
|
23
9
|
|
24
10
|
require 'singleton'
|
@@ -53,25 +39,34 @@ module Socialcastr
|
|
53
39
|
end
|
54
40
|
end
|
55
41
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
42
|
+
class << self
|
43
|
+
def configuration
|
44
|
+
if block_given?
|
45
|
+
yield Configuration.instance
|
46
|
+
if Configuration.instance.config_file
|
47
|
+
config = YAML::load_file(Configuration.instance.config_file)
|
48
|
+
Configuration.instance.domain = config['domain']
|
49
|
+
Configuration.instance.username = config['username']
|
50
|
+
Configuration.instance.password = config['password']
|
51
|
+
Configuration.instance.format = config['format']
|
52
|
+
Configuration.instance.debug = config['debug']
|
53
|
+
end
|
54
|
+
end
|
55
|
+
Configuration.instance
|
56
|
+
end
|
57
|
+
|
58
|
+
def api
|
59
|
+
config = Configuration.instance
|
60
|
+
raise MissingConfiguration unless config.username
|
61
|
+
API.new(config.username, config.password, config.domain, config.format, config.debug)
|
62
|
+
end
|
63
|
+
|
64
|
+
def to_class_name(method)
|
65
|
+
method.to_s.gsub(/^[a-z]|-[a-z]/i) { |a| a.sub("-", '').upcase }
|
66
|
+
end
|
70
67
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
API.new(config.username, config.password, config.domain, config.format, config.debug)
|
68
|
+
def const_missing(class_name)
|
69
|
+
Socialcastr.const_set(class_name, Class.new(Socialcastr::Base))
|
70
|
+
end
|
75
71
|
end
|
76
|
-
|
77
72
|
end
|
data/spec/base_spec.rb
CHANGED
@@ -27,9 +27,7 @@ describe Socialcastr::Base do
|
|
27
27
|
|
28
28
|
context 'for a class that has an element \'author\'' do
|
29
29
|
before :each do
|
30
|
-
class Post < Socialcastr::Base
|
31
|
-
element 'author'
|
32
|
-
end
|
30
|
+
class Post < Socialcastr::Base; end
|
33
31
|
@post = Post.new
|
34
32
|
end
|
35
33
|
|
@@ -45,10 +43,7 @@ describe Socialcastr::Base do
|
|
45
43
|
|
46
44
|
context 'initializing a new object with author="john doe"' do
|
47
45
|
before :each do
|
48
|
-
class Post < Socialcastr::Base
|
49
|
-
id_element :id
|
50
|
-
element 'author'
|
51
|
-
end
|
46
|
+
class Post < Socialcastr::Base; end
|
52
47
|
@post = Post.new(:author => "john doe")
|
53
48
|
end
|
54
49
|
|
@@ -78,7 +73,7 @@ describe Socialcastr::Base do
|
|
78
73
|
|
79
74
|
context '#param_name' do
|
80
75
|
it 'should return a string like model_name[variable_name]' do
|
81
|
-
@post.param_name("
|
76
|
+
@post.param_name("author").should == "post[author]"
|
82
77
|
end
|
83
78
|
end
|
84
79
|
|
@@ -96,7 +91,7 @@ describe Socialcastr::Base do
|
|
96
91
|
Socialcastr.stub!(:api).and_return(@api)
|
97
92
|
end
|
98
93
|
it 'should POST to the socialcast api' do
|
99
|
-
response = "<post><id>4</id><author>john doe</author></post>"
|
94
|
+
response = "<post><id type='integer'>4</id><author>john doe</author></post>"
|
100
95
|
@api.should_receive(:post).and_return(response)
|
101
96
|
@post.save
|
102
97
|
@post.id.should == 4
|
@@ -143,19 +138,19 @@ describe Socialcastr::Base do
|
|
143
138
|
|
144
139
|
context 'find_every or find(:all)' do
|
145
140
|
before :each do
|
146
|
-
fake_socialcast_api_for(:
|
141
|
+
fake_socialcast_api_for(:messages) do
|
147
142
|
@messages = Socialcastr::Base.find(:all)
|
148
143
|
end
|
149
144
|
end
|
150
145
|
|
151
146
|
it 'should return an enumerable' do
|
152
|
-
@messages.class.should ==
|
147
|
+
@messages.class.should == Array
|
153
148
|
lambda { @messages.first }.should_not raise_error
|
154
149
|
end
|
155
150
|
end
|
156
151
|
context 'first or find(:first)' do
|
157
152
|
before :each do
|
158
|
-
fake_socialcast_api_for(:
|
153
|
+
fake_socialcast_api_for(:messages) do
|
159
154
|
@message = Socialcastr::Message.first
|
160
155
|
end
|
161
156
|
end
|
@@ -203,19 +198,6 @@ describe Socialcastr::Base do
|
|
203
198
|
end
|
204
199
|
end
|
205
200
|
|
206
|
-
context 'collection_class' do
|
207
|
-
before do
|
208
|
-
class Post < Socialcastr::Base; end
|
209
|
-
end
|
210
|
-
it 'should return a class' do
|
211
|
-
Post.collection_class.class.should == Class
|
212
|
-
end
|
213
|
-
|
214
|
-
it 'should return a class that inherits from Socialcastr::Collection' do
|
215
|
-
Post.collection_class.superclass.should == Socialcastr::Collection
|
216
|
-
end
|
217
|
-
end
|
218
|
-
|
219
201
|
context 'element_path' do
|
220
202
|
context 'with 5 as an argument' do
|
221
203
|
it 'should return collection_name/5' do
|
data/spec/message_spec.rb
CHANGED
@@ -33,10 +33,6 @@ describe Socialcastr::Message do
|
|
33
33
|
@message.groups.class.should == Array
|
34
34
|
end
|
35
35
|
|
36
|
-
it "should belong to a well formed group" do
|
37
|
-
@message.groups.first.class.should == Socialcastr::Group
|
38
|
-
end
|
39
|
-
|
40
36
|
it "should have a source" do
|
41
37
|
@message.source.should_not be_nil
|
42
38
|
@message.source.class.should == Socialcastr::Source
|
@@ -51,8 +47,8 @@ describe Socialcastr::Message do
|
|
51
47
|
end
|
52
48
|
end
|
53
49
|
|
54
|
-
it "should be an instance of
|
55
|
-
@messages.class.should ==
|
50
|
+
it "should be an instance of Array" do
|
51
|
+
@messages.class.should == Array
|
56
52
|
end
|
57
53
|
|
58
54
|
it "should be a collection of 20 Socialcastr::Message objects" do
|
@@ -75,7 +71,7 @@ describe Socialcastr::Message do
|
|
75
71
|
@message = Socialcastr::Message.find(425)
|
76
72
|
end
|
77
73
|
@api = mock(:api)
|
78
|
-
response = "<flag><id>3333</id></flag>"
|
74
|
+
response = "<flag><id type='integer'>3333</id></flag>"
|
79
75
|
Socialcastr::Message.stub!(:api).and_return(@api)
|
80
76
|
@api.stub!(:post).and_return(response)
|
81
77
|
end
|
@@ -91,9 +87,14 @@ describe Socialcastr::Message do
|
|
91
87
|
@api.should_receive(:delete).with("/messages/425/flags/3333").and_return("")
|
92
88
|
end
|
93
89
|
|
90
|
+
it "should not be flagged afterwards" do
|
91
|
+
@message.unflag!
|
92
|
+
@message.flagged?.should be_false
|
93
|
+
end
|
94
|
+
|
94
95
|
it "should not have a flag afterwards" do
|
95
96
|
@message.unflag!
|
96
|
-
@message.flag.
|
97
|
+
@message.flag.should be_nil
|
97
98
|
end
|
98
99
|
end
|
99
100
|
end
|
@@ -105,7 +106,7 @@ describe Socialcastr::Message do
|
|
105
106
|
end
|
106
107
|
|
107
108
|
@api = mock(:api)
|
108
|
-
response = "<like><id>2222</id><unlikable>true</unlikable></like>"
|
109
|
+
response = "<like><id type='integer'>2222</id><unlikable>true</unlikable></like>"
|
109
110
|
Socialcastr::Message.stub!(:api).and_return(@api)
|
110
111
|
@api.stub!(:post).and_return(response)
|
111
112
|
end
|
@@ -124,7 +125,7 @@ describe Socialcastr::Message do
|
|
124
125
|
|
125
126
|
context "unliking a message" do
|
126
127
|
before :each do
|
127
|
-
fake_socialcast_api_for :message do
|
128
|
+
fake_socialcast_api_for :message do
|
128
129
|
@message = Socialcastr::Message.find(425)
|
129
130
|
end
|
130
131
|
|
@@ -134,6 +135,7 @@ describe Socialcastr::Message do
|
|
134
135
|
@api.stub!(:post).and_return(response)
|
135
136
|
@api.stub!(:delete).and_return("")
|
136
137
|
@message.like!
|
138
|
+
@message.likes.count.should == 1
|
137
139
|
end
|
138
140
|
|
139
141
|
it "should remove a like" do
|
@@ -145,12 +147,13 @@ describe Socialcastr::Message do
|
|
145
147
|
|
146
148
|
context "searching for messages matching 'trying'" do
|
147
149
|
before :each do
|
148
|
-
fake_socialcast_api_for :
|
150
|
+
fake_socialcast_api_for :messages
|
149
151
|
end
|
150
152
|
|
151
153
|
it "should return a message" do
|
152
|
-
@messages = Socialcastr::Message.search(
|
153
|
-
@messages
|
154
|
+
@messages = Socialcastr::Message.search("trying")
|
155
|
+
puts "@messages is a #{@message.class}"
|
156
|
+
@messages.size.should == 20
|
154
157
|
end
|
155
158
|
end
|
156
159
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: socialcastr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 2
|
9
|
+
- 0
|
10
|
+
version: 0.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Riccardo Cambiassi
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-05-
|
18
|
+
date: 2011-05-20 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -105,31 +105,19 @@ files:
|
|
105
105
|
- LICENSE.markdown
|
106
106
|
- README.markdown
|
107
107
|
- Rakefile
|
108
|
+
- examples/free_parse_messages.rb
|
108
109
|
- examples/parse_messages.rb
|
109
110
|
- examples/post_comment.rb
|
110
111
|
- examples/post_message.rb
|
111
112
|
- examples/search.rb
|
112
113
|
- lib/socialcastr.rb
|
113
114
|
- lib/socialcastr/api.rb
|
114
|
-
- lib/socialcastr/attachment.rb
|
115
|
-
- lib/socialcastr/avatar_list.rb
|
116
115
|
- lib/socialcastr/base.rb
|
117
|
-
- lib/socialcastr/collection.rb
|
118
116
|
- lib/socialcastr/comment.rb
|
119
117
|
- lib/socialcastr/exceptions.rb
|
120
|
-
- lib/socialcastr/external_resource.rb
|
121
|
-
- lib/socialcastr/flag.rb
|
122
|
-
- lib/socialcastr/group.rb
|
123
|
-
- lib/socialcastr/group_membership.rb
|
124
118
|
- lib/socialcastr/like.rb
|
125
|
-
- lib/socialcastr/media_file.rb
|
126
119
|
- lib/socialcastr/message.rb
|
127
|
-
- lib/socialcastr/
|
128
|
-
- lib/socialcastr/source.rb
|
129
|
-
- lib/socialcastr/stream.rb
|
130
|
-
- lib/socialcastr/tag.rb
|
131
|
-
- lib/socialcastr/thumbnail_list.rb
|
132
|
-
- lib/socialcastr/user.rb
|
120
|
+
- lib/socialcastr/sax/active_resource.rb
|
133
121
|
- lib/socialcastr/version.rb
|
134
122
|
- socialcastr.gemspec
|
135
123
|
- spec/api_spec.rb
|
@@ -1,30 +0,0 @@
|
|
1
|
-
module Socialcastr
|
2
|
-
class Collection < Base
|
3
|
-
include Enumerable
|
4
|
-
|
5
|
-
def each &block
|
6
|
-
members.each{|member| block.call(member)}
|
7
|
-
end
|
8
|
-
|
9
|
-
def size
|
10
|
-
members.size
|
11
|
-
end
|
12
|
-
|
13
|
-
def members
|
14
|
-
send self.class.members_method
|
15
|
-
end
|
16
|
-
|
17
|
-
def self.collection_of(name, options={})
|
18
|
-
if options[:as]
|
19
|
-
@members_method = options[:as]
|
20
|
-
else
|
21
|
-
@members_method = name
|
22
|
-
end
|
23
|
-
elements name, options
|
24
|
-
end
|
25
|
-
|
26
|
-
def self.members_method
|
27
|
-
@members_method
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
@@ -1,14 +0,0 @@
|
|
1
|
-
module Socialcastr
|
2
|
-
class ExternalResource < Base
|
3
|
-
element :type
|
4
|
-
elements :tag, :as => :tags, :class => Socialcastr::Tag
|
5
|
-
element :canonical_hashtag
|
6
|
-
element :source, :class => Socialcastr::Source
|
7
|
-
elements :media_file, :as => :media_files, :class => Socialcastr::MediaFile
|
8
|
-
element :url
|
9
|
-
element :title
|
10
|
-
element :description
|
11
|
-
element :id
|
12
|
-
|
13
|
-
end
|
14
|
-
end
|
data/lib/socialcastr/flag.rb
DELETED
data/lib/socialcastr/group.rb
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
module Socialcastr
|
2
|
-
class MediaFile < Base
|
3
|
-
element :external_resource_id
|
4
|
-
element :page_url
|
5
|
-
element :attachment_id
|
6
|
-
element :content_type
|
7
|
-
element :url
|
8
|
-
element :thumbnails, :class => Socialcastr::ThumbnailList
|
9
|
-
element :title
|
10
|
-
element :description
|
11
|
-
end
|
12
|
-
end
|
data/lib/socialcastr/source.rb
DELETED
data/lib/socialcastr/stream.rb
DELETED
data/lib/socialcastr/tag.rb
DELETED