WonderflAPI test

by 9re
This one is obsolete and running one is available at http://wonderfl.net/c/pFQB
♥2 | Line 360 | Modified 2010-09-10 11:55:49 | MIT License
play

Related images

ActionScript3 source code

/**
 * Copyright 9re ( http://wonderfl.net/user/9re )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/hjAy
 */

package {
    import flash.net.URLRequestMethod;
    import flash.net.URLRequest;
    import flash.events.Event;
    import flash.net.URLLoader;
    import flash.text.TextField;
    import flash.display.Sprite;
    public class WonderflAPITest extends Sprite {
        public function WonderflAPITest() {
            // write as3 code here..
            tf = new TextField;
            tf.wordWrap = true;
            tf.width = tf.height = 465;
            addChild(tf);

            
            var params:Object = loaderInfo.parameters;
            
            var api:WonderflAPI = new WonderflAPI(params);

            var req:URLRequest = new URLRequest;
            req.url = api.apiScoreSet();
            req.method = URLRequestMethod.POST;
            req.data = api.apiScorePostObject(100, '99');
            var ldr:URLLoader = new URLLoader;
            ldr.load(req);
            return;


            testSuit(
                new ApiTest(api.apiCode(), APICodeData),
                new ApiTest(api.apiForks(), APIForksData),
                new ApiTest(api.apiUser(), APIUserData),
                new ApiTest(api.apiUserCodes(), APIUserCodesData),
                new Test(
                    testComplete
                )
            );
        }
        
        
        private function testSuit(...tests:Array):void {
            for (var i:int = 0; i < tests.length - 1; ++i) 
                tests[i].next = tests[i + 1];
                
            tests[0].exec();
        }
        
        private function testComplete():void
        {
            trace('------------------------------');
            trace('all tests passed. ok');
        }
        
    }
}
import flash.text.TextField;

var tf:TextField;
function trace(...o):void {
            tf.appendText(o + "\n");
            tf.scrollV = tf.maxScrollV;
        }

function assertAHasB(a:Object, b:Object):void {
            var value:*;
            for (var key:String in b) {
                value = a[key];
                if (typeof value == 'object') {
                    assertAHasB(value, b[key]);
                } else {
                    if (value != b[key]) throw new Error('doesnot match ' + key);
                    trace(key + ' matched');
                }
            }
        }


import com.adobe.serialization.json.JSON;
    import flash.events.Event;
import flash.net.*;

class Test {
    protected var _exec:Function;
    public function Test($exec:Function):void {
        _exec = $exec;
    }
    public function exec():void {
        _exec();
    }
    public var next:Test;
}

class ApiTest extends Test {
    public function ApiTest(url:String, resultClass:Class) {
        var ldr:URLLoader = new URLLoader;
        ldr.addEventListener(Event.COMPLETE, function _complete(e:*):void {
            ldr.removeEventListener(Event.COMPLETE, _complete);
            var rawData:Object = JSON.decode(ldr.data);
            assertAHasB(new resultClass(rawData), rawData);
            trace(resultClass + ' test ok');
            trace();
            
            if (next != null) next.exec();
        });
        super(function ():void {
            trace('------------------------------');
            trace('loading data from ... ' + url);
            ldr.load(new URLRequest(url));
        });
    }
}


class WonderflAPIData
    {
        public static const STATE_OK: String = "ok";
        public static const STATE_FAIL: String = "fail";
        
        protected var _data: Object;
        
        public function WonderflAPIData(data: Object) 
        {
            this._data = data || {};
        }
        
        public function get stat(): String 
        {
            return _data.stat;
        }
        
        public function get isOK(): Boolean
        {
            return stat == STATE_OK;
        }
        
        public function get message(): String
        {
            return isOK ? "" : _data.message;
        }
        
    }

class SmallCodeData
    {
        protected var _createdDate: Date;
        protected var _data: Object;
        
        public function SmallCodeData(data: Object) 
        {
            this._data = data;
            _createdDate = new Date(created_date * 1000);
        }
        
        /**
         * コード ID(Application ID)
         */
        public function get id(): String { return _data.id; }
        
        /**
         * もしこのコードが何かをforkした作品だった場合はそのID
         */
        public function get parent(): String { return _data.parent; }
        
        /**
         * このコードが何かをフォークした作品かどうか
         */
        public function get isParent(): Boolean { return parent != null; }
        
        /**
         * コードのタイトル
         */
        public function get title(): String { return _data.title; }
        
        /**
         * コンパイルのステータス(1:コンパイル完了, 0:コンパイル未完了)
         */
        public function get compile_ok(): String { return _data.compile_ok; }
        
        /**
         * コンパイルできているかどうか
         */
        public function get compileOK(): Boolean { return compile_ok == "1"; }
        
        /**
         * 作成された日付(1970年1月1日0時(世界時)からの秒数)
         */
        public function get created_date(): int { return _data.created_date; }
        
        /**
         * 作成された日付
         */
        public function get createdDate(): Date { return _createdDate; }
        
        /**
         * ライセンス
         */
        public function get license(): String { return _data.license; }
        
        /**
         * フォークした場合などにフォーク元との差の行数
         */
        public function get diff(): int { return _data.diff; }
        
        /**
         * サムネイルのURL
         */
        public function get thumbnail(): String { return _data.thumbnail; }
        
        /**
         * SWFファイル の URL
         */
        public function get swf(): String { return _data.swf; }
        
    }
    
class SmallUserData
    {
        protected var _data: Object;
        
        public function SmallUserData(data: Object) 
        {
            this._data = data;
        }
        
        /**
         * ユーザーのアイコンURL
         */
        public function get icon(): String { return _data.icon; }
        
        /**
         * ユーザーの名前
         */
        public function get name(): String { return _data.name; }
        
    }

class UserData extends SmallUserData
    {
        
        public function UserData(data:Object) 
        {
            super(data);
        }
        
        /**
         * ユーザーのサイトURL
         */
        public function get external_url(): String { return _data.external_url; }
        
        /**
         * ユーザーの説明
         */
        public function get description(): String { return _data.description; }
        
        /**
         * ユーザのコード数
         */
        public function get code_count(): int { return _data.code_count; }
    }

    
class ForkCodeData extends SmallCodeData
    {
        protected var _user: SmallUserData;
        
        public function ForkCodeData(data:Object) 
        {
            super(data);
            _user = new SmallUserData(data.user);
        }
        
        /**
         * ユーザーデータ
         */
        public function get user(): SmallUserData { return _user; }
        
    }    
    
 class CodeData extends ForkCodeData
    {
        protected var _modifiedDate: Date;
        
        public function CodeData(data:Object) 
        {
            super(data);
            _modifiedDate = new Date(modified_date * 1000);
        }
        
        /**
         * コードのスクリプト
         */
        public function get as3(): String { return _data.as3; }
        
        /**
         * 変更をした日付
         */
        public function get modifiedDate(): Date { return _modifiedDate; }
        
        /**
         * 変更をした日付(1970年1月1日0時(世界時)からの秒数)
         */
        public function get modified_date(): int { return _data.modified_date; }
        
        /**
         * フォークされた回数
         */
        public function get forked_count(): int { return _data.forked_count; }
        
        /**
         * favされた回数
         */
        public function get favorite_count(): int { return _data.favorite_count; }
        
    }   
    
    
    
class ScoreData
    {
        protected var _data: Object;
        
        public function ScoreData(data: Object) 
        {
            this._data = data;
        }
        
        /**
         * スコア
         */
        public function get score(): int { return _data.score; }
        
        /**
         * ユーザー名
         */
        public function get name(): String { return _data.name; }
    }

class APIUserData extends WonderflAPIData
    {
        protected var _user: UserData;
        
        public function APIUserData(data:Object) 
        {
            super(data);
            if (isOK)
            {
                _user = new UserData(_data.user);
            }
        }
        
        /**
         * ユーザーデータ API で取得したデータ(isOK == true の時のみ)
         */
        public function get user(): UserData { return _user; }
        
    }
    
class APIUserCodesData extends WonderflAPIData
    {
        protected var _length: int;
        protected var _codes: Vector.<SmallCodeData>;
        
        public function APIUserCodesData(data:Object) 
        {
            super(data);
            if (isOK)
            {
                _codes = new Vector.<SmallCodeData>();
                var arr: Array = _data.codes;
                _length = arr.length;
                for (var i: int = 0; i < _length; i++) 
                {
                    _codes[i] = new SmallCodeData(arr[i]);
                }
                _codes.fixed = true;
            }
        }
        
        /**
         * コードデータの個数
         */
        public function get length(): int { return _length; }
        
        /**
         * コードデータの配列
         */
        public function get codes(): Vector.<SmallCodeData> { return _codes; }
        
    }    


class APIScoreData extends WonderflAPIData
    {
        protected var _length: int;
        protected var _scores: Vector.<ScoreData>;
        
        public function APIScoreData(data: Object) 
        {
            super(data);
            if (isOK)
            {
                _scores = new Vector.<ScoreData>();
                var arr: Array = _data.scores;
                _length = arr.length;
                for (var i: int = 0; i < _length; i++) 
                {
                    _scores[i] = new ScoreData(arr[i]);
                }
                _scores.fixed = true;
            }
        }
        
        /**
         * ScoreData の個数
         */
        public function get length(): int { return _length; }
        
        /**
         * ScoreData の配列
         */
        public function get scores(): Vector.<ScoreData> { return _scores; }
        
    }
    
 class APIForksData extends WonderflAPIData
    {
        protected var _length: int;
        protected var _forks: Vector.<ForkCodeData>;
        
        public function APIForksData(data:Object) 
        {
            super(data);
            if (isOK)
            {
                _forks = new Vector.<ForkCodeData>();
                var arr: Array = _data.forks;
                _length = arr.length;
                for (var i: int = 0; i < _length; i++) 
                {
                    _forks[i] = new ForkCodeData(arr[i]);
                }
                _forks.fixed = true;
            }
        }
        
        /**
         * フォークされたコードデータの数
         */
        public function get length(): int { return _length; }
        
        /**
         * フォークされたコードデータの配列
         */
        public function get forks(): Vector.<ForkCodeData> { return _forks; }
        
        
    }    
    
 class APICodeData extends WonderflAPIData
    {
        protected var _code: CodeData;
        
        public function APICodeData(data:Object) 
        {
            super(data);
            if (isOK)
            {
                _code = new CodeData(_data.code);
            }
        }
        
        /**
         * コードデータ
         */
        public function get code(): CodeData { return _code; }
        
    }

class WonderflAPI
    {
        public static const CODE_URL: String       = "http://wonderfl.net/c/";
        public static const API_URL: String        = "http://api.wonderfl.net/";
        public static const API_CODE: String       = API_URL + "code/%ID%?api_key=%API_KEY%";
        public static const API_USER: String       = API_URL + "user/%NAME%?api_key=%API_KEY%";
        public static const API_FORKS: String      = API_URL + "code/%ID%/forks?api_key=%API_KEY%";
        public static const API_SCORE_GET: String  = API_URL + "score/%ID%?api_key=%API_KEY%&descend=%DESC%&limit=%LIMIT%";
        public static const API_SCORE_SET: String  = API_URL + "score/%ID%";
        public static const API_USER_CODES: String = API_URL + "user/%NAME%/codes?api_key=%API_KEY%";
        
        private var _apiCode: String;
        private var _apiUser: String;
        private var _apiForks: String;
        private var _apiScoreGet: String;
        private var _apiScoreSet: String;
        private var _apiUserCodes: String;
        
        private var _key: String;
        private var _appID: String;
        private var _domain: String;
        private var _apiKey: String;
        private var _viewerIconURL: String;
        private var _viewerDisplayName: String;
        
        /**
         * Wonderfl API Library for AS3
         * Wonderfl API を使用するためのライブラリ
         * コンストラクタ
         * @param    params : FlashVars (loaderInfo.parameters)
         * @param    apiKey : Open API Key is set for the default.
         */
        public function WonderflAPI(params: Object, apiKey: String = null) 
        {
            _key               = params["key"];
            _appID             = params["appId"];
            _domain            = params["domain"];
            _apiKey        = apiKey || params["open_api_key"];
            _viewerIconURL     = params["viewer.iconURL"];
            _viewerDisplayName = params["viewer.displayName"];
            
            //
            _apiCode      = API_CODE.replace(/%API_KEY%/, _apiKey);
            _apiUser      = API_USER.replace(/%API_KEY%/, _apiKey);
            _apiForks     = API_FORKS.replace(/%API_KEY%/, _apiKey);
            _apiScoreGet  = API_SCORE_GET.replace(/%API_KEY%/, _apiKey);
            _apiScoreSet  = API_SCORE_SET.replace(/%API_KEY%/, _apiKey);
            _apiUserCodes = API_USER_CODES.replace(/%API_KEY%/, _apiKey);
            
        }
        
        /**
         * Get Application ID from URL 
         * URL から Application ID を取得
         * @param    url : the url of the code page (現在のコードのURL)
         * @return    
         */
        public function getAppID(url: String): String
        {
            return url.replace(CODE_URL, "");
        }
        
        /**
         * Get the url with parmeters for code api.
         * Code API の URL を取得
         * @param    appID : The application ID. The default value is set from the params(flashvars) given to the constructor.
         *                  Code API に指定する Application ID. 指定しなかった場合はコンストラクタで指定したオブジェクトの appId が使用される。
         * @return The url with parmeters for code api.
         */
        public function apiCode(appID: String = null): String
        {
            return _apiCode.replace(/%ID%/, appID || _appID);
        }
        
        /**
         * Get the url with parmeters for user api.
         * User API の URL を取得
         * @param    user : The username to request the api. If not set, viewer.displayName of params(flashvars) is set as the default value.
         *                 User API に指定する UserName. 指定しなかった場合はコンストラクタで指定したオブジェクトの viewer.displayName が使用される。
         * @return The url with parmeters for user api.
         */
        public function apiUser(user: String = null): String
        {
            return _apiUser.replace(/%NAME%/, user || _viewerDisplayName);
        }
        
        /**
         * Get the url with parmeters for forks api.
         * Forks Code API の URL を取得
         * @param    appID : The application id. If not set, appId of params(flashvars) is set as the default value. 
         *                  Forks Code API に指定する Application ID. 指定しなかった場合はコンストラクタで指定したオブジェクトの appId が使用される。
         * @return The url with parmeters for forks api.
         */
        public function apiForks(appID: String = null): String
        {
            return _apiForks.replace(/%ID%/, appID || _appID);
        }
        
        /**
         * Get the url with parameters for score api(GET).
         * Score API (GET) の URL を取得
         * @param    limit    : The limit of the numbers of the records to fetch.(1-99) スコアの取得数 (1 - 99)
         * @param    descend    : 1: Descending 0: Ascending, 1:降順で取得、 0: 昇順で取得
         * @param    appID    : The application ID. Score API (get) に指定する Application ID. 指定しなかった場合はコンストラクタで指定したオブジェクトの appId が使用される。
         * @return
         */
        public function apiScoreGet(limit: uint = 20, descend: uint = 1, appID: String = null): String
        {
            return _apiScoreGet.replace(/%ID%/, appID || _appID).replace(
                /%DESC%/,  descend > 1 ? 1 : descend).replace(/%LIMIT%/, limit > 99 ? 99 : (limit || 1));
        }
        
        /**
         * Get the url with parameters for score api(POST).
         * Score API (POST) の URL を取得
         * @param    appID    : The application id. Score API (set) に指定する Application ID. 指定しなかった場合はコンストラクタで指定したオブジェクトの appId が使用される。
         * @return
         */
        public function apiScoreSet(appID: String = null): String
        {
            return _apiScoreSet.replace(/%ID%/, appID || _appID);
        }
        
        /**
         * Score API (set) の Post データを取得
         * @param    score    : スコア
         * @param    name    : ユーザー名。指定しなかった場合はコンストラクタで指定した viewer.displayName が使用される。
         * @return
         */
        public function apiScorePostObject(score: int, name: String = null): Object
        {
            return { "api_key": _apiKey, "name": name, "score": (score || _viewerDisplayName) };
        }
        
        /**
         * User Codes API の URL を取得
         * @param    name    : ユーザー名。指定しなかった場合はコンストラクタで指定した viewer.displayName が使用される。
         * @return
         */
        public function apiUserCodes(name: String = null): String
        {
            return _apiUserCodes.replace(/%NAME%/, name || _viewerDisplayName);
        }
        
        
        
        public function get key(): String { return _key; }
        
        public function get appID(): String { return _appID; }
        
        public function get domain(): String { return _domain; }
        
        public function get apiKey(): String { return _apiKey; }
        
        public function get viewerIconURL(): String { return _viewerIconURL; }
        
        public function get viewerDisplayName(): String { return _viewerDisplayName; }
        
    }

Forked