howcast 0.4.16 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,7 @@
1
+ == 0.5.0 2010-03-17
2
+
3
+ * Add user object
4
+
1
5
  == 0.4.16 2010-03-16
2
6
 
3
7
  * Add permalink to category object
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.16
1
+ 0.5.0
data/howcast.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{howcast}
8
- s.version = "0.4.16"
8
+ s.version = "0.5.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Jingshen Jimmy Zhang", "Ian Smith-Heisters"]
12
- s.date = %q{2010-03-16}
12
+ s.date = %q{2010-03-17}
13
13
  s.description = %q{ Howcast offers an Application Programming Interface (API) which allows
14
14
  developers to build applications that interface with Howcast. The Howcast
15
15
  API is RESTful (REpresentational State Transfer) and users of this API will
@@ -38,12 +38,14 @@ Gem::Specification.new do |s|
38
38
  "lib/howcast/client/category.rb",
39
39
  "lib/howcast/client/marker.rb",
40
40
  "lib/howcast/client/search.rb",
41
+ "lib/howcast/client/user.rb",
41
42
  "lib/howcast/client/video.rb",
42
43
  "lib/howcast/errors.rb",
43
44
  "lib/howcast/logging.rb",
44
45
  "spec/howcast/client/base_spec.rb",
45
46
  "spec/howcast/client/category_spec.rb",
46
47
  "spec/howcast/client/search_spec.rb",
48
+ "spec/howcast/client/user_spec.rb",
47
49
  "spec/howcast/client/video_spec.rb",
48
50
  "spec/output_capture_helper.rb",
49
51
  "spec/spec.opts",
@@ -61,6 +63,7 @@ Gem::Specification.new do |s|
61
63
  "spec/howcast/client/base_spec.rb",
62
64
  "spec/howcast/client/category_spec.rb",
63
65
  "spec/howcast/client/search_spec.rb",
66
+ "spec/howcast/client/user_spec.rb",
64
67
  "spec/howcast/client/video_spec.rb",
65
68
  "spec/output_capture_helper.rb",
66
69
  "spec/spec_helper.rb",
@@ -2,6 +2,6 @@
2
2
  class Howcast::Client
3
3
  end
4
4
 
5
- %w(client/base client/video client/search client/category client/marker).each do |dependency|
5
+ %w(client/base client/video client/search client/category client/marker client/user).each do |dependency|
6
6
  require(File.expand_path(File.join(File.dirname(__FILE__), dependency)))
7
7
  end
@@ -0,0 +1,94 @@
1
+ #--
2
+ # Copyright (c) 2010 Howcast Media Inc.
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #++
23
+
24
+ class Howcast::Client
25
+ class User
26
+ extend WatchAttrAccessors
27
+ attr_accessor :login, :videos
28
+
29
+ # Creates a new User object which is used to encapsulate all the attributes available
30
+ # from the Howcast user profile API.
31
+ #
32
+ # === Inputs
33
+ #
34
+ # * <tt>attributes</tt> -- A hash to set the various attributes of the user object
35
+ #
36
+ # === Examples
37
+ #
38
+ # Initialize a user with login "someone"
39
+ # User.new :login => "someone"
40
+ def initialize(attributes={})
41
+ attributes.each do |k, v|
42
+ self.send("#{k}=", v) if self.respond_to?(k)
43
+ end
44
+ end
45
+ end
46
+
47
+ # Provides access to the Howcast user API.
48
+ #
49
+ # === Inputs
50
+ #
51
+ # * <tt>login</tt> -- The login/username of the user to lookup
52
+ #
53
+ # === Outputs
54
+ #
55
+ # User object if the login exists or nil if the login doesn't exist or is malformed
56
+ #
57
+ # === Exceptions
58
+ #
59
+ # * <tt>Howcast::ApiNotFound</tt>
60
+ #
61
+ # === Examples
62
+ #
63
+ # Get the Howcast user with login 'someone'
64
+ # Howcast::Client.new.user('someone')
65
+ def user(login)
66
+ response = establish_connection("users/#{login}/profile/videos.xml")
67
+ parse_single_user_xml(login, response)
68
+ end
69
+
70
+ private
71
+ # Exception here to set the login vs. parsing it (not currently included in the api response)
72
+ def parse_single_user_xml(login, xml)
73
+ hash = {}
74
+ User.attr_accessors.each do |attribute|
75
+ node_name = attribute.to_s.gsub("_", "-") # xml schema uses hyphens for spaces, but ruby uses underscores
76
+ if node_name == "videos"
77
+ hash[attribute] = videos_for(xml) unless xml.at(node_name).nil?
78
+ else
79
+ hash[attribute] = !xml.at(node_name).nil? ? xml.at(node_name).inner_text.strip : ""
80
+ end
81
+ end
82
+ hash[:login] = login
83
+ hash.values.all?{|v| v==""} ? nil : User.new(hash)
84
+ end
85
+
86
+ def videos_for(xml)
87
+ videos = []
88
+ node = xml.at('videos')
89
+ node.children_of_type('video').each do |child|
90
+ videos << parse_single_xml(child, Video)
91
+ end unless node.nil?
92
+ videos
93
+ end
94
+ end
@@ -0,0 +1,43 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Howcast::Client::User, "initialize" do
4
+ it "should create a user object with all the inputted attributes" do
5
+ user = Howcast::Client::User.new :login => "someone"
6
+ user.login.should == 'someone'
7
+ end
8
+
9
+ it "should ignore inputs which are not user attributes" do
10
+ user = Howcast::Client::User.new :not_an_attribute => "value", :login => "someone"
11
+ user.respond_to?(:not_an_attribute).should be_false
12
+ user.login.should == "someone"
13
+ end
14
+ end
15
+
16
+ describe Howcast::Client, "user" do
17
+ before do
18
+ @hc = Howcast::Client.new(:key => "myapikey")
19
+ @hc.stub!(:open).and_return(user_videos_xml)
20
+ end
21
+
22
+ it "should establish a connection with the correct user url" do
23
+ @hc.should_receive(:open).with(equivalent_uri("http://www.howcast.com/users/someone/profile/videos.xml?api_key=myapikey")).and_return(user_videos_xml)
24
+ @hc.user('someone')
25
+ end
26
+
27
+ it "should raise Howcast::ApiKeyNotFound error when the response contains Invalid API Key" do
28
+ lambda {
29
+ @hc.stub!(:open).and_return(invalid_api_key_xml)
30
+ @hc.user('someone')
31
+ }.should raise_error(Howcast::ApiKeyNotFound)
32
+ end
33
+
34
+ it "should set the login attribute in the user model response" do
35
+ @hc.user('someone').login.should == "someone"
36
+ end
37
+
38
+ it "should set the videos attribute in the user model response" do
39
+ videos = @hc.user('someone').videos
40
+ videos.size.should == 1
41
+ videos[0].title.should == "How To Remove Bike Handlebar Grips"
42
+ end
43
+ end
@@ -2485,4 +2485,44 @@ module XmlFixturesHelper
2485
2485
  </howcast>
2486
2486
  VID
2487
2487
  end
2488
+
2489
+ def user_videos_xml
2490
+ <<-VID
2491
+ <?xml version="1.0" encoding="UTF-8"?>
2492
+ <howcast version="0.1">
2493
+ <title>Howcast - mrmark86's videos</title>
2494
+ <count>1</count>
2495
+ <videos>
2496
+ <video>
2497
+ <category-id>1356</category-id>
2498
+ <id>329098</id>
2499
+ <title>How To Remove Bike Handlebar Grips</title>
2500
+ <views>77</views>
2501
+ <type>HowcastGuide</type>
2502
+ <created-at>Sun, 14 Mar 2010 11:02:07 -0700</created-at>
2503
+ <rating>0</rating>
2504
+ <username>mrmark86</username>
2505
+ <description>
2506
+ <![CDATA[Remove your handlebar grips in just a few minutes with these tips.]]>
2507
+ </description>
2508
+ <embed>
2509
+ <![CDATA[<object width="425" height="352" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="howcastplayer"><param name="movie" value="http://www.howcast.com/flash/howcast_player.swf?file=329098"></param><param name="allowFullScreen" value="true"></param><param name="allowScriptAccess" value="always"></param><embed src="http://www.howcast.com/flash/howcast_player.swf?file=329098" type="application/x-shockwave-flash" width="425" height="352" allowFullScreen="true" allowScriptAccess="always" ></embed></object>]]>
2510
+ </embed>
2511
+ <duration>61</duration>
2512
+ <filename>http://media.howcast.com/system/videos/6/16/57/32/325716.flv</filename>
2513
+ <tags>sports, fitness, bikes, biking, bicycles, handles, grips, removal, tools, screwdriver</tags>
2514
+ <category-hierarchy>
2515
+ <category id="1334">Sports &amp; Fitness</category>
2516
+ <category parent_id="1334" id="1353">Bikes &amp; Biking</category>
2517
+ <category parent_id="1353" id="1356">Biking Equipment</category>
2518
+ </category-hierarchy>
2519
+ <comment-count>0</comment-count>
2520
+ <thumbnail-url>http://img.howcast.com/system/thumbnails/329098/RemoveBikeHandlebarGrips_xxlarge_maintained_aspect.png</thumbnail-url>
2521
+ <permalink>http://www.howcast.com/videos/329098-How-To-Remove-Bike-Handlebar-Grips</permalink>
2522
+ <content_rating>nonadult</content_rating>
2523
+ </video>
2524
+ </videos>
2525
+ </howcast>
2526
+ VID
2527
+ end
2488
2528
  end
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 4
8
- - 16
9
- version: 0.4.16
7
+ - 5
8
+ - 0
9
+ version: 0.5.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Jingshen Jimmy Zhang
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-03-16 00:00:00 -07:00
18
+ date: 2010-03-17 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -64,12 +64,14 @@ files:
64
64
  - lib/howcast/client/category.rb
65
65
  - lib/howcast/client/marker.rb
66
66
  - lib/howcast/client/search.rb
67
+ - lib/howcast/client/user.rb
67
68
  - lib/howcast/client/video.rb
68
69
  - lib/howcast/errors.rb
69
70
  - lib/howcast/logging.rb
70
71
  - spec/howcast/client/base_spec.rb
71
72
  - spec/howcast/client/category_spec.rb
72
73
  - spec/howcast/client/search_spec.rb
74
+ - spec/howcast/client/user_spec.rb
73
75
  - spec/howcast/client/video_spec.rb
74
76
  - spec/output_capture_helper.rb
75
77
  - spec/spec.opts
@@ -111,6 +113,7 @@ test_files:
111
113
  - spec/howcast/client/base_spec.rb
112
114
  - spec/howcast/client/category_spec.rb
113
115
  - spec/howcast/client/search_spec.rb
116
+ - spec/howcast/client/user_spec.rb
114
117
  - spec/howcast/client/video_spec.rb
115
118
  - spec/output_capture_helper.rb
116
119
  - spec/spec_helper.rb