activitystreams 0.0.1
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/.gitignore +5 -0
- data/Gemfile +4 -0
- data/LICENSE +20 -0
- data/Rakefile +11 -0
- data/VERSION +1 -0
- data/activitystreams.gemspec +21 -0
- data/lib/activitystreams.rb +15 -0
- data/lib/activitystreams/activity.rb +39 -0
- data/lib/activitystreams/base.rb +34 -0
- data/lib/activitystreams/collection.rb +18 -0
- data/lib/activitystreams/exception.rb +7 -0
- data/lib/activitystreams/media_link.rb +19 -0
- data/lib/activitystreams/object.rb +38 -0
- data/lib/activitystreams/stream.rb +9 -0
- data/lib/activitystreams/validator.rb +54 -0
- data/lib/activitystreams/verb.rb +14 -0
- data/spec/activitystreams/activity_spec.rb +51 -0
- data/spec/activitystreams/base_spec.rb +42 -0
- data/spec/activitystreams/collection_spec.rb +44 -0
- data/spec/activitystreams/media_link_spec.rb +53 -0
- data/spec/activitystreams/object_spec.rb +47 -0
- data/spec/activitystreams/stream_spec.rb +35 -0
- data/spec/activitystreams/validator_spec.rb +150 -0
- data/spec/activitystreams/verb_spec.rb +18 -0
- data/spec/spec_helper.rb +5 -0
- metadata +216 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2011 nov matake
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.1
|
@@ -0,0 +1,21 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = "activitystreams"
|
3
|
+
s.version = File.read("VERSION")
|
4
|
+
s.authors = ["nov matake"]
|
5
|
+
s.email = ["nov@matake.jp"]
|
6
|
+
s.homepage = "http://github.com/nov/activitystreams"
|
7
|
+
s.summary = %q{A RubyGem for ActivityStreams Publishers}
|
8
|
+
s.description = %q{A RubyGem for ActivityStreams Publishers}
|
9
|
+
s.files = `git ls-files`.split("\n")
|
10
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
11
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
12
|
+
s.require_paths = ["lib"]
|
13
|
+
s.add_runtime_dependency "json", ">= 1.4.3"
|
14
|
+
s.add_runtime_dependency "activesupport", ">= 2.3"
|
15
|
+
s.add_runtime_dependency "i18n"
|
16
|
+
s.add_runtime_dependency "attr_required", ">= 0.0.3"
|
17
|
+
s.add_runtime_dependency "addressable"
|
18
|
+
s.add_development_dependency "rake", ">= 0.8"
|
19
|
+
s.add_development_dependency "rcov", ">= 0.9"
|
20
|
+
s.add_development_dependency "rspec", ">= 2"
|
21
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'active_support/core_ext'
|
3
|
+
require 'attr_required'
|
4
|
+
require 'attr_optional'
|
5
|
+
require 'addressable/uri'
|
6
|
+
|
7
|
+
require 'activitystreams/validator'
|
8
|
+
require 'activitystreams/exception'
|
9
|
+
require 'activitystreams/base'
|
10
|
+
require 'activitystreams/collection'
|
11
|
+
require 'activitystreams/stream'
|
12
|
+
require 'activitystreams/activity'
|
13
|
+
require 'activitystreams/object'
|
14
|
+
require 'activitystreams/verb'
|
15
|
+
require 'activitystreams/media_link'
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module ActivityStreams
|
2
|
+
class Activity < Base
|
3
|
+
attr_required :actor, :verb, :published
|
4
|
+
attr_optional(
|
5
|
+
# SHOULD
|
6
|
+
:id,
|
7
|
+
:object,
|
8
|
+
# MAY
|
9
|
+
:target,
|
10
|
+
:title,
|
11
|
+
:content,
|
12
|
+
:provider,
|
13
|
+
:generator,
|
14
|
+
:icon,
|
15
|
+
:updated,
|
16
|
+
:url
|
17
|
+
)
|
18
|
+
|
19
|
+
def initialize(attributes = {})
|
20
|
+
attributes[:verb] ||= Verb.new
|
21
|
+
super
|
22
|
+
end
|
23
|
+
|
24
|
+
def validate_attributes!
|
25
|
+
super
|
26
|
+
[:id, :url].each do |_attr_|
|
27
|
+
to_iri _attr_
|
28
|
+
end
|
29
|
+
[:published, :updated].each do |_attr_|
|
30
|
+
to_time _attr_
|
31
|
+
end
|
32
|
+
[:actor, :object, :target, :provider, :generator].each do |_attr_|
|
33
|
+
validate_attribute! _attr_, Object
|
34
|
+
end
|
35
|
+
validate_attribute! :verb, Verb
|
36
|
+
validate_attribute! :icon, MediaLink
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module ActivityStreams
|
2
|
+
class Base
|
3
|
+
include AttrRequired, AttrOptional, Validator
|
4
|
+
|
5
|
+
def initialize(attributes = {})
|
6
|
+
(required_attributes + optional_attributes).each do |_attr_|
|
7
|
+
self.send :"#{_attr_}=", attributes[_attr_]
|
8
|
+
end
|
9
|
+
validate_attributes!
|
10
|
+
end
|
11
|
+
|
12
|
+
def validate_attributes!
|
13
|
+
attr_missing!
|
14
|
+
end
|
15
|
+
|
16
|
+
def as_json(options = {})
|
17
|
+
(required_attributes + optional_attributes).inject({}) do |hash, _attr_|
|
18
|
+
_value_ = self.send _attr_
|
19
|
+
hash.merge!(
|
20
|
+
_attr_ => case _value_
|
21
|
+
when Symbol, Addressable::URI
|
22
|
+
_value_.to_s
|
23
|
+
when Time
|
24
|
+
_value_.iso8601
|
25
|
+
else
|
26
|
+
_value_
|
27
|
+
end
|
28
|
+
)
|
29
|
+
end.delete_if do |k,v|
|
30
|
+
v.blank?
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module ActivityStreams
|
2
|
+
class Collection < Base
|
3
|
+
attr_optional :total_count, :items, :url
|
4
|
+
|
5
|
+
def validate_attributes!
|
6
|
+
super
|
7
|
+
if items.blank? && url.blank?
|
8
|
+
raise AttrMissing.new('Either "items" or "url" is required')
|
9
|
+
end
|
10
|
+
to_iri :url
|
11
|
+
validate_attribute! :items, item_class, :arrayed!
|
12
|
+
end
|
13
|
+
|
14
|
+
def item_class
|
15
|
+
Object
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module ActivityStreams
|
2
|
+
class MediaLink < Base
|
3
|
+
attr_required :url
|
4
|
+
attr_optional(
|
5
|
+
# MAY
|
6
|
+
:duration,
|
7
|
+
:height,
|
8
|
+
:width
|
9
|
+
)
|
10
|
+
|
11
|
+
def validate_attributes!
|
12
|
+
super
|
13
|
+
to_iri :url
|
14
|
+
[:duration, :height, :width].each do |_attr_|
|
15
|
+
to_integer _attr_
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module ActivityStreams
|
2
|
+
class Object < Base
|
3
|
+
attr_optional(
|
4
|
+
# SHOULD
|
5
|
+
:id,
|
6
|
+
:downstream_duplicates,
|
7
|
+
:upstream_duplicates,
|
8
|
+
# MAY
|
9
|
+
:attachments,
|
10
|
+
:author,
|
11
|
+
:content,
|
12
|
+
:display_name,
|
13
|
+
:image,
|
14
|
+
:type,
|
15
|
+
:published,
|
16
|
+
:summary,
|
17
|
+
:updated,
|
18
|
+
:url
|
19
|
+
)
|
20
|
+
|
21
|
+
def validate_attributes!
|
22
|
+
super
|
23
|
+
[:id, :type, :url].each do |_attr_|
|
24
|
+
to_iri _attr_
|
25
|
+
end
|
26
|
+
[:published, :updated].each do |_attr_|
|
27
|
+
to_time _attr_
|
28
|
+
end
|
29
|
+
validate_attribute! :author, Object
|
30
|
+
validate_attribute! :image, MediaLink
|
31
|
+
validate_attribute! :attachments, Object, :arrayed!
|
32
|
+
[:downstream_duplicates, :upstream_duplicates].each do |_attr_|
|
33
|
+
to_iri _attr_, :arrayed!
|
34
|
+
end
|
35
|
+
# TODO: display_name MUST NOT include HTML
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module ActivityStreams
|
2
|
+
module Validator
|
3
|
+
def validate_attribute!(attribute, klass, arrayed = false)
|
4
|
+
_value_ = self.send attribute
|
5
|
+
return if _value_.blank?
|
6
|
+
if arrayed
|
7
|
+
_value_.all? do |_v_|
|
8
|
+
_v_.is_a?(klass)
|
9
|
+
end or
|
10
|
+
raise InvalidAttribute.new("#{attribute} should be an array of #{klass}")
|
11
|
+
else
|
12
|
+
_value_.is_a?(klass) or
|
13
|
+
raise InvalidAttribute.new("#{attribute} should be a #{klass}")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_iri(attribute, arrayed = false)
|
18
|
+
_value_ = self.send attribute
|
19
|
+
_value_ = if arrayed
|
20
|
+
Array(_value_).collect do |_v_|
|
21
|
+
Addressable::URI.parse(_v_)
|
22
|
+
end
|
23
|
+
else
|
24
|
+
Addressable::URI.parse(_value_)
|
25
|
+
end
|
26
|
+
self.send :"#{attribute}=", _value_
|
27
|
+
rescue Addressable::URI::InvalidURIError => e
|
28
|
+
message = if arrayed
|
29
|
+
"#{attribute} should be an array of valid IRI"
|
30
|
+
else
|
31
|
+
"#{attribute} should be a valid IRI"
|
32
|
+
end
|
33
|
+
raise InvalidAttribute.new(message)
|
34
|
+
end
|
35
|
+
|
36
|
+
def to_time(attribute)
|
37
|
+
_value_ = self.send attribute
|
38
|
+
_value_ = case _value_
|
39
|
+
when String
|
40
|
+
Time.parse _value_, :raise_me
|
41
|
+
else
|
42
|
+
_value_
|
43
|
+
end
|
44
|
+
self.send :"#{attribute}=", _value_
|
45
|
+
rescue ArgumentError, NoMethodError => e
|
46
|
+
raise InvalidAttribute.new("#{attribute} ")
|
47
|
+
end
|
48
|
+
|
49
|
+
def to_integer(attribute)
|
50
|
+
_value_ = self.send attribute
|
51
|
+
self.send :"#{attribute}=", _value_.try(:to_i)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ActivityStreams::Activity do
|
4
|
+
let :required_attributes do
|
5
|
+
{
|
6
|
+
:actor => ActivityStreams::Object.new(:display_name => 'Nov Matake'),
|
7
|
+
:published => Time.now
|
8
|
+
}
|
9
|
+
end
|
10
|
+
let :optional_attributes do
|
11
|
+
{
|
12
|
+
:id => 'activitystrea.ms/activity/foo',
|
13
|
+
:object => ActivityStreams::Object.new,
|
14
|
+
:target => ActivityStreams::Object.new,
|
15
|
+
:title => '<b>Title</b>',
|
16
|
+
:content => '<b>Content</b>',
|
17
|
+
:provider => ActivityStreams::Object.new,
|
18
|
+
:generator => ActivityStreams::Object.new,
|
19
|
+
:icon => ActivityStreams::MediaLink.new(:url => 'http://example.com/images/icon.png'),
|
20
|
+
:updated => Time.now,
|
21
|
+
:url => 'activitystrea.ms/activity/bar'
|
22
|
+
}
|
23
|
+
end
|
24
|
+
let(:valid_attributes) { required_attributes.merge(optional_attributes) }
|
25
|
+
|
26
|
+
context 'when missing attributes' do
|
27
|
+
it do
|
28
|
+
expect { ActivityStreams::Activity.new }.should raise_error AttrRequired::AttrMissing
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'otherwise' do
|
33
|
+
it do
|
34
|
+
expect { ActivityStreams::Activity.new required_attributes }.should_not raise_error AttrRequired::AttrMissing
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context 'when invalid attributes given' do
|
39
|
+
it do
|
40
|
+
expect do
|
41
|
+
ActivityStreams::Activity.new valid_attributes.merge(:icon => 'http://example.com/images/icon.png')
|
42
|
+
end.should raise_error ActivityStreams::InvalidAttribute
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context 'otherwise' do
|
47
|
+
it do
|
48
|
+
expect { ActivityStreams::Activity.new valid_attributes }.should_not raise_error AttrRequired::AttrMissing
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ActivityStreams::Base do
|
4
|
+
class SubClass < ActivityStreams::Base
|
5
|
+
attr_required :required
|
6
|
+
attr_optional :optional
|
7
|
+
end
|
8
|
+
|
9
|
+
context 'when missing attributes' do
|
10
|
+
it do
|
11
|
+
expect { SubClass.new }.should raise_error AttrRequired::AttrMissing
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
context 'otherwise' do
|
16
|
+
it 'should setup attributes' do
|
17
|
+
obj = SubClass.new(
|
18
|
+
:required => 'REQ',
|
19
|
+
:optional => 'OPT'
|
20
|
+
)
|
21
|
+
obj.required.should == 'REQ'
|
22
|
+
obj.optional.should == 'OPT'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe '#as_json' do
|
27
|
+
let(:time) { Time.parse('1981-12-13') }
|
28
|
+
let(:iri) { Addressable::URI.parse('activitystrea.ms') }
|
29
|
+
subject do
|
30
|
+
SubClass.new(
|
31
|
+
:required => time,
|
32
|
+
:optional => iri
|
33
|
+
)
|
34
|
+
end
|
35
|
+
its(:as_json) do
|
36
|
+
should == {
|
37
|
+
:required => time.iso8601,
|
38
|
+
:optional => iri.to_s
|
39
|
+
}
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ActivityStreams::Collection do
|
4
|
+
let(:collection) { ActivityStreams::Collection.new(:items => items) }
|
5
|
+
|
6
|
+
context 'when array of Activity given' do
|
7
|
+
let :items do
|
8
|
+
[
|
9
|
+
ActivityStreams::Activity.new(
|
10
|
+
:actor => ActivityStreams::Object.new(:display_name => 'Nov'),
|
11
|
+
:published => Time.now
|
12
|
+
)
|
13
|
+
]
|
14
|
+
end
|
15
|
+
|
16
|
+
it do
|
17
|
+
expect { collection }.should raise_error(
|
18
|
+
ActivityStreams::InvalidAttribute,
|
19
|
+
'items should be an array of ActivityStreams::Object'
|
20
|
+
)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'when array of Object given' do
|
25
|
+
let :items do
|
26
|
+
[
|
27
|
+
ActivityStreams::Object.new
|
28
|
+
]
|
29
|
+
end
|
30
|
+
|
31
|
+
it do
|
32
|
+
expect { collection }.should_not raise_error
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context 'when missing both items and url' do
|
37
|
+
it do
|
38
|
+
expect { ActivityStreams::Collection.new }.should raise_error(
|
39
|
+
AttrRequired::AttrMissing,
|
40
|
+
'Either "items" or "url" is required'
|
41
|
+
)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ActivityStreams::MediaLink do
|
4
|
+
let :required_attributes do
|
5
|
+
{
|
6
|
+
:url => 'http://example.com/images/icon.png'
|
7
|
+
}
|
8
|
+
end
|
9
|
+
let :optional_attributes do
|
10
|
+
{
|
11
|
+
:duration => 100.0,
|
12
|
+
:height => '200',
|
13
|
+
:width => '300.0'
|
14
|
+
}
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'when missing attributes' do
|
18
|
+
it do
|
19
|
+
expect { ActivityStreams::MediaLink.new }.should raise_error AttrRequired::AttrMissing
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'otherwise' do
|
24
|
+
subject { ActivityStreams::MediaLink.new required_attributes }
|
25
|
+
its(:url) { should be_a Addressable::URI }
|
26
|
+
|
27
|
+
context 'when optional attributes given' do
|
28
|
+
subject { ActivityStreams::MediaLink.new required_attributes.merge(optional_attributes) }
|
29
|
+
its(:duration) { should be_a Integer }
|
30
|
+
its(:height) { should be_a Integer }
|
31
|
+
its(:width) { should be_a Integer }
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'otherwise' do
|
35
|
+
its(:duration) { should be_nil }
|
36
|
+
its(:height) { should be_nil }
|
37
|
+
its(:width) { should be_nil }
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe '#as_json' do
|
42
|
+
let(:attributes) { required_attributes.merge(optional_attributes) }
|
43
|
+
subject { ActivityStreams::MediaLink.new required_attributes.merge(optional_attributes) }
|
44
|
+
its(:as_json) do
|
45
|
+
should == {
|
46
|
+
:url => required_attributes[:url],
|
47
|
+
:duration => optional_attributes[:duration].to_i,
|
48
|
+
:height => optional_attributes[:height].to_i,
|
49
|
+
:width => optional_attributes[:width].to_i
|
50
|
+
}
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ActivityStreams::Object do
|
4
|
+
let :valid_attributes do
|
5
|
+
{
|
6
|
+
:id => 'activitystrea.ms/activity/foo',
|
7
|
+
:url => 'activitystrea.ms/activity/bar',
|
8
|
+
:type => 'activitystrea.ms/activity/custom',
|
9
|
+
:downstream_duplicates => [
|
10
|
+
'activitystrea.ms/activity/123',
|
11
|
+
'activitystrea.ms/activity/234'
|
12
|
+
],
|
13
|
+
:upstream_duplicates => [
|
14
|
+
'activitystrea.ms/activity/987',
|
15
|
+
'activitystrea.ms/activity/876'
|
16
|
+
],
|
17
|
+
:attachments => [
|
18
|
+
ActivityStreams::Object.new
|
19
|
+
],
|
20
|
+
:author => ActivityStreams::Object.new(:display_name => 'Nov Matake'),
|
21
|
+
:content => '<b>NOTE:</b> Foo bar',
|
22
|
+
:display_name => 'Nov',
|
23
|
+
:image => ActivityStreams::MediaLink.new(:url => 'http://example.com/images/icon.png'),
|
24
|
+
:published => Time.now,
|
25
|
+
:summary => '<b>NOTE:</b> Foo bar',
|
26
|
+
:updated => Time.now
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should not any attributes' do
|
31
|
+
expect { ActivityStreams::Object.new }.should_not raise_error AttrRequired::AttrMissing
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'when invalid attributes given' do
|
35
|
+
it do
|
36
|
+
expect do
|
37
|
+
ActivityStreams::Object.new valid_attributes.merge(:image => 'http://example.com/images/icon.png')
|
38
|
+
end.should raise_error ActivityStreams::InvalidAttribute
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context 'otherwise' do
|
43
|
+
it do
|
44
|
+
expect { ActivityStreams::Object.new valid_attributes }.should_not raise_error AttrRequired::AttrMissing
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ActivityStreams::Stream do
|
4
|
+
let(:stream) { ActivityStreams::Stream.new(:items => items) }
|
5
|
+
|
6
|
+
context 'when array of Activity given' do
|
7
|
+
let :items do
|
8
|
+
[
|
9
|
+
ActivityStreams::Activity.new(
|
10
|
+
:actor => ActivityStreams::Object.new(:display_name => 'Nov'),
|
11
|
+
:published => Time.now
|
12
|
+
)
|
13
|
+
]
|
14
|
+
end
|
15
|
+
|
16
|
+
it do
|
17
|
+
expect { stream }.should_not raise_error
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'when array of Object given' do
|
22
|
+
let :items do
|
23
|
+
[
|
24
|
+
ActivityStreams::Object.new
|
25
|
+
]
|
26
|
+
end
|
27
|
+
|
28
|
+
it do
|
29
|
+
expect { stream }.should raise_error(
|
30
|
+
ActivityStreams::InvalidAttribute,
|
31
|
+
'items should be an array of ActivityStreams::Activity'
|
32
|
+
)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,150 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ActivityStreams::Validator do
|
4
|
+
class Foo
|
5
|
+
include ActivityStreams::Validator
|
6
|
+
attr_accessor :foo
|
7
|
+
|
8
|
+
def initialize(foo = nil)
|
9
|
+
@foo = foo
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe '#validate_attribute!' do
|
14
|
+
context 'when blank' do
|
15
|
+
it do
|
16
|
+
expect do
|
17
|
+
Foo.new.validate_attribute!(:foo, String)
|
18
|
+
Foo.new('').validate_attribute! :foo, String
|
19
|
+
Foo.new([]).validate_attribute! :foo, String
|
20
|
+
end.should_not raise_error
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'when valid' do
|
25
|
+
it do
|
26
|
+
expect { Foo.new(Time.now).validate_attribute! :foo, Time }.should_not raise_error
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context 'when invalid' do
|
31
|
+
it do
|
32
|
+
expect { Foo.new('foo').validate_attribute! :foo, Time }.should raise_error(
|
33
|
+
ActivityStreams::InvalidAttribute,
|
34
|
+
'foo should be a Time'
|
35
|
+
)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context 'when arrayed' do
|
40
|
+
context 'when valid' do
|
41
|
+
it do
|
42
|
+
expect { Foo.new([Time.now]).validate_attribute! :foo, Time, :arrayed }.should_not raise_error
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context 'when invalid' do
|
47
|
+
it do
|
48
|
+
expect { Foo.new(['foo']).validate_attribute! :foo, Time, :arrayed }.should raise_error(
|
49
|
+
ActivityStreams::InvalidAttribute,
|
50
|
+
'foo should be an array of Time'
|
51
|
+
)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe '#to_iri' do
|
58
|
+
let(:foo) { Foo.new(iri) }
|
59
|
+
let(:to_iri) { foo.to_iri :foo }
|
60
|
+
subject { to_iri }
|
61
|
+
|
62
|
+
context 'when nil' do
|
63
|
+
let(:iri) { nil }
|
64
|
+
it { should be_nil }
|
65
|
+
end
|
66
|
+
|
67
|
+
context 'when valid' do
|
68
|
+
let(:iri) { 'activitystrea.ms,2011/foo' }
|
69
|
+
it { should be_a Addressable::URI }
|
70
|
+
end
|
71
|
+
|
72
|
+
context 'when invalid' do
|
73
|
+
let(:iri) { 'http:' }
|
74
|
+
it do
|
75
|
+
expect { to_iri }.should raise_error(
|
76
|
+
ActivityStreams::InvalidAttribute,
|
77
|
+
'foo should be a valid IRI'
|
78
|
+
)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context 'when arrayed' do
|
83
|
+
let(:to_iri) { foo.to_iri :foo, :arrayed! }
|
84
|
+
|
85
|
+
context 'when valid' do
|
86
|
+
let(:iri) { ['activitystrea.ms,2011/foo'] }
|
87
|
+
it { should be_a Array }
|
88
|
+
it 'should be an array of Addressable::URI' do
|
89
|
+
to_iri.each do |iri|
|
90
|
+
iri.should be_a Addressable::URI
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
context 'when valid' do
|
96
|
+
let(:iri) { ['http:'] }
|
97
|
+
it do
|
98
|
+
expect { to_iri }.should raise_error(
|
99
|
+
ActivityStreams::InvalidAttribute,
|
100
|
+
'foo should be an array of valid IRI'
|
101
|
+
)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
describe '#to_time' do
|
108
|
+
let(:foo) { Foo.new(time) }
|
109
|
+
let(:to_time) { foo.to_time :foo }
|
110
|
+
subject { to_time }
|
111
|
+
|
112
|
+
context 'when nil' do
|
113
|
+
let(:time) { nil }
|
114
|
+
it { should be_nil }
|
115
|
+
end
|
116
|
+
|
117
|
+
context 'when valid IRI' do
|
118
|
+
let(:time) { '1981-12-13' }
|
119
|
+
it { should be_a Time }
|
120
|
+
end
|
121
|
+
|
122
|
+
context 'when invalid IRI' do
|
123
|
+
let(:time) { 'invalid-date' }
|
124
|
+
it do
|
125
|
+
expect { to_time }.should raise_error ActivityStreams::InvalidAttribute
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
describe '#to_integer' do
|
131
|
+
let(:foo) { Foo.new(integer) }
|
132
|
+
let(:to_integer) { foo.to_integer :foo }
|
133
|
+
subject { to_integer }
|
134
|
+
|
135
|
+
context 'when nil' do
|
136
|
+
let(:integer) { nil }
|
137
|
+
it { should be_nil }
|
138
|
+
end
|
139
|
+
|
140
|
+
context 'when String' do
|
141
|
+
let(:integer) { '100' }
|
142
|
+
it { should be_a Integer }
|
143
|
+
end
|
144
|
+
|
145
|
+
context 'when Float' do
|
146
|
+
let(:integer) { 10.5 }
|
147
|
+
it { should be_a Integer }
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ActivityStreams::Verb do
|
4
|
+
context 'when missing attributes' do
|
5
|
+
subject { ActivityStreams::Verb.new }
|
6
|
+
its(:verb) { should == :post }
|
7
|
+
end
|
8
|
+
|
9
|
+
context 'otherwise' do
|
10
|
+
subject { ActivityStreams::Verb.new(:verb => :my_verb) }
|
11
|
+
its(:verb) { should == :my_verb }
|
12
|
+
end
|
13
|
+
|
14
|
+
describe '#as_json' do
|
15
|
+
subject { ActivityStreams::Verb.new(:verb => :my_verb) }
|
16
|
+
its(:as_json) { should == 'my_verb' }
|
17
|
+
end
|
18
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,216 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: activitystreams
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- nov matake
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-07-05 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: json
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 1
|
29
|
+
segments:
|
30
|
+
- 1
|
31
|
+
- 4
|
32
|
+
- 3
|
33
|
+
version: 1.4.3
|
34
|
+
type: :runtime
|
35
|
+
version_requirements: *id001
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: activesupport
|
38
|
+
prerelease: false
|
39
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ">="
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
hash: 5
|
45
|
+
segments:
|
46
|
+
- 2
|
47
|
+
- 3
|
48
|
+
version: "2.3"
|
49
|
+
type: :runtime
|
50
|
+
version_requirements: *id002
|
51
|
+
- !ruby/object:Gem::Dependency
|
52
|
+
name: i18n
|
53
|
+
prerelease: false
|
54
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
55
|
+
none: false
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
hash: 3
|
60
|
+
segments:
|
61
|
+
- 0
|
62
|
+
version: "0"
|
63
|
+
type: :runtime
|
64
|
+
version_requirements: *id003
|
65
|
+
- !ruby/object:Gem::Dependency
|
66
|
+
name: attr_required
|
67
|
+
prerelease: false
|
68
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
69
|
+
none: false
|
70
|
+
requirements:
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
hash: 25
|
74
|
+
segments:
|
75
|
+
- 0
|
76
|
+
- 0
|
77
|
+
- 3
|
78
|
+
version: 0.0.3
|
79
|
+
type: :runtime
|
80
|
+
version_requirements: *id004
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
name: addressable
|
83
|
+
prerelease: false
|
84
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
85
|
+
none: false
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
hash: 3
|
90
|
+
segments:
|
91
|
+
- 0
|
92
|
+
version: "0"
|
93
|
+
type: :runtime
|
94
|
+
version_requirements: *id005
|
95
|
+
- !ruby/object:Gem::Dependency
|
96
|
+
name: rake
|
97
|
+
prerelease: false
|
98
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
99
|
+
none: false
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
hash: 27
|
104
|
+
segments:
|
105
|
+
- 0
|
106
|
+
- 8
|
107
|
+
version: "0.8"
|
108
|
+
type: :development
|
109
|
+
version_requirements: *id006
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: rcov
|
112
|
+
prerelease: false
|
113
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
114
|
+
none: false
|
115
|
+
requirements:
|
116
|
+
- - ">="
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
hash: 25
|
119
|
+
segments:
|
120
|
+
- 0
|
121
|
+
- 9
|
122
|
+
version: "0.9"
|
123
|
+
type: :development
|
124
|
+
version_requirements: *id007
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rspec
|
127
|
+
prerelease: false
|
128
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
130
|
+
requirements:
|
131
|
+
- - ">="
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
hash: 7
|
134
|
+
segments:
|
135
|
+
- 2
|
136
|
+
version: "2"
|
137
|
+
type: :development
|
138
|
+
version_requirements: *id008
|
139
|
+
description: A RubyGem for ActivityStreams Publishers
|
140
|
+
email:
|
141
|
+
- nov@matake.jp
|
142
|
+
executables: []
|
143
|
+
|
144
|
+
extensions: []
|
145
|
+
|
146
|
+
extra_rdoc_files: []
|
147
|
+
|
148
|
+
files:
|
149
|
+
- .gitignore
|
150
|
+
- Gemfile
|
151
|
+
- LICENSE
|
152
|
+
- Rakefile
|
153
|
+
- VERSION
|
154
|
+
- activitystreams.gemspec
|
155
|
+
- lib/activitystreams.rb
|
156
|
+
- lib/activitystreams/activity.rb
|
157
|
+
- lib/activitystreams/base.rb
|
158
|
+
- lib/activitystreams/collection.rb
|
159
|
+
- lib/activitystreams/exception.rb
|
160
|
+
- lib/activitystreams/media_link.rb
|
161
|
+
- lib/activitystreams/object.rb
|
162
|
+
- lib/activitystreams/stream.rb
|
163
|
+
- lib/activitystreams/validator.rb
|
164
|
+
- lib/activitystreams/verb.rb
|
165
|
+
- spec/activitystreams/activity_spec.rb
|
166
|
+
- spec/activitystreams/base_spec.rb
|
167
|
+
- spec/activitystreams/collection_spec.rb
|
168
|
+
- spec/activitystreams/media_link_spec.rb
|
169
|
+
- spec/activitystreams/object_spec.rb
|
170
|
+
- spec/activitystreams/stream_spec.rb
|
171
|
+
- spec/activitystreams/validator_spec.rb
|
172
|
+
- spec/activitystreams/verb_spec.rb
|
173
|
+
- spec/spec_helper.rb
|
174
|
+
homepage: http://github.com/nov/activitystreams
|
175
|
+
licenses: []
|
176
|
+
|
177
|
+
post_install_message:
|
178
|
+
rdoc_options: []
|
179
|
+
|
180
|
+
require_paths:
|
181
|
+
- lib
|
182
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
183
|
+
none: false
|
184
|
+
requirements:
|
185
|
+
- - ">="
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
hash: 3
|
188
|
+
segments:
|
189
|
+
- 0
|
190
|
+
version: "0"
|
191
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
192
|
+
none: false
|
193
|
+
requirements:
|
194
|
+
- - ">="
|
195
|
+
- !ruby/object:Gem::Version
|
196
|
+
hash: 3
|
197
|
+
segments:
|
198
|
+
- 0
|
199
|
+
version: "0"
|
200
|
+
requirements: []
|
201
|
+
|
202
|
+
rubyforge_project:
|
203
|
+
rubygems_version: 1.7.2
|
204
|
+
signing_key:
|
205
|
+
specification_version: 3
|
206
|
+
summary: A RubyGem for ActivityStreams Publishers
|
207
|
+
test_files:
|
208
|
+
- spec/activitystreams/activity_spec.rb
|
209
|
+
- spec/activitystreams/base_spec.rb
|
210
|
+
- spec/activitystreams/collection_spec.rb
|
211
|
+
- spec/activitystreams/media_link_spec.rb
|
212
|
+
- spec/activitystreams/object_spec.rb
|
213
|
+
- spec/activitystreams/stream_spec.rb
|
214
|
+
- spec/activitystreams/validator_spec.rb
|
215
|
+
- spec/activitystreams/verb_spec.rb
|
216
|
+
- spec/spec_helper.rb
|