hypem 0.1.6 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -70,31 +70,32 @@ Blogs can be retrieved using a blog's unique id via `Hypem.blog(1234)` and have
70
70
  ******
71
71
 
72
72
  ### Track ###
73
- All Playlist objects have a `tracks` attribute containing an array of `Hypem::Track`'s. A sample object inspect is as follows:
74
-
75
- #<Hypem::Track
76
- artist="Hot Chip"
77
- date_loved=1332109580
78
- date_posted=1332252311
79
- description="O Hot Chip está de volta com um novo álbum, In Our Heads, que vai ser lançado oficialmente em junho, mas já conta com seu primeiro vídeo, “Flutes”, disponível para visualização. A faixa serve de abertura para o novo álbum dos já bem sucedidos garotos, e p"
80
- itunes_link="http://hypem.com/go/itunes_search/Hot%20Chip"
81
- loved_count=4912
82
- media_id="1jsw9"
83
- post_id=1753700
84
- post_url="http://www.ohmyrock.net/2012/03/hot-chip-flutes/"
85
- posted_count=14
86
- site_id=14635
87
- sitename="Oh My Rock"
88
- thumb_url="http://static-ak.hypem.net/images/albumart4.gif"
89
- thumb_url_large="http://static-ak.hypem.net/images/blog_images/14635.png"
90
- time=425
91
- title="Flutes">
73
+ Tracks can be initialized using a known `media_id` via `Hypem.track('media_id')` and synced using the `get` method on any instance. Depending on the playlist type, some tracks may have more detailed attributes than other.
74
+
75
+ An example track object inspection is as follows:
76
+
77
+ ```
78
+ @media_id="1jsw9",
79
+ @artist="Hot Chip",
80
+ @title="Flutes",
81
+ @date_posted=#<DateTime: 2012-06-08T16:57:00-07:00 ((2456087j,86220s,0n),-25200s,2299161j)>,
82
+ @site_id=16116,
83
+ @site_name="the untz and the indie",
84
+ @post_url="http://theuntzandtheindie.com/2012/06/08/hot-chip-party/",
85
+ @post_id=1835105,
86
+ @loved_count=9050,
87
+ @posted_count=33,
88
+ @thumb_url="http://static-ak.hypem.net/images/albumart0.gif",
89
+ @thumb_url_large="http://static-ak.hypem.net/images/blog_images/16116.png",
90
+ @time=425,
91
+ @description="Today’s Indie: If I Was Your Girlfriend (Hot Chip Cover) / Prince /// Motion Sickness / Hot Chip /// Flutes / Hot Chip So the indie extraordinaire and goddess of all things awesome is out of town up in the Pac NW gettin silly and listening to dAHnce music",
92
+ @itunes_link="http://hypem.com/go/itunes_search/Hot%20Chip"
93
+ ```
92
94
 
93
95
  ******
94
96
 
95
97
  ## TODO ###
96
98
  - Blogs with given tag
97
- - Single track info
98
99
  - Authenticated Requests
99
100
  - Favorite a track
100
101
  - Log Playback
@@ -0,0 +1,47 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: http://hypem.com/playlist/item/1jsw9/json/1
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers: {}
10
+ response:
11
+ status:
12
+ code: 200
13
+ message:
14
+ headers:
15
+ server:
16
+ - nginx/1.0.12
17
+ date:
18
+ - Sat, 09 Jun 2012 02:48:22 GMT
19
+ content-type:
20
+ - text/javascript; charset=UTF-8
21
+ transfer-encoding:
22
+ - chunked
23
+ connection:
24
+ - close
25
+ set-cookie:
26
+ - AUTH=03%3Ae48651417fd18bf71afd356c3c50506e%3A1339210102%3A1276002699%3ACA-US;
27
+ expires=Mon, 05-Jun-2028 02:48:22 GMT; path=/; domain=hypem.com
28
+ x-hacker:
29
+ - Hey, if you're reading this, you should drop us an email at hypem.com/contact,
30
+ maybe we can work together!
31
+ access-control-allow-origin:
32
+ - ! '*'
33
+ access-control-allow-headers:
34
+ - ! '*'
35
+ vary:
36
+ - Accept-Encoding
37
+ body:
38
+ encoding: ASCII-8BIT
39
+ string: ! '{"version":"1.1","0":{"mediaid":"1jsw9","artist":"Hot Chip","title":"Flutes","dateposted":1339199820,"siteid":16116,"sitename":"the
40
+ untz and the indie","posturl":"http:\/\/theuntzandtheindie.com\/2012\/06\/08\/hot-chip-party\/","postid":1835105,"loved_count":9049,"posted_count":33,"thumb_url":"http:\/\/static-ak.hypem.net\/images\/albumart2.gif","thumb_url_large":"http:\/\/static-ak.hypem.net\/images\/blog_images\/16116.png","time":425,"description":"Today\u2019s
41
+ Indie: If I Was Your Girlfriend (Hot Chip Cover) \/ Prince \/\/\/ Motion Sickness
42
+ \/ Hot Chip \/\/\/ Flutes \/ Hot Chip So the indie extraordinaire and goddess
43
+ of all things awesome is out of town up in the Pac NW gettin silly and listening
44
+ to dAHnce music","itunes_link":"http:\/\/hypem.com\/go\/itunes_search\/Hot%20Chip"}}'
45
+ http_version:
46
+ recorded_at: Sat, 09 Jun 2012 02:48:27 GMT
47
+ recorded_with: VCR 2.1.1
@@ -23,6 +23,5 @@ Gem::Specification.new do |s|
23
23
  s.add_development_dependency "rake"
24
24
  s.add_dependency 'faraday', '~> 0.7'
25
25
  s.add_dependency 'multi_json', '~> 1.1'
26
- s.add_dependency 'hashie', '~> 1.2'
27
26
 
28
27
  end
@@ -1,5 +1,3 @@
1
- require 'hashie'
2
-
3
1
  module Hypem
4
2
  class Blog
5
3
  attr_reader :blog_image, :blog_image_small, :first_posted,
@@ -15,8 +15,7 @@ module Hypem
15
15
  def get
16
16
  response = Request.new(@path).tap(&:get).response
17
17
  @tracks = []
18
- # getting rid of version cell
19
- response.body.shift
18
+ response.body.shift # getting rid of version cell
20
19
  response.body.each_value{|v| @tracks << Track.new(v)}
21
20
  end
22
21
 
@@ -38,7 +37,7 @@ module Hypem
38
37
 
39
38
  def self.new_from_tracks(tracks)
40
39
  track_params = tracks.map(&:id).join(',')
41
- Playlist.new('set',track_params)
40
+ Playlist.new('set',track_params).tap { |p| p.tracks = tracks }
42
41
  end
43
42
 
44
43
  def self.latest(filter=:all,page=nil)
@@ -1,35 +1,51 @@
1
- require 'hashie'
2
-
3
1
  module Hypem
2
+ class Track
3
+ attr_accessor :media_id
4
4
 
5
- class Track < Hashie::Trash
6
- property :media_id, from: :mediaid
7
- property :artist
8
- property :title
9
- property :date_posted, from: :dateposted
10
- property :site_id, from: :siteid
11
- property :sitename
12
- property :post_url, from: :posturl
13
- property :post_url_first, from: :posturl_first
14
- property :post_id, from: :postid
15
- property :date_posted_first, from: :dateposted_first
16
- property :site_id_first, from: :siteid_first
17
- property :site_name_first, from: :sitename_first
18
- property :post_id_first, from: :postid_first
19
- property :loved_count
20
- property :posted_count
21
- property :thumb_url
22
- property :thumb_url_large
23
- property :time
24
- property :description
25
- property :itunes_link
26
- property :date_played, from: :dateplayed
27
- property :date_loved, from: :dateloved
28
- property :user_name, from: :username
29
- property :full_name, from: :fullname
30
- property :via_query
31
- property :plays #used by obsessed playlist
5
+ def initialize(arg)
6
+ if arg.is_a? Hash
7
+ keys_to_attributes arg
8
+ elsif arg.is_a? String
9
+ @media_id = arg
10
+ end
11
+ end
32
12
 
33
- end
13
+ def get
14
+ request = Request.new("/playlist/item/#{media_id}/json/1").tap(&:get)
15
+ raw_hash = request.response.body.tap(&:shift)["0"]
16
+ keys_to_attributes raw_hash
17
+ end
18
+
19
+ KEY_CONVERSIONS = {
20
+ mediaid: :media_id,
21
+ dateposted: :dated_posted,
22
+ siteid: :site_id,
23
+ posturl: :post_url,
24
+ posturl_first: :post_url_first,
25
+ postid: :post_id,
26
+ postid_first: :post_id_first,
27
+ dateposted_first: :date_posted_first,
28
+ siteid_first: :site_id_first,
29
+ sitename: :site_name,
30
+ dateposted: :date_posted,
31
+ sitename_first: :site_name_first
32
+ }
33
+
34
+ DATETIME_CONVERSIONS = [:date_posted, :date_posted_first]
35
+
36
+ private
34
37
 
38
+ def keys_to_attributes(raw_hash)
39
+ raw_hash.each_pair do |key,value|
40
+ converted_key = KEY_CONVERSIONS[key.to_sym]
41
+ key = converted_key unless converted_key.nil?
42
+
43
+ value = Time.at(value).to_datetime if DATETIME_CONVERSIONS.include? key
44
+ instance_variable_set("@#{key}",value)
45
+
46
+ self.class.class_eval { attr_reader key }
47
+ end
48
+ end
49
+
50
+ end
35
51
  end
@@ -1,3 +1,3 @@
1
1
  module Hypem
2
- VERSION = "0.1.6"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -13,30 +13,21 @@ describe Hypem::Playlist do
13
13
 
14
14
  ########################################
15
15
 
16
- context "when initialized" do
17
- its(:path) { should == "/playlist/latest/all/json/1" }
16
+ its(:path) { should == "/playlist/latest/all/json/1" }
17
+ its(:tracks) { should_not be_empty }
18
18
 
19
- it "assigns proper path for blog" do
20
- blog_playlist.path.should == "/playlist/blog/1/json/1"
19
+ describe "#url" do
20
+ it "returns the correct playlist url " do
21
+ subject.url.should == 'http://hypem.com/playlist/latest/all/json/1'
21
22
  end
22
23
  end
23
24
 
24
- context "after get" do
25
- its(:tracks) { should_not be_empty }
26
- end
27
-
28
25
  describe ".new_from_tracks" do
29
26
  let(:tracks) {[mock('Hypem::Track',id: 'track1',), mock('Hypem::Track',id:'track2')]}
30
27
  subject { Hypem::Playlist.new_from_tracks(tracks) }
31
28
  it { should be_a Hypem::Playlist }
32
29
  its(:path) { should == '/playlist/set/track1,track2/json/1' }
33
-
34
- end
35
-
36
- describe "#url" do
37
- it "returns the correct playlist url " do
38
- subject.url.should == 'http://hypem.com/playlist/latest/all/json/1'
39
- end
30
+ its(:tracks) { should_not be_empty }
40
31
  end
41
32
 
42
33
  describe ".latest" do
@@ -121,6 +112,43 @@ describe Hypem::Playlist do
121
112
  end
122
113
  end
123
114
 
115
+ shared_examples_for "generic method" do
116
+ before do
117
+ Hypem::Playlist.any_instance.stub(:get)
118
+ end
119
+ specify { described_class.send(method,:an_argument).should be_a described_class }
120
+ end
121
+
122
+ describe ".blog" do
123
+ let(:method) { :blog }
124
+ it_should_behave_like "generic method"
125
+ end
126
+
127
+ describe ".search" do
128
+ let(:method) { :search }
129
+ it_should_behave_like "generic method"
130
+ end
131
+
132
+ describe ".artist" do
133
+ let(:method) { :artist }
134
+ it_should_behave_like "generic method"
135
+ end
136
+
137
+ describe ".feed" do
138
+ let(:method) { :feed }
139
+ it_should_behave_like "generic method"
140
+ end
141
+
142
+ describe ".loved" do
143
+ let(:method) { :loved }
144
+ it_should_behave_like "generic method"
145
+ end
146
+
147
+ describe ".obsessed" do
148
+ let(:method) { :obsessed }
149
+ it_should_behave_like "generic method"
150
+ end
151
+
124
152
  describe "pagination" do
125
153
  before do
126
154
  playlist
@@ -3,14 +3,61 @@ require 'spec_helper'
3
3
  describe Hypem::Track do
4
4
  let(:track_hash) do
5
5
  VCR.use_cassette('latest_playlist') do
6
- Hypem::Playlist.latest.tracks.first
6
+ Hypem::Playlist.any_instance.stub(:get)
7
+ path = Hypem::Playlist.latest.path
8
+ # TODO this is fucking gross
9
+ Hypem::Request.new(path).tap(&:get).response.body.tap(&:shift)["0"]
7
10
  end
8
11
  end
9
12
 
10
- let(:track) { Hypem::Track.new(track_hash) }
13
+ let(:media_id) { '1jsw9' }
14
+ let(:track_from_hash) { described_class.new(track_hash) }
15
+ let(:track_from_string) { described_class.new(media_id) }
11
16
 
12
- it "is reformats variable names" do
13
- track.media_id.should_not be_nil
17
+ shared_examples_for "a basic synced instance" do
18
+ its(:media_id) { should be_a String }
19
+ its(:artist) { should be_a String }
20
+ its(:title) { should be_a String }
21
+ its(:date_posted) { should be_a DateTime }
22
+ its(:site_id) { should be_an Integer }
23
+ its(:site_name) { should be_a String }
24
+ its(:post_url) { should be_a String }
25
+ its(:post_id) { should be_an Integer }
26
+ its(:loved_count) { should be_an Integer }
27
+ its(:posted_count) { should be_an Integer }
28
+ its(:thumb_url) { should be_a String }
29
+ its(:thumb_url_large) { should be_a String }
30
+ its(:time) { should be_an Integer }
31
+ its(:description) { should be_a String }
32
+ its(:itunes_link) { should be_a String }
33
+ end
34
+
35
+ shared_examples_for "a detailed synced instance" do
36
+ it_should_behave_like "a basic synced instance"
37
+ its(:post_url_first) { should be_a String }
38
+ its(:post_id_first) { should be_an Integer }
39
+ its(:site_name_first) { should be_a String }
40
+ its(:date_posted_first) { should be_a DateTime }
41
+ its(:site_id_first) { should be_an Integer }
42
+ end
43
+
44
+ describe "#initialize" do
45
+ context "from a hash" do
46
+ subject { track_from_hash }
47
+ it_should_behave_like "a detailed synced instance"
48
+ end
49
+
50
+ context "from a media_id" do
51
+ subject { track_from_string }
52
+ its(:media_id) { should == media_id }
53
+ end
54
+ end
55
+
56
+ describe "#get" do
57
+ subject do
58
+ VCR.use_cassette("single_track") { track_from_string.tap(&:get) }
59
+ end
60
+ it_should_behave_like "a basic synced instance"
14
61
  end
15
62
 
16
63
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hypem
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-08 00:00:00.000000000 Z
12
+ date: 2012-06-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &70186325743340 !ruby/object:Gem::Requirement
16
+ requirement: &70340590270340 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '2.6'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70186325743340
24
+ version_requirements: *70340590270340
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: vcr
27
- requirement: &70186325742880 !ruby/object:Gem::Requirement
27
+ requirement: &70340590269880 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '2.0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70186325742880
35
+ version_requirements: *70340590269880
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rake
38
- requirement: &70186325742500 !ruby/object:Gem::Requirement
38
+ requirement: &70340590269500 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70186325742500
46
+ version_requirements: *70340590269500
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: faraday
49
- requirement: &70186325741960 !ruby/object:Gem::Requirement
49
+ requirement: &70340590268960 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0.7'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *70186325741960
57
+ version_requirements: *70340590268960
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: multi_json
60
- requirement: &70186325741460 !ruby/object:Gem::Requirement
60
+ requirement: &70340590268460 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,18 +65,7 @@ dependencies:
65
65
  version: '1.1'
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *70186325741460
69
- - !ruby/object:Gem::Dependency
70
- name: hashie
71
- requirement: &70186325741000 !ruby/object:Gem::Requirement
72
- none: false
73
- requirements:
74
- - - ~>
75
- - !ruby/object:Gem::Version
76
- version: '1.2'
77
- type: :runtime
78
- prerelease: false
79
- version_requirements: *70186325741000
68
+ version_requirements: *70340590268460
80
69
  description:
81
70
  email:
82
71
  - jackcanderson@gmail.com
@@ -101,6 +90,7 @@ files:
101
90
  - fixtures/vcr_cassettes/loved_playlist.yml
102
91
  - fixtures/vcr_cassettes/obsessed_playlist.yml
103
92
  - fixtures/vcr_cassettes/popular_playlist.yml
93
+ - fixtures/vcr_cassettes/single_track.yml
104
94
  - fixtures/vcr_cassettes/user_favorite_blogs.yml
105
95
  - fixtures/vcr_cassettes/user_friends.yml
106
96
  - fixtures/vcr_cassettes/user_profile.yml
@@ -142,7 +132,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
142
132
  version: '0'
143
133
  segments:
144
134
  - 0
145
- hash: -3176725025681081128
135
+ hash: 3510540454550370987
146
136
  requirements: []
147
137
  rubyforge_project: hypem
148
138
  rubygems_version: 1.8.10