mixcloud 0.0.3 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,7 +1,6 @@
1
1
  require 'rubygems'
2
2
  require 'rest_client'
3
3
  require 'json'
4
- require 'rspec'
5
4
 
6
5
  require 'mixcloud/popular_new_hot'
7
6
  require 'mixcloud/url_helper'
@@ -14,3 +13,4 @@ require 'mixcloud/tag'
14
13
  require 'mixcloud/track'
15
14
  require 'mixcloud/user'
16
15
  require 'mixcloud/search'
16
+ require 'mixcloud/error'
@@ -20,7 +20,7 @@ module Mixcloud
20
20
 
21
21
  ['userpick_users', 'userpick_cloudcasts', 'users', 'cloudcasts' ].each do | connection |
22
22
  define_method "#{connection}_url" do
23
- UrlHelper.turn_www_to_api(@public_url).concat "#{connection.gsub("_", "-")}/"
23
+ turn_www_to_api(@public_url).concat "#{connection.gsub("_", "-")}/"
24
24
  end
25
25
  end
26
26
  end
@@ -30,7 +30,7 @@ module Mixcloud
30
30
 
31
31
  ['listeners', 'similar', 'favorites', 'comments'].each do | connection |
32
32
  define_method "#{connection}_url" do
33
- UrlHelper.turn_www_to_api(@public_url) + "#{connection.gsub("_", "-")}/?metadata=1"
33
+ turn_www_to_api(@public_url) + "#{connection.gsub("_", "-")}/?metadata=1"
34
34
  end
35
35
  end
36
36
 
@@ -38,21 +38,26 @@ module Mixcloud
38
38
  convert_hash_data_into_array_of('sections')
39
39
  end
40
40
 
41
- def tag_urls
41
+ def tags
42
42
  convert_hash_data_into_array_of('tags')
43
43
  end
44
+
45
+ def tag_urls
46
+ tags.map(&:api_url)
47
+ end
44
48
 
45
49
  #######################################################################
46
50
  private
47
51
  def convert_hash_data_into_array_of(type)
48
- raise 'I only take sections of tags, dude' unless ['sections', 'tags'].include?(type)
52
+ raise Mixcloud::Error.new("type should be 'sections' or 'tags', but you provided '#{type}'") unless ['sections', 'tags'].include?(type)
49
53
  elements_hash = JSON.parse(RestClient.get @api_url)[type]
50
54
  objects_array = []
51
55
  elements_hash.each do | element |
52
56
  if type == 'sections'
53
- objects_array << Mixcloud::Section.new(UrlHelper.turn_www_to_api(element['track']['url']), element['position'], element['start_type'], element['section_type'] )
57
+ objects_array << Mixcloud::Section.new(turn_www_to_api(element['track']['url'] + "?metadata=1"),
58
+ element['position'], element['start_time'], element['section_type'])
54
59
  elsif type == 'tags'
55
- objects_array << UrlHelper.turn_www_to_api(element['url']).concat('?metadata=1')
60
+ objects_array << Mixcloud::Tag.new(turn_www_to_api(element['url']).concat('?metadata=1'))
56
61
  end
57
62
  end
58
63
  objects_array
@@ -0,0 +1,7 @@
1
+ module Mixcloud
2
+ class Error < StandardError
3
+ def initialize(message)
4
+ super(message)
5
+ end
6
+ end
7
+ end
@@ -1,15 +1,19 @@
1
1
  module Mixcloud
2
2
  module PopularNewHot
3
+ def self.included(base)
4
+ base.class_eval{include UrlHelper} unless base.include?(UrlHelper)
5
+ end
6
+
3
7
  def popular_url
4
- UrlHelper.turn_www_to_api(@public_url).concat 'popular/'
8
+ turn_www_to_api(@public_url).concat 'popular/'
5
9
  end
6
10
 
7
11
  def new_url
8
- UrlHelper.turn_www_to_api(@public_url).concat 'new/'
12
+ turn_www_to_api(@public_url).concat 'new/'
9
13
  end
10
14
 
11
15
  def hot_url
12
- UrlHelper.turn_www_to_api(@public_url).concat 'hot/'
16
+ turn_www_to_api(@public_url).concat 'hot/'
13
17
  end
14
18
  end
15
19
  end
@@ -1,11 +1,12 @@
1
1
  module Mixcloud
2
2
  class Resource
3
3
 
4
+ include UrlHelper
4
5
  def initialize(url)
5
- UrlHelper.validate_mixcloud_url(url)
6
- url_with_metadata = UrlHelper.concat_with_metadata(url)
7
- data_hash = JSON.parse RestClient.get(url_with_metadata)
8
- klass = Mixcloud.const_get(data_hash['type'].capitalize)
6
+ validate_mixcloud_url(url)
7
+ url_with_metadata = concat_with_metadata(url)
8
+ data_hash = grab_data_from_mixcloud(url_with_metadata)
9
+ klass = determine_class_by_mixcloud_data(data_hash)
9
10
  prevent_url_and_class_mismatch(klass)
10
11
  map_to_resource_attributes(data_hash)
11
12
  end
@@ -14,9 +15,26 @@ module Mixcloud
14
15
  ###########################################
15
16
  private
16
17
 
18
+ def grab_data_from_mixcloud(url_with_metadata)
19
+ begin
20
+ JSON.parse RestClient.get(url_with_metadata)
21
+ rescue => e
22
+ e.message.concat(". Are you sure you have connection with Mixcloud at the moment?")
23
+ raise e
24
+ end
25
+ end
26
+
27
+ def determine_class_by_mixcloud_data(data_hash)
28
+ begin
29
+ Mixcloud.const_get(data_hash['type'].capitalize) # it would take a change of Mixcloud API to get this line to fail
30
+ rescue => e
31
+ e.message.concat(". We can't find the key 'type'. Could it be that Mixcloud has changed its API?")
32
+ end
33
+ end
34
+
17
35
  def prevent_url_and_class_mismatch(klass)
18
36
  if klass != self.class
19
- raise "You tried to create an object of #{self.class} with an URL of object type #{klass}"
37
+ raise Mixcloud::Error.new("You tried to create an object of #{self.class} with an URL of object type #{klass}")
20
38
  end
21
39
  end
22
40
 
@@ -38,14 +56,15 @@ module Mixcloud
38
56
 
39
57
  def set_public_and_api_urls(url_string)
40
58
  send("public_url=", url_string)
41
- send("api_url=", UrlHelper.turn_www_to_api(url_string)).concat('?metadata=1')
59
+ send("api_url=", turn_www_to_api(url_string)).concat('?metadata=1')
42
60
  end
43
61
 
44
62
  def set_associated_object_urls(key, value)
45
63
  variable_name = key + "_url"
46
- object_url = UrlHelper.turn_www_to_api(value['url']).concat('?metadata=1')
64
+ object_url = turn_www_to_api(value['url']).concat('?metadata=1')
47
65
  [ variable_name, object_url ]
48
66
  end
67
+
49
68
  ############################################
50
69
  end
51
70
  end
@@ -1,5 +1,6 @@
1
1
  module Mixcloud
2
2
  class Search
3
+ extend UrlHelper
3
4
 
4
5
  # The codeblock below defines the following class methods:
5
6
  # Mixcloud::Search.find_artist
@@ -25,7 +26,7 @@ module Mixcloud
25
26
  def self.turn_data_into_mixcloud_resources(results, klass)
26
27
  search_results = []
27
28
  results.each do |result|
28
- resource_api_url = UrlHelper.turn_www_to_api result['url']
29
+ resource_api_url = turn_www_to_api result['url']
29
30
  resource = klass.new(resource_api_url)
30
31
  search_results << resource
31
32
  end
@@ -1,38 +1,35 @@
1
1
  module Mixcloud
2
- class UrlHelper
3
2
 
4
- class << self
5
- ##################################
6
- public
7
- def validate_mixcloud_url(url)
8
- raise "You provided an invalid Mixcloud-API url. It must start with http://api.mixcloud.com/" unless url =~ /\Ahttp:\/\/api.mixcloud.com\//
9
- end
10
-
11
- def concat_with_metadata(url)
12
- return url if ends_with_metadata?(url)
13
- return url.chop if ends_with_metadata_slash?(url)
14
- url.concat('/') unless ends_with_slash?(url)
15
- url.concat('?metadata=1')
16
- end
3
+ module UrlHelper
4
+ ##################################
5
+ public
6
+ def validate_mixcloud_url(url)
7
+ raise Mixcloud::Error.new("You provided an invalid Mixcloud-API url. It must start with http://api.mixcloud.com/") unless url =~ /\Ahttp:\/\/api.mixcloud.com\//
8
+ end
17
9
 
18
- def turn_www_to_api(url)
19
- url.strip.sub('http://www.', 'http://api.' ) if url.strip =~ /\Ahttp:\/\/www./
20
- end
21
- ##################################
22
- private
23
- def ends_with_metadata?(url)
24
- true if url =~ /\?metadata=1$/
25
- end
10
+ def concat_with_metadata(url)
11
+ return url if ends_with_metadata?(url)
12
+ return url.chop if ends_with_metadata_slash?(url)
13
+ url.concat('/') unless ends_with_slash?(url)
14
+ url.concat('?metadata=1')
15
+ end
26
16
 
27
- def ends_with_metadata_slash?(url)
28
- true if url =~ /\?metadata=1\/$/
29
- end
17
+ def turn_www_to_api(url)
18
+ url.strip.sub('http://www.', 'http://api.' ) if url.strip =~ /\Ahttp:\/\/www./
19
+ end
20
+ ##################################
21
+ private
22
+ def ends_with_metadata?(url)
23
+ true if url =~ /\?metadata=1$/
24
+ end
30
25
 
31
- def ends_with_slash?(url)
32
- url =~ /\/\z/
33
- end
34
- ##################################
26
+ def ends_with_metadata_slash?(url)
27
+ true if url =~ /\?metadata=1\/$/
35
28
  end
36
29
 
30
+ def ends_with_slash?(url)
31
+ url =~ /\/\z/
32
+ end
33
+ ##################################
37
34
  end
38
35
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mixcloud
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 1.0.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,41 +9,72 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-01-17 00:00:00.000000000Z
12
+ date: 2013-01-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rest-client
16
- requirement: &2161429600 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
- - - ~>
19
+ - - ! '>='
20
20
  - !ruby/object:Gem::Version
21
21
  version: 1.6.7
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2161429600
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 1.6.7
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: json
27
- requirement: &2161429080 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
- - - ~>
35
+ - - ! '>='
31
36
  - !ruby/object:Gem::Version
32
37
  version: 1.6.1
33
38
  type: :runtime
34
39
  prerelease: false
35
- version_requirements: *2161429080
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: 1.6.1
36
46
  - !ruby/object:Gem::Dependency
37
47
  name: rspec
38
- requirement: &2161428580 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
39
49
  none: false
40
50
  requirements:
41
- - - ~>
51
+ - - ! '>='
42
52
  - !ruby/object:Gem::Version
43
53
  version: 2.7.0
44
- type: :runtime
54
+ type: :development
45
55
  prerelease: false
46
- version_requirements: *2161428580
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: 2.7.0
62
+ - !ruby/object:Gem::Dependency
63
+ name: fakeweb
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: 1.3.0
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: 1.3.0
47
78
  description: Ruby wrapper of the Mixcloud API. Visit http://www.mixcloud.com/developers/documentation/
48
79
  for more info
49
80
  email: actfong@gmail.com
@@ -55,6 +86,7 @@ files:
55
86
  - lib/mixcloud/artist.rb
56
87
  - lib/mixcloud/category.rb
57
88
  - lib/mixcloud/cloudcast.rb
89
+ - lib/mixcloud/error.rb
58
90
  - lib/mixcloud/popular_new_hot.rb
59
91
  - lib/mixcloud/resource.rb
60
92
  - lib/mixcloud/search.rb
@@ -83,10 +115,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
83
115
  version: '0'
84
116
  requirements: []
85
117
  rubyforge_project:
86
- rubygems_version: 1.8.15
118
+ rubygems_version: 1.8.21
87
119
  signing_key:
88
120
  specification_version: 3
89
121
  summary: Ruby wrapper of the Mixcloud API. It allows you to builld Mixcloud resources
90
122
  as Ruby objects and provides search functionality
91
123
  test_files: []
92
- has_rdoc: