-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #186 from sosna/develop
Merge release 2.20.0
- Loading branch information
Showing
25 changed files
with
3,604 additions
and
2,129 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,97 @@ | ||
{AvailabilityMode} = require './availability-mode' | ||
{AvailabilityReferences} = require './availability-references' | ||
{ContextRefType, Sdmx3SeriesKeyType, NestedNCNameIDType, FiltersType} = | ||
require '../utils/sdmx-patterns' | ||
{isValidEnum, isValidPattern, isValidDate, createErrorMessage} = | ||
require '../utils/validators' | ||
|
||
defaults = | ||
context: '*=*:*(*)' | ||
key: '*' | ||
component: '*' | ||
filters: [] | ||
mode: AvailabilityMode.EXACT | ||
references: AvailabilityReferences.NONE | ||
|
||
isValidKey = (input, name, errors) -> | ||
valid = true | ||
if input.indexOf(",") > -1 | ||
for i in input.split "," | ||
r = isValidPattern(i, Sdmx3SeriesKeyType, name, errors) | ||
valid = false unless r | ||
else | ||
r = isValidPattern(input, Sdmx3SeriesKeyType, name, errors) | ||
valid = false unless r | ||
valid | ||
|
||
isValidFilters = (input, name, errors) -> | ||
valid = true | ||
for filter in input | ||
r = isValidPattern(filter, FiltersType, name, errors) | ||
valid = false unless r | ||
valid | ||
|
||
isValidComp = (input, name, errors) -> | ||
valid = true | ||
if input isnt '*' | ||
if input.indexOf(",") > -1 | ||
for i in input.split "," | ||
r = isValidPattern(i, NestedNCNameIDType, name, errors) | ||
valid = false unless r | ||
else | ||
r = isValidPattern(input, NestedNCNameIDType, name, errors) | ||
valid = false unless r | ||
valid | ||
|
||
ValidQuery = | ||
context: (i, e) -> isValidPattern(i, ContextRefType, 'context', e) | ||
key: (i, e) -> isValidKey(i, 'series key', e) | ||
component: (i, e) -> isValidComp(i, 'component', e) | ||
updatedAfter: (i, e) -> not i or isValidDate(i, 'updatedAfter', e) | ||
filters: (i, e) -> isValidFilters(i, 'filters', e) | ||
mode: (i, e) -> isValidEnum(i, AvailabilityMode, 'mode', e) | ||
references: (i, e) -> isValidEnum(i, AvailabilityReferences, 'references', e) | ||
|
||
isValidQuery = (q) -> | ||
errors = [] | ||
isValid = false | ||
for own k, v of q | ||
isValid = ValidQuery[k](v, errors) | ||
break unless isValid | ||
{isValid: isValid, errors: errors} | ||
|
||
expected = [ | ||
"context" | ||
"key" | ||
"component" | ||
"updatedAfter" | ||
"filters" | ||
"mode" | ||
"references" | ||
] | ||
|
||
query = class AvailabilityQuery | ||
|
||
@from: (opts) -> | ||
if opts | ||
for own k, v of opts | ||
throw Error createErrorMessage([], 'availability query') \ | ||
unless k in expected | ||
context = opts?.context ? defaults.context | ||
key = opts?.key ? defaults.key | ||
filters = opts?.filters ? defaults.filters | ||
filters = [filters] if not Array.isArray filters | ||
query = | ||
context: context | ||
key: key | ||
component: opts?.component ? defaults.component | ||
updatedAfter: opts?.updatedAfter | ||
filters: filters | ||
mode: opts?.mode ? defaults.mode | ||
references: opts?.references ? defaults.references | ||
input = isValidQuery query | ||
throw Error createErrorMessage(input.errors, 'availability query') \ | ||
unless input.isValid | ||
query | ||
|
||
exports.AvailabilityQuery2 = query |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,120 @@ | ||
{ContextRefType, Sdmx3SeriesKeyType, NCNameIDType, FiltersType} = | ||
require '../utils/sdmx-patterns' | ||
{isValidPattern, isValidDate, createErrorMessage} = | ||
require '../utils/validators' | ||
|
||
defaults = | ||
context: '*=*:*(*)' | ||
key: '*' | ||
history: false | ||
attributes: 'dsd' | ||
measures: 'all' | ||
filters: [] | ||
|
||
isValidHistory = (input, errors) -> | ||
valid = typeof input is 'boolean' | ||
errors.push "#{input} is not a valid value for history. Must be true or \ | ||
false" unless valid | ||
valid | ||
|
||
isValidNObs = (input, name, errors) -> | ||
valid = typeof input is 'number' and input > 0 | ||
errors.push "#{input} is not a valid value for #{name}. Must be a positive \ | ||
integer" unless valid | ||
valid | ||
|
||
isValidComp = (input, name, errors) -> | ||
valid = true | ||
if input.indexOf(",") > -1 | ||
for i in input.split "," | ||
r = isValidPattern(i, NCNameIDType, name, errors) | ||
valid = false unless r | ||
else | ||
r = isValidPattern(input, NCNameIDType, name, errors) | ||
valid = false unless r | ||
valid | ||
|
||
isValidKey = (input, name, errors) -> | ||
valid = true | ||
if input.indexOf(",") > -1 | ||
for i in input.split "," | ||
r = isValidPattern(i, Sdmx3SeriesKeyType, name, errors) | ||
valid = false unless r | ||
else | ||
r = isValidPattern(input, Sdmx3SeriesKeyType, name, errors) | ||
valid = false unless r | ||
valid | ||
|
||
isValidFilters = (input, name, errors) -> | ||
valid = true | ||
for filter in input | ||
r = isValidPattern(filter, FiltersType, name, errors) | ||
valid = false unless r | ||
valid | ||
|
||
|
||
ValidQuery = | ||
context: (i, e) -> isValidPattern(i, ContextRefType, 'context', e) | ||
key: (i, e) -> isValidKey(i, 'series key', e) | ||
updatedAfter: (i, e) -> not i or isValidDate(i, 'updatedAfter', e) | ||
firstNObs: (i, e) -> not i or isValidNObs(i, 'firstNObs', e) | ||
lastNObs: (i, e) -> not i or isValidNObs(i, 'lastNObs', e) | ||
obsDimension: (i, e) -> | ||
not i or isValidPattern(i, NCNameIDType, 'obs dimension', e) | ||
history: (i, e) -> isValidHistory(i, e) | ||
attributes: (i, e) -> isValidComp(i, 'attributes', e) | ||
measures: (i, e) -> isValidComp(i, 'measures', e) | ||
filters: (i, e) -> isValidFilters(i, 'filters', e) | ||
|
||
isValidQuery = (q) -> | ||
errors = [] | ||
isValid = false | ||
for own k, v of q | ||
isValid = ValidQuery[k](v, errors) | ||
break unless isValid | ||
{isValid: isValid, errors: errors} | ||
|
||
expected = [ | ||
"context" | ||
"key" | ||
"updatedAfter" | ||
"firstNObs" | ||
"lastNObs" | ||
"obsDimension" | ||
"history" | ||
"attributes" | ||
"measures" | ||
"filters" | ||
] | ||
|
||
# A query for data, as defined by the SDMX RESTful API. | ||
query = class DataQuery | ||
|
||
@from: (opts) -> | ||
if opts | ||
for own k, v of opts | ||
throw Error createErrorMessage([], 'data query') \ | ||
unless k in expected | ||
context = opts?.context ? defaults.context | ||
key = opts?.key ? defaults.key | ||
attrs = opts?.attributes ? defaults.attributes | ||
measures = opts?.measures ? defaults.measures | ||
filters = opts?.filters ? defaults.filters | ||
filters = [filters] if not Array.isArray filters | ||
query = | ||
context: context | ||
key: key | ||
updatedAfter: opts?.updatedAfter | ||
firstNObs: opts?.firstNObs | ||
lastNObs: opts?.lastNObs | ||
obsDimension: opts?.obsDimension | ||
history: opts?.history ? defaults.history | ||
attributes: attrs | ||
measures: measures | ||
filters: filters | ||
input = isValidQuery query | ||
throw Error createErrorMessage(input.errors, 'data query') \ | ||
unless input.isValid | ||
query | ||
|
||
exports.DataQuery2 = query |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.