idiomag 0.1.0
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/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
|