smartfm 0.4.0 → 1.0.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/ChangeLog +6 -2
- data/README +3 -10
- data/lib/smartfm.rb +3 -2
- data/lib/smartfm/core/version.rb +2 -2
- data/lib/smartfm/models.rb +7 -0
- data/lib/smartfm/{model → models}/base.rb +2 -1
- data/lib/smartfm/{model → models}/item.rb +18 -86
- data/lib/smartfm/models/like.rb +20 -0
- data/lib/smartfm/{model → models}/list.rb +35 -64
- data/lib/smartfm/models/notification.rb +26 -0
- data/lib/smartfm/models/sentence.rb +70 -0
- data/lib/smartfm/{model → models}/user.rb +54 -16
- data/lib/smartfm/modules.rb +4 -0
- data/lib/smartfm/modules/acts_as_likable.rb +16 -0
- data/lib/smartfm/modules/media_support.rb +37 -0
- data/lib/smartfm/modules/private_content.rb +25 -0
- data/lib/smartfm/modules/public_content.rb +51 -0
- data/lib/smartfm/rest_clients.rb +9 -0
- data/lib/smartfm/{rest_client → rest_clients}/base.rb +0 -0
- data/lib/smartfm/rest_clients/item.rb +17 -0
- data/lib/smartfm/rest_clients/like.rb +7 -0
- data/lib/smartfm/rest_clients/list.rb +18 -0
- data/lib/smartfm/rest_clients/notification.rb +8 -0
- data/lib/smartfm/rest_clients/sentence.rb +14 -0
- data/lib/smartfm/rest_clients/user.rb +20 -0
- data/spec/smartfm/{model → models}/base_spec.rb +5 -3
- data/spec/smartfm/{model → models}/item_spec.rb +24 -5
- data/spec/smartfm/models/like_spec.rb +19 -0
- data/spec/smartfm/models/list_spec.rb +70 -0
- data/spec/smartfm/models/notification_spec.rb +11 -0
- data/spec/smartfm/models/sentence_spec.rb +11 -0
- data/spec/smartfm/{model → models}/user_spec.rb +53 -19
- data/spec/smartfm/{rest_client → rest_clients}/base_spec.rb +0 -0
- data/spec/smartfm/{rest_client → rest_clients}/item_spec.rb +0 -0
- data/spec/smartfm/rest_clients/like_spec.rb +7 -0
- data/spec/smartfm/{rest_client → rest_clients}/list_spec.rb +0 -0
- data/spec/smartfm/rest_clients/notification_spec.rb +7 -0
- data/spec/smartfm/{rest_client → rest_clients}/sentence_spec.rb +0 -0
- data/spec/smartfm/{rest_client → rest_clients}/user_spec.rb +0 -0
- metadata +37 -24
- data/lib/smartfm/model.rb +0 -5
- data/lib/smartfm/model/sentence.rb +0 -118
- data/lib/smartfm/rest_client.rb +0 -8
- data/lib/smartfm/rest_client/item.rb +0 -14
- data/lib/smartfm/rest_client/list.rb +0 -15
- data/lib/smartfm/rest_client/sentence.rb +0 -12
- data/lib/smartfm/rest_client/user.rb +0 -14
- data/spec/smartfm/model/list_spec.rb +0 -7
- data/spec/smartfm/model/sentence_spec.rb +0 -7
data/ChangeLog
CHANGED
@@ -39,9 +39,13 @@
|
|
39
39
|
|
40
40
|
== 0.3.1
|
41
41
|
|
42
|
-
* add sessions API
|
42
|
+
* add sessions API calls
|
43
43
|
* fixed extract API bugs
|
44
44
|
|
45
45
|
== 0.4.0
|
46
46
|
|
47
|
-
* OAuth DELETE calls works fine now.
|
47
|
+
* OAuth DELETE calls works fine now.
|
48
|
+
|
49
|
+
== 1.0.0
|
50
|
+
|
51
|
+
* add friends, followers, likes and notifications API calls
|
data/README
CHANGED
@@ -7,8 +7,8 @@
|
|
7
7
|
This rubygem is a wrapper of smart.fm API.
|
8
8
|
You can get pure-ruby example at examples/pure_ruby.rb.
|
9
9
|
http://github.com/nov/smartfm/tree/master/examples/pure_ruby.rb
|
10
|
-
|
11
|
-
It shows all API calls you can use with this gem.
|
10
|
+
|
11
|
+
It shows almost all API calls you can use with this gem.
|
12
12
|
|
13
13
|
== Installation
|
14
14
|
|
@@ -26,15 +26,8 @@
|
|
26
26
|
|
27
27
|
== Features/Problems
|
28
28
|
|
29
|
-
Test! Test!! Test!!!
|
30
|
-
|
31
|
-
Create/Add/Delete APIs are not implemented.
|
32
|
-
They will be implemented in a few weeks.
|
33
|
-
|
34
|
-
smart.fm OAuth is still pre-alpha.
|
35
|
-
|
36
29
|
== Synopsis
|
37
|
-
|
30
|
+
|
38
31
|
See examples and smart.fm Developers, please.
|
39
32
|
smart.fm Developers (http://developer.smart.fm)
|
40
33
|
|
data/lib/smartfm.rb
CHANGED
data/lib/smartfm/core/version.rb
CHANGED
@@ -1,9 +1,16 @@
|
|
1
1
|
class Smartfm::Item < Smartfm::Base
|
2
|
-
ATTRIBUTES = [:sentences, :responses, :cue, :id, :list]
|
3
|
-
READONLY_ATTRIBUTES = [:sentences, :responses, :cue, :id]
|
2
|
+
ATTRIBUTES = [:sentences, :responses, :cue, :id, :list, :user]
|
3
|
+
READONLY_ATTRIBUTES = [:sentences, :responses, :cue, :id, :user]
|
4
4
|
attr_accessor *(ATTRIBUTES - READONLY_ATTRIBUTES)
|
5
5
|
attr_reader *READONLY_ATTRIBUTES
|
6
6
|
|
7
|
+
include Smartfm::PublicContent
|
8
|
+
include Smartfm::MediaSupport
|
9
|
+
include Smartfm::ActsAsLikable
|
10
|
+
|
11
|
+
def self.rest_client; Smartfm::RestClient::Item; end
|
12
|
+
def rest_client; self.class.rest_client; end
|
13
|
+
|
7
14
|
class Response < Smartfm::Base
|
8
15
|
ATTRIBUTES = [:text, :text_with_character, :type, :language]
|
9
16
|
READONLY_ATTRIBUTES = [:type]
|
@@ -34,99 +41,24 @@ class Smartfm::Item < Smartfm::Base
|
|
34
41
|
end
|
35
42
|
end
|
36
43
|
|
37
|
-
def self.recent(params = {})
|
38
|
-
hash = Smartfm::RestClient::Item.recent(params)
|
39
|
-
self.deserialize(hash) || []
|
40
|
-
end
|
41
|
-
|
42
|
-
def self.find(item_id, params = {})
|
43
|
-
params[:id] = item_id
|
44
|
-
hash = Smartfm::RestClient::Item.find(params)
|
45
|
-
self.deserialize(hash)
|
46
|
-
end
|
47
|
-
|
48
|
-
def self.matching(keyword, params = {})
|
49
|
-
params[:keyword] = keyword
|
50
|
-
hash = Smartfm::RestClient::Item.matching(params)
|
51
|
-
self.deserialize(hash) || []
|
52
|
-
end
|
53
|
-
|
54
|
-
def self.extract(text, params = {})
|
55
|
-
params[:text] = text
|
56
|
-
hash = Smartfm::RestClient::Item.extract(params)
|
57
|
-
if params[:words_only] == false
|
58
|
-
self.deserialize(hash) || []
|
59
|
-
else
|
60
|
-
hash
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
def self.create(auth, params = {})
|
65
|
-
self.new(params).save(auth)
|
66
|
-
end
|
67
|
-
|
68
44
|
def initialize(params = {})
|
69
45
|
params[:responses] = [params[:response]] if params[:response]
|
70
46
|
@id = params[:id].to_i
|
71
47
|
@list = params[:list]
|
72
|
-
@cue = self.deserialize(params[:cue],
|
48
|
+
@cue = self.deserialize(params[:cue], :as => Smartfm::Item::Cue)
|
73
49
|
@responses = self.deserialize(params[:responses], :as => Smartfm::Item::Response)
|
74
50
|
@sentences = self.deserialize(params[:sentences], :as => Smartfm::Sentence)
|
51
|
+
@user = self.deserialize(params[:user], :as => Smartfm::User)
|
75
52
|
end
|
76
53
|
|
77
|
-
def
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
end
|
83
|
-
Smartfm::Item.find(item_id)
|
84
|
-
end
|
85
|
-
|
86
|
-
def add_image(auth, params)
|
87
|
-
post_params = if params.is_a?(String)
|
88
|
-
{ 'image[url]' => params }
|
89
|
-
else
|
90
|
-
image_params = {
|
91
|
-
'image[url]' => params[:url],
|
92
|
-
'image[list_id]' => params[:list_id]
|
93
|
-
}
|
94
|
-
if params[:attribution]
|
95
|
-
attribution_params = {
|
96
|
-
'attribution[media_entity]' => params[:attribution][:media_entity],
|
97
|
-
'attribution[author]' => params[:attribution][:media_entity],
|
98
|
-
'attribution[author_url]' => params[:attribution][:media_entity],
|
99
|
-
'attribution[attribution_license_id]' => params[:attribution][:media_entity]
|
100
|
-
}
|
101
|
-
image_params.merge(attribution_params)
|
102
|
-
else
|
103
|
-
image_params
|
104
|
-
end
|
105
|
-
end
|
106
|
-
Smartfm::RestClient::Item.add_image(auth, post_params.merge(:id => self.id))
|
107
|
-
end
|
108
|
-
|
109
|
-
def add_sound(auth, params)
|
110
|
-
post_params = if params.is_a?(String)
|
111
|
-
{ 'sound[url]' => params }
|
54
|
+
def self.extract(text, params = {})
|
55
|
+
params[:text] = text
|
56
|
+
hash = self.rest_client.extract(params)
|
57
|
+
if params[:words_only] == false
|
58
|
+
self.deserialize(hash) || []
|
112
59
|
else
|
113
|
-
|
114
|
-
'sound[url]' => params[:url],
|
115
|
-
'sound[list_id]' => params[:list_id]
|
116
|
-
}
|
117
|
-
if params[:attribution]
|
118
|
-
attribution_params = {
|
119
|
-
'attribution[media_entity]' => params[:attribution][:media_entity],
|
120
|
-
'attribution[author]' => params[:attribution][:media_entity],
|
121
|
-
'attribution[author_url]' => params[:attribution][:media_entity],
|
122
|
-
'attribution[attribution_license_id]' => params[:attribution][:media_entity]
|
123
|
-
}
|
124
|
-
sound_params.merge(attribution_params)
|
125
|
-
else
|
126
|
-
sound_params
|
127
|
-
end
|
60
|
+
hash
|
128
61
|
end
|
129
|
-
Smartfm::RestClient::Item.add_sound(auth, post_params.merge(:id => self.id))
|
130
62
|
end
|
131
63
|
|
132
64
|
def add_tags(auth, *tags)
|
@@ -139,7 +71,7 @@ class Smartfm::Item < Smartfm::Base
|
|
139
71
|
post_params["semantic_tags[#{idx}][disambiguation]"] = tag[:disambiguation]
|
140
72
|
end
|
141
73
|
end
|
142
|
-
|
74
|
+
self.rest_client.add_tags(auth, post_params.merge(:id => self.id))
|
143
75
|
end
|
144
76
|
|
145
77
|
protected
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class Smartfm::Like < Smartfm::Base
|
2
|
+
ATTRIBUTES = [:id, :type, :title, :description, :href, :favorite, :user]
|
3
|
+
attr_reader *ATTRIBUTES
|
4
|
+
|
5
|
+
include Smartfm::PrivateContent
|
6
|
+
|
7
|
+
def self.rest_client; Smartfm::RestClient::Like; end
|
8
|
+
def rest_client; self.class.rest_client; end
|
9
|
+
|
10
|
+
def initialize(params)
|
11
|
+
@id = params[:id]
|
12
|
+
@type = params[:user]
|
13
|
+
@title = params[:title]
|
14
|
+
@description = params[:description]
|
15
|
+
@href = params[:href]
|
16
|
+
@favorite = params[:favorite]
|
17
|
+
@user = self.deserialize(params[:user], :as => Smartfm::User)
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
@@ -1,49 +1,37 @@
|
|
1
1
|
class Smartfm::List < Smartfm::Base
|
2
2
|
ATTRIBUTES = [:id, :title, :description, :icon, :square_icon, :item_count, :user_count, :iknow, :dictation, :brainspeed,
|
3
|
-
:language, :translation_language, :list_type, :transcript, :embed,
|
4
|
-
:
|
5
|
-
|
6
|
-
READONLY_ATTRIBUTES = [:id, :icon, :item_count, :user_count, :iknow, :dictation, :brainspeed]
|
3
|
+
:language, :translation_language, :list_type, :transcript, :embed, :tags, :media_entry,
|
4
|
+
:attribution_license_id, :items, :sentences, :user]
|
5
|
+
READONLY_ATTRIBUTES = [:id, :icon, :item_count, :user_count, :iknow, :dictation, :brainspeed, :user]
|
7
6
|
attr_accessor *(ATTRIBUTES - READONLY_ATTRIBUTES)
|
8
7
|
attr_reader *READONLY_ATTRIBUTES
|
9
8
|
|
9
|
+
include Smartfm::PublicContent
|
10
|
+
include Smartfm::ActsAsLikable
|
11
|
+
|
12
|
+
def self.rest_client; Smartfm::RestClient::List; end
|
13
|
+
def rest_client; self.class.rest_client; end
|
14
|
+
|
10
15
|
class Application < Smartfm::Base
|
11
|
-
ATTRIBUTES = [:application, :list_id, :lang]
|
16
|
+
ATTRIBUTES = [:application, :available, :progress, :list_id, :lang]
|
12
17
|
attr_reader *ATTRIBUTES
|
13
18
|
|
14
19
|
def initialize(params = {})
|
15
|
-
@application
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
20
|
+
@application = case
|
21
|
+
when params[:iknow] then :iknow
|
22
|
+
when params[:dictation] then :dictation
|
23
|
+
when params[:brainspeed] then :brainspeed
|
24
|
+
end
|
25
|
+
@available = params[self.application][:available]
|
26
|
+
@progress = params[self.application][:progress]
|
27
|
+
@href = params[self.application][:href]
|
28
|
+
@list_id = params[:list_id]
|
29
|
+
@lang = params[:lang]
|
21
30
|
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def self.recent(params = {})
|
25
|
-
hash = Smartfm::RestClient::List.recent(params)
|
26
|
-
self.deserialize(hash) || []
|
27
|
-
end
|
28
|
-
|
29
|
-
def self.find(list_id, params = {})
|
30
|
-
params[:id] = list_id
|
31
|
-
hash = Smartfm::RestClient::List.find(params)
|
32
|
-
self.deserialize(hash)
|
33
|
-
end
|
34
|
-
|
35
|
-
def self.matching(keyword, params = {})
|
36
|
-
params[:keyword] = keyword
|
37
|
-
hash = Smartfm::RestClient::List.matching(params)
|
38
|
-
self.deserialize(hash) || []
|
39
|
-
end
|
40
|
-
|
41
|
-
def self.create(auth, params = {})
|
42
|
-
self.new(params).save(auth)
|
43
|
-
end
|
44
31
|
|
45
|
-
|
46
|
-
|
32
|
+
def available?
|
33
|
+
self.available
|
34
|
+
end
|
47
35
|
end
|
48
36
|
|
49
37
|
def initialize(params = {})
|
@@ -56,55 +44,39 @@ class Smartfm::List < Smartfm::Base
|
|
56
44
|
@user_count = (params[:user_count].to_i rescue nil)
|
57
45
|
@language = params[:language]
|
58
46
|
@translation_language = params[:translation_language]
|
59
|
-
if @
|
47
|
+
if @id and @translation_language
|
60
48
|
common_settings = {:list_id => @id, :lang => @translation_language}
|
61
|
-
@iknow = Application.new(common_settings.merge(:
|
62
|
-
@dictation = Application.new(common_settings.merge(:
|
63
|
-
@brainspeed = Application.new(common_settings.merge(:
|
49
|
+
@iknow = Application.new(common_settings.merge(:iknow => params[:iknow]))
|
50
|
+
@dictation = Application.new(common_settings.merge(:dictation => params[:dictation]))
|
51
|
+
@brainspeed = Application.new(common_settings.merge(:brainspeed => params[:brainspeed]))
|
64
52
|
end
|
65
|
-
@author = params[:author] # display_name or username
|
66
|
-
@author_id = params[:author_id] # username
|
67
|
-
@author_url = params[:author_url]
|
68
53
|
@list_type = params[:list_type] # for list creation
|
69
54
|
@transcript = params[:transcript] # for list creation
|
70
55
|
@embed = params[:embed] # for list creation
|
71
56
|
@tags = params[:tags] # for list creation
|
72
57
|
@media_entry = params[:media_entry] # for list creation
|
73
58
|
@attribution_license_id = params[:attribution_license_id] # for list creation
|
74
|
-
@items
|
75
|
-
@sentences
|
59
|
+
@items = self.deserialize(params[:items], :as => Smartfm::Item)
|
60
|
+
@sentences = self.deserialize(params[:sentences], :as => Smartfm::Sentence)
|
61
|
+
@user = self.deserialize(params[:user], :as => Smartfm::User)
|
76
62
|
end
|
77
63
|
|
78
64
|
def items(params = {})
|
79
|
-
hash =
|
65
|
+
hash = self.rest_client.items(params.merge(:id => self.id))
|
80
66
|
self.deserialize(hash, :as => Smartfm::Item) || []
|
81
67
|
end
|
82
68
|
|
83
69
|
def sentences(params = {})
|
84
|
-
hash =
|
70
|
+
hash = self.rest_client.sentences(params.merge(:id => self.id))
|
85
71
|
self.deserialize(hash, :as => Smartfm::Sentence) || []
|
86
72
|
end
|
87
73
|
|
88
|
-
def save(auth)
|
89
|
-
begin
|
90
|
-
list_id = Smartfm::RestClient::List.create(auth, self.to_post_data)
|
91
|
-
rescue
|
92
|
-
return false
|
93
|
-
end
|
94
|
-
Smartfm::List.find(list_id)
|
95
|
-
end
|
96
|
-
|
97
|
-
def delete(auth)
|
98
|
-
Smartfm::RestClient::List.delete(auth, {:id => self.id})
|
99
|
-
end
|
100
|
-
alias_method :destroy, :delete
|
101
|
-
|
102
74
|
def add_item(auth, item)
|
103
|
-
|
75
|
+
self.rest_client.add_item(auth, {:id => self.id, :item_id => item.id})
|
104
76
|
end
|
105
77
|
|
106
78
|
def delete_item(auth, item)
|
107
|
-
|
79
|
+
self.rest_client.delete_item(auth, {:id => self.id, :item_id => item.id})
|
108
80
|
end
|
109
81
|
|
110
82
|
protected
|
@@ -121,8 +93,7 @@ class Smartfm::List < Smartfm::Base
|
|
121
93
|
if self.list_type
|
122
94
|
post_data['list[type]'] = self.list_type
|
123
95
|
end
|
124
|
-
[
|
125
|
-
:author, :author_url, :attribution_license_id ].each do |key|
|
96
|
+
[:transcript, :embed, :tags, :media_entry, :author, :author_url, :attribution_license_id ].each do |key|
|
126
97
|
if self.send("#{key}")
|
127
98
|
post_data["list[#{key}]"] = self.send("#{key}")
|
128
99
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
class Smartfm::Notification < Smartfm::Base
|
2
|
+
ATTRIBUTES = [:type, :message, :recipient, :sender, :context]
|
3
|
+
READONLY_ATTRIBUTES = [:type, :recipient, :sender, :context]
|
4
|
+
attr_accessor *(ATTRIBUTES - READONLY_ATTRIBUTES)
|
5
|
+
attr_reader *READONLY_ATTRIBUTES
|
6
|
+
|
7
|
+
include Smartfm::PrivateContent
|
8
|
+
|
9
|
+
def self.rest_client; Smartfm::RestClient::Notification; end
|
10
|
+
def rest_client; self.class.rest_client; end
|
11
|
+
|
12
|
+
def initialize(params)
|
13
|
+
@type = params[:type]
|
14
|
+
@message = params[:message]
|
15
|
+
@recipient = params[:recipient]
|
16
|
+
@sender = params[:sender]
|
17
|
+
@context = params[:context]
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def to_post_data
|
23
|
+
{:message => self.message}
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
class Smartfm::Sentence < Smartfm::Base
|
2
|
+
ATTRIBUTES = [:sound, :image, :square_image, :text, :language, :id, :transliterations, :translations, :item, :list, :user]
|
3
|
+
READONLY_ATTRIBUTES = [:id, :user]
|
4
|
+
attr_accessor *(ATTRIBUTES - READONLY_ATTRIBUTES)
|
5
|
+
attr_reader *READONLY_ATTRIBUTES
|
6
|
+
|
7
|
+
include Smartfm::PublicContent
|
8
|
+
include Smartfm::MediaSupport
|
9
|
+
include Smartfm::ActsAsLikable
|
10
|
+
|
11
|
+
def self.rest_client; Smartfm::RestClient::Sentence; end
|
12
|
+
def rest_client; self.class.rest_client; end
|
13
|
+
|
14
|
+
def initialize(params = {})
|
15
|
+
params[:translations] = [params[:translation]] if params[:translation]
|
16
|
+
params[:transliterations] = [params[:transliteration]] if params[:transliteration]
|
17
|
+
@id = params[:id]
|
18
|
+
@item = params[:item]
|
19
|
+
@list = params[:list]
|
20
|
+
@sound = params[:sound]
|
21
|
+
@image = params[:image]
|
22
|
+
@square_image = params[:square_image]
|
23
|
+
@text = params[:text]
|
24
|
+
@language = params[:language]
|
25
|
+
@transliterations = params[:transliterations]
|
26
|
+
@translations = self.deserialize(params[:translations], :as => Smartfm::Sentence)
|
27
|
+
@user = self.deserialize(params[:user], :as => Smartfm::User)
|
28
|
+
end
|
29
|
+
|
30
|
+
protected
|
31
|
+
|
32
|
+
def to_post_data
|
33
|
+
self.validate
|
34
|
+
post_data = {
|
35
|
+
'item_id' => self.item.id,
|
36
|
+
'sentence[text]' => self.text
|
37
|
+
}
|
38
|
+
# Optional attributes
|
39
|
+
if self.list
|
40
|
+
post_data['sentence[list_id]'] = self.list.id
|
41
|
+
end
|
42
|
+
[:language, :transliteration].each do |key|
|
43
|
+
if self.send("#{key}")
|
44
|
+
post_data["sentence[#{key}]"] = self.send("#{key}")
|
45
|
+
end
|
46
|
+
end
|
47
|
+
if self.translation
|
48
|
+
[:text, :language, :transliteration].each do |key|
|
49
|
+
if self.translation.send("#{key}")
|
50
|
+
post_data["translation[#{key}]"] = self.translation.send("#{key}")
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
post_data
|
55
|
+
end
|
56
|
+
|
57
|
+
def validate
|
58
|
+
raise ArgumentError.new("Item is required.") unless self.item
|
59
|
+
raise ArgumentError.new("Sentence text is required.") if self.text.nil? or self.text.empty?
|
60
|
+
end
|
61
|
+
|
62
|
+
def translation
|
63
|
+
self.translations.first rescue nil
|
64
|
+
end
|
65
|
+
|
66
|
+
def transliteration
|
67
|
+
self.transliterations.first rescue nil
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|