function updateExchangeCount (fileName) { log.bright.cyan ('Updating exchange count →', fileName.yellow) let oldContent = fs.readFileSync (fileName, 'utf8') let newContent = oldContent.replace (/shields\.io\/badge\/exchanges\-[0-9a-z]+\-blue/g, 'shields.io/badge/exchanges-' + ccxt.exchanges.length + '-blue') fs.truncateSync (fileName) fs.writeFileSync (fileName, newContent) }
let maxConcurrency = Number.MAX_VALUE // no limit for (const arg of args) { if (arg.startsWith ('--')) { keys[arg] = true } else if (arg.includes ('/')) { symbol = arg } else if (Number.isFinite (Number (arg))) { maxConcurrency = Number (arg) } else { exchanges.push (arg) } } /* --------------------------------------------------------------------------- */ if (!exchanges.length) { if (!fs.existsSync ('./exchanges.json')) { log.bright.red ('\n\tNo', 'exchanges.json'.white, 'found, please run', 'npm run build'.white, 'to generate it!\n') process.exit (1) } exchanges = require ('./exchanges.json').ids } /* --------------------------------------------------------------------------- */ const sleep = s => new Promise (resolve => setTimeout (resolve, s*1000)) const timeout = (s, promise) => Promise.race ([ promise, sleep (s).then (() => { throw new Error ('timed out') }) ]) /* --------------------------------------------------------------------------- */ const exec = (bin, ...args) =>
//----------------------------------------------------------------------------- function exportTypeScriptDeclarations (classes) { const file = './ccxt.d.ts' const regex = /(?: export class [^\s]+ extends [^\s]+ \{\}[\r]?[\n])+/ const replacement = Object.keys (classes).map (className => { const baseClass = classes[className] return ' export class ' + className + ' extends ' + baseClass + " {}" }).join ("\n") + "\n" replaceInFile (file, regex, replacement) } //----------------------------------------------------------------------------- createFolderRecursively (python2Folder) createFolderRecursively (python3Folder) createFolderRecursively (phpFolder) const classes = transpileDerivedExchangeFiles ('./js/') exportTypeScriptDeclarations (classes) transpilePythonAsyncToSync ('./python/test/test_async.py', './python/test/test.py') //----------------------------------------------------------------------------- log.bright.green ('Transpiled successfully.')
].forEach (({ file, regex, replacement }) => { log.bright.cyan ('Exporting exchanges →', file.yellow) replaceInFile (file, regex, replacement) })
const log = require ('ololog') const ansi = require ('ansicolor').nice // --------------------------------------------------------------------------- let exchanges let verbose = false // --------------------------------------------------------------------------- let wikiPath = 'wiki' let gitWikiPath = 'ccxt.wiki' if (!fs.existsSync (gitWikiPath)) { log.bright.cyan ('Checking out ccxt.wiki...') execSync ('git clone https://github.com/ccxt/ccxt.wiki.git') } // --------------------------------------------------------------------------- function replaceInFile (filename, regex, replacement) { let contents = fs.readFileSync (filename, 'utf8') const parts = contents.split (regex) const newContents = parts[0] + replacement + parts[1] fs.truncateSync (filename) fs.writeFileSync (filename, newContents) } // ---------------------------------------------------------------------------
"use strict"; const fs = require ('fs') const ccxt = require ('./ccxt') const log = require ('ololog') const ansi = require ('ansicolor').nice //----------------------------------------------------------------------------- let readmeRst = './python/README.rst' log.bright.cyan ('Preparing for PyPI →', readmeRst.yellow) let rst = fs.readFileSync (readmeRst, 'utf8') let rstNew = rst.replace (/\`([^\`]+)\s\<\#[^\`]+\>\`\_\_/g, '$1') // PyPI doesn't like urls containing anchor hash symbol '#', strip it off to plain text .replace (/\\\|/g, '|') // PyPI doesn't like escaped vertical bars .replace (/\\\_/g, ' _') // PyPI doesn't like escaped underscores .replace (/\|(\_[^\|]+)\|([\ ]+)\|/g, '|$1| $2|') // .replace (/\|\\(\_[^\|]+)\|/g, '|$1|') let rstExchangeTableRegex = /([\s\S]+?)APIs:(?:(?:[\r][\n]){2}|[\n]{2})(\+\-\-[\s\S]+\-\-\+)(?:(?:[\r][\n]){2}|[\n]{2})([\s\S]+)/ let match = rstExchangeTableRegex.exec (rstNew) let rstExchangeTableLines = match[2].split ("\n") let newRstExchangeTable = rstExchangeTableLines.map (line => { return line.replace (/(\||\+)(.).+?(\s|\=|\-)(\||\+)/, '$1') // replace ascii table graphics }).join ("\n") rstNew = match[1] + "APIs:\n\n" + newRstExchangeTable + "\n\n" + match[3]