Skip to content

Commit

Permalink
Introduce strict / loose option
Browse files Browse the repository at this point in the history
  • Loading branch information
pietermees committed Jan 28, 2017
1 parent a69a145 commit 24f296d
Show file tree
Hide file tree
Showing 86 changed files with 80 additions and 41 deletions.
1 change: 1 addition & 0 deletions src/errors/loose.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default () => {}
3 changes: 3 additions & 0 deletions src/errors/strict.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export default err => {
throw err
}
6 changes: 3 additions & 3 deletions src/factory/ad.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import createInLine from './in-line'
import createWrapper from './wrapper'

export default ($ad) => {
export default ($ad, options) => {
if ($ad.inLine) {
return createInLine($ad)
return createInLine($ad, options)
} else if ($ad.wrapper) {
return createWrapper($ad)
return createWrapper($ad, options)
} else {
throw new Error('Unrecognized ad type')
}
Expand Down
4 changes: 2 additions & 2 deletions src/factory/creative.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ import createLinear from './linear'
import createNonLinearAds from './non-linear-ads'
import createCompanionAds from './companion-ads'

export default ($creative) => {
export default ($creative, options) => {
if ($creative.linear) {
return createLinear($creative)
return createLinear($creative, options)
} else if ($creative.nonLinearAds) {
return createNonLinearAds($creative)
} else if ($creative.companionAds) {
Expand Down
4 changes: 2 additions & 2 deletions src/factory/in-line.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ import {InLine} from 'iab-vast-model'
import inheritAd from '../inherit/ad'
import createPricing from './pricing'

export default ($ad) => {
export default ($ad, options) => {
const inLine = new InLine()
const $inLine = $ad.inLine
inheritAd($ad, $inLine, inLine)
inheritAd($ad, $inLine, inLine, options)
inLine.adTitle = ($inLine.adTitle != null) ? $inLine.adTitle._value : null
inLine.description = ($inLine.description != null) ? $inLine.description._value : null
inLine.advertiser = ($inLine.advertiser != null) ? $inLine.advertiser._value : null
Expand Down
6 changes: 3 additions & 3 deletions src/factory/linear.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,12 @@ const mapVideoClicks = ($videoClicks, videoClicks) => {
}
}

export default ($creative) => {
export default ($creative, options) => {
const $linear = $creative.linear
const linear = new Linear()
inheritCreative($creative, linear)
if (isNonEmptyString($linear.skipoffset)) {
linear.skipoffset = createTimeOffset($linear.skipoffset)
linear.skipoffset = createTimeOffset($linear.skipoffset, options)
}
if ($linear.adParameters) {
linear.adParameters = $linear.adParameters._value
Expand All @@ -35,7 +35,7 @@ export default ($creative) => {
if ($linear.mediaFiles && $linear.mediaFiles.mediaFile) {
linear.mediaFiles.push(...$linear.mediaFiles.mediaFile.map(createMediaFile))
}
mapTrackingEvents($linear.trackingEvents, linear.trackingEvents)
mapTrackingEvents($linear.trackingEvents, linear.trackingEvents, options)
if ($linear.videoClicks) {
mapVideoClicks($linear.videoClicks, linear.videoClicks)
}
Expand Down
8 changes: 6 additions & 2 deletions src/factory/time-offset.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
import {AbsoluteTimeOffset, RelativeTimeOffset} from 'iab-vast-model'
import parseTime from '../util/parse-time'

export default (offsetStr) => {
export default (offsetStr, options, err) => {
const lastChar = offsetStr.charAt(offsetStr.length - 1)
if (lastChar === '%') {
const offset = new RelativeTimeOffset()
offset.value = parseFloat(offsetStr.substr(0, offsetStr.length - 1))
return offset
} else {
const offset = new AbsoluteTimeOffset()
offset.value = parseTime(offsetStr)
try {
offset.value = parseTime(offsetStr)
} catch (err) {
options.errorHandler(err)
}
return offset
}
}
22 changes: 16 additions & 6 deletions src/factory/vast.js
Original file line number Diff line number Diff line change
@@ -1,22 +1,32 @@
import {VAST, AdPod} from 'iab-vast-model'
import createAd from './ad'

const createPod = ($ads) => {
const createPod = ($ads, options) => {
const pod = new AdPod()
for (const ad of $ads.map(createAd)) {
pod.ads.add(ad)
for (const $ad of $ads) {
try {
const createdAd = createAd($ad, options)
pod.ads.add(createdAd)
} catch (err) {
options.errorHandler(err)
}
}
return pod
}

export default ($vast) => {
export default ($vast, options) => {
const vast = new VAST()
vast.version = $vast.version
if ($vast.ad && $vast.ad.length > 0) {
if ($vast.ad.length > 1) {
vast.adPod = createPod($vast.ad)
vast.adPod = createPod($vast.ad, options)
} else {
vast.ads.add(createAd($vast.ad[0]))
try {
const createdAd = createAd($vast.ad[0], options)
vast.ads.add(createdAd)
} catch (err) {
options.errorHandler(err)
}
}
}
return vast
Expand Down
4 changes: 2 additions & 2 deletions src/factory/wrapper.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import {Wrapper} from 'iab-vast-model'
import inheritAd from '../inherit/ad'

export default ($ad) => {
export default ($ad, options) => {
const wrapper = new Wrapper()
const $wrapper = $ad.wrapper
inheritAd($ad, $wrapper, wrapper)
inheritAd($ad, $wrapper, wrapper, options)
wrapper.vastAdTagURI = ($wrapper.vastAdTagURI != null)
? $wrapper.vastAdTagURI._value
: null
Expand Down
8 changes: 8 additions & 0 deletions src/index.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,17 @@
import {DOMParser} from 'xmldom'
import parse from './parse'
import strictHandler from './errors/strict'
import looseHandler from './errors/loose'

const DEFAULT_OPTIONS = {
strict: false
}

export default (xml, options = {}) => {
options = Object.assign({}, DEFAULT_OPTIONS, options)
if (options.domParser == null) {
options.domParser = new DOMParser()
}
options.errorHandler = options.strict ? strictHandler : looseHandler
return parse(xml, options)
}
8 changes: 5 additions & 3 deletions src/inherit/ad.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import isNonEmptyString from '../util/is-non-empty-string'

const hasValue = ($node) => ($node != null && isNonEmptyString($node._value))

export default ($ad, $impl, ad) => {
export default ($ad, $impl, ad, options) => {
ad.id = $ad.id
ad.sequence = $ad.sequence
if ($impl.adSystem != null) {
Expand All @@ -27,9 +27,11 @@ export default ($ad, $impl, ad) => {
if ($impl.creatives != null && Array.isArray($impl.creatives.creative)) {
$impl.creatives.creative.forEach((creative) => {
try {
const parsedCreative = createCreative(creative)
const parsedCreative = createCreative(creative, options)
ad.creatives.add(parsedCreative)
} catch (err) {}
} catch (err) {
options.errorHandler(err)
}
})
}
if ($impl.extensions != null && Array.isArray($impl.extensions.extension)) {
Expand Down
2 changes: 1 addition & 1 deletion src/parse.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,5 @@ export default (xml, options = {}) => {
const elem = toElement(xml, options)
const unmarshaler = new Unmarshaler(schema)
const root = unmarshaler.unmarshal(elem)
return createVAST(root)
return createVAST(root, options)
}
8 changes: 6 additions & 2 deletions src/util/map-tracking-events.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import {TrackingEvent} from 'iab-vast-model'
import createTimeOffset from '../factory/time-offset'
import isNonEmptyString from './is-non-empty-string'

export default ($trackingEvents, trackingEvents) => {
export default ($trackingEvents, trackingEvents, options) => {
if ($trackingEvents == null || !Array.isArray($trackingEvents.tracking)) {
return
}
Expand All @@ -13,7 +13,11 @@ export default ($trackingEvents, trackingEvents) => {
const conf = new TrackingEvent()
conf.uri = $tracking._value
if ($tracking.event === 'progress' && isNonEmptyString($tracking.offset)) {
conf.offset = createTimeOffset($tracking.offset)
try {
conf.offset = createTimeOffset($tracking.offset)
} catch (err) {
options.errorHandler(err)
}
}
trackingEvents.add($tracking.event, conf)
}
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
37 changes: 22 additions & 15 deletions test/integration/setup.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@ import fsp from 'fs-promise'
import marshal from '../lib/marshal'
import parse from '../../src/'

const fixturesRoot = path.resolve(__dirname, '../fixtures')
const expectedRoot = path.resolve(__dirname, 'expected')
const strictFixturesRoot = path.resolve(__dirname, '../fixtures/strict')
const strictExpectedRoot = path.resolve(__dirname, 'expected/strict')
const looseFixturesRoot = path.resolve(__dirname, '../fixtures/loose')
const looseExpectedRoot = path.resolve(__dirname, 'expected/loose')

const describeTree = (node) => {
const describeTree = (node, expectedRoot, fixturesRoot) => {
for (const item of Object.keys(node)) {
if (typeof node[item] === 'string') {
const expPath = path.join(expectedRoot, node[item])
Expand All @@ -20,22 +22,27 @@ const describeTree = (node) => {
})
} else {
describe(item, () => {
describeTree(node[item])
describeTree(node[item], expectedRoot, fixturesRoot)
})
}
}
}

const root = Object.create(null)
for (const expFile of globule.find({cwd: expectedRoot, src: '**/*.json'})) {
const dirs = expFile.split('/')
const file = dirs.pop()
const id = path.basename(file, '.json')
let node = root
for (const dir of dirs) {
node[dir] = node[dir] || Object.create(null)
node = node[dir]
const createTree = dir => {
const root = Object.create(null)
for (const expFile of globule.find({cwd: dir, src: '**/*.json'})) {
const dirs = expFile.split('/')
const file = dirs.pop()
const id = path.basename(file, '.json')
let node = root
for (const dir of dirs) {
node[dir] = node[dir] || Object.create(null)
node = node[dir]
}
node[id] = expFile
}
node[id] = expFile
return root
}
describeTree(root)

describeTree(createTree(strictExpectedRoot), strictExpectedRoot, strictFixturesRoot)
describeTree(createTree(looseExpectedRoot), looseExpectedRoot, looseFixturesRoot)

0 comments on commit 24f296d

Please sign in to comment.