# Change Log
All notable changes to this project will be documented in this file.
This project adheres to [Semantic Versioning](http://semver.org/).
## Unreleased
Diff for [unreleased]
## 3.4.0 - 2021-08-10
### Added
- `telemetry` `v1.0.0` support (#483)
- Logger Metadata (#462 & #464)
- Support setting job `state` in config (#463)
### Fixed
- Invalid Timezone fix in `ExecutionBroadcaster` (#468)
Diff for [3.4.0]
## 3.3.0 - 2020-09-25
### Added
- Support manual job triggering (#459)
Diff for [3.3.0]
## 3.2.0 - 2020-09-14
### Added
- Telemetry Support (#415)
### Fixed
- Properly override jobs with duplicate name (#392)
- Simplify `TaskRegistry` and make tests deterministic
Diff for [3.2.0]
## 3.1.0 - 2020-08-18
### Added
- Additional Supervisor Configuration for Clustering (#450)
Diff for [3.1.0]
## 3.0.2 - 2020-08-18
### Fixed
- Fix Warnings with Clock Skew (#449)
Diff for [3.0.2]
## 3.0.1 - 2020-06-16
### Fixed
- `ClockEvent` order corrected
Diff for [3.0.1]
## 3.0.0 - 2020-06-11
### Fixed
- Fix `@reboot` Cron Expression (#437)
Diff for [3.0.0]
## 3.0.0-rc.3 - 2020-02-28
### Fixed
- Update Docs
Diff for [3.0.0-rc.3]
## 3.0.0-rc.2 - 2020-02-28
### Changed
- The `Quantum.Storage` behaviour contains a new mandatory `child_spec/1` callback.
Diff for [3.0.0-rc.2]
## 3.0.0-rc.1 - 2020-02-26
### Changed
- A lot of function that were not for public use have been undocumented. Those are now considered internal and may break at any point in time.
- `Quantum.Scheduler` has been renamed to `Quantum`
- `Quantum.Storage.Adapter` has been renamed to `Quantum.Storage`
- The `global` mode has been removed. It will be reimplemented if a stable replacement is found.
Diff for [3.0.0-rc.1]
## 2.4.0 - 2020-02-25
### Added
- Native Date Library (via #405)
- Adding of inactive Jobs (via #409)
### Fixed
- GenStage 1.0 compatibility (via #424)
- Doc Fixes (#394, #396, #400, #401)
Diff for [2.4.0]
## 2.3.4 - 2019-01-06
### Fixed
- Faster Startup duration for non-global (Fixes #376)
Diff for [2.3.4]
## 2.3.3 - 2018-09-06
### Fixed
- Fix & Test Swarm Handoff & Conflict Resolution
- Fix Compilation Error
- Fix Executor Stat Options for GenStage ~> 0.12.0
Diff for [2.3.3]
## 2.3.2 - 2018-08-21
### Fixed
- Global Clustering Worker Start
Diff for [2.3.2]
## 2.3.1 - 2018-08-13
### Fixed
- Fixed Regression in Run Strategy Random
Diff for [2.3.1]
## 2.3.0 - 2018-08-10
### Added
- Experimental Storage API
### Fixed
- Use Swarm for clustering to prevent broken cluster state
- Better search for available nodes for run strategies
Diff for [2.3.0]
## 2.2.7 - 2018-03-22
### Changed
- Moved the Repository into Organization & Correct all the URL's
### Fixed
- Fixed Dialyzer Warnings
Diff for [2.2.7]
## 2.2.6 - 2018-03-21
### Fixed
- Fixed problem with Daylight Saving Time for jobs with timezone other than UTC.
Diff for [2.2.6]
## 2.2.5 - 2018-02-26
### Fixed
- Omit `gen_stage` warning on `~> 0.13`
Diff for [2.2.5]
## 2.2.4 - 2018-02-23
### Fixed
- Relax `timex` dependency
Diff for [2.2.4]
## 2.2.3 - 2018-02-13
### Fixed
- Fixed compatibility with `gen_stage ~> 0.12`
Diff for [2.2.3]
## 2.2.2 - 2018-02-08
### Added
- Better Debugging Capabilities
### Fixed
- Relaxed version requirements for `gen_stage`
Diff for [2.2.2]
## 2.2.1 - 2018-01-03
### Fixed
- sometimes the task supervisor was not running in a cluster
Diff for [2.2.1]
## 2.2.0 - 2017-11-07
Diff for [2.2.0]
### Added
- Local run strategy
## 2.1.3 - 2017-11-07
Diff for [2.1.3]
### Fixed
- Runtime Added Jobs are executed right away instead of waiting for the next job execution.
- Fix Typo in Doc
## 2.1.2 - 2017-11-04
Diff for [2.1.2]
### Added
- Distillery is not mentioned in list of package managers
### Changed
- Source is not formatted properly
### Fixed
- Removed unused Alias from `Quantum.Job`
- Hot upgrade is not possible due to missing supervisor
## 2.1.1 - 2017-10-02
Diff for [2.1.1]
### Fixed
- Resolved some Dialyzer Warnings
## 2.1.0 - 2017-09-10
Diff for [2.1.0]
### Fixed
- Resolved some Dialyzer Warnings
## 2.1.0-beta.1 - 2017-08-20
Diff for [2.1.0-beta.1]
The internal handling has been refactored onto `gen_stage`.
There were a few Breaking Changes which should not influence a user of the library.
### Changed
- Replaced `call` with `cast`
* `Scheduler.add_job`
* `Scheduler.deactivate_job`
* `Scheduler.activate_job`
* `Scheduler.delete_job`
* `Scheduler.delete_all_jobs`
### Removed
- The overlap handling is removed from the Job struct.
* removed `Job.pids`
* removed `Job.executable?`
## 2.0.4 - 2017-09-01
Diff for [2.0.4]
### Fixed
- Fix Race Condition with reboot in Runner state
## 2.0.3 - 2017-08-29
Diff for [2.0.3]
### Fixed
- `@reboot` cron expressions
## 2.0.2 - 2017-08-23
Diff for [2.0.2]
### Fixed
- Updated Docs.
## 2.0.1 - 2017-08-23
Diff for [2.0.1]
- Timezone in job configuration is now normalized into a job.
## 2.0.0 - 2017-07-20
Diff for [2.0.0]
The whole library has been refactored. See the [Migration Guide](https://hexdocs.pm/quantum/migrate-v2.html).
## 2.0.0-beta.2 - 2017-07-13
Diff for [2.0.0-beta.2]
The whole library has been refactored. See the [Migration Guide](https://hexdocs.pm/quantum/migrate-v2.html).
## 2.0.0-beta.1 - 2017-06-07
Diff for [2.0.0-beta.1]
The whole library has been refactored. See the [Migration Guide](https://hexdocs.pm/quantum/migrate-v2.html).
## 1.9.2 - 2017-05-19
Diff for [1.9.2]
## 1.9.1 - 2017-03-17
Diff for [1.9.1]
## 1.9.0 - 2017-02-07
Diff for [1.9.0]
### Removed
- Three modules were removed and replaced by [crontab](https://hex.pm/packages/crontab).
* `Quantum.Matcher`
* `Quantum.Parser`
* `Quantum.Translator`
### Fixed
- The whole cron expression syntax is now supported.
- Crons can now be configured for Umbrella applications. See the `README` for the new syntax.
### Changed
- Cron Expressions can now be provided via the `%Crontab.CronExpression{}` struct or via the `~e[CRON EXPRESSION]` sigil.
- Cron Expressions can now be extended. This way second granularity of the expressions can be provided.
### Deprecated
- The configuration property `cron` is deprecated. Use the app configuration instead.
## 1.8.1 - 2016-11-20
Diff for [1.8.1]
### Changed
- Clarity on the table to not use full name of day ([Coburn Berry](https://github.com/crododile))
- Travis testing against erlang 19.1 and elixir 1.3.3 ([Julius Beckmann](https://github.com/h4cc))
- Don't allow "local" timezone. Replace Timex w. Calendar ([Lau Taarnskov](https://github.com/lau))
### Fixed
- Global cannot be used directly ([Po Chen](https://github.com/princemaple))
- Support for timezones other than utc or local not in readme ([Coburn Berry](https://github.com/crododile))
- Timezone as string not working in config ([Daniel Roux](https://github.com/xrx))
### Removed
- Timex references in readme ([Coburn Berry](https://github.com/crododile))
- License badge in README
## 1.8.0 - 2016-09-19
Diff for [1.8.0]
### Changed
- Requires Elixir >= 1.3
- Updated C4 contribution process to RFC42
- Updated timex dependency to 3.0 ([Svilen Gospodinov](https://github.com/svileng))
### Fixed
- Same task could be generated multiple times in a cluster ([Po Chen](https://github.com/princemaple))
- Elixir 1.3.0 introduced unsafe var warnings ([Jamie J Quinn](https://github.com/JamieJQuinn))
- Typo in README ([Uģis Ozols](https://github.com/ugisozols))
- Code coverage below 100% ([Lucas Charles](https://github.com/theoretick))
### Removed
- Unused alias ([Philip Giuliani](https://github.com/philipgiuliani))
## 1.7.1 - 2016-03-24
Diff for [1.7.1]
### Added
- Optional per-job timezone support
### Fixed
- Nodes defaulting in `%Quantum.Job` struct
- `job.nodes` defaulting in the normalizer
- Test suite after changing defaulting of nodes property for the `%Quantum.Jobs{}` struct
## 1.7.0 - 2016-03-09
Diff for [1.7.0]
### Added
- ToC to README
- Documentation for `overlap` option
- Elixir 1.2 to Travis-CI config
- Prevent duplicate job-names at runtime ([Kai Faber](https://github.com/kaiatgithub))
### Changed
- ToC markdown
- Default values are now configurable
- Updated all dependencies
- Required Elixir version is now `>= 1.2`
### Fixed
- Overlap option was not set to jobs
- Incorrect example in README
- Timezone is not configurable at runtime
- Credo warnings
- GenServer restarts when one of the jobs crashes (#82)
## 1.6.1 - 2015-12-09
Diff for [1.6.1]
### Fixed
- `@reboot` entries are throwing errors
- Credo warnings and software design suggestions
- Elixir 1.2 warnings
### Changed
- Dependency 'credo' updated
- Refactored range variables
- `.gitignore` updated
## 1.6.0 - 2015-11-25
Diff for [1.6.0]
### Added
- PID of last executed task to job struct
- Credo code linter (only for dev and test)
- Total downloads badge to README
- Elixir 1.1.0 and Erlang 18.1 to Travis-CI config
### Fixed
- Max hour is 23, not 24
- Long-running jobs could overlap
- Typo in README ([Lucas Charles](https://github.com/theoretick))
- Incorrect function and response types in readme ([Bart van Zon](https://github.com/bartj3))
- Unnamed job tuples cannot take args ([Lucas Charles](https://github.com/theoretick))
- Job names can only be atoms and can't be GC ([Luis Hurtado](https://github.com/luishurtado))
## 1.5.0 - 2015-09-24
Diff for [1.5.0]
### Added
- Ability to run jobs on exact node ([Rodion Vshevtsov](https://github.com/alPacino))
- Documentation of named jobs
- OTP 17.5 and 18.0 to Travis tests
### Changed
- `ex_doc` dependency version
### Fixed
- Typos in README
## 1.4.0 - 2015-09-02
Diff for [1.4.0]
### Added
- Named jobs and the ability to (de)activate them ([Rodion Vshevtsov](https://github.com/alPacino))
- Doc annotations for functions
- Inch-CI integration
### Changed
- Updated `ex_doc` dependency
## 1.3.2 - 2015-08-22
Diff for [1.3.2]
### Added
- Timezone option to README.
### Fixed
- Using `@reboot` lead to crash.
## 1.3.1 - 2015-07-27
Diff for [1.3.1]
### Added
- Added contributors to changelog and project description
- Option to use local timezone instead of UTC.
### Changed
- Tables in README use markdown format
## 1.3.0 - 2015-07-15
Diff for [1.3.0]
### Added
- Allow cron-like job formatting (`"* * * * * MyApp.MyModule.my_method"`) ([Rodion Vshevtsov](https://github.com/alPacino))
- Allow defining functions as tuple (`{"Module", :method}`) in config ([Rodion Vshevtsov](https://github.com/alPacino))
- Note about UTC ([Lenz Gschwendtner](https://github.com/norbu09))
## 1.2.4 - 2015-06-22
Diff for [1.2.4]
### Changed
- Renamed parse/5 functions to do_parse/5 and made them private
- Always use `{expression, fun}` for jobs
- Moved duplicate code to new private function `only_multiplier_of/2`
- Moved code to normalize jobs to separate module
- Correctly use passed state in Quantum.init/1 function
- Moved reboot logic to executor.
### Removed
- Unnecessary guard clause
- Unused parse/3 functions
- Unused call to String.split on patterns starting with "*/"
## 1.2.3 - 2015-06-15
Diff for [1.2.3]
### Added
- Support for `@reboot`
### Fixed
- Does not convert jobs defined in config
## 1.2.2 - 2015-06-15
Diff for [1.2.2]
### Added
- Support for `@annually` and `@midnight`
### Changed
- Function order in Quantum.Matcher
- Renamed private translate function to do_translate
- Do not convert and translate cron expressions on every tick
### Fixed
- Adding a job using Quantum.add_job/2 does not convert to lowercase
- Adding a job using Quantum.add_job/2 does not translate day/month names
## 1.2.1 - 2015-06-13
Diff for [1.2.1]
### Added
- Test for handle_info(:tick_state)
- Dependencies to generate hexdocs
- Badge for hexdocs
- Link to docs in hex package info
- Type specs and doc annotations
### Changed
- Quantum.Application does not call Quantum.start_link/1 anymore
- Moved match logic to separate module Quantum.Matcher
- Moved parsing logic to separate module Quantum.Parser
- Moved execution logic to separate module Quantum.Executor
- Moved translation logic to separate module Quantum.Translator
### Fixed
- Typos in changelog
### Removed
- Quantum.start_link/1
## 1.2.0 - 2015-06-11
Diff for [1.2.0]
### Changed
- Date is updated in state only if it changed
- Wake up every minute instead of every second
### Fixed
- Intervals on ranges are not correctly parsed
- Hour constraints are not correct ([Lenz Gschwendtner](https://github.com/norbu09))
- There is no changelog
- Code coverage is low
- Explicit variables are not needed
- Pattern matching can be simplified
## 1.1.0 - 2015-05-28
Diff for [1.1.0]
### Added
- Add ability to schedule jobs at runtime and ability to view jobs ([Dan Swain](https://github.com/dantswain))
### Changed
- Relax Elixir version
## 1.0.4 - 2015-05-26
Diff for [1.0.4]
### Fixed
- Written month and weekday names are not parsed
## 1.0.3 - 2015-05-01
Diff for [1.0.3]
### Fixed
- Do not fire on first tick
## 1.0.2 - 2015-04-29
Diff for [1.0.2]
### Fixed
- Special expressions are not correctly in all cases
### Removed
- Functions to add and reset jobs
## 1.0.1 - 2015-04-27
Diff for [1.0.1]
### Added
- Configure cronjobs in config
- Add application
### Fixed
- Parsing of cron expression fails
## 1.0.0 - 2015-04-27
Diff for [1.0.0]
### Added
- Initial commit
[unreleased]: https://github.com/quantum-elixir/quantum-core/compare/v3.4.0...HEAD
[3.4.0]: https://github.com/quantum-elixir/quantum-core/compare/v3.3.0...v3.4.0
[3.3.0]: https://github.com/quantum-elixir/quantum-core/compare/v3.2.0...v3.3.0
[3.2.0]: https://github.com/quantum-elixir/quantum-core/compare/v3.1.0...v3.2.0
[3.1.0]: https://github.com/quantum-elixir/quantum-core/compare/v3.0.2...v3.1.0
[3.0.2]: https://github.com/quantum-elixir/quantum-core/compare/v3.0.1...v3.0.2
[3.0.1]: https://github.com/quantum-elixir/quantum-core/compare/v3.0.0...v3.0.1
[3.0.0]: https://github.com/quantum-elixir/quantum-core/compare/v3.0.0-rc.3...v3.0.0
[3.0.0-rc.3]: https://github.com/quantum-elixir/quantum-core/compare/v3.0.0-rc.2...v3.0.0-rc.3
[3.0.0-rc.2]: https://github.com/quantum-elixir/quantum-core/compare/v3.0.0-rc.1...v3.0.0-rc.2
[3.0.0-rc.1]: https://github.com/quantum-elixir/quantum-core/compare/v2.4.0...v3.0.0-rc.1
[2.4.0]: https://github.com/quantum-elixir/quantum-core/compare/v2.3.4...v2.4.0
[2.3.4]: https://github.com/quantum-elixir/quantum-core/compare/v2.3.3...v2.3.4
[2.3.3]: https://github.com/quantum-elixir/quantum-core/compare/v2.3.2...v2.3.3
[2.3.2]: https://github.com/quantum-elixir/quantum-core/compare/v2.3.1...v2.3.2
[2.3.1]: https://github.com/quantum-elixir/quantum-core/compare/v2.3.0...v2.3.1
[2.3.0]: https://github.com/quantum-elixir/quantum-core/compare/v2.2.7...v2.3.0
[2.2.7]: https://github.com/quantum-elixir/quantum-core/compare/v2.2.6...v2.2.7
[2.2.6]: https://github.com/quantum-elixir/quantum-core/compare/v2.2.5...v2.2.6
[2.2.5]: https://github.com/quantum-elixir/quantum-core/compare/v2.2.4...v2.2.5
[2.2.4]: https://github.com/quantum-elixir/quantum-core/compare/v2.2.3...v2.2.4
[2.2.3]: https://github.com/quantum-elixir/quantum-core/compare/v2.2.2...v2.2.3
[2.2.2]: https://github.com/quantum-elixir/quantum-core/compare/v2.2.1...v2.2.2
[2.2.1]: https://github.com/quantum-elixir/quantum-core/compare/v2.2.0...v2.2.1
[2.2.0]: https://github.com/quantum-elixir/quantum-core/compare/v2.1.3...v2.2.0
[2.1.3]: https://github.com/quantum-elixir/quantum-core/compare/v2.1.2...v2.1.3
[2.1.2]: https://github.com/quantum-elixir/quantum-core/compare/v2.1.1...v2.1.2
[2.1.1]: https://github.com/quantum-elixir/quantum-core/compare/v2.1.0...v2.1.1
[2.1.0]: https://github.com/quantum-elixir/quantum-core/compare/v2.1.0-beta.1...v2.1.0
[2.1.0-beta.1]: https://github.com/quantum-elixir/quantum-core/compare/v2.0.4...v2.1.0-beta.1
[2.0.4]: https://github.com/quantum-elixir/quantum-core/compare/v2.0.3...v2.0.4
[2.0.3]: https://github.com/quantum-elixir/quantum-core/compare/v2.0.2...v2.0.3
[2.0.2]: https://github.com/quantum-elixir/quantum-core/compare/v2.0.1...v2.0.2
[2.0.1]: https://github.com/quantum-elixir/quantum-core/compare/v2.0.0...v2.0.1
[2.0.0]: https://github.com/quantum-elixir/quantum-core/compare/v2.0.0-beta.2...v2.0.0
[2.0.0-beta.2]: https://github.com/quantum-elixir/quantum-core/compare/v2.0.0-beta.1...v2.0.0-beta.2
[2.0.0-beta.1]: https://github.com/quantum-elixir/quantum-core/compare/v1.9.2...v2.0.0-beta.1
[1.9.2]: https://github.com/quantum-elixir/quantum-core/compare/v1.9.1...v1.9.2
[1.9.1]: https://github.com/quantum-elixir/quantum-core/compare/v1.9.0...v1.9.1
[1.9.0]: https://github.com/quantum-elixir/quantum-core/compare/v1.8.1...v1.9.0
[1.8.1]: https://github.com/quantum-elixir/quantum-core/compare/v1.8.0...v1.8.1
[1.8.0]: https://github.com/quantum-elixir/quantum-core/compare/v1.7.1...v1.8.0
[1.7.1]: https://github.com/quantum-elixir/quantum-core/compare/v1.7.0...v1.7.1
[1.7.0]: https://github.com/quantum-elixir/quantum-core/compare/v1.6.1...v1.7.0
[1.6.1]: https://github.com/quantum-elixir/quantum-core/compare/v1.6.0...v1.6.1
[1.6.0]: https://github.com/quantum-elixir/quantum-core/compare/v1.5.0...v1.6.0
[1.5.0]: https://github.com/quantum-elixir/quantum-core/compare/v1.4.0...v1.5.0
[1.4.0]: https://github.com/quantum-elixir/quantum-core/compare/v1.3.2...v1.4.0
[1.3.2]: https://github.com/quantum-elixir/quantum-core/compare/v1.3.1...v1.3.2
[1.3.1]: https://github.com/quantum-elixir/quantum-core/compare/v1.3.0...v1.3.1
[1.3.0]: https://github.com/quantum-elixir/quantum-core/compare/v1.2.4...v1.3.0
[1.2.4]: https://github.com/quantum-elixir/quantum-core/compare/v1.2.3...v1.2.4
[1.2.3]: https://github.com/quantum-elixir/quantum-core/compare/v1.2.2...v1.2.3
[1.2.2]: https://github.com/quantum-elixir/quantum-core/compare/v1.2.1...v1.2.2
[1.2.1]: https://github.com/quantum-elixir/quantum-core/compare/v1.2.0...v1.2.1
[1.2.0]: https://github.com/quantum-elixir/quantum-core/compare/v1.1.0...v1.2.0
[1.1.0]: https://github.com/quantum-elixir/quantum-core/compare/v1.0.4...v1.1.0
[1.0.4]: https://github.com/quantum-elixir/quantum-core/compare/v1.0.3...v1.0.4
[1.0.3]: https://github.com/quantum-elixir/quantum-core/compare/v1.0.2...v1.0.3
[1.0.2]: https://github.com/quantum-elixir/quantum-core/compare/v1.0.1...v1.0.2
[1.0.1]: https://github.com/quantum-elixir/quantum-core/compare/v1.0.0...v1.0.1
[1.0.0]: https://github.com/quantum-elixir/quantum-core/commit/9a58b5f5c02a2de6cde4c579c9f879f1fb49b305