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