diff --git a/TODO b/TODO index d10c957..6c0c51f 100755 --- a/TODO +++ b/TODO @@ -1,4 +1,4 @@ -・ユーザー登録処理を実装する -・テストツールを検討する→RSpec +・ユーザー登録処理をBDDで実装する +・autoloadを書かなくても良いようにする ・ビューのLayout対応 ・開発中/運用中フラグの導入 diff --git a/lib/pinto.rb b/lib/pinto.rb index dcd18df..0907e98 100755 --- a/lib/pinto.rb +++ b/lib/pinto.rb @@ -31,7 +31,7 @@ module Pinto autoload :Config, 'pinto/config' autoload :Dispatcher, 'pinto/dispatcher' autoload :Language, 'pinto/language' - autoload :OpenID, 'pinto/openid' + autoload :OpenID, 'pinto/open_id' autoload :Request, 'pinto/request' autoload :Translate, 'pinto/translate' autoload :View, 'pinto/view' @@ -66,6 +66,23 @@ module Model autoload :User, 'pinto/model/user' end + module Type + autoload :ClaimedID, 'pinto/type/claimed_id' + autoload :ConfigKey, 'pinto/type/config_key' + autoload :ControllerName, 'pinto/type/controller_name' + autoload :EscapeChars, 'pinto/type/escape_chars' + autoload :ErrorMessage, 'pinto/type/error_message' + autoload :HttpStatusCode, 'pinto/type/http_status_code' + autoload :Language, 'pinto/type/language' + autoload :QueryStrings, 'pinto/type/query_strings' + autoload :URI, 'pinto/type/uri' + autoload :UriMap, 'pinto/type/uri_map' + autoload :UserName, 'pinto/type/user_name' + autoload :UserSuppliedID, 'pinto/type/user_supplied_id' + autoload :ViewName, 'pinto/type/view_name' + autoload :ViewParam, 'pinto/type/view_param' + end + module URI autoload :ExpandProcessor, 'pinto/uri/expand_processor' autoload :ExtractProcessor, 'pinto/uri/extract_processor' diff --git a/lib/pinto/config.rb b/lib/pinto/config.rb index ea57117..06f78de 100755 --- a/lib/pinto/config.rb +++ b/lib/pinto/config.rb @@ -2,10 +2,13 @@ module Pinto class Config - def self.load(key = nil) + def self.load(key) + unless key.is_a? Pinto::Type::ConfigKey + raise ArgumentError.new('key must be Pinto::Type::ConfigKey') + end + config = YAML.load_file('config/main.yml') - return config[key] unless key.nil? - return config + return config[key.to_s] end def self.db diff --git a/lib/pinto/controller/index.rb b/lib/pinto/controller/index.rb index 5de437e..b273e6c 100755 --- a/lib/pinto/controller/index.rb +++ b/lib/pinto/controller/index.rb @@ -6,18 +6,25 @@ class Index include Pinto::Controller::Private::Base def get_action(request) - request_lang = request.uri_map['lang'] + unless request.is_a? Pinto::Request + raise ArgumentError.new('request must be Pinto::Request') + end + + request_lang = request.get_uri_map.to_hash['lang'] if request_lang.empty? return Pinto::Controller::Private::Multiple.run(request) end - other_languages = Pinto::Language.get_other(request_lang) + base_lang = Pinto::Type::Language.new(request_lang) + other_languages = Pinto::Language.get_other(base_lang) param = { :lang => request_lang, :other_langs => other_languages } - response_body = Pinto::View.render('index', param) + view_name = Pinto::Type::ViewName.new('index') + view_param = Pinto::Type::ViewParam.new(param) + response_body = Pinto::View.render(view_name, view_param) platonic_uri = Pinto::Helper::URI.uri('index') diff --git a/lib/pinto/controller/private/base.rb b/lib/pinto/controller/private/base.rb index 864c854..f7b64f4 100755 --- a/lib/pinto/controller/private/base.rb +++ b/lib/pinto/controller/private/base.rb @@ -5,6 +5,10 @@ module Controller module Private module Base def run(request) + unless request.is_a? Pinto::Request + raise ArgumentError.new('request must be Pinto::Request') + end + if request.get? || request.head? method = 'get_action' elsif request.post? @@ -21,14 +25,22 @@ def run(request) return self.method(method).call(request) end - translator = Pinto::Translate.new(request.uri_map['lang']) + http_status_code = Pinto::Type::HttpStatusCode.new(405) + translator = Pinto::Translate.new(request.get_uri_map['lang']) message = translator._( 'Requested HTTP method is invalid for this resource' ) - return Pinto::Controller::Private::Error.run(request, 405, message) + message = Pinto::Type::ErrorMessage.new(message) + return Pinto::Controller::Private::Error.run( + request, http_status_code, message + ) end def options_action(request) + unless request.is_a? Pinto::Request + raise ArgumentError.new('request must be Pinto::Request') + end + allowed_methods = [] if self.methods.include? 'get_action' allowed_methods.push('GET') diff --git a/lib/pinto/controller/private/error.rb b/lib/pinto/controller/private/error.rb index 6fe0a2b..fda74dd 100755 --- a/lib/pinto/controller/private/error.rb +++ b/lib/pinto/controller/private/error.rb @@ -4,11 +4,21 @@ module Pinto module Controller module Private class Error - def self.run(request, code, message = '') + def self.run(request, code, message = Pinto::Type::ErrorMessage.new('')) + unless request.is_a? Pinto::Request + raise ArgumentError.new('request must be Pinto::Request') + end + unless code.is_a? Pinto::Type::HttpStatusCode + raise ArgumentError.new('code must be Pinto::Type::HttpStatusCode') + end + unless message.is_a? Pinto::Type::ErrorMessage + raise ArgumentError.new('message must be Pinto::Type::ErrorMessage') + end + return [ - code, + code.to_i, {'Content-Type' => 'text/plain'}, - [message] + [message.to_s] ] end end diff --git a/lib/pinto/controller/private/multiple.rb b/lib/pinto/controller/private/multiple.rb index 5cb0667..3ab2af4 100755 --- a/lib/pinto/controller/private/multiple.rb +++ b/lib/pinto/controller/private/multiple.rb @@ -5,17 +5,23 @@ module Controller module Private class Multiple def self.run(request) + unless request.is_a? Pinto::Request + raise ArgumentError.new('request must be Pinto::Request') + end + languages = Pinto::Language.list - uri_map = request.uri_map + uri_map = request.get_uri_map.to_hash uri_map.delete('lang') param = { - :controller => request.controller, + :controller => request.get_controller_name.to_s, :languages => languages, :uri_map => uri_map } - response_body = Pinto::View.render('multiple', param) + view_name = Pinto::Type::ViewName.new('multiple') + view_param = Pinto::Type::ViewParam.new(param) + response_body = Pinto::View.render(view_name, view_param) return [ 300, diff --git a/lib/pinto/controller/signup_account.rb b/lib/pinto/controller/signup_account.rb index 432c546..beb9f06 100755 --- a/lib/pinto/controller/signup_account.rb +++ b/lib/pinto/controller/signup_account.rb @@ -6,29 +6,53 @@ class SignupAccount include Pinto::Controller::Private::Base def get_action(request) - request_lang = request.uri_map['lang'] + unless request.is_a? Pinto::Request + raise ArgumentError.new('request must be Pinto::Request') + end + + request_lang = request.get_uri_map.to_hash['lang'] if request_lang.empty? - translator = Pinto::Translate.new(request_lang) + http_status_code = Pinto::Type::HttpStatusCode.new(400) + translator = Pinto::Translate.new( + Pinto::Type::Language.new(request_lang) + ) message = translator._('URI contains no valid language') - return Pinto::Controller::Private::Error.run(request, 400, message) + message = Pinto::Type::ErrorMessage.new(message) + return Pinto::Controller::Private::Error.run( + request, http_status_code, message + ) end - claimed_id = Pinto::OpenID.complete(request.GET, request.url) + query_strings = Pinto::Type::QueryStrings.new(request.GET) + current_uri = Pinto::Type::URI.new(request.url) + claimed_id = Pinto::OpenID.complete(query_strings, current_uri) if claimed_id.nil? - translator = Pinto::Translate.new(request_lang) + http_status_code = Pinto::Type::HttpStatusCode.new(400) + translator = Pinto::Translate.new( + Pinto::Type::Language.new(request_lang) + ) message = translator._('OpenID authentication failed') - return Pinto::Controller::Private::Error.run(request, 400, message) + message = Pinto::Type::ErrorMessage.new(message) + return Pinto::Controller::Private::Error.run( + request, http_status_code, message + ) end - Pinto::Model::SignupReservation.add(claimed_id) + Pinto::Model::SignupReservation.add( + Pinto::Type::ClaimedID.new(claimed_id) + ) - other_languages = Pinto::Language.get_other(request_lang) + base_lang = Pinto::Type::Language.new(request_lang) + other_languages = Pinto::Language.get_other(base_lang) param = { :lang => request_lang, - :claimed_id => claimed_id + :claimed_id => claimed_id, + :user_name => '' } - response_body = Pinto::View.render('signup_account', param) + view_name = Pinto::Type::ViewName.new('signup_account') + view_param = Pinto::Type::ViewParam.new(param) + response_body = Pinto::View.render(view_name, view_param) return [ 200, diff --git a/lib/pinto/controller/signup_auth.rb b/lib/pinto/controller/signup_auth.rb index 682cd00..0ccb9c5 100755 --- a/lib/pinto/controller/signup_auth.rb +++ b/lib/pinto/controller/signup_auth.rb @@ -6,23 +6,38 @@ class SignupAuth include Pinto::Controller::Private::Base def get_action(request) - request_lang = request.uri_map['lang'] + unless request.is_a? Pinto::Request + raise ArgumentError.new('request must be Pinto::Request') + end + + request_lang = request.get_uri_map.to_hash['lang'] openid = request.GET['openid'] - providers = Pinto::Config.load('openid_providers') + config_key = Pinto::Type::ConfigKey.new('openid_providers') + providers = Pinto::Config.load(config_key) unless providers.include? openid + http_status_code = Pinto::Type::HttpStatusCode.new(400) translator = Pinto::Translate.new(request_lang) message = translator._('Requested OpenID provider is not permitted') - return Pinto::Controller::Private::Error.run(request, 400, message) + message = Pinto::Type::ErrorMessage.new(message) + return Pinto::Controller::Private::Error.run( + request, http_status_code, message + ) end if request_lang.empty? + http_status_code = Pinto::Type::HttpStatusCode.new(400) translator = Pinto::Translate.new(request_lang) message = translator._('URI contains no valid language') - return Pinto::Controller::Private::Error.run(request, 400, message) + message = Pinto::Type::ErrorMessage.new(message) + return Pinto::Controller::Private::Error.run( + request, http_status_code, message + ) end - redirect_uri = Pinto::OpenID::begin(openid, request_lang) + user_supplied_id = Pinto::Type::UserSuppliedID.new(openid) + lang = Pinto::Type::Language.new(request_lang) + redirect_uri = Pinto::OpenID.begin(user_supplied_id, lang) return [ 303, diff --git a/lib/pinto/controller/signup_openid.rb b/lib/pinto/controller/signup_openid.rb index d67f4d1..346e6ac 100755 --- a/lib/pinto/controller/signup_openid.rb +++ b/lib/pinto/controller/signup_openid.rb @@ -6,13 +6,20 @@ class SignupOpenid include Pinto::Controller::Private::Base def get_action(request) - request_lang = request.uri_map['lang'] + unless request.is_a? Pinto::Request + raise ArgumentError.new('request must be Pinto::Request') + end + + request_lang = request.get_uri_map.to_hash['lang'] if request_lang.empty? return Pinto::Controller::Private::Multiple.run(request) end - other_languages = Pinto::Language.get_other(request_lang) - providers = Pinto::Config.load('openid_providers') + base_lang = Pinto::Type::Language.new(request_lang) + other_languages = Pinto::Language.get_other(base_lang) + + config_key = Pinto::Type::ConfigKey.new('openid_providers') + providers = Pinto::Config.load(config_key) param = { :lang => request_lang, @@ -20,7 +27,9 @@ def get_action(request) :providers => providers } - response_body = Pinto::View.render('signup_openid', param) + view_name = Pinto::Type::ViewName.new('signup_openid') + view_param = Pinto::Type::ViewParam.new(param) + response_body = Pinto::View.render(view_name, view_param) platonic_uri = Pinto::Helper::URI.uri('signup_openid') diff --git a/lib/pinto/controller/users.rb b/lib/pinto/controller/users.rb index e47f2d0..e3ff5a1 100755 --- a/lib/pinto/controller/users.rb +++ b/lib/pinto/controller/users.rb @@ -6,21 +6,30 @@ class Users include Pinto::Controller::Private::Base def post_action(request) - request_lang = request.uri_map['lang'] + unless request.is_a? Pinto::Request + raise ArgumentError.new('request must be Pinto::Request') + end + + request_lang = request.get_uri_map.to_hash['lang'] user_name = request.POST['user_name'] claimed_id = request.POST['claimed_id'] +=begin begin - Pinto::Model::User.add(user_name, claimed_id, request_lang) + Pinto::Model::User.add(user_name, claimed_id) rescue => e - other_languages = Pinto::Language.get_other(request_lang) + base_lang = Pinto::Type::Language.new(request_lang) + other_languages = Pinto::Language.get_other(base_lang) param = { :lang => request_lang, :user_name => user_name, :claimed_id => claimed_id, :error_message => e.message } - response_body = Pinto::View.render('signup_account', param) + + view_name = Pinto::Type::ViewName.new('signup_account') + view_param = Pinto::Type::ViewParam.new(param) + response_body = Pinto::View.render(view_name, view_param) return [ 400, @@ -28,6 +37,7 @@ def post_action(request) [response_body] ] end +=end param = { 'lang' => request_lang, diff --git a/lib/pinto/dispatcher.rb b/lib/pinto/dispatcher.rb index ac6e345..c488236 100755 --- a/lib/pinto/dispatcher.rb +++ b/lib/pinto/dispatcher.rb @@ -3,31 +3,45 @@ module Pinto class Dispatcher def call(env) + unless env.is_a? Hash + raise ArgumentError.new('env must be Hash') + end + request = Pinto::Request.new(env) uri = Addressable::URI.parse(request.url) - Pinto::Config.load('uri_templates').each do |controller, template| + config_key = Pinto::Type::ConfigKey.new('uri_templates') + Pinto::Config.load(config_key).each do |controller, template| uri_map = uri.extract_mapping(template, Pinto::URI::ExtractProcessor) unless uri_map.nil? - request.controller = controller - request.uri_map = uri_map + controller_name = Pinto::Type::ControllerName.new(controller) + request.set_controller_name(controller_name) + + uri_map = Pinto::Type::UriMap.new(uri_map) + request.set_uri_map(uri_map) break end end - if request.controller.nil? - return Pinto::Controller::Private::Error.run(request, 404) + if request.get_controller_name.to_s.empty? + http_status_code = Pinto::Type::HttpStatusCode.new(404) + return Pinto::Controller::Private::Error.run(request, http_status_code) end - path = Pathname.new("pinto/controller/#{request.controller}") + controller_name = request.get_controller_name.to_s + path = Pathname.new("pinto/controller/#{controller_name}") require path return path.get_class.new.run(request) + =begin rescue => exception - translator = Pinto::Translate.new(request.uri_map['lang']) - message = translator._('Server error occurred') - message = exception.message - return Pinto::Controller::Private::Error.run(request, 500, message) + http_status_code = Pinto::Type::HttpStatusCode.new(500) + translator = Pinto::Translate.new(request.get_uri_map['lang']) +# message = translator._('Server error occurred') + message = Pinto::Type::ErrorMessage.new(exception.message) + return Pinto::Controller::Private::Error.run( + request, http_status_code, message + ) =end end end diff --git a/lib/pinto/encoding/utf8.rb b/lib/pinto/encoding/utf8.rb index d531c60..082b595 100755 --- a/lib/pinto/encoding/utf8.rb +++ b/lib/pinto/encoding/utf8.rb @@ -4,6 +4,10 @@ module Pinto module Encoding class UTF8 def self.valid?(value) + unless value.is_a? String + raise ArgumentError.new('value must be String') + end + valid_utf8 = /^(?: [\x00-\x7F] # U+0000 - U+007F |[\xC2-\xDF][\x80-\xBF] # U+0080 - U+07FF @@ -15,7 +19,7 @@ def self.valid?(value) |[\xF1-\xF3][\x80-\xBF]{3} # U+40000 - U+FFFFF |\xF4[\x80-\x8F][\x80-\xBF]{2} # U+100000 - U+10FFFF )*$/x - return !value.to_s.match(valid_utf8).nil? + return !value.match(valid_utf8).nil? end end end diff --git a/lib/pinto/helper/html.rb b/lib/pinto/helper/html.rb index 2d15f18..4c35f39 100755 --- a/lib/pinto/helper/html.rb +++ b/lib/pinto/helper/html.rb @@ -13,16 +13,28 @@ module HTML module_function def escape_for_value(value) - escape_chars = ['&', '<', '>'] + unless value.is_a? String + raise ArgumentError.new('value must be String') + end + + escape_chars = Pinto::Type::EscapeChars.new(['&', '<', '>']) return eliminate(value, escape_chars) end def escape_for_quote(value) - escape_chars = ['&', '<', '>', '"'] + unless value.is_a? String + raise ArgumentError.new('value must be String') + end + + escape_chars = Pinto::Type::EscapeChars.new(['&', '<', '>', '"']) return eliminate(value, escape_chars) end def escape_for_tag(value) + unless value.is_a? String + raise ArgumentError.new('value must be String') + end + return eliminate(value) end @@ -30,19 +42,28 @@ def escape_for_tag(value) alias in_quote escape_for_quote alias has_tag escape_for_tag - def eliminate(value, escape_chars = nil) - str = value.to_s - raise ArgumentError unless Pinto::Encoding::UTF8.valid? str + def eliminate(value, escape_chars = Pinto::Type::EscapeChars.new([])) + unless value.is_a? String + raise ArgumentError.new('value must be String') + end + unless escape_chars.is_a? Pinto::Type::EscapeChars + raise ArgumentError.new( + 'escape_chars must be Pinto::Type::EscapeChars' + ) + end + + unless Pinto::Encoding::UTF8.valid? value + raise ArgumentError.new('value is not UTF8 string') + end control_codes = / [\x00-\x08]|\x0B|\x0C|[\x0E-\x1F] # C0 control codes |\x7F # DEL |\xC2[\x80-\x9F] # C1 control codes /ux - str.gsub!(control_codes, '') + value.gsub!(control_codes, '') - return str unless escape_chars.is_a? Array - return str.gsub(/[#{escape_chars.join}]/) {|s| ESCAPE_TABLE[s]} + return value.gsub(/[#{escape_chars.to_a.join}]/) {|s| ESCAPE_TABLE[s]} end end end diff --git a/lib/pinto/helper/translate.rb b/lib/pinto/helper/translate.rb index ca455b7..17dc80e 100755 --- a/lib/pinto/helper/translate.rb +++ b/lib/pinto/helper/translate.rb @@ -3,15 +3,29 @@ module Pinto module Helper module Translate - attr_accessor :lang + def set_language(language) + unless language.is_a? Pinto::Type::Language + raise ArgumentError.new('language must be Pinto::Type::Language') + end + + @language = language + end + + def get_language + return @language + end def _(message_id) - @lang = 'en' if @lang.nil? || @lang.empty? + unless message_id.is_a? String + raise ArgumentError.new('message_id must be String') + end + + @language = Pinto::Type::Language.new('en') if @language.nil? GetText.set_output_charset('UTF-8') GetText.bindtextdomain('pinto', {:path => 'locale'}) - GetText.set_locale(@lang) - return GetText._(message_id) + GetText.set_locale(@language.to_s) + return GetText._(message_id.to_s) end end end diff --git a/lib/pinto/helper/uri.rb b/lib/pinto/helper/uri.rb index 99177c4..0913cd5 100755 --- a/lib/pinto/helper/uri.rb +++ b/lib/pinto/helper/uri.rb @@ -5,10 +5,19 @@ module Helper module URI module_function - def uri(controller, param = {}) - uri_templates = Pinto::Config.load('uri_templates') + def uri(controller_name, param = {}) + unless controller_name.is_a? String + raise ArgumentError.new('controller_name must be String') + end + unless param.is_a? Hash + raise ArgumentError.new('param must be Hash') + end + + config_key = Pinto::Type::ConfigKey.new('uri_templates') + uri_templates = Pinto::Config.load(config_key) + return Addressable::URI.expand_template( - uri_templates[controller], + uri_templates[controller_name], param, Pinto::URI::ExpandProcessor ).to_s diff --git a/lib/pinto/language.rb b/lib/pinto/language.rb index ffd0511..e8b2737 100755 --- a/lib/pinto/language.rb +++ b/lib/pinto/language.rb @@ -2,17 +2,25 @@ module Pinto class Language - def self.list(display_lang = 'en') - translator = Pinto::Translate.new(display_lang) + def self.list(lang = Pinto::Type::Language.new('en')) + unless lang.is_a? Pinto::Type::Language + raise ArgumentError.new('lang must be Pinto::Type::Language') + end + + translator = Pinto::Translate.new(lang) return [ {'code' => 'en', 'name' => translator._('English')}, {'code' => 'ja', 'name' => translator._('Japanese')} ] end - def self.get_other(except_lang) - return self.list(except_lang).delete_if do |lang| - lang['code'] == except_lang + def self.get_other(base_lang) + unless base_lang.is_a? Pinto::Type::Language + raise ArgumentError.new('base_lang must be Pinto::Type::Language') + end + + return self.list(base_lang).delete_if do |lang| + lang['code'] == base_lang.to_s end end end diff --git a/lib/pinto/model/signup_reservation.rb b/lib/pinto/model/signup_reservation.rb index bf88e6a..06b71d2 100755 --- a/lib/pinto/model/signup_reservation.rb +++ b/lib/pinto/model/signup_reservation.rb @@ -4,6 +4,10 @@ module Pinto module Model class SignupReservation def self.add(claimed_id) + unless claimed_id.is_a? Pinto::Type::ClaimedID + raise ArgumentError.new('claimed_id must be Pinto::Type::ClaimedID') + end + db_info = Pinto::Config.db begin @@ -12,7 +16,7 @@ def self.add(claimed_id) dbh.do('INSERT INTO signup_reservations (claimed_id, reserved_at) ' + 'VALUES (?, NOW()) ' + 'ON DUPLICATE KEY UPDATE reserved_at = NOW()', - claimed_id) + claimed_id.to_s) ensure dbh.disconnect if dbh end diff --git a/lib/pinto/model/user.rb b/lib/pinto/model/user.rb index 99d52c5..3d6ff0f 100755 --- a/lib/pinto/model/user.rb +++ b/lib/pinto/model/user.rb @@ -3,9 +3,18 @@ module Pinto module Model class User - def self.add(user_name, claimed_id, lang) - user_name = user_name.to_s + def self.add(user_name, claimed_id) + unless user_name.is_a? Pinto::Type::UserName + raise ArgumentError.new('user_name must be Pinto::Type::UserName') + end + unless claimed_id.is_a? Pinto::Type::ClaimedID + raise ArgumentError.new('claimed_id must be Pinto::Type::ClaimedID') + end + end +=begin + def self.add(user_name, open_id, lang) + user_name = user_name.to_s if user_name.empty? translator = Pinto::Translate.new(lang) message = translator._('%{param} is required') % { @@ -13,7 +22,17 @@ def self.add(user_name, claimed_id, lang) } raise ArgumentError.new(message) end + + open_id = open_id.to_s + if open_id.empty? + translator = Pinto::Translate.new(lang) + message = translator._('%{param} is required') % { + :param => 'OpenID' + } + raise ArgumentError.new(message) + end end +=end end end end diff --git a/lib/pinto/open_id.rb b/lib/pinto/open_id.rb new file mode 100755 index 0000000..300a8b3 --- /dev/null +++ b/lib/pinto/open_id.rb @@ -0,0 +1,43 @@ +# lib/pinto/open_id.rb + +module Pinto + class OpenID + def self.begin(user_supplied_id, lang) + unless user_supplied_id.is_a? Pinto::Type::UserSuppliedID + raise ArgumentError.new( + 'user_supplied_id must be Pinto::Type::UserSuppliedID' + ) + end + unless lang.is_a? Pinto::Type::Language + raise ArgumentError.new('lang must be Pinto::Type::Language') + end + + request = self.consumer().begin(user_supplied_id.to_s) + + realm = Pinto::Helper::URI.uri('index', 'lang' => lang.to_s) + return_to = Pinto::Helper::URI.uri('signup_account', 'lang' => lang.to_s) + + return request.redirect_url(realm, return_to) + end + + def self.complete(query, uri) + unless query.is_a? Pinto::Type::QueryStrings + raise ArgumentError.new('query must be Pinto::Type::QueryStrings') + end + unless uri.is_a? Pinto::Type::URI + raise ArgumentError.new('uri must be Pinto::Type::URI') + end + + response = self.consumer().complete(query.to_hash, uri.to_s) + unless response.is_a? ::OpenID::Consumer::SuccessResponse + return nil + end + return response.identity_url + end + + def self.consumer + store = ::OpenID::Store::Filesystem.new('openid') + return ::OpenID::Consumer.new({}, store) + end + end +end diff --git a/lib/pinto/openid.rb b/lib/pinto/openid.rb deleted file mode 100755 index 22b13d9..0000000 --- a/lib/pinto/openid.rb +++ /dev/null @@ -1,26 +0,0 @@ -# lib/pinto/openid.rb - -module Pinto - class OpenID - def self.begin(openid, lang) - realm = Pinto::Helper::URI.uri('index', 'lang' => lang) - return_to = Pinto::Helper::URI.uri('signup_account', 'lang' => lang) - - request = self.consumer().begin(openid) - return request.redirect_url(realm, return_to) - end - - def self.complete(query, uri) - response = self.consumer().complete(query, uri) - unless response.is_a? ::OpenID::Consumer::SuccessResponse - return nil - end - return response.identity_url - end - - def self.consumer() - store = ::OpenID::Store::Filesystem.new('openid') - return ::OpenID::Consumer.new({}, store) - end - end -end diff --git a/lib/pinto/request.rb b/lib/pinto/request.rb index 564a3d2..5ab2781 100755 --- a/lib/pinto/request.rb +++ b/lib/pinto/request.rb @@ -2,15 +2,46 @@ module Pinto class Request < Rack::Request - attr_accessor :controller - attr_accessor :uri_map - def initialize(env) - @controller = nil - @uri_map = {} + unless env.is_a? Hash + raise ArgumentError.new('env must be Hash') + end + + controller_name = Pinto::Type::ControllerName.new('') + self.set_controller_name(controller_name) + + uri_map = Pinto::Type::UriMap.new({}) + self.set_uri_map(uri_map) + super(env) end + def set_controller_name(controller_name) + unless controller_name.is_a? Pinto::Type::ControllerName + raise ArgumentError.new( + 'controller_name must be Pinto::Type::ControllerName' + ) + end + + @controller_name = controller_name + end + + def get_controller_name + return @controller_name + end + + def set_uri_map(uri_map) + unless uri_map.is_a? Pinto::Type::UriMap + raise ArgumentError.new('uri_map must be Pinto::Type::UriMap') + end + + @uri_map = uri_map + end + + def get_uri_map + return @uri_map + end + def head? return (request_method == 'HEAD') end diff --git a/lib/pinto/translate.rb b/lib/pinto/translate.rb index 84d363b..a43b647 100755 --- a/lib/pinto/translate.rb +++ b/lib/pinto/translate.rb @@ -2,15 +2,21 @@ module Pinto class Translate - attr_accessor :translator - def initialize(lang) + unless lang.is_a? Pinto::Type::Language + raise ArgumentError.new('lang must be Pinto::Type::Language') + end + @translator = Class.new @translator.extend(Pinto::Helper::Translate) - @translator.lang = lang + @translator.set_language(lang) end def _(message_id) + unless message_id.is_a? String + raise ArgumentError.new('message_id must be String') + end + return @translator._(message_id) end end diff --git a/lib/pinto/type/claimed_id.rb b/lib/pinto/type/claimed_id.rb new file mode 100755 index 0000000..e0d6a01 --- /dev/null +++ b/lib/pinto/type/claimed_id.rb @@ -0,0 +1,19 @@ +# lib/pinto/type/claimed_id.rb + +module Pinto + module Type + class ClaimedID + def initialize(claimed_id) + unless claimed_id.is_a? String + raise ArgumentError.new('claimed_id must be String') + end + + @claimed_id = claimed_id + end + + def to_s + return @claimed_id + end + end + end +end diff --git a/lib/pinto/type/config_key.rb b/lib/pinto/type/config_key.rb new file mode 100755 index 0000000..c563596 --- /dev/null +++ b/lib/pinto/type/config_key.rb @@ -0,0 +1,19 @@ +# lib/pinto/type/config_key.rb + +module Pinto + module Type + class ConfigKey + def initialize(config_key) + unless config_key.is_a? String + raise ArgumentError.new('config_key must be String') + end + + @config_key = config_key + end + + def to_s + return @config_key + end + end + end +end diff --git a/lib/pinto/type/controller_name.rb b/lib/pinto/type/controller_name.rb new file mode 100755 index 0000000..8906477 --- /dev/null +++ b/lib/pinto/type/controller_name.rb @@ -0,0 +1,19 @@ +# lib/pinto/type/controller_name.rb + +module Pinto + module Type + class ControllerName + def initialize(controller_name) + unless controller_name.is_a? String + raise ArgumentError.new('controller_name must be String') + end + + @controller_name = controller_name + end + + def to_s + return @controller_name + end + end + end +end diff --git a/lib/pinto/type/error_message.rb b/lib/pinto/type/error_message.rb new file mode 100755 index 0000000..0680146 --- /dev/null +++ b/lib/pinto/type/error_message.rb @@ -0,0 +1,19 @@ +# lib/pinto/type/error_message.rb + +module Pinto + module Type + class ErrorMessage + def initialize(error_message) + unless error_message.is_a? String + raise ArgumentError.new('error_message must be String') + end + + @error_message = error_message + end + + def to_s + return @error_message + end + end + end +end diff --git a/lib/pinto/type/escape_chars.rb b/lib/pinto/type/escape_chars.rb new file mode 100755 index 0000000..5c753f0 --- /dev/null +++ b/lib/pinto/type/escape_chars.rb @@ -0,0 +1,19 @@ +# lib/pinto/type/escape_chars.rb + +module Pinto + module Type + class EscapeChars + def initialize(escape_chars) + unless escape_chars.is_a? Array + raise ArgumentError.new('escape_chars must be Array') + end + + @escape_chars = escape_chars + end + + def to_a + return @escape_chars + end + end + end +end diff --git a/lib/pinto/type/http_status_code.rb b/lib/pinto/type/http_status_code.rb new file mode 100755 index 0000000..e40360e --- /dev/null +++ b/lib/pinto/type/http_status_code.rb @@ -0,0 +1,19 @@ +# lib/pinto/type/http_status_code.rb + +module Pinto + module Type + class HttpStatusCode + def initialize(http_status_code) + unless http_status_code.is_a? Integer + raise ArgumentError.new('http_status_code must be Integer') + end + + @http_status_code = http_status_code + end + + def to_i + return @http_status_code + end + end + end +end diff --git a/lib/pinto/type/language.rb b/lib/pinto/type/language.rb new file mode 100755 index 0000000..97c61ed --- /dev/null +++ b/lib/pinto/type/language.rb @@ -0,0 +1,19 @@ +# lib/pinto/type/language.rb + +module Pinto + module Type + class Language + def initialize(language) + unless language.is_a? String + raise ArgumentError.new('language must be String') + end + + @language = language + end + + def to_s + return @language + end + end + end +end diff --git a/lib/pinto/type/query_strings.rb b/lib/pinto/type/query_strings.rb new file mode 100755 index 0000000..961c1d3 --- /dev/null +++ b/lib/pinto/type/query_strings.rb @@ -0,0 +1,19 @@ +# lib/pinto/type/query_strings.rb + +module Pinto + module Type + class QueryStrings + def initialize(query_strings) + unless query_strings.is_a? Hash + raise ArgumentError.new('query_strings must be Hash') + end + + @query_strings = query_strings + end + + def to_hash + return @query_strings + end + end + end +end diff --git a/lib/pinto/type/uri.rb b/lib/pinto/type/uri.rb new file mode 100755 index 0000000..6d4c070 --- /dev/null +++ b/lib/pinto/type/uri.rb @@ -0,0 +1,19 @@ +# lib/pinto/type/uri.rb + +module Pinto + module Type + class URI + def initialize(uri) + unless uri.is_a? String + raise ArgumentError.new('uri must be String') + end + + @uri = uri + end + + def to_s + return @uri + end + end + end +end diff --git a/lib/pinto/type/uri_map.rb b/lib/pinto/type/uri_map.rb new file mode 100755 index 0000000..d5563af --- /dev/null +++ b/lib/pinto/type/uri_map.rb @@ -0,0 +1,19 @@ +# lib/pinto/type/uri_map.rb + +module Pinto + module Type + class UriMap + def initialize(uri_map) + unless uri_map.is_a? Hash + raise ArgumentError.new('uri_map must be Hash') + end + + @uri_map = uri_map + end + + def to_hash + return @uri_map + end + end + end +end diff --git a/lib/pinto/type/user_name.rb b/lib/pinto/type/user_name.rb new file mode 100755 index 0000000..47b0df0 --- /dev/null +++ b/lib/pinto/type/user_name.rb @@ -0,0 +1,19 @@ +# lib/pinto/type/user_name.rb + +module Pinto + module Type + class UserName + def initialize(user_name) + unless user_name.is_a? String + raise ArgumentError.new('user_name must be String') + end + + @user_name = user_name + end + + def to_s + return @user_name + end + end + end +end diff --git a/lib/pinto/type/user_supplied_id.rb b/lib/pinto/type/user_supplied_id.rb new file mode 100755 index 0000000..605b5ea --- /dev/null +++ b/lib/pinto/type/user_supplied_id.rb @@ -0,0 +1,19 @@ +# lib/pinto/type/user_supplied_id.rb + +module Pinto + module Type + class UserSuppliedID + def initialize(user_supplied_id) + unless user_supplied_id.is_a? String + raise ArgumentError.new('user_supplied_id must be String') + end + + @user_supplied_id = user_supplied_id + end + + def to_s + return @user_supplied_id + end + end + end +end diff --git a/lib/pinto/type/view_name.rb b/lib/pinto/type/view_name.rb new file mode 100755 index 0000000..502b561 --- /dev/null +++ b/lib/pinto/type/view_name.rb @@ -0,0 +1,19 @@ +# lib/pinto/type/view_name.rb + +module Pinto + module Type + class ViewName + def initialize(view_name) + unless view_name.is_a? String + raise ArgumentError.new('view_name must be String') + end + + @view_name = view_name + end + + def to_s + return @view_name + end + end + end +end diff --git a/lib/pinto/type/view_param.rb b/lib/pinto/type/view_param.rb new file mode 100755 index 0000000..459ac6d --- /dev/null +++ b/lib/pinto/type/view_param.rb @@ -0,0 +1,19 @@ +# lib/pinto/type/view_param.rb + +module Pinto + module Type + class ViewParam + def initialize(view_param) + unless view_param.is_a? Hash + raise ArgumentError.new('view_param must be Hash') + end + + @view_param = view_param + end + + def to_hash + return @view_param + end + end + end +end diff --git a/lib/pinto/uri/expand_processor.rb b/lib/pinto/uri/expand_processor.rb index d6324ff..7b6d5f4 100755 --- a/lib/pinto/uri/expand_processor.rb +++ b/lib/pinto/uri/expand_processor.rb @@ -4,6 +4,13 @@ module Pinto module URI class ExpandProcessor def self.transform(name, value) + unless name.is_a? String + raise ArgumentError.new('name must be String') + end + unless value.is_a? String + raise ArgumentError.new('value must be String') + end + return value + '.' if name == 'lang' return '?' + value if name == 'query' return value diff --git a/lib/pinto/uri/extract_processor.rb b/lib/pinto/uri/extract_processor.rb index c743bea..d87667c 100755 --- a/lib/pinto/uri/extract_processor.rb +++ b/lib/pinto/uri/extract_processor.rb @@ -4,6 +4,10 @@ module Pinto module URI class ExtractProcessor def self.match(name) + unless name.is_a? String + raise ArgumentError.new('name must be String') + end + return 'ja\.|en\.|' if name == 'lang' return '\?.+|' if name == 'query' return '[0-9a-zA-Z_\-]+' if name == 'username' @@ -11,6 +15,13 @@ def self.match(name) end def self.restore(name, value) + unless name.is_a? String + raise ArgumentError.new('name must be String') + end + unless value.is_a? String + raise ArgumentError.new('value must be String') + end + case name when 'lang' restore_value = value.gsub(/\.$/, '') diff --git a/lib/pinto/view.rb b/lib/pinto/view.rb index 5c45989..5d79421 100755 --- a/lib/pinto/view.rb +++ b/lib/pinto/view.rb @@ -2,8 +2,15 @@ module Pinto class View - def self.render(view, param = {}) - template = File.read("view/#{view}.erb") + def self.render(name, param = Pinto::Type::ViewParam.new({})) + unless name.is_a? Pinto::Type::ViewName + raise ArgumentError.new('name must be Pinto::Type::ViewName') + end + unless param.is_a? Pinto::Type::ViewParam + raise ArgumentError.new('param must be Pinto::Type::ViewParam') + end + + template = File.read("view/#{name.to_s}.erb") return Pinto::View::XHTML.new(template).evaluate(param) end end diff --git a/lib/pinto/view/xhtml.rb b/lib/pinto/view/xhtml.rb index 4d9ed4e..c4e78d4 100755 --- a/lib/pinto/view/xhtml.rb +++ b/lib/pinto/view/xhtml.rb @@ -4,20 +4,29 @@ module Pinto class View class XHTML < Erubis::EscapedEruby def escaped_expr(code) + unless code.is_a? String + raise ArgumentError.new('code must be String') + end + return "h(#{code})" end def evaluate(param) - context = Erubis::Context.new(param) + unless param.is_a? Pinto::Type::ViewParam + raise ArgumentError.new('param must be Pinto::Type::ViewParam') + end + + context = Erubis::Context.new(param.to_hash) context.extend(Pinto::Helper::HTML) context.extend(Pinto::Helper::URI) - if param.has_key? :lang + if param.to_hash.has_key? :lang context.extend(Pinto::Helper::Translate) - context.lang = param[:lang] + language = Pinto::Type::Language.new(param.to_hash[:lang]) + context.set_language(language) end - super context + super(context) end end end diff --git a/test/model/user_spec.rb b/test/model/user_spec.rb index 892c156..f867def 100755 --- a/test/model/user_spec.rb +++ b/test/model/user_spec.rb @@ -1,6 +1,21 @@ $LOAD_PATH << 'lib' require 'pinto' +describe Pinto::Model::User, 'add method is called' do + it 'should raise ArgumentError when invalid user_name is passed' do + lambda { + Pinto::Model::User.add(nil, Pinto::Type::UserName.new('test')) + }.should raise_error(ArgumentError) + end + + it 'should raise ArgumentError when invalid claimed_id is passed' do + lambda { + Pinto::Model::User.add(Pinto::Type::ClaimedID.new('test'), nil) + }.should raise_error(ArgumentError) + end +end + +=begin describe Pinto::Model::User, 'when user_name is nil for add method' do it 'should raise English error when lang is "en"' do lambda { @@ -28,3 +43,32 @@ }.should raise_error(ArgumentError, 'ユーザー名は必須です') end end + +describe Pinto::Model::User, 'when claimed_id is nil for add method' do + it 'should raise English error when lang is "en"' do + lambda { + Pinto::Model::User.add('dummy', nil, 'en') + }.should raise_error(ArgumentError, 'OpenID is required') + end + + it 'should raise Japanese error when lang is "ja"' do + lambda { + Pinto::Model::User.add('dummy', nil, 'ja') + }.should raise_error(ArgumentError, 'OpenIDは必須です') + end +end + +describe Pinto::Model::User, 'when claimed_id is empty for add method' do + it 'should raise English error when lang is "en"' do + lambda { + Pinto::Model::User.add('dummy', '', 'en') + }.should raise_error(ArgumentError, 'OpenID is required') + end + + it 'should raise Japanese error when lang is "ja"' do + lambda { + Pinto::Model::User.add('dummy', '', 'ja') + }.should raise_error(ArgumentError, 'OpenIDは必須です') + end +end +=end