From 549e6d57c44abcd7e59699f739027d190d4e3bd7 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Thu, 24 May 2018 16:33:58 -0700 Subject: Add schema assertions on public methods of @0xproject/sol-compiler --- packages/sol-compiler/package.json | 1 + packages/sol-compiler/src/cli.ts | 2 +- packages/sol-compiler/src/compiler.ts | 5 +++++ .../src/schemas/compiler_options_schema.ts | 26 ++++++++++++++++++++++ 4 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 packages/sol-compiler/src/schemas/compiler_options_schema.ts (limited to 'packages') diff --git a/packages/sol-compiler/package.json b/packages/sol-compiler/package.json index 7e55d718d..a74e4ae3e 100644 --- a/packages/sol-compiler/package.json +++ b/packages/sol-compiler/package.json @@ -72,6 +72,7 @@ "zeppelin-solidity": "1.8.0" }, "dependencies": { + "@0xproject/assert": "0.2.10", "@0xproject/json-schemas": "0.7.22", "@0xproject/sol-resolver": "^0.0.5", "@0xproject/types": "^0.7.0", diff --git a/packages/sol-compiler/src/cli.ts b/packages/sol-compiler/src/cli.ts index d107e8b37..b97cf4cab 100644 --- a/packages/sol-compiler/src/cli.ts +++ b/packages/sol-compiler/src/cli.ts @@ -35,7 +35,7 @@ const SEPARATOR = ','; : argv.contracts === DEFAULT_CONTRACTS_LIST ? DEFAULT_CONTRACTS_LIST : argv.contracts.split(SEPARATOR); - const opts: CompilerOptions = { + const opts = { contractsDir: argv.contractsDir, artifactsDir: argv.artifactsDir, contracts, diff --git a/packages/sol-compiler/src/compiler.ts b/packages/sol-compiler/src/compiler.ts index 2ebc5228e..d063b27a1 100644 --- a/packages/sol-compiler/src/compiler.ts +++ b/packages/sol-compiler/src/compiler.ts @@ -1,3 +1,5 @@ +import { assert } from '@0xproject/assert'; +import { schemas } from '@0xproject/json-schemas'; import { ContractSource, ContractSources, @@ -22,6 +24,7 @@ import * as requireFromString from 'require-from-string'; import * as semver from 'semver'; import solc = require('solc'); +import { compilerOptionsSchema } from './schemas/compiler_options_schema'; import { binPaths } from './solc/bin_paths'; import { createDirIfDoesNotExistAsync, @@ -81,10 +84,12 @@ export class Compiler { * @return An instance of the Compiler class. */ constructor(opts: CompilerOptions) { + assert.doesConformToSchema('opts', opts, compilerOptionsSchema); // TODO: Look for config file in parent directories if not found in current directory const config: CompilerOptions = fs.existsSync(CONFIG_FILE) ? JSON.parse(fs.readFileSync(CONFIG_FILE).toString()) : {}; + assert.doesConformToSchema('compiler.json', config, compilerOptionsSchema); this._contractsDir = opts.contractsDir || config.contractsDir || DEFAULT_CONTRACTS_DIR; this._solcVersionIfExists = opts.solcVersion || config.solcVersion; this._compilerSettings = opts.compilerSettings || config.compilerSettings || DEFAULT_COMPILER_SETTINGS; diff --git a/packages/sol-compiler/src/schemas/compiler_options_schema.ts b/packages/sol-compiler/src/schemas/compiler_options_schema.ts new file mode 100644 index 000000000..43a9c0879 --- /dev/null +++ b/packages/sol-compiler/src/schemas/compiler_options_schema.ts @@ -0,0 +1,26 @@ +export const compilerOptionsSchema = { + id: '/CompilerOptions', + properties: { + contractsDir: { type: 'string' }, + artifactsDir: { type: 'string' }, + solcVersion: { type: 'string', pattern: '^d+.d+.d+$' }, + compilerSettings: { type: 'object' }, + contracts: { + oneOf: [ + { + type: 'string', + pattern: '^\\*$', + }, + { + type: 'array', + items: { + type: 'string', + }, + }, + ], + }, + }, + type: 'object', + required: [], + additionalProperties: false, +}; -- cgit v1.2.3 From cc7b0f4623ef1f9590a81a0f2206241df1abeb31 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Thu, 24 May 2018 16:36:39 -0700 Subject: Add CHANGELOG entry --- packages/sol-compiler/CHANGELOG.json | 10 ++++++++++ packages/sol-compiler/src/compiler.ts | 1 - 2 files changed, 10 insertions(+), 1 deletion(-) (limited to 'packages') diff --git a/packages/sol-compiler/CHANGELOG.json b/packages/sol-compiler/CHANGELOG.json index 33fd99e4f..db24ad78b 100644 --- a/packages/sol-compiler/CHANGELOG.json +++ b/packages/sol-compiler/CHANGELOG.json @@ -1,4 +1,14 @@ [ + { + "version": "0.5.1", + "changes": [ + { + "note": "Add schema validation for compiler configuration", + "pr": 621 + } + ], + "timestamp": 1527009133 + }, { "version": "0.5.0", "changes": [ diff --git a/packages/sol-compiler/src/compiler.ts b/packages/sol-compiler/src/compiler.ts index d063b27a1..2cd8311d1 100644 --- a/packages/sol-compiler/src/compiler.ts +++ b/packages/sol-compiler/src/compiler.ts @@ -1,5 +1,4 @@ import { assert } from '@0xproject/assert'; -import { schemas } from '@0xproject/json-schemas'; import { ContractSource, ContractSources, -- cgit v1.2.3 From 9854db0a63fcf356425d307b4813e3ed65c38066 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Thu, 24 May 2018 16:52:35 -0700 Subject: Throw if trying to schema-validate an undefined --- packages/assert/src/index.ts | 3 +++ 1 file changed, 3 insertions(+) (limited to 'packages') diff --git a/packages/assert/src/index.ts b/packages/assert/src/index.ts index f3b3651d5..95c7b658b 100644 --- a/packages/assert/src/index.ts +++ b/packages/assert/src/index.ts @@ -64,6 +64,9 @@ export const assert = { this.assert(isWeb3Provider, this.typeAssertionMessage(variableName, 'Provider', value)); }, doesConformToSchema(variableName: string, value: any, schema: Schema, subSchemas?: Schema[]): void { + if (_.isUndefined(value)) { + throw new Error(`${variableName} can't be undefined`); + } const schemaValidator = new SchemaValidator(); if (!_.isUndefined(subSchemas)) { _.map(subSchemas, schemaValidator.addSchema.bind(schemaValidator)); -- cgit v1.2.3 From f5a39c2f7bcd8647e3f309116733da1406b0bb5f Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Thu, 24 May 2018 16:56:12 -0700 Subject: Make opts param optional in Compiler --- packages/sol-compiler/src/compiler.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'packages') diff --git a/packages/sol-compiler/src/compiler.ts b/packages/sol-compiler/src/compiler.ts index 2cd8311d1..1d5bdb940 100644 --- a/packages/sol-compiler/src/compiler.ts +++ b/packages/sol-compiler/src/compiler.ts @@ -82,18 +82,19 @@ export class Compiler { * Instantiates a new instance of the Compiler class. * @return An instance of the Compiler class. */ - constructor(opts: CompilerOptions) { + constructor(opts?: CompilerOptions) { assert.doesConformToSchema('opts', opts, compilerOptionsSchema); // TODO: Look for config file in parent directories if not found in current directory const config: CompilerOptions = fs.existsSync(CONFIG_FILE) ? JSON.parse(fs.readFileSync(CONFIG_FILE).toString()) : {}; + const passedOpts = opts || {}; assert.doesConformToSchema('compiler.json', config, compilerOptionsSchema); - this._contractsDir = opts.contractsDir || config.contractsDir || DEFAULT_CONTRACTS_DIR; - this._solcVersionIfExists = opts.solcVersion || config.solcVersion; - this._compilerSettings = opts.compilerSettings || config.compilerSettings || DEFAULT_COMPILER_SETTINGS; - this._artifactsDir = opts.artifactsDir || config.artifactsDir || DEFAULT_ARTIFACTS_DIR; - this._specifiedContracts = opts.contracts || config.contracts || ALL_CONTRACTS_IDENTIFIER; + this._contractsDir = passedOpts.contractsDir || config.contractsDir || DEFAULT_CONTRACTS_DIR; + this._solcVersionIfExists = passedOpts.solcVersion || config.solcVersion; + this._compilerSettings = passedOpts.compilerSettings || config.compilerSettings || DEFAULT_COMPILER_SETTINGS; + this._artifactsDir = passedOpts.artifactsDir || config.artifactsDir || DEFAULT_ARTIFACTS_DIR; + this._specifiedContracts = passedOpts.contracts || config.contracts || ALL_CONTRACTS_IDENTIFIER; this._nameResolver = new NameResolver(path.resolve(this._contractsDir)); const resolver = new FallthroughResolver(); resolver.appendResolver(new URLResolver()); -- cgit v1.2.3 From 98652997f9e460de14f7a1199eccee1951d6c4d7 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Thu, 24 May 2018 16:56:53 -0700 Subject: Add a CHANGELOG entry --- packages/sol-compiler/CHANGELOG.json | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'packages') diff --git a/packages/sol-compiler/CHANGELOG.json b/packages/sol-compiler/CHANGELOG.json index db24ad78b..e0ebd3a2d 100644 --- a/packages/sol-compiler/CHANGELOG.json +++ b/packages/sol-compiler/CHANGELOG.json @@ -2,6 +2,10 @@ { "version": "0.5.1", "changes": [ + { + "note": "Make `opts` constructor parameter optional", + "pr": 621 + }, { "note": "Add schema validation for compiler configuration", "pr": 621 -- cgit v1.2.3