src/cm/media/js/lib/yui/yui_3.10.3/build/dataschema-json/dataschema-json-debug.js
author gibus
Tue, 16 Jul 2013 14:29:46 +0200
changeset 525 89ef5ed3c48b
permissions -rw-r--r--
Upgrades to yui 3.10.3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
525
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     1
/*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     2
YUI 3.10.3 (build 2fb5187)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     3
Copyright 2013 Yahoo! Inc. All rights reserved.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     4
Licensed under the BSD License.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     5
http://yuilibrary.com/license/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     6
*/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     7
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     8
YUI.add('dataschema-json', function (Y, NAME) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     9
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    10
/**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    11
Provides a DataSchema implementation which can be used to work with JSON data.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    12
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    13
@module dataschema
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    14
@submodule dataschema-json
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    15
**/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    16
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    17
/**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    18
Provides a DataSchema implementation which can be used to work with JSON data.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    19
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    20
See the `apply` method for usage.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    21
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    22
@class DataSchema.JSON
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    23
@extends DataSchema.Base
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    24
@static
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    25
**/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    26
var LANG = Y.Lang,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    27
    isFunction = LANG.isFunction,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    28
    isObject   = LANG.isObject,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    29
    isArray    = LANG.isArray,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    30
    // TODO: I don't think the calls to Base.* need to be done via Base since
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    31
    // Base is mixed into SchemaJSON.  Investigate for later.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    32
    Base       = Y.DataSchema.Base,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    33
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    34
    SchemaJSON;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    35
    
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    36
SchemaJSON = {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    37
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    38
/////////////////////////////////////////////////////////////////////////////
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    39
//
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    40
// DataSchema.JSON static methods
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    41
//
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    42
/////////////////////////////////////////////////////////////////////////////
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    43
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    44
     * Utility function converts JSON locator strings into walkable paths
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    45
     *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    46
     * @method getPath
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    47
     * @param locator {String} JSON value locator.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    48
     * @return {String[]} Walkable path to data value.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    49
     * @static
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    50
     */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    51
    getPath: function(locator) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    52
        var path = null,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    53
            keys = [],
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    54
            i = 0;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    55
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    56
        if (locator) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    57
            // Strip the ["string keys"] and [1] array indexes
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    58
            // TODO: the first two steps can probably be reduced to one with
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    59
            // /\[\s*(['"])?(.*?)\1\s*\]/g, but the array indices would be
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    60
            // stored as strings.  This is not likely an issue.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    61
            locator = locator.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    62
                replace(/\[\s*(['"])(.*?)\1\s*\]/g,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    63
                function (x,$1,$2) {keys[i]=$2;return '.@'+(i++);}).
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    64
                replace(/\[(\d+)\]/g,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    65
                function (x,$1) {keys[i]=parseInt($1,10)|0;return '.@'+(i++);}).
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    66
                replace(/^\./,''); // remove leading dot
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    67
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    68
            // Validate against problematic characters.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    69
            // commented out because the path isn't sent to eval, so it
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    70
            // should be safe. I'm not sure what makes a locator invalid.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    71
            //if (!/[^\w\.\$@]/.test(locator)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    72
            path = locator.split('.');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    73
            for (i=path.length-1; i >= 0; --i) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    74
                if (path[i].charAt(0) === '@') {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    75
                    path[i] = keys[parseInt(path[i].substr(1),10)];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    76
                }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    77
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    78
            /*}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    79
            else {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    80
                Y.log("Invalid locator: " + locator, "error", "dataschema-json");
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    81
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    82
            */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    83
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    84
        return path;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    85
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    86
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    87
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    88
     * Utility function to walk a path and return the value located there.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    89
     *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    90
     * @method getLocationValue
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    91
     * @param path {String[]} Locator path.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    92
     * @param data {String} Data to traverse.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    93
     * @return {Object} Data value at location.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    94
     * @static
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    95
     */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    96
    getLocationValue: function (path, data) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    97
        var i = 0,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    98
            len = path.length;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    99
        for (;i<len;i++) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   100
            if (isObject(data) && (path[i] in data)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   101
                data = data[path[i]];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   102
            } else {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   103
                data = undefined;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   104
                break;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   105
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   106
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   107
        return data;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   108
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   109
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   110
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   111
    Applies a schema to an array of data located in a JSON structure, returning
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   112
    a normalized object with results in the `results` property. Additional
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   113
    information can be parsed out of the JSON for inclusion in the `meta`
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   114
    property of the response object.  If an error is encountered during
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   115
    processing, an `error` property will be added.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   116
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   117
    The input _data_ is expected to be an object or array.  If it is a string,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   118
    it will be passed through `Y.JSON.parse()`.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   119
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   120
    If _data_ contains an array of data records to normalize, specify the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   121
    _schema.resultListLocator_ as a dot separated path string just as you would
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   122
    reference it in JavaScript.  So if your _data_ object has a record array at
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   123
    _data.response.results_, use _schema.resultListLocator_ =
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   124
    "response.results". Bracket notation can also be used for array indices or
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   125
    object properties (e.g. "response['results']");  This is called a "path
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   126
    locator"
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   127
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   128
    Field data in the result list is extracted with field identifiers in
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   129
    _schema.resultFields_.  Field identifiers are objects with the following
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   130
    properties:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   131
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   132
      * `key`   : <strong>(required)</strong> The path locator (String)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   133
      * `parser`: A function or the name of a function on `Y.Parsers` used
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   134
            to convert the input value into a normalized type.  Parser
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   135
            functions are passed the value as input and are expected to
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   136
            return a value.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   137
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   138
    If no value parsing is needed, you can use path locators (strings) 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   139
    instead of field identifiers (objects) -- see example below.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   140
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   141
    If no processing of the result list array is needed, _schema.resultFields_
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   142
    can be omitted; the `response.results` will point directly to the array.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   143
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   144
    If the result list contains arrays, `response.results` will contain an
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   145
    array of objects with key:value pairs assuming the fields in
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   146
    _schema.resultFields_ are ordered in accordance with the data array
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   147
    values.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   148
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   149
    If the result list contains objects, the identified _schema.resultFields_
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   150
    will be used to extract a value from those objects for the output result.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   151
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   152
    To extract additional information from the JSON, include an array of
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   153
    path locators in _schema.metaFields_.  The collected values will be
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   154
    stored in `response.meta`.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   155
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   156
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   157
    @example
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   158
        // Process array of arrays
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   159
        var schema = {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   160
                resultListLocator: 'produce.fruit',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   161
                resultFields: [ 'name', 'color' ]
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   162
            },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   163
            data = {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   164
                produce: {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   165
                    fruit: [
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   166
                        [ 'Banana', 'yellow' ],
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   167
                        [ 'Orange', 'orange' ],
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   168
                        [ 'Eggplant', 'purple' ]
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   169
                    ]
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   170
                }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   171
            };
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   172
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   173
        var response = Y.DataSchema.JSON.apply(schema, data);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   174
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   175
        // response.results[0] is { name: "Banana", color: "yellow" }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   176
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   177
        
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   178
        // Process array of objects + some metadata
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   179
        schema.metaFields = [ 'lastInventory' ];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   180
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   181
        data = {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   182
            produce: {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   183
                fruit: [
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   184
                    { name: 'Banana', color: 'yellow', price: '1.96' },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   185
                    { name: 'Orange', color: 'orange', price: '2.04' },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   186
                    { name: 'Eggplant', color: 'purple', price: '4.31' }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   187
                ]
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   188
            },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   189
            lastInventory: '2011-07-19'
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   190
        };
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   191
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   192
        response = Y.DataSchema.JSON.apply(schema, data);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   193
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   194
        // response.results[0] is { name: "Banana", color: "yellow" }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   195
        // response.meta.lastInventory is '2001-07-19'
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   196
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   197
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   198
        // Use parsers
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   199
        schema.resultFields = [
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   200
            {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   201
                key: 'name',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   202
                parser: function (val) { return val.toUpperCase(); }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   203
            },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   204
            {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   205
                key: 'price',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   206
                parser: 'number' // Uses Y.Parsers.number
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   207
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   208
        ];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   209
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   210
        response = Y.DataSchema.JSON.apply(schema, data);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   211
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   212
        // Note price was converted from a numeric string to a number
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   213
        // response.results[0] looks like { fruit: "BANANA", price: 1.96 }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   214
     
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   215
    @method apply
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   216
    @param {Object} [schema] Schema to apply.  Supported configuration
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   217
        properties are:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   218
      @param {String} [schema.resultListLocator] Path locator for the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   219
          location of the array of records to flatten into `response.results`
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   220
      @param {Array} [schema.resultFields] Field identifiers to
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   221
          locate/assign values in the response records. See above for
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   222
          details.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   223
      @param {Array} [schema.metaFields] Path locators to extract extra
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   224
          non-record related information from the data object.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   225
    @param {Object|Array|String} data JSON data or its string serialization.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   226
    @return {Object} An Object with properties `results` and `meta`
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   227
    @static
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   228
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   229
    apply: function(schema, data) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   230
        var data_in = data,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   231
            data_out = { results: [], meta: {} };
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   232
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   233
        // Convert incoming JSON strings
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   234
        if (!isObject(data)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   235
            try {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   236
                data_in = Y.JSON.parse(data);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   237
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   238
            catch(e) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   239
                data_out.error = e;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   240
                return data_out;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   241
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   242
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   243
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   244
        if (isObject(data_in) && schema) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   245
            // Parse results data
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   246
            data_out = SchemaJSON._parseResults.call(this, schema, data_in, data_out);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   247
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   248
            // Parse meta data
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   249
            if (schema.metaFields !== undefined) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   250
                data_out = SchemaJSON._parseMeta(schema.metaFields, data_in, data_out);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   251
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   252
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   253
        else {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   254
            Y.log("JSON data could not be schema-parsed: " + Y.dump(data) + " " + Y.dump(data), "error", "dataschema-json");
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   255
            data_out.error = new Error("JSON schema parse failure");
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   256
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   257
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   258
        return data_out;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   259
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   260
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   261
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   262
     * Schema-parsed list of results from full data
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   263
     *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   264
     * @method _parseResults
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   265
     * @param schema {Object} Schema to parse against.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   266
     * @param json_in {Object} JSON to parse.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   267
     * @param data_out {Object} In-progress parsed data to update.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   268
     * @return {Object} Parsed data object.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   269
     * @static
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   270
     * @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   271
     */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   272
    _parseResults: function(schema, json_in, data_out) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   273
        var getPath  = SchemaJSON.getPath,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   274
            getValue = SchemaJSON.getLocationValue,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   275
            path     = getPath(schema.resultListLocator),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   276
            results  = path ?
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   277
                        (getValue(path, json_in) ||
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   278
                         // Fall back to treat resultListLocator as a simple key
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   279
                            json_in[schema.resultListLocator]) :
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   280
                        // Or if no resultListLocator is supplied, use the input
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   281
                        json_in;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   282
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   283
        if (isArray(results)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   284
            // if no result fields are passed in, then just take
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   285
            // the results array whole-hog Sometimes you're getting
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   286
            // an array of strings, or want the whole object, so
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   287
            // resultFields don't make sense.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   288
            if (isArray(schema.resultFields)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   289
                data_out = SchemaJSON._getFieldValues.call(this, schema.resultFields, results, data_out);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   290
            } else {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   291
                data_out.results = results;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   292
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   293
        } else if (schema.resultListLocator) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   294
            data_out.results = [];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   295
            data_out.error = new Error("JSON results retrieval failure");
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   296
            Y.log("JSON data could not be parsed: " + Y.dump(json_in), "error", "dataschema-json");
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   297
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   298
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   299
        return data_out;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   300
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   301
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   302
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   303
     * Get field data values out of list of full results
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   304
     *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   305
     * @method _getFieldValues
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   306
     * @param fields {Array} Fields to find.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   307
     * @param array_in {Array} Results to parse.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   308
     * @param data_out {Object} In-progress parsed data to update.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   309
     * @return {Object} Parsed data object.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   310
     * @static
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   311
     * @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   312
     */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   313
    _getFieldValues: function(fields, array_in, data_out) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   314
        var results = [],
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   315
            len = fields.length,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   316
            i, j,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   317
            field, key, locator, path, parser, val,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   318
            simplePaths = [], complexPaths = [], fieldParsers = [],
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   319
            result, record;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   320
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   321
        // First collect hashes of simple paths, complex paths, and parsers
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   322
        for (i=0; i<len; i++) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   323
            field = fields[i]; // A field can be a simple string or a hash
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   324
            key = field.key || field; // Find the key
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   325
            locator = field.locator || key; // Find the locator
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   326
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   327
            // Validate and store locators for later
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   328
            path = SchemaJSON.getPath(locator);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   329
            if (path) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   330
                if (path.length === 1) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   331
                    simplePaths.push({
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   332
                        key : key,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   333
                        path: path[0]
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   334
                    });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   335
                } else {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   336
                    complexPaths.push({
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   337
                        key    : key,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   338
                        path   : path,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   339
                        locator: locator
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   340
                    });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   341
                }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   342
            } else {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   343
                Y.log("Invalid key syntax: " + key, "warn", "dataschema-json");
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   344
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   345
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   346
            // Validate and store parsers for later
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   347
            //TODO: use Y.DataSchema.parse?
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   348
            parser = (isFunction(field.parser)) ?
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   349
                        field.parser :
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   350
                        Y.Parsers[field.parser + ''];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   351
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   352
            if (parser) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   353
                fieldParsers.push({
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   354
                    key   : key,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   355
                    parser: parser
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   356
                });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   357
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   358
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   359
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   360
        // Traverse list of array_in, creating records of simple fields,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   361
        // complex fields, and applying parsers as necessary
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   362
        for (i=array_in.length-1; i>=0; --i) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   363
            record = {};
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   364
            result = array_in[i];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   365
            if(result) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   366
                // Cycle through complexLocators
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   367
                for (j=complexPaths.length - 1; j>=0; --j) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   368
                    path = complexPaths[j];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   369
                    val = SchemaJSON.getLocationValue(path.path, result);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   370
                    if (val === undefined) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   371
                        val = SchemaJSON.getLocationValue([path.locator], result);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   372
                        // Fail over keys like "foo.bar" from nested parsing
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   373
                        // to single token parsing if a value is found in
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   374
                        // results["foo.bar"]
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   375
                        if (val !== undefined) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   376
                            simplePaths.push({
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   377
                                key:  path.key,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   378
                                path: path.locator
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   379
                            });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   380
                            // Don't try to process the path as complex
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   381
                            // for further results
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   382
                            complexPaths.splice(i,1);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   383
                            continue;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   384
                        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   385
                    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   386
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   387
                    record[path.key] = Base.parse.call(this,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   388
                        (SchemaJSON.getLocationValue(path.path, result)), path);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   389
                }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   390
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   391
                // Cycle through simpleLocators
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   392
                for (j = simplePaths.length - 1; j >= 0; --j) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   393
                    path = simplePaths[j];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   394
                    // Bug 1777850: The result might be an array instead of object
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   395
                    record[path.key] = Base.parse.call(this,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   396
                            ((result[path.path] === undefined) ?
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   397
                            result[j] : result[path.path]), path);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   398
                }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   399
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   400
                // Cycle through fieldParsers
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   401
                for (j=fieldParsers.length-1; j>=0; --j) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   402
                    key = fieldParsers[j].key;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   403
                    record[key] = fieldParsers[j].parser.call(this, record[key]);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   404
                    // Safety net
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   405
                    if (record[key] === undefined) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   406
                        record[key] = null;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   407
                    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   408
                }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   409
                results[i] = record;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   410
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   411
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   412
        data_out.results = results;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   413
        return data_out;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   414
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   415
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   416
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   417
     * Parses results data according to schema
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   418
     *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   419
     * @method _parseMeta
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   420
     * @param metaFields {Object} Metafields definitions.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   421
     * @param json_in {Object} JSON to parse.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   422
     * @param data_out {Object} In-progress parsed data to update.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   423
     * @return {Object} Schema-parsed meta data.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   424
     * @static
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   425
     * @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   426
     */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   427
    _parseMeta: function(metaFields, json_in, data_out) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   428
        if (isObject(metaFields)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   429
            var key, path;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   430
            for(key in metaFields) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   431
                if (metaFields.hasOwnProperty(key)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   432
                    path = SchemaJSON.getPath(metaFields[key]);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   433
                    if (path && json_in) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   434
                        data_out.meta[key] = SchemaJSON.getLocationValue(path, json_in);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   435
                    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   436
                }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   437
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   438
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   439
        else {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   440
            data_out.error = new Error("JSON meta data retrieval failure");
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   441
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   442
        return data_out;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   443
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   444
};
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   445
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   446
// TODO: Y.Object + mix() might be better here
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   447
Y.DataSchema.JSON = Y.mix(SchemaJSON, Base);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   448
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   449
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   450
}, '3.10.3', {"requires": ["dataschema-base", "json"]});