├── .npmrc ├── .gitattributes ├── docs ├── docpress.json ├── commands │ ├── remove.md │ ├── version.md │ ├── set.md │ ├── init.md │ ├── add.md │ └── release.md ├── examples.md ├── README.md └── plugins.md ├── test ├── fixtures │ ├── sample_directory │ │ ├── bower.json │ │ ├── component.json │ │ └── package.json │ └── plugin_directory │ │ ├── package.json │ │ └── .bumpedrc ├── mocha.opts └── index.coffee ├── index.js ├── .npmignore ├── .editorconfig ├── .gitignore ├── .bumpedrc ├── .bumpedrc_backup ├── .travis.yml ├── LICENSE.md ├── lib ├── Bumped.default.coffee ├── Bumped.animation.coffee ├── Bumped.logger.coffee ├── Bumped.coffee ├── Bumped.messages.coffee ├── Bumped.util.coffee ├── Bumped.plugin.coffee ├── Bumped.semver.coffee └── Bumped.config.coffee ├── bin ├── help.txt └── index.js ├── package.json ├── README.md └── CHANGELOG.md /.npmrc: -------------------------------------------------------------------------------- 1 | unsafe-perm=true 2 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | -------------------------------------------------------------------------------- /docs/docpress.json: -------------------------------------------------------------------------------- 1 | { 2 | "github": "bumped/bumped" 3 | } 4 | -------------------------------------------------------------------------------- /test/fixtures/sample_directory/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.1.0" 3 | } 4 | -------------------------------------------------------------------------------- /test/fixtures/plugin_directory/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "1.0.0" 3 | } 4 | -------------------------------------------------------------------------------- /test/fixtures/sample_directory/component.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.0.0" 3 | } 4 | -------------------------------------------------------------------------------- /test/fixtures/sample_directory/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0" 3 | } 4 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | require('coffee-script/register'); 3 | module.exports = require('lib/Bumped'); 4 | -------------------------------------------------------------------------------- /test/mocha.opts: -------------------------------------------------------------------------------- 1 | --bail 2 | --compilers coffee:coffee-script/register 3 | --require should 4 | --reporter spec 5 | --timeout 120000 6 | --slow 300 7 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .idea 2 | .project 3 | *.sublime-* 4 | .DS_Store 5 | *.seed 6 | *.log 7 | *.csv 8 | *.dat 9 | *.out 10 | *.pid 11 | *.swp 12 | *.swo 13 | node_modules 14 | coverage 15 | *.tgz 16 | *.xml 17 | -------------------------------------------------------------------------------- /docs/commands/remove.md: -------------------------------------------------------------------------------- 1 | # .remove 2 | 3 | It's used to remove configuration file under `files` path of `.bumpedrc`. 4 | 5 | ``` 6 | $ bumped remove component.json 7 | 8 | info : 'component.json' has been removed. 9 | ``` 10 | -------------------------------------------------------------------------------- /docs/examples.md: -------------------------------------------------------------------------------- 1 | # Examples 2 | 3 | A list of representative examples are: 4 | 5 | - [Bumped](https://github.com/Kikobeats/uno-zen/blob/master/.bumpedrc) 6 | - [Acho](https://github.com/achohq/acho/blob/master/.bumpedrc) 7 | - [Uno Zen](https://github.com/bumped/bumped/blob/master/.bumpedrc) 8 | -------------------------------------------------------------------------------- /test/fixtures/plugin_directory/.bumpedrc: -------------------------------------------------------------------------------- 1 | files: [ 2 | "package.json" 3 | ] 4 | 5 | plugins: 6 | prerelease: 7 | 'Saying hello': 8 | plugin: 'bumped-terminal' 9 | command: 'echo "hey man, hello!"' 10 | 11 | postrelease: 12 | 'Say good Day': 13 | plugin: 'bumped-terminal' 14 | command: 'echo "have a good day (night)!"' 15 | -------------------------------------------------------------------------------- /docs/commands/version.md: -------------------------------------------------------------------------------- 1 | # .version 2 | 3 | It prints the current synchronized version. 4 | 5 | ```bash 6 | $ bumped version 7 | 8 | info : Current version is '1.0.0'. 9 | ``` 10 | 11 | This means that the higher version declared across your configuration files is `1.0.0`. 12 | 13 | Every time that you do a release, the version will be updated in all the files. 14 | -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | # Table of contents 2 | 3 | * [Bumped](/README.md) 4 | * Commands 5 | * [.init](/docs/commands/init.md) 6 | * [.add](/docs/commands/add.md) 7 | * [.remove](/docs/commands/remove.md) 8 | * [.version](/docs/commands/version.md) 9 | * [.set](/docs/commands/set.md) 10 | * [.release](/docs/commands/release.md) 11 | * [Plugins](/docs/plugins.md) 12 | * [Examples](/docs/examples.md) 13 | * [Changelog](/CHANGELOG.md) 14 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | 3 | root = true 4 | 5 | [*] 6 | indent_style = space 7 | indent_size = 2 8 | end_of_line = lf 9 | charset = utf-8 10 | trim_trailing_whitespace = true 11 | insert_final_newline = true 12 | max_line_length = 80 13 | indent_brace_style = 1TBS 14 | spaces_around_operators = true 15 | quote_type = auto 16 | 17 | [package.json] 18 | indent_style = space 19 | indent_size = 2 20 | 21 | [*.md] 22 | trim_trailing_whitespace = false 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ############################ 2 | # npm 3 | ############################ 4 | node_modules 5 | npm-debug.log 6 | 7 | 8 | ############################ 9 | # tmp, editor & OS files 10 | ############################ 11 | .tmp 12 | *.swo 13 | *.swp 14 | *.swn 15 | *.swm 16 | .DS_STORE 17 | *# 18 | *~ 19 | .idea 20 | nbproject 21 | _docpress 22 | 23 | 24 | ############################ 25 | # Tests 26 | ############################ 27 | testApp 28 | coverage 29 | test/sample_directory 30 | .nyc_output 31 | 32 | ############################ 33 | # Other 34 | ############################ 35 | .node_history 36 | -------------------------------------------------------------------------------- /docs/commands/set.md: -------------------------------------------------------------------------------- 1 | # .set 2 | 3 | It's used to set a pair of `` across all your configuration files declared under `files` path of `.bumpedrc`. 4 | 5 | Sometimes you need to update a determinate property in the configuration files. No more edit files manually! 6 | 7 | ```bash 8 | $ bumped set name simple-average 9 | 10 | success : Property 'name' set. 11 | ``` 12 | 13 | In this case, `name` is a plain property in the JSON, but you can update nested object properties as well providing the object path: 14 | 15 | ```bash 16 | $ bumped set author.name Kiko Beats 17 | 18 | success : Property 'author.name' set. 19 | ``` 20 | 21 | or Arrays values: 22 | 23 | ```bash 24 | $ bumped set keywords "[average, avg]" 25 | 26 | success : Property 'keywords' set. 27 | ``` 28 | -------------------------------------------------------------------------------- /.bumpedrc: -------------------------------------------------------------------------------- 1 | files: [ 2 | 'package.json' 3 | ] 4 | 5 | plugins: 6 | 7 | prerelease: 8 | 9 | 'Linting config files': 10 | plugin: 'bumped-finepack' 11 | 12 | postrelease: 13 | 14 | 'Generating CHANGELOG file': 15 | plugin: 'bumped-changelog' 16 | 17 | 'Commiting new version': 18 | plugin: 'bumped-terminal' 19 | command: 'git add CHANGELOG.md package.json && git commit -m "Release $newVersion"' 20 | 21 | 'Detecting problems before publish': 22 | plugin: 'bumped-terminal' 23 | command: 'git-dirty && npm test' 24 | 25 | 'Publishing tag at Github': 26 | plugin: 'bumped-terminal' 27 | command: 'git tag $newVersion && git push && git push --tags' 28 | 29 | 'Publishing at NPM': 30 | plugin: 'bumped-terminal' 31 | command: 'npm publish' 32 | -------------------------------------------------------------------------------- /.bumpedrc_backup: -------------------------------------------------------------------------------- 1 | files: [ 2 | 'package.json' 3 | ] 4 | 5 | plugins: 6 | 7 | prerelease: 8 | 9 | 'Linting config files': 10 | plugin: 'bumped-finepack' 11 | 12 | postrelease: 13 | 14 | 'Generating CHANGELOG file': 15 | plugin: 'bumped-changelog' 16 | 17 | 'Commiting new version': 18 | plugin: 'bumped-terminal' 19 | command: 'git add CHANGELOG.md package.json && git commit -m "Release $newVersion"' 20 | 21 | 'Detecting problems before publish': 22 | plugin: 'bumped-terminal' 23 | command: 'git-dirty && npm test' 24 | 25 | 'Publishing tag at Github': 26 | plugin: 'bumped-terminal' 27 | command: 'git tag $newVersion && git push && git push --tags' 28 | 29 | 'Publishing at NPM': 30 | plugin: 'bumped-terminal' 31 | command: 'npm publish' 32 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "stable" 4 | - "5" 5 | - "4" 6 | - "0.12" 7 | - "0.10" 8 | - "iojs" 9 | 10 | env: 11 | global: 12 | - GIT_NAME: Travis CI 13 | - GIT_EMAIL: nobody@nobody.org 14 | - GITHUB_REPO: bumped/bumped.github.io 15 | - GIT_SOURCE: _docpress 16 | - GIT_BRANCH: master 17 | 18 | after_success: 19 | - npm run coveralls 20 | 21 | after_script: 22 | - | 23 | declare exitCode; 24 | 25 | # -- [1] ------------------------------------------------------- 26 | 27 | $(npm bin)/travis-after-all 28 | exitCode=$? 29 | 30 | # -- [2] ------------------------------------------------------- 31 | 32 | if [ "$TRAVIS_BRANCH" = "master" -a "$TRAVIS_PULL_REQUEST" = "false" -a $exitCode -eq 0 ]; then 33 | npm install docpress git-update-ghpages 34 | ./node_modules/.bin/docpress build && ./node_modules/.bin/git-update-ghpages -e 35 | fi 36 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright © 2015 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 10 | -------------------------------------------------------------------------------- /lib/Bumped.default.coffee: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | Args = require 'args-js' 4 | 5 | module.exports = 6 | 7 | scaffold: -> 8 | return { 9 | files: [] 10 | plugins: 11 | prerelease: {} 12 | postrelease: {} 13 | } 14 | 15 | keywords: 16 | semver: ['major', 'minor', 'patch', 'premajor', 'preminor', 'prepatch', 'prerelease'] 17 | nature: ['breaking', 'feature', 'fix'] 18 | adapter: 19 | breaking: 'major' 20 | feature: 'minor' 21 | fix: 'patch' 22 | 23 | detectFileNames: ['package.json', 'bower.json'] 24 | fallbackFileName: 'package.json' 25 | 26 | logger: 27 | keyword: 'bumped' 28 | level: 'all' 29 | types: 30 | error: 31 | level : 0 32 | color : 'red' 33 | warn: 34 | level : 1 35 | color : 'yellow' 36 | success: 37 | level : 2 38 | color : 'green' 39 | 40 | args: -> 41 | args = Args([ 42 | { opts : Args.OBJECT | Args.Optional } 43 | { cb : Args.FUNCTION | Args.Required } 44 | ], arguments[0]) 45 | return [args.opts, args.cb] 46 | -------------------------------------------------------------------------------- /docs/commands/init.md: -------------------------------------------------------------------------------- 1 | # .init 2 | 3 | It initializes a `.bumpedrdc` file in the path. 4 | 5 | `bumped init` is a smart command that try to add common configuration files. 6 | 7 | For example, if your project have `package.json` and `bower.json` it detects and add them automagically: 8 | 9 | ``` 10 | $ bumped init 11 | 12 | bumped File package.json has been added. 13 | bumped File bower.json has been added. 14 | bumped Current version is 0.0.0. 15 | bumped Config file created!. 16 | ``` 17 | 18 | At this moment, **Bumped** creates a configuration file `.bumpedrc`, which is associated with the project folder. If you open this file, its content is a list made up of all the synchronized files: 19 | 20 | ```cson 21 | files: [ 22 | "package.json" 23 | "bower.json" 24 | ] 25 | plugins: 26 | prerelease: {} 27 | postrelease: {} 28 | ``` 29 | 30 | For synchronize the version around all the files, **Bumped** needs at least a one file with a `version` field. If is not possible detect a configuration file, the command will create a `package.json` with `version` field. 31 | 32 | As you can see, it also initializes plugins section. 33 | -------------------------------------------------------------------------------- /docs/commands/add.md: -------------------------------------------------------------------------------- 1 | # .add 2 | 3 | It's used to add configuration file under `files` path of `.bumpedrc`. 4 | 5 | In the beginning, **Bumped** automatically detects common configuration files from the most popular packages managers, but you may need to add one manually. 6 | 7 | For example, I want to add a new file called `component.json` that which version setted to `2.0.0`: 8 | 9 | ```json 10 | { 11 | "version": "2.0.0" 12 | } 13 | ``` 14 | 15 | I can be done using `bumped add`: 16 | 17 | ```bash 18 | $ bumped add component.json 19 | 20 | info : Detected 'component.json' in the directory. 21 | success : 'component.json' has been added. 22 | ``` 23 | 24 | If you check now the `.bumpedrc` file, the list of configuration files has been updated: 25 | 26 | ```cson 27 | files: [ 28 | "package.json" 29 | "component.json" 30 | ] 31 | ``` 32 | 33 | If you type now `bumped version`, you can check that the shared version has changed: 34 | 35 | ```bash 36 | $ bumped version 37 | 38 | info : Current version is '2.0.0'. 39 | ``` 40 | 41 | The version is setted to 2.0.0 because it's the major version between all the configuration files. 42 | -------------------------------------------------------------------------------- /lib/Bumped.animation.coffee: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | chalk = require 'chalk' 4 | ms = require 'pretty-ms' 5 | timeSpan = require 'time-span' 6 | DEFAULT = require './Bumped.default' 7 | MSG = require './Bumped.messages' 8 | 9 | TYPE_SHORTCUT = 10 | prerelease: 'pre' 11 | postrelease: 'post' 12 | 13 | module.exports = class Animation 14 | 15 | constructor: (params) -> 16 | @[param] = value for param, value of params 17 | @isPostRelease = @type is 'postrelease' 18 | @isPreRelease = @type is 'prerelease' 19 | 20 | start: (cb) -> 21 | @timespan = timeSpan() 22 | @running = true 23 | shortcut = TYPE_SHORTCUT[@type] 24 | process.stdout.write '\n' if @isPostRelease 25 | 26 | @logger.keyword = "#{chalk.magenta(shortcut)} #{@logger.keyword}" 27 | @logger.success "Starting #{chalk.cyan(@text)}" 28 | cb() 29 | 30 | stop: (err, cb) -> 31 | @running = false 32 | 33 | if err 34 | @logger.keyword = DEFAULT.logger.keyword 35 | return cb err 36 | 37 | end = ms @timespan() 38 | @logger.success "Finished #{chalk.cyan(@text)} after #{chalk.magenta(end)}." 39 | process.stdout.write '\n' if @isPreRelease 40 | @logger.keyword = DEFAULT.logger.keyword 41 | cb() 42 | 43 | @end: (opts) -> 44 | opts.logger.success MSG.CREATED_VERSION(opts.version) 45 | opts.logger.keyword = DEFAULT.logger.keyword 46 | -------------------------------------------------------------------------------- /docs/commands/release.md: -------------------------------------------------------------------------------- 1 | # .release 2 | 3 | It's used for release a new version of your project. 4 | 5 | The purpose of this command is increment the value under the `version` field of your `files` declared at `.bumpedrc`. 6 | 7 | When you want to release a new version, you need to specify a high new version of your project. 8 | 9 | For do that, we can follow different approach: 10 | 11 | ## Semver 12 | 13 | This is the classic way. You have to provide the keyword that increment the `X`,`Y` or `Z` version of your `X.Y.Z` version declared. 14 | 15 | In this mode, you can also create prebuilds. Are the keywords availables in this mode are: 16 | 17 | ``` 18 | bumped release 19 | ``` 20 | 21 | ## Numerical 22 | 23 | Providing the exact version that you want to release. 24 | 25 | It's similar to semver approach, but specifying using numbers the version to be released. 26 | 27 | It's aligned with the pattern: 28 | 29 | ``` 30 | bumped release <[0-9].[0-9].[0-9]> 31 | ``` 32 | 33 | ## Nature 34 | 35 | It's a modification of the semver version focusing in a more semantic keywords. 36 | 37 | ``` 38 | bumped release 39 | ``` 40 | 41 | The following example is equivalent between the three approaches 42 | 43 | ```bash 44 | $ bumped release 2.0.0 45 | $ bumped release major 46 | $ bumped release breaking 47 | ``` 48 | 49 | Where in all the cases the message will be: 50 | 51 | ```bash 52 | success : Releases version '2.0.0'. 53 | ``` 54 | -------------------------------------------------------------------------------- /lib/Bumped.logger.coffee: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | Acho = require 'acho' 4 | DEFAULT = require './Bumped.default' 5 | MSG = require './Bumped.messages' 6 | # TODO: Remove, Use Object.assign instead. 7 | existsDefault = require 'existential-default' 8 | noop = require('./Bumped.util').noop 9 | isArray = require('./Bumped.util').isArray 10 | isBoolean = require('./Bumped.util').isBoolean 11 | 12 | optsDefault = 13 | lineBreak: true 14 | output: true 15 | 16 | ###* 17 | * Unify error logging endpoint 18 | * @param {Message} err Error structure based on Message. 19 | * @param {Object} opts Configurable options 20 | * @param {Object} [opts.lineBreak=true] Prints Line break 21 | * @param {Function} cb [description] 22 | ### 23 | errorHandler = (err, opts, cb) -> 24 | if (arguments.length is 2 and typeof arguments[1] is 'function') 25 | cb = opts 26 | opts = optsDefault 27 | else 28 | opts = existsDefault opts, optsDefault 29 | cb = existsDefault cb, noop 30 | 31 | return cb err if @level is 'silent' or not opts.output 32 | 33 | err = MSG.NOT_PROPERLY_FINISHED err if isBoolean err 34 | printErrorMessage = (err) => @error err.message or err 35 | process.stdout.write '\n' if opts.lineBreak 36 | err = [err] unless isArray(err) 37 | 38 | err.forEach printErrorMessage 39 | cb err 40 | 41 | module.exports = (opts) -> 42 | opts = existsDefault opts, DEFAULT.logger 43 | logger = Acho opts 44 | logger.errorHandler = errorHandler 45 | logger 46 | -------------------------------------------------------------------------------- /lib/Bumped.coffee: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | async = require 'async' 4 | Semver = require './Bumped.semver' 5 | Config = require './Bumped.config' 6 | Logger = require './Bumped.logger' 7 | Plugin = require './Bumped.plugin' 8 | DEFAULT = require './Bumped.default' 9 | MSG = require './Bumped.messages' 10 | 11 | module.exports = class Bumped 12 | 13 | constructor: (opts = {}) -> 14 | process.chdir opts.cwd if opts.cwd 15 | @pkg = require '../package.json' 16 | @config = new Config this 17 | @semver = new Semver this 18 | @logger = new Logger opts.logger 19 | @plugin = new Plugin this 20 | 21 | this 22 | 23 | ###* 24 | * Load a previously cofinguration file declared. 25 | ### 26 | load: -> 27 | [opts, cb] = DEFAULT.args arguments 28 | 29 | return cb() unless @config.rc.config 30 | 31 | tasks = [ 32 | (next) => @config.load opts, next 33 | (next) => @semver.sync opts, next 34 | ] 35 | 36 | async.series tasks, cb 37 | 38 | ###* 39 | * Initialize a new configuration file in the current path. 40 | ### 41 | init: => 42 | [opts, cb] = DEFAULT.args arguments 43 | 44 | tasks = [ 45 | (next) => @config.autodetect opts, next 46 | (next) => @config.save opts, next 47 | (next) => @semver.sync opts, next 48 | ] 49 | 50 | async.waterfall tasks, (err, result) => 51 | return @logger.errorHandler err, cb if err 52 | @end opts, cb 53 | 54 | end: -> 55 | [opts, cb] = DEFAULT.args arguments 56 | 57 | @semver.version opts, => 58 | @logger.success MSG.CONFIG_CREATED() 59 | cb() 60 | -------------------------------------------------------------------------------- /bin/help.txt: -------------------------------------------------------------------------------- 1 | Usage 2 | $ bumped 3 | 4 | Commands 5 | init Initializes a new .bumpedrc file in the current directory. 6 | Bumped detects configuration files as package.json or 7 | bower.json by default, but you can add files with 'add' as well. 8 | 9 | add Add a new file in your current configuration. 10 | When you add a file, the shared version between the configuration 11 | files is recalculated to get the more high version possible. 12 | 13 | version Prints the current synchronized version. 14 | 15 | release Bumped a new version of your software, updating the 16 | version in your configuration files. 17 | 18 | bumped supports different release keywords styles, namely: 19 | 20 | semver: 21 | $ bumped release 22 | 23 | nature: 24 | $ bumped release 25 | 26 | numeric: 27 | $ bumped release <[0-9].[0-9].[0-9]> 28 | 29 | remove Removes a file declared in the configuration file. 30 | The synchronized version is recalculated. 31 | 32 | set Set or update a determinate property across the files 33 | declared in your configuration files. 34 | 35 | You can set Strings, Arrays or Objects: 36 | 37 | $ bumped set name newName 38 | $ bumped set keywords [ semver, management, cli ] 39 | $ bumped set authors.name newAuthor 40 | 41 | Example 42 | $ bumped init 43 | $ bumped release 1.0.0 44 | $ bumped release breaking 45 | $ bumped release premajor beta 46 | -------------------------------------------------------------------------------- /bin/index.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 'use strict' 3 | require('coffee-script').register() 4 | var fs = require('fs') 5 | var Bumped = require('./../lib/Bumped') 6 | var updateNotifier = require('update-notifier') 7 | var partial = require('fn-partial') 8 | var cli = require('meow')({ 9 | pkg: '../package.json', 10 | help: fs.readFileSync(__dirname + '/help.txt', 'utf8') 11 | }) 12 | 13 | updateNotifier({pkg: cli.pkg}).notify() 14 | if (cli.input.length === 0) cli.showHelp() 15 | 16 | var bumped = new Bumped() 17 | var command = cli.input.shift() 18 | 19 | var exit = function (err) { 20 | if (!err) return process.exit() 21 | if (!Array.isArray(err)) err = [err] 22 | var code = err[err.length - 1].code || 1 23 | return process.exit(code || 1) 24 | } 25 | 26 | var commands = { 27 | init: partial(bumped.init, exit), 28 | version: partial(bumped.semver.version, exit), 29 | 30 | release: partial(bumped.semver.release, { 31 | version: cli.input[0], 32 | prefix: cli.input[1] 33 | }, exit), 34 | 35 | add: partial(bumped.config.add, { 36 | detect: true, 37 | save: true, 38 | file: cli.input[0] 39 | }, exit), 40 | 41 | remove: partial(bumped.config.remove, { 42 | save: true, 43 | file: cli.input[0] 44 | }, exit), 45 | 46 | set: (function () { 47 | var property = cli.input[0] 48 | cli.input.shift() 49 | var value = cli.input.join(' ') 50 | return partial(bumped.config.set, { 51 | property: property, 52 | value: value 53 | }, exit) 54 | })() 55 | } 56 | 57 | var existCommand = Object.keys(commands).indexOf(command) > -1 58 | 59 | if (!existCommand) return cli.showHelp() 60 | 61 | process.stdout.write('\n') 62 | 63 | if (command === 'init') return commands[command]() 64 | 65 | return bumped.load(function (err) { 66 | if (err) throw err 67 | return commands[command]() 68 | }) 69 | -------------------------------------------------------------------------------- /lib/Bumped.messages.coffee: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | chalk = require 'chalk' 4 | 5 | module.exports = 6 | 7 | # Positive 8 | CONFIG_CREATED : -> 'Config file created!.' 9 | ADD_FILE : (file) -> "File #{chalk.green(file)} has been added." 10 | REMOVE_FILE : (file) -> "File #{chalk.green(file)} has been removed." 11 | CREATED_VERSION : (version) -> "Releases version #{chalk.green(version)}." 12 | CURRENT_VERSION : (version) -> "Current version is #{chalk.green(version)}." 13 | SET_PROPERTY : (property, value) -> "Property #{chalk.green(property)} set as #{chalk.green(value)}." 14 | INSTALLING_PLUGIN : (plugin) -> "Plugin #{chalk.green(plugin)} not detected on the system." 15 | INSTALLING_PLUGIN_2 : -> "Installing it as global, might take a while." 16 | 17 | # Negative 18 | NOT_ALREADY_ADD_FILE : (file) -> 19 | message: "File #{chalk.red(file)} is already added." 20 | code: 2 21 | NOT_ADD_FILE : (file) -> 22 | message: "File #{chalk.red(file)} can't be added because doesn't exist." 23 | code: 3 24 | NOT_REMOVE_FILE : (file) -> 25 | message: "File #{chalk.red(file)} can't be removed because previously hasn't been added." 26 | code: 4 27 | NOT_VALID_VERSION : (version) -> 28 | message: "Version #{chalk.red(version)} provided to release is not valid." 29 | code: 5 30 | NOT_GREATER_VERSION : (last, old) -> 31 | message: "Version #{chalk.red(last)} is not greater that the current #{chalk.green(old)} version." 32 | code: 6 33 | NOT_CURRENT_VERSION : -> 34 | message: "There isn't version declared. Maybe you need to init first?" 35 | code: 7 36 | NOT_SET_PROPERTY : -> 37 | message: "You need to provide the property and the value to be set." 38 | code: 8 39 | NOT_SET_VERSION : -> 40 | message: "Use 'bumped release' instead." 41 | code: 9 42 | NOT_PROPERLY_FINISHED: (status) -> 43 | message: "Something is wrong. Resolve #{chalk.red('red')} messages to continue." 44 | code: 10 45 | -------------------------------------------------------------------------------- /lib/Bumped.util.coffee: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | CSON = require 'season' 4 | fs = require 'fs-extra' 5 | dotProp = require 'dot-prop' 6 | jsonFuture = require 'json-future' 7 | 8 | module.exports = 9 | 10 | createJSON: (opts, cb)-> 11 | jsonFuture.saveAsync opts.file, opts.data, (err) -> cb err 12 | 13 | ###* 14 | * A sweet way to update JSON Arrays, Objects or String from String. 15 | * @param {Object} opts [description] 16 | * @param {Function} cb Standard NodeJS callback. 17 | * @return {[type]} Standard NodeJS callback. 18 | ### 19 | updateJSON: (opts, cb) -> 20 | jsonFuture.loadAsync opts.filename, (err, file) -> 21 | return cb err if err 22 | 23 | firstChar = opts.value.charAt(0) 24 | lastChar = opts.value.charAt(opts.value.length - 1) 25 | isArray = (firstChar is '[') and (lastChar is ']') 26 | isDotProp = opts.property.split('.').length > 1 27 | 28 | if isArray 29 | items = opts.value.substring(1, opts.value.length - 1) 30 | items = items.split(',') 31 | items = items.map (item) -> item.trim() 32 | file[opts.property] = items 33 | else if isDotProp 34 | dotProp.set(file, opts.property, opts.value) 35 | else 36 | file[opts.property] = opts.value if file[opts.property]? or opts.force 37 | 38 | jsonFuture.saveAsync(opts.filename, file, cb) 39 | 40 | loadCSON: (opts, cb) -> 41 | fs.readFile opts.path, encoding: 'utf8', (err, data) -> 42 | return cb err if err 43 | cb null, CSON.parse data 44 | 45 | saveCSON: (opts, cb) -> 46 | data = CSON.stringify opts.data, null, 2 47 | fs.writeFile opts.path, data, encoding: 'utf8', cb 48 | 49 | isBoolean: (n) -> 50 | typeof n is 'boolean' 51 | 52 | isArray: Array.isArray 53 | 54 | isEmpty: (arr) -> 55 | arr.length is 0 56 | 57 | includes: (arr, word) -> 58 | arr.indexOf(word) isnt -1 59 | 60 | noop: -> 61 | 62 | size: (arr) -> 63 | return 0 unless arr 64 | arr.length 65 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bumped", 3 | "description": "Makes easy release software.", 4 | "homepage": "https://github.com/bumped/bumped", 5 | "version": "0.9.3", 6 | "main": "./bin/index.js", 7 | "bin": { 8 | "bumped": "./bin/index.js" 9 | }, 10 | "author": { 11 | "email": "josefrancisco.verdu@gmail.com", 12 | "name": "Kiko Beats", 13 | "url": "https://github.com/Kikobeats" 14 | }, 15 | "repository": { 16 | "type": "git", 17 | "url": "git+https://github.com/bumped/bumped.git" 18 | }, 19 | "bugs": { 20 | "url": "https://github.com/bumped/bumped/issues" 21 | }, 22 | "keywords": [ 23 | "bumped", 24 | "npm", 25 | "release", 26 | "semver", 27 | "version" 28 | ], 29 | "dependencies": { 30 | "acho": "~3.0.0", 31 | "args-js": "~0.10.11", 32 | "async": "~2.0.0", 33 | "chalk": "~1.1.2", 34 | "coffee-script": "~1.10.0", 35 | "dot-prop": "~3.0.0", 36 | "existential-default": "~1.3.1", 37 | "exists-file": "~2.1.0", 38 | "fn-partial": "~0.12.12", 39 | "fs-extra": "~0.30.0", 40 | "global-modules": "~0.2.1", 41 | "json-future": ">=1 <2", 42 | "lodash.clonedeep": "~4.5.0", 43 | "lodash.omit": "~4.5.0", 44 | "meow": "~3.7.0", 45 | "pretty-ms": "~2.1.0", 46 | "rc": "~1.1.6", 47 | "resolve-up": "~0.5.2", 48 | "season": "~5.3.0", 49 | "semver": "~5.3.0", 50 | "spawn-sync": "~1.0.15", 51 | "time-span": "~1.0.0", 52 | "update-notifier": "~1.0.0" 53 | }, 54 | "devDependencies": { 55 | "coveralls": "latest", 56 | "git-dirty": "latest", 57 | "mocha": "latest", 58 | "nyc": "latest", 59 | "should": "latest", 60 | "travis-after-all": "latest" 61 | }, 62 | "engines": { 63 | "node": ">= 0.10.0" 64 | }, 65 | "scripts": { 66 | "coveralls": "nyc report --reporter=text-lcov | coveralls", 67 | "posttest": "cp .bumpedrc_backup .bumpedrc", 68 | "pretest": "rm .bumpedrc || exit 0", 69 | "test": "nyc --extension .coffee mocha" 70 | }, 71 | "license": "MIT" 72 | } 73 | -------------------------------------------------------------------------------- /docs/plugins.md: -------------------------------------------------------------------------------- 1 | # Plugins 2 | 3 | They are actions that will be executed every time that you release a new version of your project. 4 | 5 | ## Declaration 6 | 7 | When you declare a plugin under the `plugins` path at your `.bumpedrc`, you are creating a step to be executed before or after you release a new version. 8 | 9 | Plugins can be used as `prereleases` and `postrelease` steps interchangeably: You can put it in the step that you need it. 10 | 11 | In all the cases, the plugin declaration is formed by the description message of the step and the plugin that you want to use. 12 | 13 | ```YAML 14 | plugins: 15 | prerelease: 16 | 'Say hello': 17 | plugin: 'bumped-terminal' 18 | command: 'echo Hello my friend!' 19 | ``` 20 | 21 | The rest of information, (in this example, `command`) depends of the specific plugin used. 22 | 23 | ## Execution 24 | 25 | Every time that you release a new version, plugins will be executed. 26 | 27 | Also, As you can imagine, the workflow will be: 28 | 29 | - Execute `prerelease` plugins. 30 | - Increment the current version. 31 | - Execute `postrelease` plugins. 32 | 33 | Plugins are executed on series. Under the words, this means: 34 | 35 | - Order is important (or not): first plugin declared will be first plugin to be executed. 36 | - If a plugin have a unexepected exit, it stop the pipeline and the release process. 37 | 38 | ## Available plugins 39 | 40 | | Name | Description | 41 | |----------------------------------------------------------------|---------------------------------------------------------| 42 | | [bumped-terminal](https://github.com/bumped/bumped-terminal) | Executes whatever terminal command. | 43 | | [bumped-changelog](https://github.com/bumped/bumped-changelog) | Auto generates a changelog file in each bump. | 44 | | [bumped-finepack](https://github.com/bumped/bumped-finepack) | Lints your JSON Config files and keep them readables. | 45 | | [bumped-http](https://github.com/bumped/bumped-http) | Expose an HTTP Client to interact with API's endpoints. | 46 | | [bumped-gh-pages](https://github.com/bumped/bumped-gh-pages) | Publishing files on GitHub Pages. | 47 | 48 | ## Write a plugin! 49 | 50 | *SOON* 51 | -------------------------------------------------------------------------------- /lib/Bumped.plugin.coffee: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | path = require 'path' 4 | omit = require 'lodash.omit' 5 | async = require 'async' 6 | resolveUp = require 'resolve-up' 7 | spawnSync = require 'spawn-sync' 8 | globalNpmPath = require 'global-modules' 9 | updateNotifier = require 'update-notifier' 10 | clone = require 'lodash.clonedeep' 11 | MSG = require './Bumped.messages' 12 | Animation = require './Bumped.animation' 13 | isEmpty = require('./Bumped.util').isEmpty 14 | 15 | npmInstallGlobal = (pkg) -> 16 | spawnSync 'npm', [ 'install', pkg ], 17 | stdio: 'inherit' 18 | cwd: globalNpmPath 19 | 20 | ###* 21 | * Bumped.plugin 22 | * 23 | * Module to call each plugin declared for the user in the configuration file. 24 | * Modules follow a duck type interface and are sorted. 25 | * If any plugin throw and error, automatically stop the rest of the plugins. 26 | ### 27 | module.exports = class Plugin 28 | 29 | constructor: (bumped) -> 30 | @bumped = bumped 31 | @prerelease = @bumped.config.rc.plugins.prerelease 32 | @postrelease = @bumped.config.rc.plugins.postrelease 33 | @cache = {} 34 | 35 | pluginPath: (plugin) -> 36 | pluginPath = resolveUp plugin 37 | return pluginPath[0] if pluginPath.length > 0 38 | @bumped.logger.warn MSG.INSTALLING_PLUGIN plugin 39 | @bumped.logger.warn MSG.INSTALLING_PLUGIN_2() 40 | npmInstallGlobal plugin 41 | path.resolve globalNpmPath, plugin 42 | 43 | buildOptions: (opts) -> 44 | opts: omit(opts, 'plugin') 45 | title: opts.plugin 46 | logger: @bumped.logger 47 | path: @pluginPath opts.plugin 48 | 49 | exec: (opts, cb) -> 50 | pluginType = @[opts.type] 51 | return cb null if isEmpty Object.keys pluginType 52 | 53 | async.forEachOfSeries pluginType, (settings, description, next) => 54 | pluginOptions = @buildOptions settings 55 | 56 | if @cache[settings.plugin] 57 | plugin = @cache[settings.plugin] 58 | else 59 | plugin = @cache[settings.plugin] = require pluginOptions.path 60 | @notifyPlugin pluginOptions.path 61 | 62 | animation = new Animation 63 | text : description 64 | logger : @bumped.logger 65 | plugin : settings.plugin 66 | type : opts.type 67 | 68 | animation.start => 69 | plugin @bumped, pluginOptions, (err) -> 70 | animation.stop err, next 71 | , cb 72 | 73 | notifyPlugin: (pluginPath) -> 74 | pkgPath = path.join pluginPath, 'package.json' 75 | updateNotifier({pkg: require(pkgPath)}).notify() 76 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Bumped 2 | 3 |

4 |
5 | bumped 6 |
7 | Makes easy release software. 8 |
9 |
10 |

11 | 12 |

13 | Last version Build Status Coverage Status Donate
Dependency status Dev Dependencies Status NPM Status 14 |

15 | 16 | Bumped is a release system that make it easy to perform actions **before** and **after** releasing a new version of your software. 17 | 18 | ## Installation 19 | 20 | ```bash 21 | npm install bumped -g 22 | ``` 23 | 24 | ## First steps 25 | 26 | When you start a new project, run `bumped init`. 27 | 28 | It creates a configuration file called `.bumpedrc` associated with your project where your release steps will be declared. 29 | 30 | The configuration file is divided into 3 sections: 31 | 32 | - Files that will have the version incremented. 33 | - Steps to do **before** incrementing the version 34 | - Steps to do **after** incrementing the version 35 | 36 | For example, a typical `.bumpedrc` file will have: 37 | 38 | - Before increment the project version, do a set of actions related to the integrity of the project: Run tests, lint files, check for unstaged changes, etc. 39 | - Increment the project version in all necessary files, for example, in `package.json` and `bower.json`. 40 | - After that, do actions mostly related with the publishing process: Publish a new git tag on GitHub, publish new bower/NPM project version. 41 | 42 | Now, next time you run `bumped release ` it performs all the release steps. 43 | 44 |

45 | bumped 46 |

47 | 48 | ## Why? 49 | 50 | - Separates the processes of creating and publishing software. 51 | - Synchronizes, unifies and publishes different software versions for the different package managers. 52 | - Easy to integrate it with both with your current and new projects. 53 | - Provides a plugin system for associate action before and after releasing your software. 54 | 55 | **Bumped** synchronizes your software version across different package manager configuration files (npm, bower,...) and controls, edits and releases each of its versions to ensure all the files have the same version. 56 | 57 | Because writing software is hard enough, we must make the publishing process of software simple and effective. 58 | 59 | Consider read this excellent list of articles to expand your vision about the releasing process: 60 | 61 | * [Semantic Pedantic by Jeremy Ashkenas](https://gist.github.com/jashkenas/cbd2b088e20279ae2c8e). 62 | * [Maintaining Open Source Projects by thoughtbot](https://robots.thoughtbot.com/maintaining-open-source-projects-versioning). 63 | * [Software Versions are Broken by Eric Elliot](https://medium.com/javascript-scene/software-versions-are-broken-3d2dc0da0783#.wvzd0qcp8). 64 | -------------------------------------------------------------------------------- /lib/Bumped.semver.coffee: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | path = require 'path' 4 | async = require 'async' 5 | semver = require 'semver' 6 | util = require './Bumped.util' 7 | DEFAULT = require './Bumped.default' 8 | MSG = require './Bumped.messages' 9 | Animation = require './Bumped.animation' 10 | 11 | module.exports = class Semver 12 | 13 | constructor: (bumped) -> 14 | @bumped = bumped 15 | 16 | ###* 17 | * Get the high project version across config files declared. 18 | * @return {[type]} [description] 19 | ### 20 | sync: => 21 | [opts, cb] = DEFAULT.args arguments 22 | async.compose(@max, @versions) (err, max) => 23 | @bumped._version = max 24 | cb() 25 | 26 | versions: (cb) => 27 | async.reduce @bumped.config.rc.files, [], (accumulator, file, next) -> 28 | version = require(path.resolve file).version 29 | accumulator.push(version) if version? 30 | next(null, accumulator) 31 | , cb 32 | 33 | max: (versions, cb) -> 34 | initial = versions.shift() 35 | async.reduce versions, initial, (max, version, next) -> 36 | max = version if semver.gt version, max 37 | next null, max 38 | , cb 39 | 40 | release: => 41 | [opts, cb] = DEFAULT.args arguments 42 | return @bumped.logger.errorHandler MSG.NOT_VALID_VERSION(opts.version), cb unless opts.version 43 | 44 | @bumped._version ?= '0.0.0' 45 | semverStyle = @detect opts.version 46 | releaseVersion = @releaseBasedOn semverStyle 47 | 48 | tasks = [ 49 | (next) => 50 | opts.type = 'prerelease' 51 | @bumped.plugin.exec opts, next 52 | (next) -> 53 | releaseVersion 54 | version: opts.version 55 | prefix: opts.prefix 56 | , next 57 | (newVersion, next) => 58 | @bumped._oldVersion = @bumped._version 59 | @update version: newVersion, next 60 | (next) => 61 | opts.type = 'postrelease' 62 | @bumped.plugin.exec opts, next 63 | ] 64 | 65 | async.waterfall tasks, (err) => 66 | return @bumped.logger.errorHandler err, cb if err 67 | cb null, @bumped._version 68 | 69 | update: -> 70 | [opts, cb] = DEFAULT.args arguments 71 | 72 | @bumped._version = opts.version 73 | 74 | async.forEachOf @bumped.config.rc.files, @save, (err) => 75 | return @bumped.logger.errorHandler err, cb if err 76 | 77 | Animation.end 78 | logger : @bumped.logger 79 | version : @bumped._version 80 | 81 | cb() 82 | 83 | save: (file, index, cb) => 84 | util.updateJSON 85 | filename : file 86 | property : 'version' 87 | value : @bumped._version 88 | force : index is 0 89 | , cb 90 | 91 | ###* 92 | * Print the current synchronized version. 93 | ### 94 | version: => 95 | [opts, cb] = DEFAULT.args arguments 96 | 97 | if @bumped._version? 98 | @bumped.logger.success MSG.CURRENT_VERSION @bumped._version 99 | else 100 | @bumped.logger.errorHandler MSG.NOT_CURRENT_VERSION(), lineBreak:false 101 | 102 | return cb @bumped._version 103 | 104 | detect: (word) -> 105 | return 'semver' if util.includes DEFAULT.keywords.semver, word 106 | return 'nature' if util.includes DEFAULT.keywords.nature, word 107 | 'numeric' 108 | 109 | releaseBasedOn: (type) => 110 | return @_releasesBasedOnSemver if type is 'semver' 111 | return @_releaseBasedOnNatureSemver if type is 'nature' 112 | @_releasesBasedOnVersion 113 | 114 | _releaseBasedOnNatureSemver: (opts, cb) => 115 | cb null, semver.inc(@bumped._version, DEFAULT.keywords.adapter[opts.version]) 116 | 117 | _releasesBasedOnSemver: (opts, cb) => 118 | cb null, semver.inc(@bumped._version, opts.version, opts.prefix) 119 | 120 | _releasesBasedOnVersion: (opts, cb) => 121 | version = semver.clean opts.version 122 | version = semver.valid version 123 | return cb MSG.NOT_VALID_VERSION version unless version? 124 | return cb MSG.NOT_GREATER_VERSION(version, @bumped._version) unless semver.gt version, @bumped._version 125 | cb null, version 126 | -------------------------------------------------------------------------------- /lib/Bumped.config.coffee: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | path = require 'path' 4 | async = require 'async' 5 | CSON = require 'season' 6 | fs = require 'fs-extra' 7 | existsFile = require 'exists-file' 8 | jsonFuture = require 'json-future' 9 | util = require './Bumped.util' 10 | DEFAULT = require './Bumped.default' 11 | MSG = require './Bumped.messages' 12 | 13 | module.exports = class Config 14 | 15 | constructor: (bumped) -> 16 | @bumped = bumped 17 | @rc = require('rc') bumped.pkg.name, DEFAULT.scaffold(), null, (config) -> 18 | CSON.parse config 19 | 20 | ###* 21 | * Special '.add' action that try to autodetect common configuration files 22 | * It doesn't print a error message if the file are not present 23 | * in the directory. 24 | ### 25 | autodetect: -> 26 | [opts, cb] = DEFAULT.args arguments 27 | 28 | tasks = [ 29 | removePreviousConfigFile = (next) => 30 | return next() unless @rc.config 31 | fs.remove @rc.config, next 32 | detectCommonFiles = (next) => 33 | @rc.files = DEFAULT.scaffold().files 34 | @rc.plugins = DEFAULT.scaffold().plugins 35 | async.each DEFAULT.detectFileNames, (file, done) => 36 | @add file:file, output:false, (err) -> done() 37 | , next 38 | fallbackUnderNotDetect = (next) => 39 | return next() if @rc.files.length isnt 0 40 | @addFallback next 41 | ] 42 | 43 | async.waterfall tasks, cb 44 | 45 | ###* 46 | * Special '.add' action to be called when autodetect fails. 47 | ### 48 | addFallback: (cb) -> 49 | opts = 50 | file: DEFAULT.fallbackFileName 51 | data: version:'0.0.0' 52 | 53 | tasks = [ 54 | createFallbackFile = (next) -> util.createJSON opts, next 55 | addFallbackFile = (next) => @addFile opts, next 56 | ] 57 | 58 | async.waterfall tasks, cb 59 | 60 | ###* 61 | * Add a file into configuration file. 62 | * Before do it, check: 63 | * - The file was previously added. 64 | * - The file that are you trying to add exists. 65 | ### 66 | add: => 67 | [opts, cb] = DEFAULT.args arguments 68 | 69 | loggerOptions = 70 | lineBreak: false 71 | output: opts.output 72 | 73 | if @hasFile opts.file 74 | message = MSG.NOT_ALREADY_ADD_FILE opts.file 75 | return @bumped.logger.errorHandler message, loggerOptions, cb 76 | 77 | tasks = [ 78 | (next) => 79 | @detect opts, next, 80 | (exists, next) => 81 | return @addFile opts, next if exists 82 | message = MSG.NOT_ADD_FILE opts.file 83 | return @bumped.logger.errorHandler message, loggerOptions, cb 84 | (next) => 85 | unless opts.save then next() else @save opts, next 86 | ] 87 | 88 | async.waterfall tasks, (err, result) => 89 | cb err, @rc.files 90 | 91 | ###* 92 | * Detect if a configuration file exists in the project path. 93 | ### 94 | detect: -> 95 | [opts, cb] = DEFAULT.args arguments 96 | 97 | filePath = path.join(process.cwd(), opts.file) 98 | existsFile filePath, cb 99 | 100 | remove: => 101 | [opts, cb] = DEFAULT.args arguments 102 | 103 | unless @hasFile opts.file 104 | message = MSG.NOT_REMOVE_FILE opts.file 105 | return @bumped.logger.errorHandler message, lineBreak:false, cb 106 | 107 | tasks = [ 108 | (next) => @removeFile opts, next 109 | (next) => unless opts.save then next() else @save opts, next 110 | ] 111 | 112 | async.waterfall tasks, (err, result) => 113 | cb(err, @rc.files) 114 | 115 | ###* 116 | * Write from memory to config file. 117 | ### 118 | save: => 119 | [opts, cb] = DEFAULT.args arguments 120 | 121 | util.saveCSON 122 | path : ".#{@bumped.pkg.name}rc" 123 | data : 124 | files: @rc.files 125 | plugins: @rc.plugins 126 | , cb 127 | 128 | load: => 129 | [opts, cb] = DEFAULT.args arguments 130 | 131 | util.loadCSON 132 | path: @bumped.config.rc.config 133 | , (err, filedata) => 134 | throw err if err 135 | @loadScaffold filedata 136 | cb() 137 | 138 | addFile: -> 139 | [opts, cb] = DEFAULT.args arguments 140 | 141 | @rc.files.push opts.file 142 | @bumped.logger.success MSG.ADD_FILE opts.file 143 | cb() 144 | 145 | removeFile: -> 146 | [opts, cb] = DEFAULT.args arguments 147 | 148 | index = @rc.files.indexOf opts.file 149 | @rc.files.splice index, 1 150 | @bumped.logger.success MSG.REMOVE_FILE opts.file 151 | cb() 152 | 153 | set: => 154 | [opts, cb] = DEFAULT.args arguments 155 | 156 | setProperty = (file, done) -> 157 | util.updateJSON 158 | filename : file 159 | property : opts.property 160 | value : opts.value 161 | force : true 162 | , done 163 | 164 | message = null 165 | message = MSG.NOT_SET_PROPERTY() if util.size(opts.value) is 0 166 | message = MSG.NOT_SET_PROPERTY() if util.size(opts.property) is 0 167 | message = MSG.NOT_SET_VERSION() if opts.property is 'version' 168 | return @bumped.logger.errorHandler message, lineBreak:false, cb if message 169 | 170 | async.each @bumped.config.rc.files, setProperty, (err) => 171 | return @bumped.logger.errorHandler err, cb if err 172 | @bumped.logger.success MSG.SET_PROPERTY opts.property, opts.value 173 | cb null, opts 174 | 175 | hasFile: (file) -> 176 | @rc.files.indexOf(file) isnt -1 177 | 178 | loadScaffold: (filedata) -> 179 | @bumped.config.rc.files = filedata.files 180 | @bumped.config.rc.plugins = filedata.plugins 181 | -------------------------------------------------------------------------------- /test/index.coffee: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | path = require 'path' 4 | CSON = require 'season' 5 | should = require 'should' 6 | fs = require 'fs-extra' 7 | jsonFuture = require 'json-future' 8 | Bumped = require '../lib/Bumped' 9 | pkg = require '../package.json' 10 | 11 | loadJSON = (relativePath) -> 12 | jsonFuture.load path.resolve(relativePath) 13 | 14 | testPath = (filepath) -> path.resolve __dirname, filepath 15 | 16 | bumpedFactory = (folderName) -> 17 | before (done) -> 18 | src = testPath "fixtures/#{folderName}" 19 | dest = testPath "#{folderName}" 20 | fs.copy src, dest, => 21 | @bumped = new Bumped 22 | cwd: dest 23 | logger: 24 | color: true 25 | 26 | done() 27 | 28 | after (done) -> 29 | fs.remove testPath(folderName), done 30 | 31 | describe 'Bumped ::', -> 32 | 33 | bumpedFactory 'sample_directory' 34 | 35 | describe 'init ::', -> 36 | 37 | it 'initialize a configuration file', (done) -> 38 | @bumped.init -> 39 | config = fs.readFileSync('.bumpedrc', encoding: 'utf8') 40 | config = CSON.parse config 41 | config.files.length.should.be.equal 2 42 | done() 43 | 44 | describe 'semver ::', -> 45 | 46 | describe 'version ::', -> 47 | 48 | it 'sync correctly the version between the files', -> 49 | @bumped.semver.version (version) -> 50 | version.should.be.equal('0.2.0') 51 | 52 | describe 'release style ::', -> 53 | 54 | describe 'numeric', -> 55 | 56 | it 'try to release a new version that is not valid', (done) -> 57 | @bumped.semver.release version:null, (err, version) -> 58 | (err?).should.be.equal true 59 | done() 60 | 61 | it 'try to release a new version that is not valid string', (done) -> 62 | @bumped.semver.release version:'1.0', (err, version) -> 63 | (err?).should.be.equal true 64 | done() 65 | 66 | it 'try to release a new version that is a valid string but is not greater', (done) -> 67 | @bumped.semver.release version:'0.1.0', (err, version) -> 68 | (err?).should.be.equal true 69 | done() 70 | 71 | it 'releases a new version that is a valid based in a number', (done) -> 72 | @bumped.semver.release version:'1.0.0', (err, version) -> 73 | (err?).should.be.equal false 74 | version.should.be.equal('1.0.0') 75 | bower = loadJSON('./bower.json') 76 | bower.version.should.be.equal('1.0.0') 77 | done() 78 | 79 | describe 'semver', -> 80 | 81 | it 'release a new version that is valid based in a semver keyword', (done) -> 82 | @bumped.semver.release version:'minor', (err, version) -> 83 | (err?).should.be.equal false 84 | version.should.be.equal('1.1.0') 85 | loadJSON('./bower.json').version.should.be.equal('1.1.0') 86 | done() 87 | 88 | describe 'nature', -> 89 | it 'release a new version that is valid based in a nature semver keyword', (done) -> 90 | @bumped.semver.release version:'fix', (err, version) -> 91 | (err?).should.be.equal false 92 | version.should.be.equal('1.1.1') 93 | loadJSON('./bower.json').version.should.be.equal('1.1.1') 94 | done() 95 | 96 | describe 'config ::', -> 97 | 98 | describe 'add ::', -> 99 | 100 | # it 'just add a file', (done) -> 101 | # @bumped.config.add 102 | # file: 'test.json' 103 | # , (err, files) -> 104 | # files.length.should.be.equal 3 105 | # done() 106 | 107 | it 'try to add a file that is already added', (done) -> 108 | @bumped.config.add 109 | file: 'package.json' 110 | , (err) => 111 | (err?).should.be.equal true 112 | @bumped.config.rc.files.length.should.be.equal 2 113 | done() 114 | 115 | it 'prevent add a file that doesn\'t exist in the directory', (done) -> 116 | @bumped.config.add 117 | file: 'testing.json' 118 | detect: true 119 | , (err) => 120 | (err?).should.be.equal true 121 | @bumped.config.rc.files.length.should.be.equal 2 122 | done() 123 | 124 | it 'add a file that exist in the directory and then save it', (done) -> 125 | @bumped.config.add 126 | file: 'component.json' 127 | detect: true 128 | save: true 129 | , (err, files) -> 130 | console.log err 131 | (err?).should.be.equal false 132 | files.length.should.be.equal 3 133 | config = fs.readFileSync('.bumpedrc', encoding: 'utf8') 134 | config = CSON.parse config 135 | config.files.length.should.be.equal 3 136 | done() 137 | 138 | describe 'remove ::', -> 139 | 140 | it 'try to removed a file that doesn\'t exist', (done) -> 141 | @bumped.config.remove 142 | file: 'unicorn.json' 143 | save: true 144 | , (err) => 145 | (err?).should.be.equal true 146 | @bumped.config.rc.files.length.should.be.equal 3 147 | done() 148 | 149 | it 'remove a previous declared file', (done) -> 150 | 151 | @bumped.config.remove 152 | file: 'component.json' 153 | save: true 154 | , (err) => 155 | (err?).should.be.equal false 156 | @bumped.config.rc.files.length.should.be.equal 2 157 | config = fs.readFileSync('.bumpedrc', encoding: 'utf8') 158 | config = CSON.parse config 159 | config.files.length.should.be.equal 2 160 | done() 161 | 162 | describe 'set ::', -> 163 | 164 | it 'change a property across the files', (done) -> 165 | descriptionValue = 'a new description for the project' 166 | @bumped.config.set 167 | property: 'description' 168 | value: descriptionValue 169 | , (err) -> 170 | (err?).should.be.equal false 171 | loadJSON('./bower.json').description.should.be.equal descriptionValue 172 | loadJSON('./package.json').description.should.be.equal descriptionValue 173 | done() 174 | 175 | describe 'plugins ::', -> 176 | 177 | bumpedFactory 'plugin_directory' 178 | 179 | it 'exists a plugins section in the basic file scaffold', (done) -> 180 | config = fs.readFileSync(@bumped.config.rc.config, encoding: 'utf8') 181 | config = CSON.parse config 182 | (config.plugins?.prerelease?).should.be.equal true 183 | (config.plugins?.prerelease?).should.be.equal true 184 | done() 185 | 186 | it 'release a new version and hook pre releases plugins in order', (done) -> 187 | @bumped.semver.release version: '1.0.0', (err, version) -> 188 | done err if err 189 | # (err?).should.be.equal true 190 | done() 191 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | 2 | ## 0.9.3 (2016-08-27) 3 | 4 | * Add Changelog docs ([da6b9b0](https://github.com/bumped/bumped/commit/da6b9b0)) 5 | * Define a better plugin interface ([dc51357](https://github.com/bumped/bumped/commit/dc51357)) 6 | * Remove dot from message ([fc2e91d](https://github.com/bumped/bumped/commit/fc2e91d)) 7 | * chore(package): update async to version 2.0.0 ([c1576ac](https://github.com/bumped/bumped/commit/c1576ac)) 8 | * chore(package): update exists-file to version 2.1.0 ([8a7757b](https://github.com/bumped/bumped/commit/8a7757b)) 9 | * chore(package): update lodash.clonedeep to version 4.4.0 ([9d31fcc](https://github.com/bumped/bumped/commit/9d31fcc)) 10 | * chore(package): update lodash.clonedeep to version 4.5.0 ([247f536](https://github.com/bumped/bumped/commit/247f536)) 11 | * chore(package): update semver to version 5.2.0 ([1aa87a2](https://github.com/bumped/bumped/commit/1aa87a2)) 12 | * chore(package): update semver to version 5.3.0 ([6b5c00b](https://github.com/bumped/bumped/commit/6b5c00b)) 13 | 14 | 15 | 16 | 17 | ## 0.9.2 (2016-06-23) 18 | 19 | * Add autodetect fallback ([f79c56a](https://github.com/bumped/bumped/commit/f79c56a)) 20 | * Add build docs script ([b988405](https://github.com/bumped/bumped/commit/b988405)) 21 | * Add coverage ([c6b1b25](https://github.com/bumped/bumped/commit/c6b1b25)) 22 | * Add plugins docs (WIP) ([7492754](https://github.com/bumped/bumped/commit/7492754)) 23 | * Little refactor ([1c34449](https://github.com/bumped/bumped/commit/1c34449)) 24 | * Lock dep ([36475de](https://github.com/bumped/bumped/commit/36475de)) 25 | * Update doc ([ec9b5da](https://github.com/bumped/bumped/commit/ec9b5da)) 26 | * Update docs ([a738501](https://github.com/bumped/bumped/commit/a738501)) 27 | * Update docs ([b2badf8](https://github.com/bumped/bumped/commit/b2badf8)) 28 | * chore(package): update update-notifier to version 1.0.0 ([3f6d58b](https://github.com/bumped/bumped/commit/3f6d58b)) 29 | 30 | 31 | 32 | 33 | ## 0.9.1 (2016-06-04) 34 | 35 | * Unify errorHandler interface ([585807d](https://github.com/bumped/bumped/commit/585807d)) 36 | 37 | 38 | 39 | 40 | # 0.9.0 (2016-06-04) 41 | 42 | * Fix little style issues ([8e8aa7f](https://github.com/bumped/bumped/commit/8e8aa7f)) 43 | * Fix typo ([30e0e0a](https://github.com/bumped/bumped/commit/30e0e0a)) 44 | * Force set key ([3e4126d](https://github.com/bumped/bumped/commit/3e4126d)) 45 | * Handle correctly trying to add files that doesn't exists ([c179d41](https://github.com/bumped/bumped/commit/c179d41)) 46 | * Handle set exception cases ([127f8fb](https://github.com/bumped/bumped/commit/127f8fb)) 47 | * Little refactor ([42aa80b](https://github.com/bumped/bumped/commit/42aa80b)) 48 | * Remove detectFile method ([38ce440](https://github.com/bumped/bumped/commit/38ce440)) 49 | * Remove duplicate check ([cc3031b](https://github.com/bumped/bumped/commit/cc3031b)) 50 | * Require version key just for first file declared ([aaca2d0](https://github.com/bumped/bumped/commit/aaca2d0)) 51 | * Standarize predicate ([1a09085](https://github.com/bumped/bumped/commit/1a09085)) 52 | * chore(package): update dot-prop to version 3.0.0 ([1452da8](https://github.com/bumped/bumped/commit/1452da8)) 53 | * chore(package): update exists-file to version 2.0.0 ([4d3d9c5](https://github.com/bumped/bumped/commit/4d3d9c5)) 54 | * chore(package): update update-notifier to version 0.7.0 ([c9f0ecd](https://github.com/bumped/bumped/commit/c9f0ecd)) 55 | 56 | 57 | 58 | 59 | ## 0.8.1 (2016-05-01) 60 | 61 | * Simplifiest logging levels ([fcbee83](https://github.com/bumped/bumped/commit/fcbee83)) 62 | * Update to Acho v3 ([0f407f4](https://github.com/bumped/bumped/commit/0f407f4)) 63 | * chore(package): update acho to version 2.6.0 ([973d592](https://github.com/bumped/bumped/commit/973d592)) 64 | * chore(package): update acho to version 2.7.0 ([f308c6b](https://github.com/bumped/bumped/commit/f308c6b)) 65 | * chore(package): update acho to version 2.8.0 ([65a82fb](https://github.com/bumped/bumped/commit/65a82fb)) 66 | * chore(package): update chalk to version 1.1.2 ([2ed1e25](https://github.com/bumped/bumped/commit/2ed1e25)) 67 | * chore(package): update existential-default to version 1.2.1 ([4fce3c5](https://github.com/bumped/bumped/commit/4fce3c5)) 68 | * chore(package): update existential-default to version 1.3.1 ([5070d94](https://github.com/bumped/bumped/commit/5070d94)) 69 | * chore(package): update fs-extra to version 0.27.0 ([a0e6896](https://github.com/bumped/bumped/commit/a0e6896)) 70 | * chore(package): update fs-extra to version 0.28.0 ([0fa78d0](https://github.com/bumped/bumped/commit/0fa78d0)) 71 | * chore(package): update fs-extra to version 0.29.0 ([6402fdc](https://github.com/bumped/bumped/commit/6402fdc)) 72 | * chore(package): update fs-extra to version 0.30.0 ([96f2352](https://github.com/bumped/bumped/commit/96f2352)) 73 | * chore(package): update lodash.clonedeep to version 4.3.2 ([22dee04](https://github.com/bumped/bumped/commit/22dee04)) 74 | 75 | 76 | 77 | 78 | # [0.8.0](https://github.com/bumped/bumped/compare/0.7.1...v0.8.0) (2016-03-24) 79 | 80 | 81 | 82 | 83 | 84 | ## 0.7.1 (2016-03-16) 85 | 86 | 87 | ### chore 88 | 89 | * chore(package): update dot-prop to version 2.3.0 ([8f06fbb](https://github.com/bumped/bumped/commit/8f06fbb)) 90 | * chore(package): update dot-prop to version 2.4.0 ([fcb962c](https://github.com/bumped/bumped/commit/fcb962c)) 91 | * chore(package): update lodash.clonedeep to version 4.2.0 ([5c998c8](https://github.com/bumped/bumped/commit/5c998c8)) 92 | * chore(package): update lodash.clonedeep to version 4.3.0 ([c8201ef](https://github.com/bumped/bumped/commit/c8201ef)) 93 | 94 | * Delete ':' from help command ([c3eb5ae](https://github.com/bumped/bumped/commit/c3eb5ae)) 95 | * fix typo ([09cc6d6](https://github.com/bumped/bumped/commit/09cc6d6)) 96 | * Improve global installation of packages ([e5cf7e0](https://github.com/bumped/bumped/commit/e5cf7e0)) 97 | * Merge pull request #10 from bumped/greenkeeper-lodash.clonedeep-4.2.0 ([a13d44d](https://github.com/bumped/bumped/commit/a13d44d)) 98 | * Merge pull request #11 from bumped/greenkeeper-lodash.clonedeep-4.3.0 ([faf74dd](https://github.com/bumped/bumped/commit/faf74dd)) 99 | * Merge pull request #12 from bumped/greenkeeper-dot-prop-2.3.0 ([ec17539](https://github.com/bumped/bumped/commit/ec17539)) 100 | * Merge pull request #13 from bumped/greenkeeper-dot-prop-2.4.0 ([46464ec](https://github.com/bumped/bumped/commit/46464ec)) 101 | * Setup spawn process correctly ([7b4f725](https://github.com/bumped/bumped/commit/7b4f725)) 102 | 103 | 104 | 105 | 106 | # 0.7.0 (2016-02-13) 107 | 108 | 109 | ### chore 110 | 111 | * chore(package): update lodash.clonedeep to version 4.1.0 ([1875ce7](https://github.com/bumped/bumped/commit/1875ce7)) 112 | 113 | * Add support different semver style ([33c4946](https://github.com/bumped/bumped/commit/33c4946)) 114 | * Add unit tests ([6fdae45](https://github.com/bumped/bumped/commit/6fdae45)) 115 | * Better docs ([776e1d0](https://github.com/bumped/bumped/commit/776e1d0)) 116 | * Fix #9 ([b56b45f](https://github.com/bumped/bumped/commit/b56b45f)), closes [#9](https://github.com/bumped/bumped/issues/9) 117 | * Fix tests ([5ef5e57](https://github.com/bumped/bumped/commit/5ef5e57)) 118 | * Fix typo ([563d4be](https://github.com/bumped/bumped/commit/563d4be)) 119 | * Merge pull request #7 from bumped/greenkeeper-lodash.clonedeep-4.1.0 ([d8bc22d](https://github.com/bumped/bumped/commit/d8bc22d)) 120 | * Release 0.7.0 ([93bc0e6](https://github.com/bumped/bumped/commit/93bc0e6)) 121 | * Update README.md ([3f51408](https://github.com/bumped/bumped/commit/3f51408)) 122 | 123 | 124 | 125 | 126 | ## 0.6.2 (2016-02-02) 127 | 128 | 129 | ### chore 130 | 131 | * chore(package): update acho to version 2.5.3 ([664f9f7](https://github.com/bumped/bumped/commit/664f9f7)) 132 | 133 | * Merge pull request #6 from bumped/greenkeeper-acho-2.5.3 ([3bd4648](https://github.com/bumped/bumped/commit/3bd4648)) 134 | * Release 0.6.2 ([bdb00e7](https://github.com/bumped/bumped/commit/bdb00e7)) 135 | 136 | 137 | 138 | 139 | ## 0.6.1 (2016-02-02) 140 | 141 | 142 | * change dependency ([e7759ec](https://github.com/bumped/bumped/commit/e7759ec)) 143 | * Change util.updateJSON to avoid caching ([a70ad5a](https://github.com/bumped/bumped/commit/a70ad5a)) 144 | * Delete unused vars ([ff9a2cb](https://github.com/bumped/bumped/commit/ff9a2cb)) 145 | * Fix test ([5f9f3bf](https://github.com/bumped/bumped/commit/5f9f3bf)) 146 | * lock dependencies ([143d61f](https://github.com/bumped/bumped/commit/143d61f)) 147 | * Release 0.6.1 ([03f0721](https://github.com/bumped/bumped/commit/03f0721)) 148 | * update settings ([3a5c217](https://github.com/bumped/bumped/commit/3a5c217)) 149 | 150 | 151 | 152 | 153 | # 0.6.0 (2016-01-03) 154 | 155 | 156 | * 0.6.0 releases ([cfa0848](https://github.com/bumped/bumped/commit/cfa0848)) 157 | * Add better pre and post test scripts ([f171a05](https://github.com/bumped/bumped/commit/f171a05)) 158 | * Add bumped-http ([b87202b](https://github.com/bumped/bumped/commit/b87202b)) 159 | * Add time-span dep ([9c34143](https://github.com/bumped/bumped/commit/9c34143)) 160 | * Delete outputMessage param ([8c0bd13](https://github.com/bumped/bumped/commit/8c0bd13)) 161 | * Delete outputMessageType param ([3a8ad53](https://github.com/bumped/bumped/commit/3a8ad53)) 162 | * Delete unnecessary code ([ba159a1](https://github.com/bumped/bumped/commit/ba159a1)) 163 | * Delete unnecessary variable ([4e50f30](https://github.com/bumped/bumped/commit/4e50f30)) 164 | * Fix color ([91b3e91](https://github.com/bumped/bumped/commit/91b3e91)) 165 | * Fix global timespan ([95b8954](https://github.com/bumped/bumped/commit/95b8954)) 166 | * Fix messages ([0490f3e](https://github.com/bumped/bumped/commit/0490f3e)) 167 | * Fix newline ([174892d](https://github.com/bumped/bumped/commit/174892d)) 168 | * Fix tests scripts ([4c277e0](https://github.com/bumped/bumped/commit/4c277e0)) 169 | * Fix timespan fn ([cf609ce](https://github.com/bumped/bumped/commit/cf609ce)) 170 | * Little refactor ([6159c1f](https://github.com/bumped/bumped/commit/6159c1f)) 171 | * More simple ([6376eed](https://github.com/bumped/bumped/commit/6376eed)) 172 | * Refactor ([a0af84e](https://github.com/bumped/bumped/commit/a0af84e)) 173 | * Refactor bin ([8ff47ff](https://github.com/bumped/bumped/commit/8ff47ff)) 174 | * Remove global timespan ([cdc2ec8](https://github.com/bumped/bumped/commit/cdc2ec8)) 175 | * Remove unnecessary ([36368bb](https://github.com/bumped/bumped/commit/36368bb)) 176 | * Remove unnecessary code ([6bbd36c](https://github.com/bumped/bumped/commit/6bbd36c)) 177 | * WIP ([c2124fa](https://github.com/bumped/bumped/commit/c2124fa)) 178 | * WIP ([ed3b579](https://github.com/bumped/bumped/commit/ed3b579)) 179 | * WIP ([682c388](https://github.com/bumped/bumped/commit/682c388)) 180 | 181 | 182 | 183 | 184 | ## 0.5.7 (2015-12-29) 185 | 186 | 187 | * 0.5.7 releases ([8e8f8d7](https://github.com/bumped/bumped/commit/8e8f8d7)) 188 | * Add gif ✨💄 ([b5836f5](https://github.com/bumped/bumped/commit/b5836f5)) 189 | * Better error handler ([2ba899d](https://github.com/bumped/bumped/commit/2ba899d)) 190 | * Delete extra space ([c0d02ad](https://github.com/bumped/bumped/commit/c0d02ad)) 191 | * Fix style ([0091b95](https://github.com/bumped/bumped/commit/0091b95)) 192 | 193 | 194 | 195 | 196 | ## 0.5.6 (2015-12-05) 197 | 198 | 199 | * 0.5.6 releases ([beafb02](https://github.com/bumped/bumped/commit/beafb02)) 200 | * removed coveralls ([f6a04af](https://github.com/bumped/bumped/commit/f6a04af)) 201 | * Update .travis.yml ([6570e57](https://github.com/bumped/bumped/commit/6570e57)) 202 | * updated Acho interface ([4720ce6](https://github.com/bumped/bumped/commit/4720ce6)) 203 | * updated devDependencies version ([2a26711](https://github.com/bumped/bumped/commit/2a26711)) 204 | * updated travis node builds ([10b1660](https://github.com/bumped/bumped/commit/10b1660)) 205 | 206 | 207 | 208 | 209 | ## 0.5.5 (2015-11-03) 210 | 211 | 212 | ### chore 213 | 214 | * chore(package): update coffee-coverage to version 0.7.0 ([3a44890](https://github.com/bumped/bumped/commit/3a44890)) 215 | 216 | * 0.5.5 releases ([35440ba](https://github.com/bumped/bumped/commit/35440ba)) 217 | * fixed missing space ([22256cf](https://github.com/bumped/bumped/commit/22256cf)) 218 | * improve line breaks in the output ([a03fa0f](https://github.com/bumped/bumped/commit/a03fa0f)) 219 | * integrates with coveralls ([39fb1cb](https://github.com/bumped/bumped/commit/39fb1cb)) 220 | * little style change ([5da22ef](https://github.com/bumped/bumped/commit/5da22ef)) 221 | * Merge pull request #4 from bumped/greenkeeper-coffee-coverage-0.7.0 ([c1600ca](https://github.com/bumped/bumped/commit/c1600ca)) 222 | * updated settings ([ae8658a](https://github.com/bumped/bumped/commit/ae8658a)) 223 | 224 | 225 | 226 | 227 | ## 0.5.4 (2015-10-17) 228 | 229 | 230 | * 0.5.3 releases ([57926e8](https://github.com/bumped/bumped/commit/57926e8)) 231 | * 0.5.4 releases ([b76a3d0](https://github.com/bumped/bumped/commit/b76a3d0)) 232 | * avoiding innecessary information ([dd6c2d0](https://github.com/bumped/bumped/commit/dd6c2d0)) 233 | * little UI changes ([e7fcf12](https://github.com/bumped/bumped/commit/e7fcf12)) 234 | 235 | 236 | 237 | 238 | ## 0.5.2 (2015-10-16) 239 | 240 | 241 | * 0.5.2 releases ([97a50dc](https://github.com/bumped/bumped/commit/97a50dc)) 242 | * better grammar ([85dee69](https://github.com/bumped/bumped/commit/85dee69)) 243 | * new log approach. renamed 'plugins' into 'plugin' ([bde4e8e](https://github.com/bumped/bumped/commit/bde4e8e)) 244 | * new log skin ([8600578](https://github.com/bumped/bumped/commit/8600578)) 245 | * output time ([bccb6f1](https://github.com/bumped/bumped/commit/bccb6f1)) 246 | * UI consistency ([f525656](https://github.com/bumped/bumped/commit/f525656)) 247 | * Update README.md ([5e39e46](https://github.com/bumped/bumped/commit/5e39e46)) 248 | * using your own chalk dependency ([f14fd81](https://github.com/bumped/bumped/commit/f14fd81)) 249 | 250 | 251 | 252 | 253 | ## 0.5.1 (2015-10-12) 254 | 255 | 256 | * 0.5.1 releases ([04c58b3](https://github.com/bumped/bumped/commit/04c58b3)) 257 | * added finepack plugin ([96cd5a3](https://github.com/bumped/bumped/commit/96cd5a3)) 258 | * bye black style, welcome white ([b03e946](https://github.com/bumped/bumped/commit/b03e946)) 259 | * notifications for new plugins versions available ([e7fa304](https://github.com/bumped/bumped/commit/e7fa304)) 260 | * Update README.md ([31b43cc](https://github.com/bumped/bumped/commit/31b43cc)) 261 | * Update README.md ([9790bf0](https://github.com/bumped/bumped/commit/9790bf0)) 262 | 263 | 264 | 265 | 266 | # 0.5.0 (2015-08-18) 267 | 268 | 269 | * 0.5.0 releases ([60d3246](https://github.com/bumped/bumped/commit/60d3246)) 270 | * added plugins feedback animation ([dbe4bfb](https://github.com/bumped/bumped/commit/dbe4bfb)) 271 | * meh ([d8b37ba](https://github.com/bumped/bumped/commit/d8b37ba)) 272 | * sort dependencies ([4c4e565](https://github.com/bumped/bumped/commit/4c4e565)) 273 | 274 | 275 | 276 | 277 | ## 0.4.5 (2015-07-31) 278 | 279 | 280 | * 0.4.5 releases ([f48619c](https://github.com/bumped/bumped/commit/f48619c)) 281 | * little refactor to prevent \n for empty messages ([91361b6](https://github.com/bumped/bumped/commit/91361b6)) 282 | 283 | 284 | 285 | 286 | ## 0.4.4 (2015-07-30) 287 | 288 | 289 | * 0.4.4 releases ([e901ca9](https://github.com/bumped/bumped/commit/e901ca9)) 290 | * little refactor improving output messages ([9d57dca](https://github.com/bumped/bumped/commit/9d57dca)) 291 | * updated settings ([ffd0c52](https://github.com/bumped/bumped/commit/ffd0c52)) 292 | 293 | 294 | 295 | 296 | ## 0.4.3 (2015-07-29) 297 | 298 | 299 | * 0.4.3 releases ([e0d84cf](https://github.com/bumped/bumped/commit/e0d84cf)) 300 | * added pre & post tests hooks ([e5fbbcf](https://github.com/bumped/bumped/commit/e5fbbcf)) 301 | * little refactor ([019e49b](https://github.com/bumped/bumped/commit/019e49b)) 302 | * Update package.json ([7cd77e2](https://github.com/bumped/bumped/commit/7cd77e2)) 303 | * updated ([9fd9a2d](https://github.com/bumped/bumped/commit/9fd9a2d)) 304 | 305 | 306 | 307 | 308 | ## 0.4.2 (2015-07-29) 309 | 310 | 311 | * 0.4.2 releases ([11d17d8](https://github.com/bumped/bumped/commit/11d17d8)) 312 | * deleted last line break in plugins ([da759cf](https://github.com/bumped/bumped/commit/da759cf)) 313 | * improved plugins output ([4a383f8](https://github.com/bumped/bumped/commit/4a383f8)) 314 | * Update Bumped.plugins.coffee ([6be6634](https://github.com/bumped/bumped/commit/6be6634)) 315 | * Update Bumped.plugins.coffee ([df3fa76](https://github.com/bumped/bumped/commit/df3fa76)) 316 | 317 | 318 | 319 | 320 | ## 0.4.1 (2015-07-21) 321 | 322 | 323 | * 0.4.1 releases ([1bf6f55](https://github.com/bumped/bumped/commit/1bf6f55)) 324 | * added force-require dependency ([eee1c13](https://github.com/bumped/bumped/commit/eee1c13)) 325 | * Update .bumpedrc ([6b861b6](https://github.com/bumped/bumped/commit/6b861b6)) 326 | 327 | 328 | 329 | 330 | # 0.4.0 (2015-07-21) 331 | 332 | 333 | * 0.4.0 releases ([db72422](https://github.com/bumped/bumped/commit/db72422)) 334 | * added bumped-terminal as dev dependency ([613ea6b](https://github.com/bumped/bumped/commit/613ea6b)) 335 | * added minimal plugin interface ([863a775](https://github.com/bumped/bumped/commit/863a775)) 336 | * fixed set array ([4cce160](https://github.com/bumped/bumped/commit/4cce160)) 337 | * little refactor ([2449841](https://github.com/bumped/bumped/commit/2449841)) 338 | * Merge pull request #2 from bumped/hooks ([8bc8e3c](https://github.com/bumped/bumped/commit/8bc8e3c)) 339 | * refactor tests ([1101c50](https://github.com/bumped/bumped/commit/1101c50)) 340 | * unified handle errors ([4a00ccf](https://github.com/bumped/bumped/commit/4a00ccf)) 341 | * WIP ([d9563a4](https://github.com/bumped/bumped/commit/d9563a4)) 342 | 343 | 344 | 345 | 346 | # 0.3.0 (2015-07-09) 347 | 348 | 349 | * fixed little bug ([70d5695](https://github.com/bumped/bumped/commit/70d5695)) 350 | * indented ([66d0aa9](https://github.com/bumped/bumped/commit/66d0aa9)) 351 | * load plugins scaffold ([cc66f31](https://github.com/bumped/bumped/commit/cc66f31)) 352 | * Merge branch 'hooks' ([3fea910](https://github.com/bumped/bumped/commit/3fea910)) 353 | * Merge branch 'hooks' ([17b8348](https://github.com/bumped/bumped/commit/17b8348)) 354 | * refactor semver.release method ([3191e18](https://github.com/bumped/bumped/commit/3191e18)) 355 | * write plugins default scaffold ([29eafce](https://github.com/bumped/bumped/commit/29eafce)) 356 | 357 | 358 | 359 | 360 | ## 0.2.17 (2015-07-03) 361 | 362 | 363 | * 0.2.17 releases ([260d5b0](https://github.com/bumped/bumped/commit/260d5b0)) 364 | * added better help ([eeb3845](https://github.com/bumped/bumped/commit/eeb3845)) 365 | * added keywords ([4aaf42f](https://github.com/bumped/bumped/commit/4aaf42f)) 366 | * little refactor ([bf7a0d1](https://github.com/bumped/bumped/commit/bf7a0d1)) 367 | * updated ([02ddff6](https://github.com/bumped/bumped/commit/02ddff6)) 368 | 369 | 370 | 371 | 372 | # 0.2.0 (2015-06-21) 373 | 374 | 375 | * 0.2.0 releases ([e27c654](https://github.com/bumped/bumped/commit/e27c654)) 376 | * added config.set command ([4e7b4da](https://github.com/bumped/bumped/commit/4e7b4da)) 377 | * completed .set command 💄 ([1d180b3](https://github.com/bumped/bumped/commit/1d180b3)) 378 | * fixed nested object ([dc86baf](https://github.com/bumped/bumped/commit/dc86baf)) 379 | * objects and array support in config.set. Avoid use it for set version ([e5bda4c](https://github.com/bumped/bumped/commit/e5bda4c)) 380 | * removed deprecated fs.exists 💀 ([693cb75](https://github.com/bumped/bumped/commit/693cb75)) 381 | * try ([916ac1c](https://github.com/bumped/bumped/commit/916ac1c)) 382 | * updated ([88c69a6](https://github.com/bumped/bumped/commit/88c69a6)) 383 | * updated ([1e0b594](https://github.com/bumped/bumped/commit/1e0b594)) 384 | * use .stats instead of .exists ([04df0f2](https://github.com/bumped/bumped/commit/04df0f2)) 385 | 386 | 387 | 388 | 389 | # 0.1.0 (2015-06-01) 390 | 391 | 392 | * added 'add' command ([2f1783b](https://github.com/bumped/bumped/commit/2f1783b)) 393 | * added 'remove' command ([9561b79](https://github.com/bumped/bumped/commit/9561b79)) 394 | * added basic documentation and little improvements ([8e41463](https://github.com/bumped/bumped/commit/8e41463)) 395 | * added method for load configuration files ([3090df1](https://github.com/bumped/bumped/commit/3090df1)) 396 | * added minimal bin interface and default configuration ([1694d57](https://github.com/bumped/bumped/commit/1694d57)) 397 | * added missing dependency ([6114f80](https://github.com/bumped/bumped/commit/6114f80)) 398 | * added support for release versions based in semver keyword and numbers ([0b301fe](https://github.com/bumped/bumped/commit/0b301fe)) 399 | * adjust message text ([19a10c6](https://github.com/bumped/bumped/commit/19a10c6)) 400 | * avoid circular dependency ([ffa7184](https://github.com/bumped/bumped/commit/ffa7184)) 401 | * check first ([1a95911](https://github.com/bumped/bumped/commit/1a95911)) 402 | * deleted unnecesary code ([12e3ee5](https://github.com/bumped/bumped/commit/12e3ee5)) 403 | * deleted unnecessary file check ([8c915d6](https://github.com/bumped/bumped/commit/8c915d6)) 404 | * doesn't init by default ([0b1de9c](https://github.com/bumped/bumped/commit/0b1de9c)) 405 | * ensure to initialize first ([86ec260](https://github.com/bumped/bumped/commit/86ec260)) 406 | * experiment ([b15897d](https://github.com/bumped/bumped/commit/b15897d)) 407 | * first commit ([dac2388](https://github.com/bumped/bumped/commit/dac2388)) 408 | * fixed remove method ([c1c59f2](https://github.com/bumped/bumped/commit/c1c59f2)) 409 | * little refactor ([581a7b9](https://github.com/bumped/bumped/commit/581a7b9)) 410 | * little refactor ([6bdc56c](https://github.com/bumped/bumped/commit/6bdc56c)) 411 | * Merge branch 'elenatorro-master' ([c0731ad](https://github.com/bumped/bumped/commit/c0731ad)) 412 | * naming refactor ([34f26a2](https://github.com/bumped/bumped/commit/34f26a2)) 413 | * README revised ([7dd952a](https://github.com/bumped/bumped/commit/7dd952a)) 414 | * refactor ([e31da57](https://github.com/bumped/bumped/commit/e31da57)) 415 | * refactor ([c10ccbc](https://github.com/bumped/bumped/commit/c10ccbc)) 416 | * refactor and updated cli ([2e21a8e](https://github.com/bumped/bumped/commit/2e21a8e)) 417 | * refactor CLI and normalize interface ([9a70226](https://github.com/bumped/bumped/commit/9a70226)) 418 | * refactor config into class ([90da435](https://github.com/bumped/bumped/commit/90da435)) 419 | * refactor into classes ([ad7c934](https://github.com/bumped/bumped/commit/ad7c934)) 420 | * refactor logger into class ([e57b4e6](https://github.com/bumped/bumped/commit/e57b4e6)) 421 | * refactor tests ([55c5611](https://github.com/bumped/bumped/commit/55c5611)) 422 | * refactor using async ([54888c4](https://github.com/bumped/bumped/commit/54888c4)) 423 | * releases 0.1.0 ([356efa4](https://github.com/bumped/bumped/commit/356efa4)) 424 | * renamed ([bc9589c](https://github.com/bumped/bumped/commit/bc9589c)) 425 | * some fixes ([a7578be](https://github.com/bumped/bumped/commit/a7578be)) 426 | * split config.detect in two methods ([ea668e7](https://github.com/bumped/bumped/commit/ea668e7)) 427 | * support CSON by default ([06c5292](https://github.com/bumped/bumped/commit/06c5292)) 428 | * Update README.md ([ecbb1c3](https://github.com/bumped/bumped/commit/ecbb1c3)) 429 | * Update README.md ([7907437](https://github.com/bumped/bumped/commit/7907437)) 430 | * Update README.md ([66eff42](https://github.com/bumped/bumped/commit/66eff42)) 431 | * updated ([11ef67f](https://github.com/bumped/bumped/commit/11ef67f)) 432 | * updated ([a6850ac](https://github.com/bumped/bumped/commit/a6850ac)) 433 | * updated ([d6e7734](https://github.com/bumped/bumped/commit/d6e7734)) 434 | * use rc namespace instead of config ([df49d4a](https://github.com/bumped/bumped/commit/df49d4a)) 435 | 436 | 437 | 438 | --------------------------------------------------------------------------------