iknow 0.0.4

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.
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