src/cm/media/js/lib/yui/yui_3.10.3/build/dataschema-json/dataschema-json.js
author gibus
Tue, 11 Feb 2014 12:33:25 +0100
changeset 572 93383e54e042
parent 525 89ef5ed3c48b
permissions -rw-r--r--
Font size for piwik optout iframe.
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
            }
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
        return path;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    84
    },
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
     * Utility function to walk a path and return the value located there.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    88
     *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    89
     * @method getLocationValue
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    90
     * @param path {String[]} Locator path.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    91
     * @param data {String} Data to traverse.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    92
     * @return {Object} Data value at location.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    93
     * @static
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    94
     */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    95
    getLocationValue: function (path, data) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    96
        var i = 0,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    97
            len = path.length;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    98
        for (;i<len;i++) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    99
            if (isObject(data) && (path[i] in data)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   100
                data = data[path[i]];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   101
            } else {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   102
                data = undefined;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   103
                break;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   104
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   105
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   106
        return data;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   107
    },
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
    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
   111
    a normalized object with results in the `results` property. Additional
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   112
    information can be parsed out of the JSON for inclusion in the `meta`
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   113
    property of the response object.  If an error is encountered during
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   114
    processing, an `error` property will be added.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   115
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   116
    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
   117
    it will be passed through `Y.JSON.parse()`.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   118
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   119
    If _data_ contains an array of data records to normalize, specify the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   120
    _schema.resultListLocator_ as a dot separated path string just as you would
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   121
    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
   122
    _data.response.results_, use _schema.resultListLocator_ =
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   123
    "response.results". Bracket notation can also be used for array indices or
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   124
    object properties (e.g. "response['results']");  This is called a "path
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   125
    locator"
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   126
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   127
    Field data in the result list is extracted with field identifiers in
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   128
    _schema.resultFields_.  Field identifiers are objects with the following
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   129
    properties:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   130
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   131
      * `key`   : <strong>(required)</strong> The path locator (String)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   132
      * `parser`: A function or the name of a function on `Y.Parsers` used
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   133
            to convert the input value into a normalized type.  Parser
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   134
            functions are passed the value as input and are expected to
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   135
            return a value.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   136
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   137
    If no value parsing is needed, you can use path locators (strings) 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   138
    instead of field identifiers (objects) -- see example below.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   139
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   140
    If no processing of the result list array is needed, _schema.resultFields_
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   141
    can be omitted; the `response.results` will point directly to the array.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   142
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   143
    If the result list contains arrays, `response.results` will contain an
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   144
    array of objects with key:value pairs assuming the fields in
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   145
    _schema.resultFields_ are ordered in accordance with the data array
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   146
    values.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   147
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   148
    If the result list contains objects, the identified _schema.resultFields_
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   149
    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
   150
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   151
    To extract additional information from the JSON, include an array of
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   152
    path locators in _schema.metaFields_.  The collected values will be
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   153
    stored in `response.meta`.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   154
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   155
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   156
    @example
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   157
        // Process array of arrays
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   158
        var schema = {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   159
                resultListLocator: 'produce.fruit',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   160
                resultFields: [ 'name', 'color' ]
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   161
            },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   162
            data = {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   163
                produce: {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   164
                    fruit: [
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   165
                        [ 'Banana', 'yellow' ],
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   166
                        [ 'Orange', 'orange' ],
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   167
                        [ 'Eggplant', 'purple' ]
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   168
                    ]
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
        var response = Y.DataSchema.JSON.apply(schema, data);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   173
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   174
        // response.results[0] is { name: "Banana", color: "yellow" }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   175
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   176
        
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   177
        // Process array of objects + some metadata
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   178
        schema.metaFields = [ 'lastInventory' ];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   179
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   180
        data = {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   181
            produce: {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   182
                fruit: [
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   183
                    { name: 'Banana', color: 'yellow', price: '1.96' },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   184
                    { name: 'Orange', color: 'orange', price: '2.04' },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   185
                    { name: 'Eggplant', color: 'purple', price: '4.31' }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   186
                ]
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   187
            },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   188
            lastInventory: '2011-07-19'
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   189
        };
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   190
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   191
        response = Y.DataSchema.JSON.apply(schema, data);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   192
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   193
        // response.results[0] is { name: "Banana", color: "yellow" }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   194
        // response.meta.lastInventory is '2001-07-19'
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   195
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   196
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   197
        // Use parsers
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   198
        schema.resultFields = [
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   199
            {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   200
                key: 'name',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   201
                parser: function (val) { return val.toUpperCase(); }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   202
            },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   203
            {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   204
                key: 'price',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   205
                parser: 'number' // Uses Y.Parsers.number
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   206
            }
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
        response = Y.DataSchema.JSON.apply(schema, data);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   210
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   211
        // Note price was converted from a numeric string to a number
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   212
        // response.results[0] looks like { fruit: "BANANA", price: 1.96 }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   213
     
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   214
    @method apply
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   215
    @param {Object} [schema] Schema to apply.  Supported configuration
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   216
        properties are:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   217
      @param {String} [schema.resultListLocator] Path locator for the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   218
          location of the array of records to flatten into `response.results`
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   219
      @param {Array} [schema.resultFields] Field identifiers to
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   220
          locate/assign values in the response records. See above for
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   221
          details.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   222
      @param {Array} [schema.metaFields] Path locators to extract extra
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   223
          non-record related information from the data object.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   224
    @param {Object|Array|String} data JSON data or its string serialization.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   225
    @return {Object} An Object with properties `results` and `meta`
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   226
    @static
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   227
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   228
    apply: function(schema, data) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   229
        var data_in = data,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   230
            data_out = { results: [], meta: {} };
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   231
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   232
        // Convert incoming JSON strings
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   233
        if (!isObject(data)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   234
            try {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   235
                data_in = Y.JSON.parse(data);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   236
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   237
            catch(e) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   238
                data_out.error = e;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   239
                return data_out;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   240
            }
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
        if (isObject(data_in) && schema) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   244
            // Parse results data
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   245
            data_out = SchemaJSON._parseResults.call(this, schema, data_in, data_out);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   246
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   247
            // Parse meta data
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   248
            if (schema.metaFields !== undefined) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   249
                data_out = SchemaJSON._parseMeta(schema.metaFields, data_in, data_out);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   250
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   251
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   252
        else {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   253
            data_out.error = new Error("JSON schema parse failure");
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   254
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   255
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   256
        return data_out;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   257
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   258
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   259
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   260
     * Schema-parsed list of results from full data
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   261
     *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   262
     * @method _parseResults
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   263
     * @param schema {Object} Schema to parse against.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   264
     * @param json_in {Object} JSON to parse.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   265
     * @param data_out {Object} In-progress parsed data to update.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   266
     * @return {Object} Parsed data object.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   267
     * @static
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   268
     * @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   269
     */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   270
    _parseResults: function(schema, json_in, data_out) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   271
        var getPath  = SchemaJSON.getPath,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   272
            getValue = SchemaJSON.getLocationValue,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   273
            path     = getPath(schema.resultListLocator),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   274
            results  = path ?
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   275
                        (getValue(path, json_in) ||
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   276
                         // Fall back to treat resultListLocator as a simple key
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   277
                            json_in[schema.resultListLocator]) :
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   278
                        // Or if no resultListLocator is supplied, use the input
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   279
                        json_in;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   280
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   281
        if (isArray(results)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   282
            // if no result fields are passed in, then just take
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   283
            // the results array whole-hog Sometimes you're getting
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   284
            // an array of strings, or want the whole object, so
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   285
            // resultFields don't make sense.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   286
            if (isArray(schema.resultFields)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   287
                data_out = SchemaJSON._getFieldValues.call(this, schema.resultFields, results, data_out);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   288
            } else {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   289
                data_out.results = results;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   290
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   291
        } else if (schema.resultListLocator) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   292
            data_out.results = [];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   293
            data_out.error = new Error("JSON results retrieval failure");
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   294
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   295
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   296
        return data_out;
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
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   300
     * Get field data values out of list of full results
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   301
     *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   302
     * @method _getFieldValues
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   303
     * @param fields {Array} Fields to find.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   304
     * @param array_in {Array} Results to parse.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   305
     * @param data_out {Object} In-progress parsed data to update.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   306
     * @return {Object} Parsed data object.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   307
     * @static
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   308
     * @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   309
     */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   310
    _getFieldValues: function(fields, array_in, data_out) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   311
        var results = [],
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   312
            len = fields.length,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   313
            i, j,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   314
            field, key, locator, path, parser, val,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   315
            simplePaths = [], complexPaths = [], fieldParsers = [],
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   316
            result, record;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   317
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   318
        // First collect hashes of simple paths, complex paths, and parsers
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   319
        for (i=0; i<len; i++) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   320
            field = fields[i]; // A field can be a simple string or a hash
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   321
            key = field.key || field; // Find the key
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   322
            locator = field.locator || key; // Find the locator
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   323
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   324
            // Validate and store locators for later
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   325
            path = SchemaJSON.getPath(locator);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   326
            if (path) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   327
                if (path.length === 1) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   328
                    simplePaths.push({
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   329
                        key : key,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   330
                        path: path[0]
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   331
                    });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   332
                } else {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   333
                    complexPaths.push({
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   334
                        key    : key,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   335
                        path   : path,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   336
                        locator: locator
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   337
                    });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   338
                }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   339
            } else {
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
            // Validate and store parsers for later
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   343
            //TODO: use Y.DataSchema.parse?
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   344
            parser = (isFunction(field.parser)) ?
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   345
                        field.parser :
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   346
                        Y.Parsers[field.parser + ''];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   347
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   348
            if (parser) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   349
                fieldParsers.push({
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   350
                    key   : key,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   351
                    parser: parser
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   352
                });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   353
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   354
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   355
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   356
        // Traverse list of array_in, creating records of simple fields,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   357
        // complex fields, and applying parsers as necessary
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   358
        for (i=array_in.length-1; i>=0; --i) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   359
            record = {};
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   360
            result = array_in[i];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   361
            if(result) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   362
                // Cycle through complexLocators
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   363
                for (j=complexPaths.length - 1; j>=0; --j) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   364
                    path = complexPaths[j];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   365
                    val = SchemaJSON.getLocationValue(path.path, result);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   366
                    if (val === undefined) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   367
                        val = SchemaJSON.getLocationValue([path.locator], result);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   368
                        // Fail over keys like "foo.bar" from nested parsing
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   369
                        // to single token parsing if a value is found in
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   370
                        // results["foo.bar"]
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   371
                        if (val !== undefined) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   372
                            simplePaths.push({
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   373
                                key:  path.key,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   374
                                path: path.locator
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   375
                            });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   376
                            // Don't try to process the path as complex
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   377
                            // for further results
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   378
                            complexPaths.splice(i,1);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   379
                            continue;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   380
                        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   381
                    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   382
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   383
                    record[path.key] = Base.parse.call(this,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   384
                        (SchemaJSON.getLocationValue(path.path, result)), path);
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
                // Cycle through simpleLocators
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   388
                for (j = simplePaths.length - 1; j >= 0; --j) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   389
                    path = simplePaths[j];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   390
                    // Bug 1777850: The result might be an array instead of object
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   391
                    record[path.key] = Base.parse.call(this,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   392
                            ((result[path.path] === undefined) ?
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   393
                            result[j] : result[path.path]), path);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   394
                }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   395
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   396
                // Cycle through fieldParsers
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   397
                for (j=fieldParsers.length-1; j>=0; --j) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   398
                    key = fieldParsers[j].key;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   399
                    record[key] = fieldParsers[j].parser.call(this, record[key]);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   400
                    // Safety net
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   401
                    if (record[key] === undefined) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   402
                        record[key] = null;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   403
                    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   404
                }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   405
                results[i] = record;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   406
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   407
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   408
        data_out.results = results;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   409
        return data_out;
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
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   413
     * Parses results data according to schema
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   414
     *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   415
     * @method _parseMeta
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   416
     * @param metaFields {Object} Metafields definitions.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   417
     * @param json_in {Object} JSON to parse.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   418
     * @param data_out {Object} In-progress parsed data to update.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   419
     * @return {Object} Schema-parsed meta data.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   420
     * @static
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   421
     * @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   422
     */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   423
    _parseMeta: function(metaFields, json_in, data_out) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   424
        if (isObject(metaFields)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   425
            var key, path;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   426
            for(key in metaFields) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   427
                if (metaFields.hasOwnProperty(key)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   428
                    path = SchemaJSON.getPath(metaFields[key]);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   429
                    if (path && json_in) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   430
                        data_out.meta[key] = SchemaJSON.getLocationValue(path, json_in);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   431
                    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   432
                }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   433
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   434
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   435
        else {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   436
            data_out.error = new Error("JSON meta data retrieval failure");
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   437
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   438
        return data_out;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   439
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   440
};
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   441
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   442
// TODO: Y.Object + mix() might be better here
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   443
Y.DataSchema.JSON = Y.mix(SchemaJSON, Base);
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
}, '3.10.3', {"requires": ["dataschema-base", "json"]});