aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLeonid Logvinov <logvinov.leon@gmail.com>2018-05-30 01:58:46 +0800
committerGitHub <noreply@github.com>2018-05-30 01:58:46 +0800
commita4726a0e0d78416dc9fe4387d44f4a83b64c5f92 (patch)
tree97250eebad47ea12628756c075002d6fb323a429
parented5b9c2b56185fc5d8e83c17d85cc8044fee0872 (diff)
parent98652997f9e460de14f7a1199eccee1951d6c4d7 (diff)
downloaddexon-sol-tools-a4726a0e0d78416dc9fe4387d44f4a83b64c5f92.tar
dexon-sol-tools-a4726a0e0d78416dc9fe4387d44f4a83b64c5f92.tar.gz
dexon-sol-tools-a4726a0e0d78416dc9fe4387d44f4a83b64c5f92.tar.bz2
dexon-sol-tools-a4726a0e0d78416dc9fe4387d44f4a83b64c5f92.tar.lz
dexon-sol-tools-a4726a0e0d78416dc9fe4387d44f4a83b64c5f92.tar.xz
dexon-sol-tools-a4726a0e0d78416dc9fe4387d44f4a83b64c5f92.tar.zst
dexon-sol-tools-a4726a0e0d78416dc9fe4387d44f4a83b64c5f92.zip
Merge pull request #621 from 0xProject/feature/compiler-assertions
Add schema assertions on public methods of @0xproject/sol-compiler
-rw-r--r--packages/assert/src/index.ts3
-rw-r--r--packages/sol-compiler/CHANGELOG.json14
-rw-r--r--packages/sol-compiler/package.json1
-rw-r--r--packages/sol-compiler/src/cli.ts2
-rw-r--r--packages/sol-compiler/src/compiler.ts17
-rw-r--r--packages/sol-compiler/src/schemas/compiler_options_schema.ts26
6 files changed, 56 insertions, 7 deletions
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));
diff --git a/packages/sol-compiler/CHANGELOG.json b/packages/sol-compiler/CHANGELOG.json
index 33fd99e4f..e0ebd3a2d 100644
--- a/packages/sol-compiler/CHANGELOG.json
+++ b/packages/sol-compiler/CHANGELOG.json
@@ -1,5 +1,19 @@
[
{
+ "version": "0.5.1",
+ "changes": [
+ {
+ "note": "Make `opts` constructor parameter optional",
+ "pr": 621
+ },
+ {
+ "note": "Add schema validation for compiler configuration",
+ "pr": 621
+ }
+ ],
+ "timestamp": 1527009133
+ },
+ {
"version": "0.5.0",
"changes": [
{
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..1d5bdb940 100644
--- a/packages/sol-compiler/src/compiler.ts
+++ b/packages/sol-compiler/src/compiler.ts
@@ -1,3 +1,4 @@
+import { assert } from '@0xproject/assert';
import {
ContractSource,
ContractSources,
@@ -22,6 +23,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,
@@ -80,16 +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())
: {};
- 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;
+ const passedOpts = opts || {};
+ assert.doesConformToSchema('compiler.json', config, compilerOptionsSchema);
+ 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());
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,
+};