iknow 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. data/ChangeLog +12 -0
  2. data/README +64 -0
  3. data/Rakefile +147 -0
  4. data/examples/iknow_on_rails/app/controllers/application.rb +15 -0
  5. data/examples/iknow_on_rails/app/controllers/iknow_oauth_controller.rb +24 -0
  6. data/examples/iknow_on_rails/app/controllers/users_controller.rb +10 -0
  7. data/examples/iknow_on_rails/app/helpers/application_helper.rb +3 -0
  8. data/examples/iknow_on_rails/app/helpers/iknow_oauth_helper.rb +3 -0
  9. data/examples/iknow_on_rails/app/helpers/users_helper.rb +2 -0
  10. data/examples/iknow_on_rails/app/models/iknow_oauth_token.rb +37 -0
  11. data/examples/iknow_on_rails/config/boot.rb +109 -0
  12. data/examples/iknow_on_rails/config/environment.rb +76 -0
  13. data/examples/iknow_on_rails/config/environments/development.rb +17 -0
  14. data/examples/iknow_on_rails/config/environments/production.rb +22 -0
  15. data/examples/iknow_on_rails/config/environments/test.rb +22 -0
  16. data/examples/iknow_on_rails/config/initializers/inflections.rb +10 -0
  17. data/examples/iknow_on_rails/config/initializers/mime_types.rb +5 -0
  18. data/examples/iknow_on_rails/config/initializers/new_rails_defaults.rb +17 -0
  19. data/examples/iknow_on_rails/config/routes.rb +44 -0
  20. data/examples/iknow_on_rails/db/migrate/20081017012212_create_iknow_oauth_tokens.rb +15 -0
  21. data/examples/iknow_on_rails/db/schema.rb +23 -0
  22. data/examples/iknow_on_rails/lib/iknow_oauth_system.rb +26 -0
  23. data/examples/iknow_on_rails/public/dispatch.rb +10 -0
  24. data/examples/iknow_on_rails/test/functional/iknow_oauth_controller_test.rb +7 -0
  25. data/examples/iknow_on_rails/test/functional/users_controller_test.rb +8 -0
  26. data/examples/iknow_on_rails/test/test_helper.rb +38 -0
  27. data/examples/iknow_on_rails/test/unit/iknow_oauth_token_test.rb +7 -0
  28. data/examples/pure_ruby.rb +54 -0
  29. data/generators/iknow_oauth/USAGE +12 -0
  30. data/generators/iknow_oauth/iknow_oauth_generator.rb +22 -0
  31. data/generators/iknow_oauth/templates/iknow_oauth_controller.rb +24 -0
  32. data/generators/iknow_oauth/templates/iknow_oauth_controller_test.rb +7 -0
  33. data/generators/iknow_oauth/templates/iknow_oauth_helper.rb +3 -0
  34. data/generators/iknow_oauth/templates/iknow_oauth_system.rb +26 -0
  35. data/generators/iknow_oauth/templates/iknow_oauth_token.rb +37 -0
  36. data/generators/iknow_oauth/templates/iknow_oauth_token_test.rb +7 -0
  37. data/generators/iknow_oauth/templates/iknow_oauth_tokens_migration.rb +15 -0
  38. data/generators/iknow_oauth/templates/index.rhtml +4 -0
  39. data/lib/ext/hash.rb +23 -0
  40. data/lib/iknow/core/config.rb +44 -0
  41. data/lib/iknow/core/version.rb +14 -0
  42. data/lib/iknow/core.rb +2 -0
  43. data/lib/iknow/model/base.rb +29 -0
  44. data/lib/iknow/model/item.rb +60 -0
  45. data/lib/iknow/model/list.rb +133 -0
  46. data/lib/iknow/model/sentence.rb +34 -0
  47. data/lib/iknow/model/user.rb +102 -0
  48. data/lib/iknow/model.rb +5 -0
  49. data/lib/iknow/rest_client/base.rb +114 -0
  50. data/lib/iknow/rest_client/item.rb +12 -0
  51. data/lib/iknow/rest_client/list.rb +13 -0
  52. data/lib/iknow/rest_client/sentence.rb +12 -0
  53. data/lib/iknow/rest_client/user.rb +12 -0
  54. data/lib/iknow/rest_client.rb +8 -0
  55. data/lib/iknow.rb +14 -0
  56. data/test/iknow_test.rb +5 -0
  57. data/test/test_helper.rb +3 -0
  58. metadata +157 -0
@@ -0,0 +1,34 @@
1
+ class Iknow::Sentence < Iknow::Base
2
+ ATTRIBUTES = [:sound, :image, :text, :language, :id, :transliterations, :translations]
3
+ WRITABLE_ATTRIBUTES = [:sound, :image]
4
+ attr_accessor *WRITABLE_ATTRIBUTES
5
+ attr_reader *(ATTRIBUTES - WRITABLE_ATTRIBUTES)
6
+
7
+ def self.recent(params = {})
8
+ response = Iknow::RestClient::Sentence.recent(params)
9
+ self.deserialize(response) || []
10
+ end
11
+
12
+ def self.find(sentence_id, params = {})
13
+ params[:id] = sentence_id
14
+ response = Iknow::RestClient::Sentence.find(params)
15
+ self.deserialize(response)
16
+ end
17
+
18
+ def self.matching(keyword, params = {})
19
+ params[:keyword] = keyword
20
+ response = Iknow::RestClient::Sentence.matching(params)
21
+ self.deserialize(response) || []
22
+ end
23
+
24
+ def initialize(params = {})
25
+ @id = params[:id]
26
+ @sound = params[:sound]
27
+ @image = params[:image]
28
+ @text = params[:text]
29
+ @language = params[:language]
30
+ @transliterations = params[:transliterations]
31
+ @translations = self.deserialize(params[:translations], :as => Iknow::Sentence)
32
+ end
33
+
34
+ end
@@ -0,0 +1,102 @@
1
+ class Iknow::User < Iknow::Base
2
+ ATTRIBUTES = [:username, :profile]
3
+ attr_reader *ATTRIBUTES
4
+
5
+ class Profile < Iknow::Base
6
+ ATTRIBUTES = [:name, :gender, :birthday, :description, :blog_url, :profile_url, :foaf_url, :icon_url]
7
+ attr_reader *ATTRIBUTES
8
+
9
+ def initialize(params = {})
10
+ @name = params[:name]
11
+ @gender = params[:gender]
12
+ @birthday = (Date.parse(params[:birthday]) rescue nil)
13
+ @description = params[:description]
14
+ @blog_url = params[:blog_url]
15
+ @profile_url = params[:profile_url]
16
+ @foaf_url = params[:foaf_url]
17
+ @icon_url = params[:icon_url]
18
+ end
19
+ end
20
+
21
+ class Study < Iknow::Base
22
+ ATTRIBUTES = [:today, :results, :total_summary]
23
+ attr_reader *ATTRIBUTES
24
+
25
+ class Result < Iknow::Base
26
+ ATTRIBUTES = [:timestamp, :seconds, :totals, :seen, :completed, :date]
27
+ attr_reader *ATTRIBUTES
28
+
29
+ def initialize(params = {})
30
+ @timestamp = (params[:timestamp].to_i rescue nil)
31
+ @seconds = (params[:seconds].to_i rescue nil)
32
+ @totals = {
33
+ :seconds => (params[:totals][:seconds].to_i rescue nil),
34
+ :seen => (params[:totals][:seen].to_i rescue nil),
35
+ :completed => (params[:totals][:completed].to_i rescue nil)
36
+ }
37
+ @seen = (params[:seen].to_i rescue nil)
38
+ @completed = (params[:completed].to_i rescue nil)
39
+ @date = (Date.parse(params[:date]) rescue nil)
40
+ end
41
+ end
42
+
43
+ class TotalSummary < Iknow::Base
44
+ ATTRIBUTES = [:studied, :completed, :performance, :best_speed, :best_score]
45
+ attr_reader *ATTRIBUTES
46
+
47
+ def initialize(params = {})
48
+ @studied = params[:studied]
49
+ @completed = params[:completed]
50
+ @performance = params[:performance]
51
+ @best_speed = params[:best_speed]
52
+ @best_score = params[:best_score]
53
+ end
54
+ end
55
+
56
+ def initialize(params = {})
57
+ @today = (Date.parse(params[:today]) rescue nil)
58
+ @results = self.deserialize(params[:study_results], :as => Iknow::User::Study::Result)
59
+ @total_summary = self.deserialize(params[:total_summary], :as => Iknow::User::Study::TotalSummary)
60
+ end
61
+
62
+ end
63
+
64
+ def self.find(username, params = {})
65
+ params[:username] = username
66
+ response = Iknow::RestClient::User.find(params)
67
+ self.deserialize(response)
68
+ end
69
+
70
+ def self.matching(keyword, params = {})
71
+ params[:keyword] = keyword
72
+ response = Iknow::RestClient::User.matching(params)
73
+ self.deserialize(response) || []
74
+ end
75
+
76
+ def initialize(params)
77
+ @profile = Profile.new(params[:profile])
78
+ @username = params[:username]
79
+ end
80
+
81
+ def items(params = {})
82
+ response = Iknow::RestClient::User.items(params.merge(:username => self.username))
83
+ self.deserialize(response, :as => Iknow::Item) || []
84
+ end
85
+
86
+ def lists(params = {})
87
+ response = Iknow::RestClient::User.lists(params.merge(:username => self.username))
88
+ self.deserialize(response, :as => Iknow::List) || []
89
+ end
90
+
91
+ def friends(params = {})
92
+ response = Iknow::RestClient::User.friends(params.merge(:username => self.username))
93
+ self.deserialize(response) || []
94
+ end
95
+
96
+ def study(params = {})
97
+ params[:application] ||= 'iknow'
98
+ response = Iknow::RestClient::User.study_results(params.merge(:username => self.username))
99
+ self.deserialize(response, :as => Iknow::User::Study)
100
+ end
101
+
102
+ end
@@ -0,0 +1,5 @@
1
+ require 'iknow/model/base'
2
+ require 'iknow/model/user'
3
+ require 'iknow/model/list'
4
+ require 'iknow/model/item'
5
+ require 'iknow/model/sentence'
@@ -0,0 +1,114 @@
1
+ class Iknow::RestClient::Base
2
+
3
+ class RESTError < Exception
4
+ attr_accessor :code, :message, :uri
5
+
6
+ def initialize(params = {})
7
+ self.code = params[:code]
8
+ self.message = params[:message]
9
+ self.uri = params[:uri]
10
+ end
11
+
12
+ def to_s
13
+ "HTTP #{@code}: #{@message} at #{@uri}"
14
+ end
15
+ end
16
+
17
+ def self.valid_action?(action) ; self::ACTIONS.keys.include? action.to_sym end
18
+ def self.path(action) ; self::ACTIONS[action.to_sym][:path] end
19
+ def self.http_method(action) ; self::ACTIONS[action.to_sym][:http_method] || :get end
20
+
21
+ def self.method_missing(action, *args)
22
+ # GET methods are handled here
23
+ # POST and DELETE methods should be implemented in each class
24
+ super unless self.valid_action?(action)
25
+ uri, params = replace_uri_params(self.path(action), args[0])
26
+ http_connect do |conn|
27
+ case self.http_method(action)
28
+ when :get
29
+ http_get_request(uri, params)
30
+ when :post
31
+ http_post_request(uri, params)
32
+ when :delete
33
+ http_delete_request(uri, params)
34
+ end
35
+ end
36
+ end
37
+
38
+ private
39
+
40
+ def self.config; Iknow::Config end
41
+
42
+ def self.api_key_required
43
+ raise ArgumentError.new("iKnow! API key is required") if self.config.api_key == ''
44
+ end
45
+
46
+ def self.http_connect
47
+ connection = Net::HTTP.new(self.config.api_host, self.config.api_port)
48
+ connection.start do |conn|
49
+ request = yield connection
50
+ response = conn.request(request)
51
+ handle_rest_response(response)
52
+ JSON.parse(response.body)
53
+ end
54
+ end
55
+
56
+ def self.raise_rest_error(response, uri = nil)
57
+ raise RESTError.new(:code => response.code, :message => response.message, :uri => uri)
58
+ end
59
+
60
+ def self.handle_rest_response(response, uri = nil)
61
+ raise_rest_error(response, uri) unless response.is_a?(Net::HTTPSuccess)
62
+ end
63
+
64
+ def self.http_header
65
+ @@http_header ||= {
66
+ 'User-Agent' => "iKnow! API v#{Iknow::Version.to_version} [#{self.config.user_agent}]",
67
+ 'Accept' => 'text/x-json',
68
+ 'X-iKnow-Client' => self.config.application_name,
69
+ 'X-iKnow-Client-Version' => self.config.application_version,
70
+ 'X-iKnow-Client-URL' => self.config.application_url,
71
+ }
72
+ @@http_header
73
+ end
74
+
75
+ def self.replace_uri_params(uri, params = {})
76
+ replaced_uri = uri.clone
77
+ unless params.empty?
78
+ params.each do |key, value|
79
+ if replaced_uri=~/__#{key}__/
80
+ replaced_uri.sub!(/__#{key}__/, value.to_s)
81
+ params.delete(key)
82
+ end
83
+ end
84
+ end
85
+ return replaced_uri, params
86
+ end
87
+
88
+ def self.http_get_request(uri, params = {})
89
+ unless self.config.api_key == ''
90
+ params.merge!(:api_key => self.config.api_key)
91
+ end
92
+ path = (params.size > 0) ? "#{uri}?#{params.to_http_str}" : uri
93
+ Net::HTTP::Get.new(path, http_header)
94
+ end
95
+
96
+ def self.http_post_request(uri, params = {})
97
+ self.api_key_required
98
+ request = Net::HTTP::Post.new(uri, http_header)
99
+ request.body = params.merge(:api_key => self.config.api_key).to_http_str
100
+ request
101
+ end
102
+
103
+ def self.http_delete_request(uri, params = {})
104
+ unless self.config.api_key == ''
105
+ params.merge!(:api_key => self.config.api_key)
106
+ end
107
+ path = (params.size > 0) ? "#{uri}?#{params.to_http_str}" : uri
108
+ Net::HTTP::Delete.new(path, http_header)
109
+ end
110
+
111
+ private_class_method :http_connect, :raise_rest_error, :handle_rest_response, :http_header,
112
+ :replace_uri_params, :http_get_request, :http_post_request, :http_delete_request
113
+
114
+ end
@@ -0,0 +1,12 @@
1
+ class Iknow::RestClient::Item < Iknow::RestClient::Base
2
+
3
+ ACTIONS = {
4
+ :recent => { :path => '/items' },
5
+ :find => { :path => '/items/__id__' },
6
+ :matching => { :path => '/items/matching/__keyword__' },
7
+ :add_image => { :path => '/items/__id__/images', :http_method => :post },
8
+ :add_sound => { :path => '/items/__id__/sounds', :http_method => :post },
9
+ :extract => { :path => '/items/extract', :http_method => :post }
10
+ }
11
+
12
+ end
@@ -0,0 +1,13 @@
1
+ class Iknow::RestClient::List < Iknow::RestClient::Base
2
+
3
+ ACTIONS = {
4
+ :recent => { :path => '/lists' },
5
+ :find => { :path => '/lists/__id__' },
6
+ :items => { :path => '/lists/__id__/items' },
7
+ :sentences => { :path => '/lists/__id__/sentences' },
8
+ :matching => { :path => '/lists/matching/__keyword__' },
9
+ :create => { :path => '/lists', :http_method => :post },
10
+ :delete => { :path => '/lists/__id__', :http_method => :delete }
11
+ }
12
+
13
+ end
@@ -0,0 +1,12 @@
1
+ class Iknow::RestClient::Sentence < Iknow::RestClient::Base
2
+
3
+ ACTIONS = {
4
+ :recent => { :path => '/sentences' },
5
+ :find => { :path => '/sentences/__id__' },
6
+ :matching => { :path => '/sentences/matching/__keyword__' },
7
+ :create => { :path => '/sentences', :http_method => :post },
8
+ :add_image => { :path => '/sentences/__id__/images', :http_method => :post },
9
+ :add_sound => { :path => '/sentences/__id__/sounds', :http_method => :post }
10
+ }
11
+
12
+ end
@@ -0,0 +1,12 @@
1
+ class Iknow::RestClient::User < Iknow::RestClient::Base
2
+
3
+ ACTIONS = {
4
+ :find => { :path => '/users/__username__' },
5
+ :lists => { :path => '/users/__username__/lists' },
6
+ :items => { :path => '/users/__username__/items' },
7
+ :friends => { :path => '/users/__username__/friends' },
8
+ :study_results => { :path => '/users/__username__/study_results/__application__' },
9
+ :matching => { :path => '/users/matching/__keyword__' }
10
+ }
11
+
12
+ end
@@ -0,0 +1,8 @@
1
+ module Iknow::RestClient
2
+ end
3
+
4
+ require 'iknow/rest_client/base'
5
+ require 'iknow/rest_client/user'
6
+ require 'iknow/rest_client/list'
7
+ require 'iknow/rest_client/item'
8
+ require 'iknow/rest_client/sentence'
data/lib/iknow.rb ADDED
@@ -0,0 +1,14 @@
1
+ module Iknow
2
+ end
3
+
4
+ require 'date'
5
+ require 'net/https'
6
+ require 'uri'
7
+
8
+ require 'rubygems'
9
+ require 'json'
10
+
11
+ require 'ext/hash'
12
+ require 'iknow/core'
13
+ require 'iknow/rest_client'
14
+ require 'iknow/model'
@@ -0,0 +1,5 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ require "test/unit"
4
+ class IknowTest < Test::Unit::TestCase
5
+ end
@@ -0,0 +1,3 @@
1
+ require 'test/unit'
2
+ require File.dirname(__FILE__) + '/../lib/iknow'
3
+
metadata ADDED
@@ -0,0 +1,157 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: iknow
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.4
5
+ platform: ruby
6
+ authors:
7
+ - nov
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-12-01 00:00:00 +09:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rails
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 2.1.0
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: json
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: oauth
37
+ type: :runtime
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 0.2.4
44
+ version:
45
+ description: A rubygem for iKnow! APIs
46
+ email: developer@iknow.co.jp
47
+ executables: []
48
+
49
+ extensions: []
50
+
51
+ extra_rdoc_files:
52
+ - README
53
+ - ChangeLog
54
+ files:
55
+ - README
56
+ - ChangeLog
57
+ - Rakefile
58
+ - test/iknow_test.rb
59
+ - test/test_helper.rb
60
+ - lib/ext
61
+ - lib/ext/hash.rb
62
+ - lib/iknow
63
+ - lib/iknow/core
64
+ - lib/iknow/core/config.rb
65
+ - lib/iknow/core/version.rb
66
+ - lib/iknow/core.rb
67
+ - lib/iknow/model
68
+ - lib/iknow/model/base.rb
69
+ - lib/iknow/model/item.rb
70
+ - lib/iknow/model/list.rb
71
+ - lib/iknow/model/sentence.rb
72
+ - lib/iknow/model/user.rb
73
+ - lib/iknow/model.rb
74
+ - lib/iknow/rest_client
75
+ - lib/iknow/rest_client/base.rb
76
+ - lib/iknow/rest_client/item.rb
77
+ - lib/iknow/rest_client/list.rb
78
+ - lib/iknow/rest_client/sentence.rb
79
+ - lib/iknow/rest_client/user.rb
80
+ - lib/iknow/rest_client.rb
81
+ - lib/iknow.rb
82
+ - generators/iknow_oauth
83
+ - generators/iknow_oauth/iknow_oauth_generator.rb
84
+ - generators/iknow_oauth/templates
85
+ - generators/iknow_oauth/templates/iknow_oauth_controller.rb
86
+ - generators/iknow_oauth/templates/iknow_oauth_controller_test.rb
87
+ - generators/iknow_oauth/templates/iknow_oauth_helper.rb
88
+ - generators/iknow_oauth/templates/iknow_oauth_system.rb
89
+ - generators/iknow_oauth/templates/iknow_oauth_token.rb
90
+ - generators/iknow_oauth/templates/iknow_oauth_token_test.rb
91
+ - generators/iknow_oauth/templates/iknow_oauth_tokens_migration.rb
92
+ - generators/iknow_oauth/templates/index.rhtml
93
+ - generators/iknow_oauth/USAGE
94
+ - examples/iknow_on_rails/app/controllers/application.rb
95
+ - examples/iknow_on_rails/app/controllers/iknow_oauth_controller.rb
96
+ - examples/iknow_on_rails/app/controllers/users_controller.rb
97
+ - examples/iknow_on_rails/app/helpers/application_helper.rb
98
+ - examples/iknow_on_rails/app/helpers/iknow_oauth_helper.rb
99
+ - examples/iknow_on_rails/app/helpers/users_helper.rb
100
+ - examples/iknow_on_rails/app/models/iknow_oauth_token.rb
101
+ - examples/iknow_on_rails/config/boot.rb
102
+ - examples/iknow_on_rails/config/environment.rb
103
+ - examples/iknow_on_rails/config/environments/development.rb
104
+ - examples/iknow_on_rails/config/environments/production.rb
105
+ - examples/iknow_on_rails/config/environments/test.rb
106
+ - examples/iknow_on_rails/config/initializers/inflections.rb
107
+ - examples/iknow_on_rails/config/initializers/mime_types.rb
108
+ - examples/iknow_on_rails/config/initializers/new_rails_defaults.rb
109
+ - examples/iknow_on_rails/config/routes.rb
110
+ - examples/iknow_on_rails/db/migrate/20081017012212_create_iknow_oauth_tokens.rb
111
+ - examples/iknow_on_rails/db/schema.rb
112
+ - examples/iknow_on_rails/lib/iknow_oauth_system.rb
113
+ - examples/iknow_on_rails/public/dispatch.rb
114
+ - examples/iknow_on_rails/test/functional/iknow_oauth_controller_test.rb
115
+ - examples/iknow_on_rails/test/functional/users_controller_test.rb
116
+ - examples/iknow_on_rails/test/test_helper.rb
117
+ - examples/iknow_on_rails/test/unit/iknow_oauth_token_test.rb
118
+ - examples/pure_ruby.rb
119
+ has_rdoc: true
120
+ homepage: http://iknow.rubyforge.org
121
+ post_install_message:
122
+ rdoc_options:
123
+ - --title
124
+ - iknow documentation
125
+ - --charset
126
+ - utf-8
127
+ - --opname
128
+ - index.html
129
+ - --line-numbers
130
+ - --main
131
+ - README
132
+ - --inline-source
133
+ - --exclude
134
+ - ^(examples|extras)/
135
+ require_paths:
136
+ - lib
137
+ required_ruby_version: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - ">="
140
+ - !ruby/object:Gem::Version
141
+ version: 1.8.6
142
+ version:
143
+ required_rubygems_version: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: "0"
148
+ version:
149
+ requirements: []
150
+
151
+ rubyforge_project: iknow
152
+ rubygems_version: 1.3.1
153
+ signing_key:
154
+ specification_version: 2
155
+ summary: A rubygem for iKnow! APIs
156
+ test_files:
157
+ - test/iknow_test.rb