nov-iknow 0.0.1

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 ADDED
@@ -0,0 +1,4 @@
1
+ == 0.0.1 / 2008-10-13
2
+
3
+ * initial release
4
+
data/README ADDED
@@ -0,0 +1,56 @@
1
+
2
+ = iknow
3
+
4
+ A rubygem for iKnow! APIs
5
+ by nov <nmatake@cerego.co.jp>
6
+
7
+ == Description
8
+
9
+ ## Set API Key (in environment.rb etc.)
10
+ Iknow::Config.init do |conf|
11
+ conf.api_key = YOUR_API_KEY
12
+ end
13
+
14
+ ## User API
15
+ @user = Iknow::User.find('matake')
16
+ @user.items
17
+ @user.lists
18
+ @user.study_results
19
+ @matchied_users = Iknow::User.matching('matake')
20
+
21
+ ## List API
22
+ @recent_lists = Iknow::List.recent
23
+ @list = @recent_lists.first
24
+ @list.items
25
+ @list.sentences
26
+
27
+ ## Item API
28
+ @recent_items = Iknow::Item.recent
29
+ @matchied_items = Iknow::Item.matching('record')
30
+
31
+ ## Sentence API
32
+ @recent_sentences = Iknow::Sentence.recent
33
+ @matchied_sentences = Iknow::Sentence.matching('record')
34
+
35
+ == Installation
36
+
37
+ === Archive Installation
38
+
39
+ rake install
40
+
41
+ === Gem Installation
42
+
43
+ gem install iknow
44
+
45
+
46
+ == Features/Problems
47
+
48
+
49
+ == Synopsis
50
+
51
+
52
+ == Copyright
53
+
54
+ Author:: nov <nmatake@cerego.co.jp>
55
+ Copyright:: Copyright (c) 2008 nov
56
+ License:: MIT License
data/Rakefile ADDED
@@ -0,0 +1,146 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'rake/clean'
4
+ require 'rake/testtask'
5
+ require 'rake/packagetask'
6
+ require 'rake/gempackagetask'
7
+ require 'rake/rdoctask'
8
+ require 'rake/contrib/rubyforgepublisher'
9
+ require 'rake/contrib/sshpublisher'
10
+ require 'fileutils'
11
+ include FileUtils
12
+
13
+ NAME = "iknow"
14
+ AUTHOR = "nov"
15
+ EMAIL = "developer@iknow.co.jp"
16
+ DESCRIPTION = "A rubygem for iKnow! APIs"
17
+ RUBYFORGE_PROJECT = "iknow"
18
+ HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
19
+ BIN_FILES = %w( )
20
+
21
+ $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/lib"
22
+ require 'lib/iknow'
23
+ VERS = Iknow::Version.to_version
24
+ REV = File.read(".svn/entries")[/committed-rev="(d+)"/, 1] rescue nil
25
+ CLEAN.include ['**/.*.sw?', '*.gem', '.config']
26
+ RDOC_OPTS = [
27
+ '--title', "#{NAME} documentation",
28
+ "--charset", "utf-8",
29
+ "--opname", "index.html",
30
+ "--line-numbers",
31
+ "--main", "README",
32
+ "--inline-source",
33
+ ]
34
+
35
+ task :default => [:test]
36
+ task :package => [:clean]
37
+
38
+ Rake::TestTask.new("test") do |t|
39
+ t.libs << "test"
40
+ t.pattern = "test/**/*_test.rb"
41
+ t.verbose = true
42
+ end
43
+
44
+ spec = Gem::Specification.new do |s|
45
+ s.name = NAME
46
+ s.version = VERS
47
+ s.platform = Gem::Platform::RUBY
48
+ s.has_rdoc = true
49
+ s.extra_rdoc_files = ["README", "ChangeLog"]
50
+ s.rdoc_options += RDOC_OPTS + ['--exclude', '^(examples|extras)/']
51
+ s.summary = DESCRIPTION
52
+ s.description = DESCRIPTION
53
+ s.author = AUTHOR
54
+ s.email = EMAIL
55
+ s.homepage = HOMEPATH
56
+ s.executables = BIN_FILES
57
+ s.rubyforge_project = RUBYFORGE_PROJECT
58
+ s.bindir = "bin"
59
+ s.require_path = "lib"
60
+ #s.autorequire = ""
61
+ s.test_files = Dir["test/*_test.rb"]
62
+
63
+ #s.add_dependency('activesupport', '>=1.3.1')
64
+ s.add_dependency('json')
65
+ #s.required_ruby_version = '>= 1.8.2'
66
+
67
+ s.files = %w(README ChangeLog Rakefile) +
68
+ Dir.glob("{bin,doc,test,lib,templates,generator,extras,website,script}/**/*") +
69
+ Dir.glob("ext/**/*.{h,c,rb}") +
70
+ Dir.glob("examples/**/*.rb") +
71
+ Dir.glob("tools/*.rb") +
72
+ Dir.glob("rails/*.rb")
73
+
74
+ s.extensions = FileList["ext/**/extconf.rb"].to_a
75
+ end
76
+
77
+ Rake::GemPackageTask.new(spec) do |p|
78
+ p.need_tar = true
79
+ p.gem_spec = spec
80
+ end
81
+
82
+ task :install do
83
+ name = "#{NAME}-#{VERS}.gem"
84
+ sh %{rake package}
85
+ sh %{sudo gem install pkg/#{name}}
86
+ end
87
+
88
+ task :uninstall => [:clean] do
89
+ sh %{sudo gem uninstall #{NAME}}
90
+ end
91
+
92
+
93
+ Rake::RDocTask.new do |rdoc|
94
+ rdoc.rdoc_dir = 'html'
95
+ rdoc.options += RDOC_OPTS
96
+ rdoc.template = "resh"
97
+ #rdoc.template = "#{ENV['template']}.rb" if ENV['template']
98
+ if ENV['DOC_FILES']
99
+ rdoc.rdoc_files.include(ENV['DOC_FILES'].split(/,\s*/))
100
+ else
101
+ rdoc.rdoc_files.include('README', 'ChangeLog')
102
+ rdoc.rdoc_files.include('lib/**/*.rb')
103
+ rdoc.rdoc_files.include('ext/**/*.c')
104
+ end
105
+ end
106
+
107
+ desc "Publish to RubyForge"
108
+ task :rubyforge => [:rdoc, :package] do
109
+ require 'rubyforge'
110
+ Rake::RubyForgePublisher.new(RUBYFORGE_PROJECT, 'nov').upload
111
+ end
112
+
113
+ desc 'Package and upload the release to rubyforge.'
114
+ task :release => [:clean, :package] do |t|
115
+ v = ENV["VERSION"] or abort "Must supply VERSION=x.y.z"
116
+ abort "Versions don't match #{v} vs #{VERS}" unless v == VERS
117
+ pkg = "pkg/#{NAME}-#{VERS}"
118
+
119
+ require 'rubyforge'
120
+ rf = RubyForge.new.configure
121
+ puts "Logging in"
122
+ rf.login
123
+
124
+ c = rf.userconfig
125
+ # c["release_notes"] = description if description
126
+ # c["release_changes"] = changes if changes
127
+ c["preformatted"] = true
128
+
129
+ files = [
130
+ "#{pkg}.tgz",
131
+ "#{pkg}.gem"
132
+ ].compact
133
+
134
+ puts "Releasing #{NAME} v. #{VERS}"
135
+ rf.add_release RUBYFORGE_PROJECT, NAME, VERS, *files
136
+ end
137
+
138
+ desc 'Show information about the gem.'
139
+ task :debug_gem do
140
+ puts spec.to_ruby
141
+ end
142
+
143
+ desc 'Update gem spec'
144
+ task :gemspec do
145
+ open("#{NAME}.gemspec", 'w').write spec.to_ruby
146
+ end
@@ -0,0 +1,43 @@
1
+ require 'rubygems'
2
+ require 'iknow'
3
+
4
+ Iknow::Config.init do |conf|
5
+ conf.api_key = "" # Set your iKnow! API key, here.
6
+ conf.host = "api.iknow.co.jp"
7
+ end
8
+
9
+ please_get_api_key =<<EOS
10
+ This example needs your own iKnow! API key.
11
+ (for only Iknow::Item.extract example)
12
+
13
+ You can get iKnow! API key at iKnow! Developers.
14
+ iKnow! Developers (http://developer.iknow.co.jp/)
15
+
16
+ Thanks!
17
+ EOS
18
+
19
+ raise ArgumentError.new(please_get_api_key) if Iknow::Config.instance.api_key == ''
20
+
21
+ ## User API
22
+ @user = Iknow::User.find('matake')
23
+ @user.items
24
+ @user.lists
25
+ @user.friends
26
+ @user.study_results
27
+ @matchied_users = Iknow::User.matching('matake')
28
+
29
+ # ## List API
30
+ @recent_lists = Iknow::List.recent
31
+ @matchied_lists = Iknow::List.matching("遺伝的アルゴリズム")
32
+ @ga_list.first.items
33
+ @ga_list.first.sentences
34
+
35
+ # ## Item API
36
+ @recent_items = Iknow::Item.recent
37
+ @matchied_items = Iknow::Item.matching('record')
38
+ @items = Iknow::Item.extract("sometimes, often, electrical")
39
+ @items.first.sentences
40
+
41
+ ## Sentence API
42
+ @recent_sentences = Iknow::Sentence.recent
43
+ @matchied_sentences = Iknow::Sentence.matching('record')
data/lib/ext/hash.rb ADDED
@@ -0,0 +1,10 @@
1
+ class Hash
2
+ def to_http_str
3
+ result = ''
4
+ return result if self.empty?
5
+ self.each do |key, val|
6
+ result << "#{key}=#{URI.encode(val.to_s)}&"
7
+ end
8
+ result.chop
9
+ end
10
+ end
@@ -0,0 +1,28 @@
1
+ require 'singleton'
2
+
3
+ class Iknow::Config
4
+ include Singleton
5
+ attr_accessor :protocol, :host, :port, :user_agent, :api_key, :application_name, :application_version, :application_url, :source
6
+
7
+ def self.init(&block)
8
+ conf = Iknow::Config.instance
9
+ { :protocol => 'http',
10
+ :host => 'api.iknow.co.jp',
11
+ :port => 80,
12
+ :user_agent => 'default',
13
+ :api_key => '',
14
+ :application_name => 'iKnow! API',
15
+ :application_version => Iknow::Version.to_version,
16
+ :application_url => 'http://github.com/nov/iknow',
17
+ :source => 'iknow'
18
+ }.each do |key, value| conf.send("#{key}=", value) end
19
+ yield conf if block_given?
20
+ conf
21
+ end
22
+
23
+ def iknow_base_url
24
+ port = self.port==80 ? nil : ":#{self.port}"
25
+ "#{self.protocol}://#{self.host}#{port}"
26
+ end
27
+
28
+ end
@@ -0,0 +1,14 @@
1
+ module Iknow::Version
2
+ MAJOR = 0
3
+ MINOR = 0
4
+ REVISION = 1
5
+ class << self
6
+ def to_version
7
+ "#{MAJOR}.#{MINOR}.#{REVISION}"
8
+ end
9
+
10
+ def to_name
11
+ "#{MAJOR}_#{MINOR}_#{REVISION}"
12
+ end
13
+ end
14
+ end
data/lib/iknow/core.rb ADDED
@@ -0,0 +1,2 @@
1
+ require 'iknow/core/version'
2
+ require 'iknow/core/config'
@@ -0,0 +1,14 @@
1
+ class Iknow::Base
2
+ # TODO: define self.attributes
3
+ def self.attributes; self::ATTRIBUTES end
4
+ def attributes; self.class.attributes end
5
+
6
+ def self.deserialize(response, params = {})
7
+ klass = params[:as] ? params[:as] : self
8
+ response.is_a?(Array) ? response.inject([]) { |results, params| results << klass.new(params) } : klass.new(response)
9
+ end
10
+ def deserialize(response, params = {})
11
+ self.class.deserialize(response, params)
12
+ end
13
+
14
+ end
@@ -0,0 +1,54 @@
1
+ class Iknow::Item < Iknow::Base
2
+ ATTRIBUTES = [:sentences, :response, :cue, :id]
3
+ attr_reader *ATTRIBUTES
4
+
5
+ class Response
6
+ ATTRIBUTES = [:text]
7
+ attr_reader *ATTRIBUTES
8
+
9
+ def initialize(params = {})
10
+ @text = params['text']
11
+ end
12
+ end
13
+
14
+ class Cue
15
+ ATTRIBUTES = [:sound, :part_of_speech, :text]
16
+ NOT_WRITABLE_ATTRIBUTES = [:text]
17
+ attr_accessor *(ATTRIBUTES - NOT_WRITABLE_ATTRIBUTES)
18
+ attr_reader *NOT_WRITABLE_ATTRIBUTES
19
+
20
+ def initialize(params = {})
21
+ @text = params['text']
22
+ @sound = params['sound']
23
+ @image = params['part_of_speech']
24
+ end
25
+ end
26
+
27
+ def self.recent(params = {})
28
+ response = Iknow::RestClient::Item.recent(params)
29
+ self.deserialize(response)
30
+ end
31
+
32
+ def self.matching(keyword, params = {})
33
+ params[:keyword] = keyword
34
+ response = Iknow::RestClient::Item.matching(params)
35
+ self.deserialize(response)
36
+ end
37
+
38
+ def self.extract(text, params = {})
39
+ params[:text] = text
40
+ response = Iknow::RestClient::Item.extract(params)
41
+ self.deserialize(response)
42
+ end
43
+
44
+ def initialize(params = {})
45
+ @id = params['id'].to_i
46
+ @sentences = []
47
+ params['sentences'].each do |sentence|
48
+ @sentences << Iknow::Sentence.new(sentence)
49
+ end
50
+ @response = params['response'] ? Iknow::Item::Response.new(params['response']) : nil
51
+ @cue = Iknow::Item::Cue.new(params['cue'])
52
+ end
53
+
54
+ end
@@ -0,0 +1,84 @@
1
+ class Iknow::List < Iknow::Base
2
+ ATTRIBUTES = [:list_id, :title, :description, :link,
3
+ :language, :translation_language, :list_type, :transcript, :embed,
4
+ :tags, :media_entry, :author, :author_url, :attribution_license_id]
5
+ NOT_WRITABLE_ATTRIBUTES = [:list_id]
6
+ attr_accessor *(ATTRIBUTES - NOT_WRITABLE_ATTRIBUTES)
7
+ attr_reader *NOT_WRITABLE_ATTRIBUTES
8
+
9
+ def self.recent(params = {})
10
+ response = Iknow::RestClient::List.recent(params)
11
+ self.deserialize(response)
12
+ end
13
+
14
+ def self.matching(keyword, params = {})
15
+ params[:keyword] = keyword
16
+ response = Iknow::RestClient::List.matching(params)
17
+ self.deserialize(response)
18
+ end
19
+
20
+ def self.create(params = {})
21
+ new_list = self.new(params)
22
+ new_list.save!
23
+ end
24
+
25
+ def initialize(params = {})
26
+ @list_id = params['id'].to_i if params['id']
27
+ @title = params[:title] || params['title']
28
+ @description = params[:description] || params['description']
29
+ @link = params[:link] || params['link']
30
+ end
31
+
32
+ def items(params = {})
33
+ return @items if @items
34
+
35
+ response = Iknow::RestClient::List.items(params.merge(:id => self.list_id))
36
+ @items = self.deserialize(response, :as => Iknow::Item)
37
+ @items
38
+ end
39
+
40
+ def sentences(params = {})
41
+ return @sentences if @sentences
42
+
43
+ response = Iknow::RestClient::List.sentences(params.merge(:id => self.list_id))
44
+ @sentences = self.deserialize(response, :as => Iknow::Sentence)
45
+ @sentences
46
+ end
47
+
48
+ def save!
49
+ Iknow::RestClient::List.create(self.to_post_data)
50
+ end
51
+
52
+ def save
53
+ self.save!
54
+ true
55
+ rescue
56
+ false
57
+ end
58
+
59
+ protected
60
+
61
+ def to_post_data
62
+ raise ArgumentError.new("List title is needed.") if self.title.nil? or self.title.empty?
63
+
64
+ post_data = {
65
+ 'list[name]' => self.title,
66
+ 'list[description]' => self.description,
67
+ 'list[language]' => self.language || 'en',
68
+ 'list[translation_language]' => self.translation_language || 'ja'
69
+ }
70
+ # Object#type should not be used
71
+ if self.list_type
72
+ post_data['list[type]'] = self.list_type
73
+ end
74
+ # Optional attributes
75
+ [ :transcript, :embed, :tags, :media_entry,
76
+ :author, :author_url, :attribution_license_id ].each do |key|
77
+ if self.send("#{key}")
78
+ post_data["list[#{key}]"] = self.send("#{key}")
79
+ end
80
+ end
81
+ post_data
82
+ end
83
+
84
+ end
@@ -0,0 +1,24 @@
1
+ class Iknow::Sentence < Iknow::Base
2
+ ATTRIBUTES = [:sound, :image, :text]
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.matching(keyword, params = {})
13
+ params[:keyword] = keyword
14
+ response = Iknow::RestClient::Sentence.matching(params)
15
+ self.deserialize(response)
16
+ end
17
+
18
+ def initialize(params = {})
19
+ @sound = params['sound']
20
+ @image = params['image']
21
+ @text = params['text']
22
+ end
23
+
24
+ end
@@ -0,0 +1,84 @@
1
+ class Iknow::User < Iknow::Base
2
+ ATTRIBUTES = [:username, :profile]
3
+ attr_reader *ATTRIBUTES
4
+
5
+ class Profile < Iknow::User
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 StudyResult < Iknow::User
22
+ ATTRIBUTES = [:timestamp, :seconds, :totals, :seen, :completed, :date]
23
+ attr_reader *ATTRIBUTES
24
+
25
+ def initialize(params = {})
26
+ @timestamp = (params['timestamp'].to_i rescue nil)
27
+ @seconds = (params['seconds'].to_i rescue nil)
28
+ @totals = {
29
+ :seconds => (params['totals']['seconds'].to_i rescue nil),
30
+ :seen => (params['totals']['seen'].to_i rescue nil),
31
+ :completed => (params['totals']['completed'].to_i rescue nil)
32
+ }
33
+ @seen = (params['seen'].to_i rescue nil)
34
+ @completed = (params['completed'].to_i rescue nil)
35
+ @date = (Date.parse(params['date']) rescue nil)
36
+ end
37
+ end
38
+
39
+ def self.find(username)
40
+ response = Iknow::RestClient::User.find(:username => username)
41
+ self.deserialize(response)
42
+ end
43
+
44
+ def self.matching(keyword, params = {})
45
+ params[:keyword] = keyword
46
+ response = Iknow::RestClient::User.matching(params)
47
+ self.deserialize(response)
48
+ end
49
+
50
+ def initialize(params)
51
+ @profile = Profile.new(params['profile'])
52
+ @username = params['username']
53
+ end
54
+
55
+ def items(params = {})
56
+ return @items if @items
57
+
58
+ response = Iknow::RestClient::User.items(params.merge(:username => self.username))
59
+ self.deserialize(response, :as => Iknow::Item)
60
+ end
61
+
62
+ def lists(params = {})
63
+ return @lists if @lists
64
+
65
+ response = Iknow::RestClient::User.lists(params.merge(:username => self.username))
66
+ self.deserialize(response, :as => Iknow::List)
67
+ end
68
+
69
+ def friends(params = {})
70
+ return @friends if @friends
71
+
72
+ response = Iknow::RestClient::User.friends(params.merge(:username => self.username))
73
+ self.deserialize(response)
74
+ end
75
+
76
+ def study_results(params = {})
77
+ return @study_results if @study_results
78
+
79
+ params[:application] ||= :iknow
80
+ response = Iknow::RestClient::User.study_results(params.merge(:username => self.username))
81
+ self.deserialize(response, :as => Iknow::User::StudyResult)
82
+ end
83
+
84
+ 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,128 @@
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
+ class ResourceError < RESTError ; end
17
+ class ResourceNotFound < ResourceError ; end
18
+ class ResourceAccessDenied < ResourceError ; end
19
+
20
+ def self.valid_action?(action) ; self::ACTIONS.keys.include? action.to_sym end
21
+ def self.path(action) ; self::ACTIONS[action.to_sym][:path] end
22
+ def self.http_method(action) ; self::ACTIONS[action.to_sym][:http_method] || :get end
23
+
24
+ def self.method_missing(action, *args)
25
+ # GET methods are handled here
26
+ # POST and DELETE methods should be implemented in each class
27
+ super unless self.valid_action?(action)
28
+ uri, params = replace_uri_params(self.path(action), args[0])
29
+ http_connect do |conn|
30
+ case self.http_method(action)
31
+ when :get
32
+ http_get_request(uri, params)
33
+ when :post
34
+ http_post_request(uri, params)
35
+ when :delete
36
+ http_delete_request(uri, params)
37
+ end
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ def self.config; Iknow::Config.instance end
44
+
45
+ def self.api_key_required
46
+ raise ArgumentError.new("iKnow! API key is required") if self.config.api_key == ''
47
+ end
48
+
49
+ def self.http_connect
50
+ connection = Net::HTTP.new(self.config.host, self.config.port)
51
+ connection.start do |conn|
52
+ request = yield connection
53
+ response = conn.request(request)
54
+ handle_rest_response(response)
55
+ json_response = JSON.parse(response.body)
56
+ handle_json_response(json_response)
57
+ json_response
58
+ end
59
+ end
60
+
61
+ def self.raise_json_error(code, message, uri = nil)
62
+ case code
63
+ when 403
64
+ raise ResourceAccessDenied.new(:code => code, :message => message, :uri => uri)
65
+ when 404
66
+ raise ResourceNotFound.new(:code => code, :message => message, :uri => uri)
67
+ else
68
+ raise ResourceError.new(:code => code, :message => message, :uri => uri)
69
+ end
70
+ end
71
+
72
+ def self.raise_rest_error(response, uri = nil)
73
+ raise RESTError.new(:code => response.code, :message => response.message, :uri => uri)
74
+ end
75
+
76
+ def self.handle_json_response(json_response, uri = nil)
77
+ jsoon_error = json_response.is_a?(Hash) ? json_response['error'] : nil
78
+ raise_json_error(jsoon_error['code'], jsoon_error['message'], uri) unless jsoon_error.nil?
79
+ end
80
+
81
+ def self.handle_rest_response(response, uri = nil)
82
+ raise_rest_error(response, uri) unless response.is_a?(Net::HTTPSuccess)
83
+ end
84
+
85
+ def self.http_header
86
+ @@http_header ||= {
87
+ 'User-Agent' => "iKnow! API v#{Iknow::Version.to_version} [#{self.config.user_agent}]",
88
+ 'Accept' => 'text/x-json',
89
+ 'X-iKnow-Client' => self.config.application_name,
90
+ 'X-iKnow-Client-Version' => self.config.application_version,
91
+ 'X-iKnow-Client-URL' => self.config.application_url,
92
+ }
93
+ @@http_header
94
+ end
95
+
96
+ def self.replace_uri_params(uri, params = {})
97
+ unless params.empty?
98
+ params.each do |key, value|
99
+ if uri=~/__#{key}__/
100
+ uri.sub!(/__#{key}__/, value.to_s)
101
+ params.delete(key)
102
+ end
103
+ end
104
+ end
105
+ return uri, params
106
+ end
107
+
108
+ def self.http_get_request(uri, params = {})
109
+ path = (params.size > 0) ? "#{uri}?#{params.to_http_str}" : uri
110
+ Net::HTTP::Get.new(path, http_header)
111
+ end
112
+
113
+ def self.http_post_request(uri, params = {})
114
+ self.api_key_required
115
+ request = Net::HTTP::Post.new(uri, http_header)
116
+ request.body = params.merge(:api_key => self.config.api_key).to_http_str
117
+ request
118
+ end
119
+
120
+ def self.http_delete_request(uri, params = {})
121
+ path = (params.size > 0) ? "#{uri}?#{params.to_http_str}" : uri
122
+ Net::HTTP::Delete.new(path, http_header)
123
+ end
124
+
125
+ private_class_method :http_connect, :raise_rest_error, :handle_rest_response, :http_header,
126
+ :replace_uri_params, :http_get_request, :http_post_request, :http_delete_request
127
+
128
+ end
@@ -0,0 +1,11 @@
1
+ class Iknow::RestClient::Item < Iknow::RestClient::Base
2
+
3
+ ACTIONS = {
4
+ :recent => { :path => '/items' },
5
+ :matching => { :path => '/items/matching/__keyword__' },
6
+ :add_image => { :path => '/items/__id__/images', :http_method => :post },
7
+ :add_sound => { :path => '/items/__id__/sounds', :http_method => :post },
8
+ :extract => { :path => '/items/extract', :http_method => :post }
9
+ }
10
+
11
+ end
@@ -0,0 +1,12 @@
1
+ class Iknow::RestClient::List < Iknow::RestClient::Base
2
+
3
+ ACTIONS = {
4
+ :recent => { :path => '/lists' },
5
+ :items => { :path => '/lists/__id__/items' },
6
+ :sentences => { :path => '/lists/__id__/sentences' },
7
+ :matching => { :path => '/lists/matching/__keyword__' },
8
+ :create => { :path => '/lists', :http_method => :post },
9
+ :delete => { :path => '/lists/__id__', :http_method => :delete }
10
+ }
11
+
12
+ end
@@ -0,0 +1,11 @@
1
+ class Iknow::RestClient::Sentence < Iknow::RestClient::Base
2
+
3
+ ACTIONS = {
4
+ :recent => { :path => '/sentences' },
5
+ :matching => { :path => '/sentences/matching/__keyword__' },
6
+ :create => { :path => '/sentences', :http_method => :post },
7
+ :add_image => { :path => '/sentences/__id__/images', :http_method => :post },
8
+ :add_sound => { :path => '/sentences/__id__/sounds', :http_method => :post }
9
+ }
10
+
11
+ 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,100 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nov-iknow
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - nov
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-10-16 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: json
17
+ version_requirement:
18
+ version_requirements: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: "0"
23
+ version:
24
+ description: A rubygem for iKnow! APIs
25
+ email: developer@iknow.co.jp
26
+ executables: []
27
+
28
+ extensions: []
29
+
30
+ extra_rdoc_files:
31
+ - README
32
+ - ChangeLog
33
+ files:
34
+ - README
35
+ - ChangeLog
36
+ - Rakefile
37
+ - test/iknow_test.rb
38
+ - test/test_helper.rb
39
+ - lib/ext
40
+ - lib/ext/hash.rb
41
+ - lib/iknow
42
+ - lib/iknow/core
43
+ - lib/iknow/core/config.rb
44
+ - lib/iknow/core/version.rb
45
+ - lib/iknow/core.rb
46
+ - lib/iknow/model
47
+ - lib/iknow/model/base.rb
48
+ - lib/iknow/model/item.rb
49
+ - lib/iknow/model/list.rb
50
+ - lib/iknow/model/sentence.rb
51
+ - lib/iknow/model/user.rb
52
+ - lib/iknow/model.rb
53
+ - lib/iknow/rest_client
54
+ - lib/iknow/rest_client/base.rb
55
+ - lib/iknow/rest_client/item.rb
56
+ - lib/iknow/rest_client/list.rb
57
+ - lib/iknow/rest_client/sentence.rb
58
+ - lib/iknow/rest_client/user.rb
59
+ - lib/iknow/rest_client.rb
60
+ - lib/iknow.rb
61
+ - examples/pure_ruby.rb
62
+ has_rdoc: true
63
+ homepage: http://iknow.rubyforge.org
64
+ post_install_message:
65
+ rdoc_options:
66
+ - --title
67
+ - iknow documentation
68
+ - --charset
69
+ - utf-8
70
+ - --opname
71
+ - index.html
72
+ - --line-numbers
73
+ - --main
74
+ - README
75
+ - --inline-source
76
+ - --exclude
77
+ - ^(examples|extras)/
78
+ require_paths:
79
+ - lib
80
+ required_ruby_version: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: "0"
85
+ version:
86
+ required_rubygems_version: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: "0"
91
+ version:
92
+ requirements: []
93
+
94
+ rubyforge_project: iknow
95
+ rubygems_version: 1.2.0
96
+ signing_key:
97
+ specification_version: 2
98
+ summary: A rubygem for iKnow! APIs
99
+ test_files:
100
+ - test/iknow_test.rb