Update of /project/cl-selenium/cvsroot/cl-selenium In directory clnet:/tmp/cvs-serv19783
Modified Files: ChangeLog iedoc.lisp selenium.lisp Log Message: Apply patch from Chaitanya Gupta to improve handling of return types.
--- /project/cl-selenium/cvsroot/cl-selenium/ChangeLog 2008/01/24 15:40:40 1.2 +++ /project/cl-selenium/cvsroot/cl-selenium/ChangeLog 2008/05/19 06:37:05 1.3 @@ -1,3 +1,8 @@ +2008-05-19 Matthew Kennedy + + * iedoc.lisp, selenium.lisp: Apply patch from Chaitanya Gupta to + improve handling of return types. + 2008-01-24 Matthew Kennedy
* packages.lisp: Add documentation strings. --- /project/cl-selenium/cvsroot/cl-selenium/iedoc.lisp 2008/01/24 15:40:40 1.2 +++ /project/cl-selenium/cvsroot/cl-selenium/iedoc.lisp 2008/05/19 06:37:05 1.3 @@ -6,7 +6,9 @@ (parameters :initarg :parameters :accessor iedoc-function-parameters) (comment :initarg :comment - :accessor iedoc-function-comment))) + :accessor iedoc-function-comment) + (return-type :initarg :return-type + :accessor iedoc-return-type)))
(defmethod print-object ((iedoc-function iedoc-function) stream) (print-unreadable-object (iedoc-function stream :identity t :type t) @@ -30,7 +32,10 @@ :name name :parameters (loop for p across (dom:get-elements-by-tag-name e "param") collect (make-iedoc-parameter p)) - :comment (make-iedoc-comment (elt (dom:get-elements-by-tag-name e "comment") 0))))) + :comment (make-iedoc-comment (elt (dom:get-elements-by-tag-name e "comment") 0)) + :return-type (let ((return-elements (dom:get-elements-by-tag-name e "return"))) + (when (plusp (length return-elements)) + (make-iedoc-return-type (elt return-elements 0)))))))
(defun make-iedoc-parameter (e) (let ((name (dom:get-attribute e "name"))) @@ -48,6 +53,15 @@ (with-output-to-string (stream) (make-iedoc-comment-r e stream)))))
+(defun make-iedoc-return-type (e) + (let ((type (dom:get-attribute e "type"))) + (cond + ((string-equal type "string") 'string) + ((string-equal type "boolean") 'boolean) + ((string-equal type "number") 'number) + ((string-equal type "string[]") 'list)))) + + (defun normalize-comment (comment) (cl-ppcre:regex-replace-all " {3,}" (cl-ppcre:regex-replace-all "[\t\n]" comment " ") " "))
@@ -104,11 +118,37 @@ (or (null mismatch) (>= mismatch (length prefix)))))
-(defun convert-result (s) - (cond - ((string= s "true") t) - ((string= s "false") nil) - (t s))) +(defun convert-result (s return-type) + (ecase return-type + ((number string) s) + (boolean (cond + ((string= s "true") t) + ((string= s "false") nil))) + (list (convert-string-array s)) + ((nil) nil))) + +;;; Shamelessly copied from selenium.rb in selenium-ruby-client-driver +(defun convert-string-array (s) + (flet ((new-string () + (make-array 0 :element-type 'character :fill-pointer 0 :adjustable t))) + (let ((result nil) + (escape-p nil) + (token (new-string))) + (loop + for char across s + do (cond + (escape-p + (vector-push-extend char token) + (setf escape-p nil)) + ((eql char #\) + (setf escape-p t)) + ((eql char #,) + (push token result) + (setf token (new-string))) + (t + (vector-push-extend char token))) + finally (push token result)) + (nreverse result))))
(define-condition base-error (error) ()) @@ -130,18 +170,18 @@ (format s "Selenium execution error: ~A" (description c)))))
-(defun execute (url) +(defun execute (url &optional return-type) (multiple-value-bind (reply status-code headers reply-from stream some-bool reason) (drakma:http-request url :method :get) (declare (ignore headers reply-from stream some-bool)) (when (/= 200 status-code) (error 'http-error :status-code status-code :reason reason)) - (let ((results (split-sequence:split-sequence #, reply))) - (cond - ((starts-with (first results) "OK") (convert-result (second results))) - ((starts-with (first results) "ERROR:") - (let ((err (second (split-sequence:split-sequence #: (first results))))) - (error 'execution-error :description err))))))) + (cond + ((starts-with reply "OK") + (convert-result (subseq reply (min 3 (length reply))) return-type)) + ((starts-with reply "ERROR:") + (let ((err (second (split-sequence:split-sequence #: reply)))) + (error 'execution-error :description err))))))
(defun convert-function (iedoc-function) (let ((function-name (convert-function-name (iedoc-function-name iedoc-function))) @@ -153,7 +193,8 @@ (marshall-request ,(iedoc-function-name iedoc-function) ,@parameters) (format nil "&sessionId=~d" session)))) (execute (puri:merge-uris (make-instance 'puri:uri :query query) - *selenium-driver-url*)))))) + *selenium-driver-url*) + ',(iedoc-return-type iedoc-function))))))
#+nil (mapcar #'convert-function (parse-iedoc #p"/selenium-core-0.8.2/core/iedoc.xml"))
--- /project/cl-selenium/cvsroot/cl-selenium/selenium.lisp 2008/01/24 15:40:40 1.2 +++ /project/cl-selenium/cvsroot/cl-selenium/selenium.lisp 2008/05/19 06:37:05 1.3 @@ -15,8 +15,9 @@
(defun do-get-new-browser-session (browser url) "Create a session by using the the given browser and initial URL." - (execute (puri:merge-uris (make-instance 'puri:uri :query (marshall-request "getNewBrowserSession" browser url)) - *selenium-driver-url*))) + (execute (puri:merge-uris (make-instance 'puri:uri :query (marshall-request "getNewBrowserSession" browser url)) + *selenium-driver-url*) + 'string))
(defun do-test-complete (&optional (session *selenium-session*)) (let ((query (concatenate 'string