rtunesu 0.4.1 → 0.4.2
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/VERSION +1 -1
- data/lib/rtunesu/associations.rb +22 -4
- data/lib/rtunesu/entities/external_feed.rb +9 -0
- data/lib/rtunesu/entities/file.rb +1 -1
- data/lib/rtunesu/entities/group.rb +28 -0
- data/lib/rtunesu/entities/template.rb +2 -0
- data/lib/rtunesu/entity.rb +9 -7
- data/spec/entities/file_spec.rb +18 -0
- data/spec/entities/group_spec.rb +36 -0
- data/spec/spec_helper.rb +1 -1
- metadata +4 -2
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.4.
|
1
|
+
0.4.2
|
data/lib/rtunesu/associations.rb
CHANGED
@@ -6,14 +6,27 @@ module RTunesU
|
|
6
6
|
@owner = owner
|
7
7
|
@owner.edits[name] = self
|
8
8
|
@edits = []
|
9
|
-
self.from_xml(name)
|
10
9
|
end
|
11
10
|
|
12
11
|
end
|
13
12
|
|
14
13
|
class HasAEntityCollectionProxy < SubentityAssociationProxy
|
15
14
|
delegate :class, :to => :target
|
16
|
-
attr_reader :target
|
15
|
+
attr_reader :target
|
16
|
+
|
17
|
+
def self.new_or_nil(source_xml, owner, name)
|
18
|
+
return nil if source_xml.empty?
|
19
|
+
proxy = self.new(source_xml, owner, name)
|
20
|
+
proxy.from_xml(name)
|
21
|
+
return proxy
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.new_from_target(target, owner, name)
|
25
|
+
proxy = self.new(nil, owner, name)
|
26
|
+
proxy.instance_variable_set("@target", target)
|
27
|
+
return proxy
|
28
|
+
end
|
29
|
+
|
17
30
|
def from_xml(name)
|
18
31
|
if @source_xml
|
19
32
|
@target = "RTunesU::#{name}".constantize.new(:source_xml => @source_xml.first, :parent_handle => @owner.handle)
|
@@ -22,8 +35,8 @@ module RTunesU
|
|
22
35
|
end
|
23
36
|
end
|
24
37
|
|
25
|
-
def to_xml(
|
26
|
-
@target.to_xml(
|
38
|
+
def to_xml(xml_builder = Builder::XmlMarkup.new)
|
39
|
+
@target.to_xml(xml_builder) if @target.edits.any?
|
27
40
|
end
|
28
41
|
|
29
42
|
def method_missing(method_name, *args)
|
@@ -34,6 +47,11 @@ module RTunesU
|
|
34
47
|
class HasNEntityCollectionProxy < SubentityAssociationProxy
|
35
48
|
delegate :[], :at, :first, :last, :size, :clear, :to => :target
|
36
49
|
attr_reader :target, :edits
|
50
|
+
|
51
|
+
def initialize(source_xml, owner, name)
|
52
|
+
super
|
53
|
+
self.from_xml(name)
|
54
|
+
end
|
37
55
|
|
38
56
|
def from_xml(name)
|
39
57
|
if @source_xml
|
@@ -5,6 +5,15 @@ module RTunesU
|
|
5
5
|
validates! :polling_interval, [:never, :daily]
|
6
6
|
validates! :security_type, [:none, 'Basic Authentication']
|
7
7
|
|
8
|
+
# an ExternalFeed must serialize in a specific order
|
9
|
+
def to_xml(xml_builder = Builder::XmlMarkup.new)
|
10
|
+
xml_builder.tag!('ExternalFeed') do
|
11
|
+
%w(URL OwnerEmail PollingInterval SecurityType SignatureType BasicAuthUsername BasicAuthPassword).each do |tag_name|
|
12
|
+
xml_builder.tag!(tag_name, self.edits[tag_name]) if self.edits[tag_name]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
8
17
|
# As an entirely nested entity ExternalFeed instances don't have a parent handle. However, something 'truthy' needs
|
9
18
|
# to be presnet for proper XML document genration.
|
10
19
|
def parent_handle # :nodoc:
|
@@ -2,10 +2,38 @@ module RTunesU
|
|
2
2
|
# A Group in iTunes U. A Group is expressed as a tab in the iTunes interface.
|
3
3
|
|
4
4
|
class Group < Entity
|
5
|
+
ACCESS = {
|
6
|
+
:no_access => "No Access",
|
7
|
+
:steaming => "Streaming",
|
8
|
+
:download => "Download",
|
9
|
+
:drop_box => "Drop Box",
|
10
|
+
:shared => "Shared",
|
11
|
+
:edit => "Edit"
|
12
|
+
}
|
13
|
+
TYPES = {
|
14
|
+
:feed => "Feed"
|
15
|
+
}
|
5
16
|
composed_of :name, :group_type, :short_name, :allow_subscription, :explicit
|
6
17
|
composed_of :aggregate_file_size, :readonly => true
|
7
18
|
validates! :group_type, [:simple, :smart, :feed]
|
8
19
|
has_a :external_feed
|
9
20
|
has_n :permissions, :tracks, :shared_objects
|
21
|
+
|
22
|
+
# a Group must serialize in a specific order
|
23
|
+
def to_xml(xml_builder = Builder::XmlMarkup.new)
|
24
|
+
xml_builder.tag!('Group') do
|
25
|
+
%w(Name Handle GroupType Explicit).each do |tag_name|
|
26
|
+
xml_builder.tag!(tag_name, self.edits[tag_name]) if self.edits[tag_name]
|
27
|
+
end
|
28
|
+
|
29
|
+
self.tracks.to_xml(xml_builder)
|
30
|
+
self.permissions.to_xml(xml_builder)
|
31
|
+
|
32
|
+
%w(AllowSubscription).each do |tag_name|
|
33
|
+
xml_builder.tag!(tag_name, self.edits[tag_name]) if self.edits[tag_name]
|
34
|
+
end
|
35
|
+
self.external_feed.to_xml(xml_builder) if self.external_feed
|
36
|
+
end
|
37
|
+
end
|
10
38
|
end
|
11
39
|
end
|
data/lib/rtunesu/entity.rb
CHANGED
@@ -52,7 +52,7 @@ module RTunesU
|
|
52
52
|
end
|
53
53
|
|
54
54
|
def self.composed_of(*names)
|
55
|
-
options = names.
|
55
|
+
options = names.extract_options!
|
56
56
|
self.attributes.merge(names)
|
57
57
|
names.each do |name|
|
58
58
|
storage_name = options[:as] || name.to_s.camelize
|
@@ -70,24 +70,26 @@ module RTunesU
|
|
70
70
|
end
|
71
71
|
|
72
72
|
def self.has_a(*names)
|
73
|
-
options = names.
|
73
|
+
options = names.extract_options!
|
74
74
|
self.attributes.merge(names)
|
75
75
|
names.each do |name|
|
76
76
|
define_method(name) do
|
77
77
|
entity_name = options[:as] || name.to_s.camelize
|
78
|
-
|
78
|
+
edits[entity_name] || RTunesU::HasAEntityCollectionProxy.new_or_nil(self.source_xml./(entity_name), self, entity_name)
|
79
79
|
end
|
80
80
|
|
81
81
|
unless options[:readonly]
|
82
82
|
define_method(:"#{name}=") do |arg|
|
83
|
-
|
83
|
+
entity_name = options[:as] || name.to_s.camelize
|
84
|
+
RTunesU::HasAEntityCollectionProxy.new_from_target(arg, self, entity_name)
|
85
|
+
#edits[options[:as] || name.to_s.camelize] = arg
|
84
86
|
end
|
85
87
|
end
|
86
88
|
end
|
87
89
|
end
|
88
90
|
|
89
91
|
def self.has_n(*names)
|
90
|
-
options = names.
|
92
|
+
options = names.extract_options!
|
91
93
|
self.attributes.merge(names)
|
92
94
|
names.each do |name|
|
93
95
|
define_method(name) do
|
@@ -180,11 +182,11 @@ module RTunesU
|
|
180
182
|
# Converts the entities changed attributes and subentities to XML. Called by Document when building
|
181
183
|
# documents to transfer to iTunes U.
|
182
184
|
def to_xml(xml_builder = Builder::XmlMarkup.new)
|
183
|
-
xml_builder.tag!(self.class_name)
|
185
|
+
xml_builder.tag!(self.class_name) do
|
184
186
|
self.edits.each do |attribute,edit|
|
185
187
|
edit.is_a?(SubentityAssociationProxy) ? edit.to_xml(xml_builder) : xml_builder.tag!(attribute, edit)
|
186
188
|
end
|
187
|
-
|
189
|
+
end
|
188
190
|
end
|
189
191
|
|
190
192
|
def inspect
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper.rb'
|
2
|
+
require File.dirname(__FILE__) + '/../entity_spec.rb'
|
3
|
+
|
4
|
+
include RTunesU
|
5
|
+
|
6
|
+
describe RTunesU::File do
|
7
|
+
before(:each) do
|
8
|
+
@klass = RTunesU::File
|
9
|
+
@entity = RTunesU::File.new
|
10
|
+
@file = @entity
|
11
|
+
@attributes = {:name => 'foo.png'}
|
12
|
+
end
|
13
|
+
|
14
|
+
it_should_behave_like "an Entity with attribute assignment"
|
15
|
+
|
16
|
+
it_should_be_composed_of :name, :path, :shared
|
17
|
+
it_should_be_composed_of :size, :readonly => true
|
18
|
+
end
|
data/spec/entities/group_spec.rb
CHANGED
@@ -16,4 +16,40 @@ describe Group do
|
|
16
16
|
it_should_be_composed_of :aggregate_file_size, :readonly => true
|
17
17
|
it_should_have_many :permissions, :tracks, :shared_objects
|
18
18
|
it_should_have_a :external_feed
|
19
|
+
|
20
|
+
describe "external feed" do
|
21
|
+
it "should return nil if unset" do
|
22
|
+
@entity.external_feed.should be_nil
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should return feed from XML if present" do
|
26
|
+
id = 2628591672
|
27
|
+
mock_connect!
|
28
|
+
FakeWeb.register_uri(:get,
|
29
|
+
"https://deimos.apple.com/WebObjects/Core.woa/API/GetUploadURL/example.edu.#{id}?credentials=Administrator%40urn%3Amace%3Aitunesu.com%3Asites%3Aexample.edu&identity=%22Admin%22+%3Cadmin%40example.edu%3E+%28admin%29+%5B0%5D&time=1214619134&signature=121a6cf76c9c5ecda41450d87e3394b9d02c570a5f76b2bd16287f860f068302&type=XMLControlFile",
|
30
|
+
:body => mock_upload_url_for_handle(id))
|
31
|
+
FakeWeb.register_uri(:post, mock_upload_url_for_handle(id), :body => response_for(@klass, 'show', true))
|
32
|
+
@entity = Group.find(id)
|
33
|
+
@entity.external_feed.should_not be_nil
|
34
|
+
FakeWeb.clean_registry
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should return a feed if set" do
|
38
|
+
@entity.external_feed = ExternalFeed.new
|
39
|
+
@entity.external_feed.should_not be_nil
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "access rights" do
|
44
|
+
it "should have the correct access rights as constant" do
|
45
|
+
Group::ACCESS.should == {
|
46
|
+
:no_access => "No Access",
|
47
|
+
:steaming => "Streaming",
|
48
|
+
:download => "Download",
|
49
|
+
:drop_box => "Drop Box",
|
50
|
+
:shared => "Shared",
|
51
|
+
:edit => "Edit"
|
52
|
+
}
|
53
|
+
end
|
54
|
+
end
|
19
55
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -48,7 +48,7 @@ def it_should_have_a(*associations)
|
|
48
48
|
associations.each do |association|
|
49
49
|
it "should have a #{association}" do
|
50
50
|
@entity.should respond_to(association)
|
51
|
-
@entity.send(association).should be_kind_of(HasAEntityCollectionProxy)
|
51
|
+
# @entity.send(association).should be_kind_of(HasAEntityCollectionProxy)
|
52
52
|
end
|
53
53
|
end
|
54
54
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rtunesu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Trek Glowacki
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-11-08 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -88,6 +88,7 @@ files:
|
|
88
88
|
- spec/entities/course_spec.rb
|
89
89
|
- spec/entities/division_spec.rb
|
90
90
|
- spec/entities/external_feed_spec.rb
|
91
|
+
- spec/entities/file_spec.rb
|
91
92
|
- spec/entities/group_spec.rb
|
92
93
|
- spec/entities/permission_spec.rb
|
93
94
|
- spec/entities/section_spec.rb
|
@@ -183,6 +184,7 @@ test_files:
|
|
183
184
|
- spec/entities/course_spec.rb
|
184
185
|
- spec/entities/division_spec.rb
|
185
186
|
- spec/entities/external_feed_spec.rb
|
187
|
+
- spec/entities/file_spec.rb
|
186
188
|
- spec/entities/group_spec.rb
|
187
189
|
- spec/entities/permission_spec.rb
|
188
190
|
- spec/entities/section_spec.rb
|