idiomag 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History +2 -0
- data/LICENSE +9 -0
- data/README.rdoc +151 -0
- data/Rakefile +54 -0
- data/VERSION.yml +4 -0
- data/lib/idiomag.rb +17 -0
- data/lib/idiomag/articles.rb +48 -0
- data/lib/idiomag/artist.rb +103 -0
- data/lib/idiomag/base.rb +9 -0
- data/lib/idiomag/helpers.rb +26 -0
- data/lib/idiomag/parser.rb +32 -0
- data/lib/idiomag/recommendation.rb +70 -0
- data/lib/idiomag/rest.rb +20 -0
- data/lib/idiomag/tag.rb +106 -0
- data/lib/idiomag/user.rb +114 -0
- data/spec/articles_spec.rb +61 -0
- data/spec/artist_spec.rb +149 -0
- data/spec/base_spec.rb +15 -0
- data/spec/fixtures/articles_featured.json +1 -0
- data/spec/fixtures/articles_latest.json +1 -0
- data/spec/fixtures/artist_articles.json +1 -0
- data/spec/fixtures/artist_info.json +1 -0
- data/spec/fixtures/artist_photos.json +1 -0
- data/spec/fixtures/artist_playlist.json +1 -0
- data/spec/fixtures/artist_tags.json +1 -0
- data/spec/fixtures/artist_videos.json +1 -0
- data/spec/fixtures/recommendation_articles.json +1 -0
- data/spec/fixtures/recommendation_artists.json +1 -0
- data/spec/fixtures/tag_articles.json +1 -0
- data/spec/fixtures/tag_artists.json +1 -0
- data/spec/fixtures/tag_list.txt +144 -0
- data/spec/fixtures/tag_photos.json +1 -0
- data/spec/fixtures/tag_playlist.json +1 -0
- data/spec/fixtures/tag_videos.json +1 -0
- data/spec/fixtures/user_articles.json +1 -0
- data/spec/fixtures/user_info.json +1 -0
- data/spec/fixtures/user_lovedarticles.json +1 -0
- data/spec/fixtures/user_photos.json +1 -0
- data/spec/fixtures/user_playlist.json +1 -0
- data/spec/fixtures/user_videos.json +1 -0
- data/spec/recommendation_spec.rb +88 -0
- data/spec/rest_spec.rb +41 -0
- data/spec/spec_helper.rb +15 -0
- data/spec/tag_spec.rb +149 -0
- data/spec/user_spec.rb +169 -0
- metadata +112 -0
@@ -0,0 +1,70 @@
|
|
1
|
+
module Idiomag
|
2
|
+
class Recommendation
|
3
|
+
ValidNetworks = [:lastfm,:mog,:ilike,:mystrands,:projectplaylist,:imeem,:pandora,:bebo,:myspace,:songza]
|
4
|
+
|
5
|
+
def initialize(options)
|
6
|
+
if !options[:network].blank? && !options[:user].blank?
|
7
|
+
@user = options[:user]
|
8
|
+
@network = options[:network]
|
9
|
+
raise ArgumentError if !ValidNetworks.include?(@network)
|
10
|
+
@query = {:network => @network,:username => @user}
|
11
|
+
elsif !options[:apml].blank?
|
12
|
+
@apml = options[:apml]
|
13
|
+
@query = {:apml => @apml}
|
14
|
+
elsif !options[:artists].blank? && options[:artists].is_a?(Array)
|
15
|
+
@artist_list = options[:artists]
|
16
|
+
@query = {:artists => @artist_list}
|
17
|
+
else
|
18
|
+
raise ArgumentError
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def get(*args)
|
23
|
+
args.each do |action|
|
24
|
+
case action
|
25
|
+
when :articles
|
26
|
+
get_articles
|
27
|
+
when :artists
|
28
|
+
get_artists
|
29
|
+
else
|
30
|
+
raise ArgumentError
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def respond_to?(method)
|
36
|
+
case method
|
37
|
+
when :articles,:artists
|
38
|
+
true
|
39
|
+
else
|
40
|
+
super
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def method_missing(method, *args)
|
45
|
+
case method
|
46
|
+
when :articles
|
47
|
+
get_articles if @articles.nil?
|
48
|
+
@articles
|
49
|
+
when :artists
|
50
|
+
get_artists if @artists.nil?
|
51
|
+
@artists
|
52
|
+
else
|
53
|
+
super
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def get_articles
|
60
|
+
@articles = Parser.parse_articles(REST.fetch('recommendation/articles', @query))
|
61
|
+
end
|
62
|
+
|
63
|
+
def get_artists
|
64
|
+
artist_data = REST.fetch('recommendation/artists', @query)
|
65
|
+
|
66
|
+
@artists = {}
|
67
|
+
artist_data['artists'].each {|a| @artists[a['title']] = a['value'] }
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
data/lib/idiomag/rest.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
module Idiomag
|
2
|
+
class InvalidResult < StandardError; end;
|
3
|
+
|
4
|
+
class REST
|
5
|
+
def self.fetch(resource, query={}, parse=true)
|
6
|
+
raise ArgumentError, 'api key missing' if Base.api_key.blank?
|
7
|
+
|
8
|
+
options = {:query => {:key => Base.api_key}}
|
9
|
+
options[:query].merge!(query)
|
10
|
+
options[:format] = :json if parse
|
11
|
+
begin
|
12
|
+
data = HTTParty.get(API_URL + resource + "/json", options)
|
13
|
+
rescue Net::HTTPServerException => e
|
14
|
+
raise ArgumentError, 'invalid user, artist or tag' if e.message =~ /400/
|
15
|
+
end
|
16
|
+
raise InvalidResult if data.blank?
|
17
|
+
data
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/idiomag/tag.rb
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
module Idiomag
|
2
|
+
class Tag
|
3
|
+
def initialize(tag)
|
4
|
+
raise ArgumentError if tag.blank?
|
5
|
+
@tag = tag.to_s.gsub(/_/, ' ')
|
6
|
+
end
|
7
|
+
|
8
|
+
def get(*args)
|
9
|
+
args.each do |action|
|
10
|
+
case action
|
11
|
+
when :articles
|
12
|
+
get_articles
|
13
|
+
when :photos
|
14
|
+
get_photos
|
15
|
+
when :videos
|
16
|
+
get_videos
|
17
|
+
when :playlist, :tracks
|
18
|
+
get_playlist
|
19
|
+
when :artists
|
20
|
+
get_artists
|
21
|
+
else
|
22
|
+
raise ArgumentError
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def respond_to?(method)
|
28
|
+
case method
|
29
|
+
when :articles,:photos,:videos,:playlist,:tracks,:artists,:list,:name
|
30
|
+
true
|
31
|
+
else
|
32
|
+
super
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def method_missing(method, *args)
|
37
|
+
case method
|
38
|
+
when :name
|
39
|
+
@tag
|
40
|
+
when :articles
|
41
|
+
get_articles if @articles.nil?
|
42
|
+
@articles
|
43
|
+
when :photos
|
44
|
+
get_photos if @photos.nil?
|
45
|
+
@photos
|
46
|
+
when :videos
|
47
|
+
get_videos if @videos.nil?
|
48
|
+
@videos
|
49
|
+
when :playlist, :tracks
|
50
|
+
get_playlist if @playlist.nil?
|
51
|
+
@playlist
|
52
|
+
when :artists
|
53
|
+
get_artists if @artists.nil?
|
54
|
+
@artists
|
55
|
+
when :list
|
56
|
+
Tag.list
|
57
|
+
else
|
58
|
+
super
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
class << self
|
63
|
+
def list
|
64
|
+
if @list.blank?
|
65
|
+
@list_data = REST.fetch('tags', {}, false)
|
66
|
+
|
67
|
+
@list = @list_data.split("\n")
|
68
|
+
@list.map! do |t|
|
69
|
+
if t =~ /-/
|
70
|
+
t.strip.downcase
|
71
|
+
else
|
72
|
+
t.strip.downcase.gsub(/ /, '_').to_sym
|
73
|
+
end
|
74
|
+
end
|
75
|
+
else
|
76
|
+
@list
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
private
|
82
|
+
|
83
|
+
def get_articles
|
84
|
+
@articles = Parser.parse_articles(REST.fetch('tag/articles', :tag => @tag))
|
85
|
+
end
|
86
|
+
|
87
|
+
def get_photos
|
88
|
+
@photos = Parser.parse_photos(REST.fetch('tag/photos', :tag => @tag))
|
89
|
+
end
|
90
|
+
|
91
|
+
def get_videos
|
92
|
+
@videos = Parser.parse_videos(REST.fetch('tag/videos', :tag => @tag))
|
93
|
+
end
|
94
|
+
|
95
|
+
def get_playlist
|
96
|
+
@playlist = Parser.parse_playlist(REST.fetch('tag/playlist', :tag => @tag))
|
97
|
+
end
|
98
|
+
|
99
|
+
def get_artists
|
100
|
+
artist_data = REST.fetch('tag/artists', :tag => @tag)
|
101
|
+
|
102
|
+
@artists = {}
|
103
|
+
artist_data['profile']['artist'].each {|t| @artists[t['title']] = t['value']}
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
data/lib/idiomag/user.rb
ADDED
@@ -0,0 +1,114 @@
|
|
1
|
+
module Idiomag
|
2
|
+
class User
|
3
|
+
attr_accessor :user
|
4
|
+
|
5
|
+
def initialize(user)
|
6
|
+
raise ArgumentError if user.blank?
|
7
|
+
@user = user
|
8
|
+
end
|
9
|
+
|
10
|
+
def get(*args)
|
11
|
+
args.each do |action|
|
12
|
+
case action
|
13
|
+
when :info
|
14
|
+
get_info
|
15
|
+
when :articles
|
16
|
+
get_articles
|
17
|
+
when :loved_articles
|
18
|
+
get_loved_articles
|
19
|
+
when :photos
|
20
|
+
get_photos
|
21
|
+
when :videos
|
22
|
+
get_videos
|
23
|
+
when :playlist, :tracks
|
24
|
+
get_playlist
|
25
|
+
else
|
26
|
+
raise ArgumentError
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def respond_to?(method)
|
32
|
+
case method
|
33
|
+
when :name,:email,:url,:tags,:artists,:articles,:loved_articles,:photos,:videos,:playlist,:tracks
|
34
|
+
true
|
35
|
+
else
|
36
|
+
super
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def method_missing(method, *args)
|
41
|
+
case method
|
42
|
+
when :name
|
43
|
+
get_info if @name.nil?
|
44
|
+
@name
|
45
|
+
when :email
|
46
|
+
get_info if @email.nil?
|
47
|
+
@email
|
48
|
+
when :url
|
49
|
+
get_info if @url.nil?
|
50
|
+
@url
|
51
|
+
when :artists
|
52
|
+
get_info if @artists.nil?
|
53
|
+
@artists
|
54
|
+
when :tags
|
55
|
+
get_info if @tags.nil?
|
56
|
+
@tags
|
57
|
+
when :articles
|
58
|
+
get_articles if @articles.nil?
|
59
|
+
@articles
|
60
|
+
when :loved_articles
|
61
|
+
get_loved_articles if @loved_articles.nil?
|
62
|
+
@loved_articles
|
63
|
+
when :photos
|
64
|
+
get_photos if @photos.nil?
|
65
|
+
@photos
|
66
|
+
when :videos
|
67
|
+
get_videos if @videos.nil?
|
68
|
+
@videos
|
69
|
+
when :playlist, :tracks
|
70
|
+
get_playlist if @playlist.nil?
|
71
|
+
@playlist
|
72
|
+
else
|
73
|
+
super
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
private
|
78
|
+
|
79
|
+
def get_info
|
80
|
+
info_data = REST.fetch('user/info', {:user => @user})
|
81
|
+
|
82
|
+
@name = info_data['name']
|
83
|
+
@email = info_data['email_sha1']
|
84
|
+
@url = info_data['url']
|
85
|
+
|
86
|
+
@artists = {}
|
87
|
+
info_data['artists']['artist'].each {|a| @artists[a['title']] = a['value'] } if !info_data['artists'].blank?
|
88
|
+
|
89
|
+
@tags = {}
|
90
|
+
info_data['tags']['tag'].each {|t| @tags[t['name']] = t['value']} if !info_data['tags'].blank?
|
91
|
+
@tags.keys_to_sym!
|
92
|
+
end
|
93
|
+
|
94
|
+
def get_articles
|
95
|
+
@articles = Parser.parse_articles(REST.fetch('user/articles', :user => @user))
|
96
|
+
end
|
97
|
+
|
98
|
+
def get_loved_articles
|
99
|
+
@loved_articles = Parser.parse_articles(REST.fetch('user/lovedarticles', :user => @user))
|
100
|
+
end
|
101
|
+
|
102
|
+
def get_photos
|
103
|
+
@photos = Parser.parse_photos(REST.fetch('user/photos', :user => @user))
|
104
|
+
end
|
105
|
+
|
106
|
+
def get_videos
|
107
|
+
@videos = Parser.parse_videos(REST.fetch('user/videos', :user => @user))
|
108
|
+
end
|
109
|
+
|
110
|
+
def get_playlist
|
111
|
+
@playlist = Parser.parse_playlist(REST.fetch('user/playlist', :user => @user))
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
+
|
3
|
+
describe 'Idiomag::Articles' do
|
4
|
+
before(:each) do
|
5
|
+
@articles = Idiomag::Articles.new
|
6
|
+
end
|
7
|
+
|
8
|
+
it 'should respond_to the correct methods' do
|
9
|
+
@articles.respond_to?(:get).should == true
|
10
|
+
@articles.respond_to?(:latest).should == true
|
11
|
+
@articles.respond_to?(:featured).should == true
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should error on invalid get argument' do
|
15
|
+
lambda { @articles.get(:foo) }.should raise_error(ArgumentError)
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'should error on invalid method' do
|
19
|
+
lambda { @articles.foo }.should raise_error(NoMethodError)
|
20
|
+
end
|
21
|
+
|
22
|
+
describe 'latest' do
|
23
|
+
before(:each) do
|
24
|
+
@data = open(Fixtures + 'articles_latest.json').read
|
25
|
+
Idiomag::REST.should_receive(:fetch).with('articles/latest').and_return(JSON.parse(@data))
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should allow prefetching' do
|
29
|
+
@articles.get(:latest)
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should get latest articles' do
|
33
|
+
@articles.latest[0][:artist].should == 'K-Drama'
|
34
|
+
@articles.latest[0][:description].blank?.should_not == true
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should parse the dates' do
|
38
|
+
@articles.latest[0][:date].class.should == Time
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe 'featured' do
|
43
|
+
before(:each) do
|
44
|
+
@data = open(Fixtures + 'articles_featured.json').read
|
45
|
+
Idiomag::REST.should_receive(:fetch).with('articles/featured').and_return(JSON.parse(@data))
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'should allow prefetching' do
|
49
|
+
@articles.get(:featured)
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'should get featured articles' do
|
53
|
+
@articles.featured[0][:artist].should == 'Coldplay'
|
54
|
+
@articles.featured[0][:description].blank?.should_not == true
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'should parse the dates' do
|
58
|
+
@articles.featured[0][:date].class.should == Time
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
data/spec/artist_spec.rb
ADDED
@@ -0,0 +1,149 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
+
|
3
|
+
describe 'Idiomag::Artist' do
|
4
|
+
before(:each) do
|
5
|
+
@artist = Idiomag::Artist.new('Anberlin')
|
6
|
+
end
|
7
|
+
|
8
|
+
it 'should require an artist' do
|
9
|
+
lambda { Idiomag::Artist.new }.should raise_error(ArgumentError)
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'should know the artist name' do
|
13
|
+
@artist.name.should == 'Anberlin'
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should respond_to the correct methods' do
|
17
|
+
@artist.respond_to?(:get).should == true
|
18
|
+
@artist.respond_to?(:name).should == true
|
19
|
+
@artist.respond_to?(:links).should == true
|
20
|
+
@artist.respond_to?(:related).should == true
|
21
|
+
@artist.respond_to?(:tags).should == true
|
22
|
+
@artist.respond_to?(:articles).should == true
|
23
|
+
@artist.respond_to?(:photos).should == true
|
24
|
+
@artist.respond_to?(:videos).should == true
|
25
|
+
@artist.respond_to?(:playlist).should == true
|
26
|
+
@artist.respond_to?(:tracks).should == true
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should error on invalid get argument' do
|
30
|
+
lambda { @artist.get(:foo) }.should raise_error(ArgumentError)
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should error on invalid method' do
|
34
|
+
lambda { @artist.foo }.should raise_error(NoMethodError)
|
35
|
+
end
|
36
|
+
|
37
|
+
describe 'info' do
|
38
|
+
before(:each) do
|
39
|
+
@data = open(Fixtures + 'artist_info.json').read
|
40
|
+
Idiomag::REST.should_receive(:fetch).with('artist/info',:artist=>'Anberlin').and_return(JSON.parse(@data))
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should allow prefetching' do
|
44
|
+
@artist.get(:info)
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'should get links' do
|
48
|
+
@artist.links.should include('http://www.anberlin.com')
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'should get related artists' do
|
52
|
+
@artist.related['Relient K'].should include('http://www.idiomag.com/artist/relient_k/')
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe 'tags' do
|
57
|
+
before(:each) do
|
58
|
+
@data = open(Fixtures + 'artist_tags.json').read
|
59
|
+
Idiomag::REST.should_receive(:fetch).with('artist/tags',:artist=>'Anberlin').and_return(JSON.parse(@data))
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'should allow prefetching' do
|
63
|
+
@artist.get(:tags)
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'should get tags' do
|
67
|
+
@artist.tags[:alternative_rock].should == 0.37
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
describe 'articles' do
|
72
|
+
before(:each) do
|
73
|
+
@data = open(Fixtures + 'artist_articles.json').read
|
74
|
+
Idiomag::REST.should_receive(:fetch).with('artist/articles',:artist=>'Anberlin').and_return(JSON.parse(@data))
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'should allow prefetching' do
|
78
|
+
@artist.get(:articles)
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'should get articles' do
|
82
|
+
@artist.articles[0][:artist].should == 'Anberlin'
|
83
|
+
@artist.articles[0][:description].blank?.should_not == true
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'should parse the dates' do
|
87
|
+
@artist.articles[0][:date].class.should == Time
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
describe 'photos' do
|
92
|
+
before(:each) do
|
93
|
+
@data = open(Fixtures + 'artist_photos.json').read
|
94
|
+
Idiomag::REST.should_receive(:fetch).with('artist/photos',:artist=>'Anberlin').and_return(JSON.parse(@data))
|
95
|
+
end
|
96
|
+
|
97
|
+
it 'should allow prefetching' do
|
98
|
+
@artist.get(:photos)
|
99
|
+
end
|
100
|
+
|
101
|
+
it 'should get photos' do
|
102
|
+
@artist.photos[0][:title].should =~ /jpg/
|
103
|
+
@artist.photos[0][:url].should =~ /jpg/
|
104
|
+
@artist.photos[0][:width].class.should == Fixnum
|
105
|
+
@artist.photos[0][:height].class.should == Fixnum
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'should parse the dates' do
|
109
|
+
@artist.photos[0][:date].class.should == Time
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
describe 'videos' do
|
114
|
+
before(:each) do
|
115
|
+
@data = open(Fixtures + 'artist_videos.json').read
|
116
|
+
Idiomag::REST.should_receive(:fetch).with('artist/videos',:artist=>'Anberlin').and_return(JSON.parse(@data))
|
117
|
+
end
|
118
|
+
|
119
|
+
it 'should allow prefetching' do
|
120
|
+
@artist.get(:videos)
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'should get videos' do
|
124
|
+
@artist.videos[0][:location].should =~ /video/
|
125
|
+
@artist.videos[0][:info].should =~ /youtube/
|
126
|
+
@artist.videos[0][:thumb].should =~ /jpg/
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
describe 'playlist' do
|
131
|
+
before(:each) do
|
132
|
+
@data = open(Fixtures + 'artist_playlist.json').read
|
133
|
+
Idiomag::REST.should_receive(:fetch).with('artist/playlist',:artist=>'Anberlin').and_return(JSON.parse(@data))
|
134
|
+
end
|
135
|
+
|
136
|
+
it 'should allow prefetching' do
|
137
|
+
@artist.get(:playlist)
|
138
|
+
end
|
139
|
+
|
140
|
+
it 'should get playlist' do
|
141
|
+
@artist.playlist[0][:location] =~ /mp3/
|
142
|
+
end
|
143
|
+
|
144
|
+
it 'should respond to #tracks' do
|
145
|
+
@artist.get(:tracks)
|
146
|
+
@artist.tracks[0][:location] =~ /mp3/
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|