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,23 @@
1
+ # This file is auto-generated from the current state of the database. Instead of editing this file,
2
+ # please use the migrations feature of Active Record to incrementally modify your database, and
3
+ # then regenerate this schema definition.
4
+ #
5
+ # Note that this schema.rb definition is the authoritative source for your database schema. If you need
6
+ # to create the application database on another system, you should be using db:schema:load, not running
7
+ # all the migrations from scratch. The latter is a flawed and unsustainable approach (the more migrations
8
+ # you'll amass, the slower it'll run and the greater likelihood for issues).
9
+ #
10
+ # It's strongly recommended to check this file into your version control system.
11
+
12
+ ActiveRecord::Schema.define(:version => 20081016145649) do
13
+
14
+ create_table "iknow_oauth_tokens", :force => true do |t|
15
+ t.string "iknow_username", :null => false
16
+ t.string "token"
17
+ t.string "secret"
18
+ end
19
+
20
+ add_index "iknow_oauth_tokens", ["iknow_username"], :name => "index_iknow_oauth_tokens_on_iknow_username"
21
+ add_index "iknow_oauth_tokens", ["token"], :name => "index_iknow_oauth_tokens_on_token", :unique => true
22
+
23
+ end
@@ -0,0 +1,26 @@
1
+ module IknowOauthSystem
2
+
3
+ protected
4
+
5
+ def require_iknow_oauth
6
+ unless iknow_username_exists?
7
+ redirect_to(:controller => 'iknow_oauth', :action => 'index')
8
+ return false
9
+ end
10
+
11
+ iknow_oauth_token = IknowOauthToken.find_by_username(session[:iknow_username])
12
+ unless iknow_oauth_token
13
+ redirect_to(:controller => 'iknow_oauth', :action => 'new_request')
14
+ return false
15
+ end
16
+
17
+ true
18
+ end
19
+
20
+ private
21
+
22
+ def iknow_username_exists?
23
+ !session[:iknow_username].blank?
24
+ end
25
+
26
+ end
@@ -0,0 +1,10 @@
1
+ #!/usr/local/ruby//bin/ruby
2
+
3
+ require File.dirname(__FILE__) + "/../config/environment" unless defined?(RAILS_ROOT)
4
+
5
+ # If you're using RubyGems and mod_ruby, this require should be changed to an absolute path one, like:
6
+ # "/usr/local/lib/ruby/gems/1.8/gems/rails-0.8.0/lib/dispatcher" -- otherwise performance is severely impaired
7
+ require "dispatcher"
8
+
9
+ ADDITIONAL_LOAD_PATHS.reverse.each { |dir| $:.unshift(dir) if File.directory?(dir) } if defined?(Apache::RubyRun)
10
+ Dispatcher.dispatch
@@ -0,0 +1,7 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class IknowOauthControllerTest < ActionController::TestCase
4
+ def test_true
5
+ true
6
+ end
7
+ end
@@ -0,0 +1,8 @@
1
+ require 'test_helper'
2
+
3
+ class UsersControllerTest < ActionController::TestCase
4
+ # Replace this with your real tests.
5
+ def test_truth
6
+ assert true
7
+ end
8
+ end
@@ -0,0 +1,38 @@
1
+ ENV["RAILS_ENV"] = "test"
2
+ require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
3
+ require 'test_help'
4
+
5
+ class Test::Unit::TestCase
6
+ # Transactional fixtures accelerate your tests by wrapping each test method
7
+ # in a transaction that's rolled back on completion. This ensures that the
8
+ # test database remains unchanged so your fixtures don't have to be reloaded
9
+ # between every test method. Fewer database queries means faster tests.
10
+ #
11
+ # Read Mike Clark's excellent walkthrough at
12
+ # http://clarkware.com/cgi/blosxom/2005/10/24#Rails10FastTesting
13
+ #
14
+ # Every Active Record database supports transactions except MyISAM tables
15
+ # in MySQL. Turn off transactional fixtures in this case; however, if you
16
+ # don't care one way or the other, switching from MyISAM to InnoDB tables
17
+ # is recommended.
18
+ #
19
+ # The only drawback to using transactional fixtures is when you actually
20
+ # need to test transactions. Since your test is bracketed by a transaction,
21
+ # any transactions started in your code will be automatically rolled back.
22
+ self.use_transactional_fixtures = true
23
+
24
+ # Instantiated fixtures are slow, but give you @david where otherwise you
25
+ # would need people(:david). If you don't want to migrate your existing
26
+ # test cases which use the @david style and don't mind the speed hit (each
27
+ # instantiated fixtures translates to a database query per test method),
28
+ # then set this back to true.
29
+ self.use_instantiated_fixtures = false
30
+
31
+ # Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order.
32
+ #
33
+ # Note: You'll currently still have to declare fixtures explicitly in integration tests
34
+ # -- they do not yet inherit this setting
35
+ fixtures :all
36
+
37
+ # Add more helper methods to be used by all tests here...
38
+ end
@@ -0,0 +1,7 @@
1
+ require 'test/unit'
2
+
3
+ class IkonwOauthTokenTest < Test::Unit::TestCase
4
+ def test_true
5
+ true
6
+ end
7
+ end
@@ -0,0 +1,54 @@
1
+ require 'rubygems'
2
+ require 'iknow'
3
+
4
+ Iknow::Config.init do |conf|
5
+ conf.api_key = 'SET_YOUR_API_KEY'
6
+ conf.oauth_consumer_key = 'SET_YOUR_OAUTH_CONSUMER_KEY'
7
+ conf.oauth_consumer_secret = 'SET_YOUR_OAUTH_CONSUMER_SECRET'
8
+ end
9
+
10
+ please_get_api_key =<<EOS
11
+ This example needs your own iKnow! API key.
12
+ (for only Iknow::Item.extract example)
13
+
14
+ You can get iKnow! API key at iKnow! Developers.
15
+ iKnow! Developers (http://developer.iknow.co.jp/)
16
+
17
+ Thanks!
18
+ EOS
19
+
20
+ if Iknow::Config.api_key == ''# or
21
+ # Iknow::Config.oauth_consumer_key == '' or
22
+ # Iknow::Config.oauth_consumer_secret == ''
23
+ raise ArgumentError.new(please_get_api_key)
24
+ end
25
+
26
+ # ## User API
27
+ # @user = Iknow::User.find('kirk')
28
+ # @user.items(:include_sentences => true)
29
+ # @user.lists
30
+ # @user.friends
31
+ # @user.study.results
32
+ # @user.study.total_results
33
+ # @matched_users = Iknow::User.matching('matake')
34
+ #
35
+ # ## List API
36
+ # @recent_lists = Iknow::List.recent
37
+ # @list = Iknow::List.find(31509, :include_sentences => true, :include_items => true)
38
+ # @list.items
39
+ # @list.sentences
40
+ # @matched_lists = Iknow::List.matching("イタリア語であいさつ")
41
+ #
42
+ puts Iknow::List.find(31509, :include_sentences => true, :include_items => true).inspect
43
+ #
44
+ # ## Item API
45
+ # @recent_items = Iknow::Item.recent(:include_sentences => true)
46
+ # @item = Iknow::Item.find(437525)
47
+ # @matched_items = Iknow::Item.matching('record', :include_sentences => true)
48
+ # @items = Iknow::Item.extract("sometimes, often, electrical")
49
+ # @items.first.sentences
50
+ #
51
+ # ## Sentence API
52
+ # @recent_sentences = Iknow::Sentence.recent
53
+ # @sentence = Iknow::Sentence.find(312271)
54
+ # @matched_sentences = Iknow::Sentence.matching('record')
@@ -0,0 +1,12 @@
1
+ NAME
2
+ iknow_oauth - creates a functional iknow oauth consumer
3
+
4
+ SYNOPSIS
5
+ nothing
6
+
7
+ Description:
8
+ Generates a model, controller, helper, view and library for making a OAuth consumer of iKnow! API.
9
+ No arguments are needed.
10
+
11
+ Example:
12
+ ./script/generate iknow_oauth
@@ -0,0 +1,22 @@
1
+ require 'rails_generator/base'
2
+
3
+ class IknowOauthGenerator < Rails::Generator::Base
4
+ def manifest
5
+ record do |m|
6
+ m.class_collisions 'IknowOauthController', 'IknowOauthControllerTest', 'IknowOauthHelper',
7
+ 'IknowOauthSystem', 'IknowOauthToken', 'IknowOauthTokenTest'
8
+
9
+ m.migration_template 'iknow_oauth_tokens_migration.rb', 'db/migrate', :migration_file_name => 'create_iknow_oauth_tokens'
10
+
11
+ m.template 'iknow_oauth_controller.rb', File.join('app/controllers', 'iknow_oauth_controller.rb' )
12
+ m.template 'iknow_oauth_controller_test.rb', File.join('test/functional', 'iknow_oauth_controller_test.rb')
13
+ m.template 'iknow_oauth_helper.rb', File.join('app/helpers', 'iknow_oauth_helper.rb' )
14
+ m.template 'iknow_oauth_system.rb', File.join('lib', 'iknow_oauth_system.rb' )
15
+ m.template 'iknow_oauth_token.rb', File.join('app/models', 'iknow_oauth_token.rb' )
16
+ m.template 'iknow_oauth_token_test.rb', File.join('test/unit', 'iknow_oauth_token_test.rb' )
17
+
18
+ m.directory File.join('app/views', 'iknow_oauth')
19
+ m.template 'index.rhtml', File.join('app/views', 'iknow_oauth', 'index.rhtml')
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,24 @@
1
+ class IknowOauthController < ApplicationController
2
+
3
+ def index; end
4
+
5
+ def new_request
6
+ request_token = IknowOauthToken.new_request_token
7
+
8
+ session[:iknow_username] = params[:iknow_username]
9
+ session[:request_token] = request_token
10
+ session[:redirect_url_after_auth] = params[:redirect_url_after_auth] || request.referer
11
+
12
+ if request_token
13
+ redirect_to(request_token.authorize_url)
14
+ else
15
+ raise RuntimeError.new("Failed to get a iKnow! Request Token")
16
+ end
17
+ end
18
+
19
+ def callback
20
+ AuthToken.establish_auth_token(session[:iknow_username], session[:request_token])
21
+ redirect_to(session[:redirect_url_after_auth])
22
+ end
23
+
24
+ end
@@ -0,0 +1,7 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class IknowOauthControllerTest < ActionController::TestCase
4
+ def test_true
5
+ true
6
+ end
7
+ end
@@ -0,0 +1,3 @@
1
+ module IknowOauthHelper
2
+ # add any methods if you want
3
+ end
@@ -0,0 +1,26 @@
1
+ module IknowOauthSystem
2
+
3
+ protected
4
+
5
+ def require_iknow_oauth
6
+ unless iknow_username_exists?
7
+ redirect_to(:controller => 'iknow_oauth', :action => 'index')
8
+ return false
9
+ end
10
+
11
+ iknow_oauth_token = IknowOauthToken.find_by_username(session[:iknow_username])
12
+ unless iknow_oauth_token
13
+ redirect_to(:controller => 'iknow_oauth', :action => 'new_request')
14
+ return false
15
+ end
16
+
17
+ true
18
+ end
19
+
20
+ private
21
+
22
+ def iknow_username_exists?
23
+ !session[:iknow_username].blank?
24
+ end
25
+
26
+ end
@@ -0,0 +1,37 @@
1
+ require 'oauth/consumer'
2
+
3
+ class IknowOauthToken < ActiveRecord::Base
4
+
5
+ def self.consumer
6
+ @@consumer ||= OAuth::Consumer.new(
7
+ Iknow::Config.oauth_consumer_key,
8
+ Iknow::Config.oauth_consumer_secret,
9
+ :site => Iknow::Config.iknow_api_base_url,
10
+ :authorize_url => "#{Iknow::Config.iknow_base_url}/oauth/authorize"
11
+ )
12
+ end
13
+
14
+ def self.new_request_token
15
+ begin
16
+ self.consumer.get_request_token
17
+ rescue Exception => e
18
+ nil
19
+ end
20
+ end
21
+
22
+ def self.establish_auth_token(iknow_username, request_token)
23
+ access_token = request_token.get_access_token
24
+
25
+ auth_token = IknowAuthToken.new
26
+ auth_token.username = iknow_username
27
+ auth_token.token = access_token.token
28
+ auth_token.secret = access_token.secret
29
+ auth_token.save!
30
+ end
31
+
32
+ def to_access_token
33
+ OAuth::AccessToken.new(self.class.consumer, self.token, self.secret)
34
+ end
35
+
36
+ end
37
+
@@ -0,0 +1,7 @@
1
+ require 'test/unit'
2
+
3
+ class IkonwOauthTokenTest < Test::Unit::TestCase
4
+ def test_true
5
+ true
6
+ end
7
+ end
@@ -0,0 +1,15 @@
1
+ class CreateIknowOauthTokens < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :iknow_oauth_tokens do |t|
4
+ t.column :iknow_username, :string, :null => false
5
+ t.column :token, :string, :unique => true
6
+ t.column :secret, :string
7
+ end
8
+ add_index :iknow_oauth_tokens, :token, :unique => true
9
+ add_index :iknow_oauth_tokens, :iknow_username
10
+ end
11
+
12
+ def self.down
13
+ drop_table :iknow_oauth_tokens
14
+ end
15
+ end
@@ -0,0 +1,4 @@
1
+ <%% form_tag(:controller => 'iknow_oauth', :action => 'new_request') do %>
2
+ <label for="iknow_username">iKnow! Username</label>
3
+ <%%= text_field_tag "iknow_username" %>
4
+ <%% end %>
data/lib/ext/hash.rb ADDED
@@ -0,0 +1,23 @@
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
+ def symbolize_keys!
11
+ self.each do |key, value|
12
+ unless self.delete(key.to_s).nil?
13
+ if value.is_a?(Hash)
14
+ value.symbolize_keys!
15
+ elsif value.is_a?(Array)
16
+ value.map!{ |v| v.symbolize_keys! if v.is_a?(Hash) }
17
+ end
18
+ self[key.to_sym] = value
19
+ end
20
+ end
21
+ self
22
+ end
23
+ end
@@ -0,0 +1,44 @@
1
+ require 'singleton'
2
+
3
+ class Iknow::Config
4
+ include Singleton
5
+ attr_accessor :protocol, :host, :port, :api_protocol, :api_host, :api_port,
6
+ :api_key, :oauth_consumer_key, :oauth_consumer_secret,
7
+ :user_agent, :application_name, :application_version, :application_url, :source
8
+
9
+ def self.init(&block)
10
+ conf = Iknow::Config.instance
11
+ { :protocol => 'http',
12
+ :host => 'www.iknow.co.jp',
13
+ :port => 80,
14
+ :api_protocol => 'http',
15
+ :api_host => 'api.iknow.co.jp',
16
+ :api_port => 80,
17
+ :api_key => '',
18
+ :oauth_consumer_key => '',
19
+ :oauth_consumer_secret => '',
20
+ :user_agent => 'default',
21
+ :application_name => 'A rubygem for iKnow! API',
22
+ :application_version => Iknow::Version.to_version,
23
+ :application_url => 'http://github.com/nov/iknow_oauth_generator',
24
+ :source => 'iknow'
25
+ }.each do |key, value| conf.send("#{key}=", value) end
26
+ yield conf if block_given?
27
+ conf
28
+ end
29
+
30
+ def iknow_base_url
31
+ port = self.port==80 ? nil : ":#{self.port}"
32
+ "#{self.protocol}://#{self.host}#{port}"
33
+ end
34
+
35
+ def iknow_api_base_url
36
+ port = self.api_port==80 ? nil : ":#{self.api_port}"
37
+ "#{self.api_protocol}://#{self.api_host}#{port}"
38
+ end
39
+
40
+ def self.method_missing(method, *args)
41
+ self.instance.send(method, *args)
42
+ end
43
+
44
+ end
@@ -0,0 +1,14 @@
1
+ module Iknow::Version
2
+ MAJOR = 0
3
+ MINOR = 0
4
+ REVISION = 4
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,29 @@
1
+ class Iknow::Base
2
+
3
+ def self.attributes; self::ATTRIBUTES end
4
+
5
+ def attributes; self.class.attributes end
6
+
7
+ def self.deserialize(response, params = {})
8
+ return nil if response.nil? or
9
+ (response.is_a?(Hash) and
10
+ !response['error'].nil? and
11
+ response['error']['code'].to_i == 404)
12
+
13
+ klass = params[:as] ? params[:as] : self
14
+ if response.is_a?(Array)
15
+ response.inject([]) { |results, hash|
16
+ hash.symbolize_keys!
17
+ results << klass.new(hash)
18
+ }
19
+ else
20
+ response.symbolize_keys!
21
+ klass.new(response)
22
+ end
23
+ end
24
+
25
+ def deserialize(response, params = {})
26
+ self.class.deserialize(response, params)
27
+ end
28
+
29
+ end
@@ -0,0 +1,60 @@
1
+ class Iknow::Item < Iknow::Base
2
+ ATTRIBUTES = [:sentences, :response, :cue, :id]
3
+ attr_reader *ATTRIBUTES
4
+
5
+ class Response
6
+ ATTRIBUTES = [:text, :type, :language]
7
+ attr_reader *ATTRIBUTES
8
+
9
+ def initialize(params = {})
10
+ @text = params[:text]
11
+ @type = params[:type]
12
+ @language = params[:language]
13
+ end
14
+ end
15
+
16
+ class Cue
17
+ ATTRIBUTES = [:text, :sound, :part_of_speech, :language]
18
+ NOT_WRITABLE_ATTRIBUTES = [:text]
19
+ attr_accessor *(ATTRIBUTES - NOT_WRITABLE_ATTRIBUTES)
20
+ attr_reader *NOT_WRITABLE_ATTRIBUTES
21
+
22
+ def initialize(params = {})
23
+ @text = params[:text]
24
+ @sound = params[:sound]
25
+ @part_of_speech = params[:part_of_speech]
26
+ @language = params[:language]
27
+ end
28
+ end
29
+
30
+ def self.recent(params = {})
31
+ response = Iknow::RestClient::Item.recent(params)
32
+ self.deserialize(response) || []
33
+ end
34
+
35
+ def self.find(item_id, params = {})
36
+ params[:id] = item_id
37
+ response = Iknow::RestClient::Item.find(params)
38
+ self.deserialize(response)
39
+ end
40
+
41
+ def self.matching(keyword, params = {})
42
+ params[:keyword] = keyword
43
+ response = Iknow::RestClient::Item.matching(params)
44
+ self.deserialize(response) || []
45
+ end
46
+
47
+ def self.extract(text, params = {})
48
+ params[:text] = text
49
+ response = Iknow::RestClient::Item.extract(params)
50
+ self.deserialize(response) || []
51
+ end
52
+
53
+ def initialize(params = {})
54
+ @id = params[:id].to_i
55
+ @cue = self.deserialize(params[:cue], :as => Iknow::Item::Cue)
56
+ @responses = self.deserialize(params[:responses], :as => Iknow::Item::Response)
57
+ @sentences = self.deserialize(params[:sentences], :as => Iknow::Sentence)
58
+ end
59
+
60
+ end
@@ -0,0 +1,133 @@
1
+ # "iknow": true,
2
+ # "description": "hogehoge",
3
+ # "translation_language": "ja",
4
+ # "dictation": true,
5
+ # "icon": "http://www.iknow.co.jp/assets/courses/m4.jpg",
6
+ # "brainspeed": true,
7
+ # "language": "en",
8
+ # "item_count": 117,
9
+ # "author_id": "Cerego",
10
+ # "user_count": 45056,
11
+ # "author": "Team iKnow!",
12
+ # "title": "\u65c5\u306b\u51fa\u3088\u3046\uff01\uff08\u51fa\u56fd\uff06\u8857\u3092\u6b69\u304f\uff09",
13
+ # "id": 708,
14
+ # "author_url": "http://www.iknow.co.jp/user/Cerego"
15
+
16
+ class Iknow::List < Iknow::Base
17
+ ATTRIBUTES = [:list_id, :title, :description, :icon, :item_count, :user_count, :iknow, :dictation, :brainspeed,
18
+ :language, :translation_language, :list_type, :transcript, :embed,
19
+ :tags, :media_entry, :author, :author_id, :author_url, :attribution_license_id,
20
+ :items, :sentences]
21
+ NOT_WRITABLE_ATTRIBUTES = [:list_id, :icon, :item_count, :user_count, :iknow, :dictation, :brainspeed]
22
+ attr_accessor *(ATTRIBUTES - NOT_WRITABLE_ATTRIBUTES)
23
+ attr_reader *NOT_WRITABLE_ATTRIBUTES
24
+
25
+ class Application
26
+ attr_reader :application, :list_id, :lang
27
+ def initialize(params = {})
28
+ @application = params[:application]
29
+ @list_id = params[:list_id]
30
+ @lang = params[:lang]
31
+ end
32
+ def url
33
+ "http://www.iknow.co.jp/flash?swf=#{self.name}&course_id=#{self.list_id}&lang=#{self.lang}"
34
+ end
35
+ end
36
+
37
+ def self.recent(params = {})
38
+ response = Iknow::RestClient::List.recent(params)
39
+ self.deserialize(response) || []
40
+ end
41
+
42
+ def self.find(list_id, params = {})
43
+ params[:id] = list_id
44
+ response = Iknow::RestClient::List.find(params)
45
+ self.deserialize(response)
46
+ end
47
+
48
+ def self.matching(keyword, params = {})
49
+ params[:keyword] = keyword
50
+ response = Iknow::RestClient::List.matching(params)
51
+ self.deserialize(response) || []
52
+ end
53
+
54
+ def self.create(params = {})
55
+ new_list = self.new(params)
56
+ new_list.save!
57
+ end
58
+
59
+ def initialize(params = {})
60
+ @list_id = (params[:id].to_i rescue nil)
61
+ @title = params[:title]
62
+ @description = params[:description]
63
+ @icon = params[:icon]
64
+ @item_count = (params[:item_count].to_i rescue nil)
65
+ @user_count = (params[:user_count].to_i rescue nil)
66
+ @language = params[:language]
67
+ @translation_language = params[:translation_language]
68
+ if @list_id and @translation_language
69
+ common_settings = {:list_id => @list_id, :lang => @translation_language}
70
+ @iknow = Application.new(common_settings.merge(:application => 'iknow')) if params[:iknow]
71
+ @dictation = Application.new(common_settings.merge(:application => 'dictation')) if params[:dictation]
72
+ @brainspeed = Application.new(common_settings.merge(:application => 'brainspeed')) if params[:brainspeed]
73
+ end
74
+ @author = params[:author] # display_name or username
75
+ @author_id = params[:author_id] # username
76
+ @author_url = params[:author_url]
77
+ @list_type = params[:list_type] # for list creation
78
+ @transcript = params[:transcript] # for list creation
79
+ @embed = params[:embed] # for list creation
80
+ @tags = params[:tags] # for list creation
81
+ @media_entry = params[:media_entry] # for list creation
82
+ @attribution_license_id = params[:attribution_license_id] # for list creation
83
+ @items = self.deserialize(params[:items], :as => Iknow::Item)
84
+ @sentences = self.deserialize(params[:sentences], :as => Iknow::Sentence)
85
+ end
86
+
87
+ def items(params = {})
88
+ response = Iknow::RestClient::List.items(params.merge(:id => self.list_id))
89
+ self.deserialize(response, :as => Iknow::Item) || []
90
+ end
91
+
92
+ def sentences(params = {})
93
+ response = Iknow::RestClient::List.sentences(params.merge(:id => self.list_id))
94
+ self.deserialize(response, :as => Iknow::Sentence) || []
95
+ end
96
+
97
+ def save!
98
+ Iknow::RestClient::List.create(self.to_post_data)
99
+ end
100
+
101
+ def save
102
+ self.save!
103
+ true
104
+ rescue
105
+ false
106
+ end
107
+
108
+ protected
109
+
110
+ def to_post_data
111
+ raise ArgumentError.new("List title is needed.") if self.title.nil? or self.title.empty?
112
+
113
+ post_data = {
114
+ 'list[name]' => self.title,
115
+ 'list[description]' => self.description,
116
+ 'list[language]' => self.language || 'en',
117
+ 'list[translation_language]' => self.translation_language || 'ja'
118
+ }
119
+ # Object#type should not be used
120
+ if self.list_type
121
+ post_data['list[type]'] = self.list_type
122
+ end
123
+ # Optional attributes
124
+ [ :transcript, :embed, :tags, :media_entry,
125
+ :author, :author_url, :attribution_license_id ].each do |key|
126
+ if self.send("#{key}")
127
+ post_data["list[#{key}]"] = self.send("#{key}")
128
+ end
129
+ end
130
+ post_data
131
+ end
132
+
133
+ end