## 0.18.0 (2020-12-05) [0.18.0]: https://github.com/celluloid/celluloid/compare/v0.17.3...v0.18.0 * [#804](https://github.com/celluloid/celluloid/pull/804) Remove deprecation warnings * [#802](https://github.com/celluloid/celluloid/pull/802) Remove lattice link itself. * [#797](https://github.com/celluloid/celluloid/pull/797) Update Ruby versions in CI script * [#801](https://github.com/celluloid/celluloid/pull/801) Associate Open Collective sponsorship option * [#800](https://github.com/celluloid/celluloid/pull/800) Streamline README * [#799](https://github.com/celluloid/celluloid/pull/799) Update links, add diagram preview. * [#796](https://github.com/celluloid/celluloid/pull/796) Create Class Diagram in Draw.io * [#798](https://github.com/celluloid/celluloid/pull/798) Pertinent Newsflash * [#792](https://github.com/celluloid/celluloid/pull/792) CI: 2.5.5, 2.6.2 * [#788](https://github.com/celluloid/celluloid/pull/788) Travis: Include Ruby 2.5, 2.6 * [#787](https://github.com/celluloid/celluloid/pull/787) Travis config: drop old configuration sudo: false * [#786](https://github.com/celluloid/celluloid/pull/786) Travis: use jruby-9.2.5.0 * [#783](https://github.com/celluloid/celluloid/pull/783) v0.18.0.pre2 * [#782](https://github.com/celluloid/celluloid/pull/782) Merge 'celluloid-supervision' back into the tree * [#781](https://github.com/celluloid/celluloid/pull/781) .gitmodules: No longer used * [#780](https://github.com/celluloid/celluloid/pull/780) README.md: Link to unmaintained issue * [#778](https://github.com/celluloid/celluloid/pull/778) README.md: Add "maintained: no! (as of 2016)" badge * [#777](https://github.com/celluloid/celluloid/pull/777) gemspec: Metadata with supported links * [#776](https://github.com/celluloid/celluloid/pull/776) Travis: use jruby-9.2.0.0 * [#775](https://github.com/celluloid/celluloid/pull/775) Travis: jruby-9.1.17.0 * [#769](https://github.com/celluloid/celluloid/pull/769) Travis: jruby-9.1.15.0 * [#768](https://github.com/celluloid/celluloid/pull/768) Travis: use latest JRuby * [#767](https://github.com/celluloid/celluloid/pull/767) CHANGES: Add GitHub compare link on each heading * [#766](https://github.com/celluloid/celluloid/pull/766) Fix celluloid/celluloid#758 * [#765](https://github.com/celluloid/celluloid/pull/765) Travis: jruby-9.1.13.0 * [#761](https://github.com/celluloid/celluloid/pull/761) Travis: jruby-9.1.12.0 * [#760](https://github.com/celluloid/celluloid/pull/760) Travis: jruby-9.1.10.0 * [#759](https://github.com/celluloid/celluloid/pull/759) Travis: jruby-9.1.9.0 * [#757](https://github.com/celluloid/celluloid/pull/757) parameterize error message so old and new Rubies match text * [#756](https://github.com/celluloid/celluloid/pull/756) Travis: latest stable rubies * [#754](https://github.com/celluloid/celluloid/pull/754) README: Fix badge rendering in Markdown * [#753](https://github.com/celluloid/celluloid/pull/753) Travis: use jruby-9.1.8.0 * [#752](https://github.com/celluloid/celluloid/pull/752) Misspellings * [#749](https://github.com/celluloid/celluloid/pull/749) Return false from Celluloid.running? if Celluloid.boot hasn't been called * [#751](https://github.com/celluloid/celluloid/pull/751) Travis: Use JRuby 9.1.7.0 * [#740](https://github.com/celluloid/celluloid/pull/740) Global variables: stop the bleeding * [#739](https://github.com/celluloid/celluloid/pull/739) Remove hacks around old MRIs, JRuby, and rbx * [#738](https://github.com/celluloid/celluloid/pull/738) Update to RuboCop 0.45.0 (with new rubocop.yml policy) * [#737](https://github.com/celluloid/celluloid/pull/737) Simplify dependencies: merge 'essentials' and 'culture' repos * [#736](https://github.com/celluloid/celluloid/pull/736) Remove $CELLULOID_BACKPORTED and $CELLULOID_MANAGED * [#735](https://github.com/celluloid/celluloid/pull/735) Require Ruby 2.2.6+ * [#729](https://github.com/celluloid/celluloid/pull/729) Remove mysterious Fiber.yield * [#721](https://github.com/celluloid/celluloid/pull/721) Instruction for cloning Celluloid via github * [#715](https://github.com/celluloid/celluloid/pull/715) fix error response reference in Future#cancel * [#712](https://github.com/celluloid/celluloid/pull/712) Add RBX-3 to the build * [#711](https://github.com/celluloid/celluloid/pull/711) Added bundler cache * [#709](https://github.com/celluloid/celluloid/pull/709) Fix autostart. Fixes https://github.com/celluloid/celluloid/issues/698 * [#705](https://github.com/celluloid/celluloid/pull/705) Adding method source code path to backtrace ## [0.17.3] (2016-01-18) [0.17.3]: https://github.com/celluloid/celluloid/compare/v0.17.2...v0.17.3 * [#701](https://github.com/celluloid/celluloid/pull/701) Conditions in loose threads loop does not take into account the difference between backtraces from ruby 2.0.0 and greater than. Fixes celluloid/celluloid-io#165. ([@TiagoCardoso1983]) * [#700](https://github.com/celluloid/celluloid/pull/700) Set celluloid logger level to info by default unless debug is enabled. Fixes #667. ([@ioquatix]) * [#695](https://github.com/celluloid/celluloid/pull/695) Extending the condition event handler with the block; this solves a bug introduced in jruby >9.0.0.0, which breaks with an ArgumentError exception, apparently due to the way to_proc procs are passed arguments. Fixes #694. ([@TiagoCardoso1983]) * [#689](https://github.com/celluloid/celluloid/pull/689) Simplified sync, async and future proxies by providing specific AbstractCall base. ([@ioquatix]) * [#688](https://github.com/celluloid/celluloid/pull/688) Fix failure to remove dead actors from sets, e.g. celluloid-supervision. ([@ioquatix]) * [#686](https://github.com/celluloid/celluloid/pull/686) Print out method name to help debugging method call which caused dead actor error. ([@ioquatix]) * [#682](https://github.com/celluloid/celluloid/pull/682) Remove excess call/block require. * [#666](https://github.com/celluloid/celluloid/pull/666) Don't catch IOError. ## [0.17.2] (2015-09-30) [0.17.2]: https://github.com/celluloid/celluloid/compare/v0.17.1.2...v0.17.2 * Revamped test suite, using shared RSpec configuration layer provided by Celluloid itself. * Updated gem dependencies provided by Celluloid::Sync... extraneous gems removed, or marked as development dependencies. * Clean up deprecation notes. ## [0.17.1.2] (2015-08-21) [0.17.1.2]: https://github.com/celluloid/celluloid/compare/v0.17.1.1...v0.17.1.2 * Fixes to posted markdown content. * Pull in new gem dependencies. ## [0.17.1.1] (2015-08-07) [0.17.1.1]: https://github.com/celluloid/celluloid/compare/v0.17.1...v0.17.1.1 * Revert "no task to suspend" code from #232. ## [0.17.1] (2015-08-06) [0.17.1]: https://github.com/celluloid/celluloid/compare/v0.17.0...v0.17.1 * `Celluloid::ActorSystem` moved to `Celluloid::Actor::System`, and from `celluloid/actor_system.rb` to `celluloid/actor/system.rb` * Added extensible API for defining new SystemEvents, and having them handled... without everyone changing `Actor#handle_system_event`. * Deprecated Task::TerminatedError & Task::TimeoutError... Consolidated in exceptions.rb, inherited from Exceptions vs. StandardError. * General round-up of all "errors" emitted throughout Celluloid, to either be derived from `Celluloid::Error` or `Celluloid::Interruption`. * Added ability to pass a block to `Condition#wait` which runs a `{ |value| ... }` type block if present, once the value is obtained by waiting. ## [0.17.0] (2015-07-04) [0.17.0]: https://github.com/celluloid/celluloid/compare/v0.16.0...v0.17.0 * Fix $CELLULOID_TEST warnings * Massive overhaul of test suite, end-to-end. * Make "Terminating task" log messages debug-level events * Added `.dead?` method on actors, as opposite of `.alive?` * Added class/module method to access `publish` outside actors. * Radical Refactor of Celluloid::InternalPool, and moved it to Celluloid::Group::Pool * Radical Refactor: *::Group::Pool replaced as default with *::Group::Spawner * Added `rspec-log_split` as replacement logger for itemized testing logs. * *::Task::PooledFibers has been found and made available, and compatible ( sometimes 4x faster than even Task::Fibered ) * GEM EXTRACTION: PoolManager taken out, and implemented in the `celluloid-pool` gem, separately. * GEM EXTRACTION: FSM taken out, and implemented in the `celluloid-fsm` gem, separately. * GEM EXTRACTION: SupervisionGroup, Supervisor, and related methods taken out, and implemented in the `celluloid-supervision` gem, separately. * BREAKING CHANGE: Added Celluloid::Internals and moved several "private" classes into that namespace: * CallChain, CPUCounter, Handlers ( and Handle ), Links, Logger, Method, Properties, Registry, Responses, Signals, StackDump, TaskSet, ThreadHandle, UUID. * BREAKING CHANGE: Changed class names, per convention: * Moved Celluloid::TaskFiber to Celluloid::Task::Fibered * Moved Celluloid::TaskThread to Celluloid::Task::Threaded * Moved Celluloid::EventedMailbox to Celluloid::Mailbox::Evented * Moved Celluloid::AbstractProxy to Celluloid::Proxy::Abstract * Moved Celluloid::ActorProxy to Celluloid::Proxy::Actor * Moved Celluloid::AsyncProxy to Celluloid::Proxy::Async * Moved Celluloid::BlockProxy to Celluloid::Proxy::Block * Moved Celluloid::CellProxy to Celluloid::Proxy::Cell * Moved Celluloid::FutureProxy to Celluloid::Proxy::Future * Moved Celluloid::SyncProxy to Celluloid::Proxy::Sync * GEM EXTRACTION: `Internals`, `Notifications`, `Probe`, and the contents of `logging/*` have become a `celluloid-essentials` gem. * Implement `Group::Manager` as base for future `Group::Unlocker` and other such systems traversing `ActorSystem#group` regularly. * Reduce number of supervisors instantiated by `ActorSystem` by consolidating them down to `Service::Root` container instances. ## [0.16.0] (2014-09-04) [0.16.0]: https://github.com/celluloid/celluloid/compare/v0.15.2...v0.16.0 * Factor apart Celluloid::Cell (concurrent objects) from Celluloid::Actor * Introduce Celluloid::ActorSystem as an abstraction around the backend actor implementation (idea borrowed from Akka) * Celluloid::Probe system for monitoring system behavior * Fix handling of timeouts with Celluloid::EventedMailbox (i.e. Celluloid::IO and Celluloid::ZMQ) * Add timeout support to Celluloid::Condition * Obtain actor names via Celluloid::Actor.registered_name and #registered_name to avoid conflicts with the built-in Ruby Class.name method * Update to timers 4.0.0 * Dynamically resizable pools * Remove use of core Ruby ThreadGroups * Simplified CPU core detector * Better thread names on JRuby for easier debugging * Thread safety fixes to internal thread pool ## [0.15.2] (2013-10-06) [0.15.2]: https://github.com/celluloid/celluloid/compare/v0.15.1...v0.15.2 * require 'celluloid/test' for at_exit-free testing ## [0.15.1] (2013-09-06) [0.15.1]: https://github.com/celluloid/celluloid/compare/v0.15.0...v0.15.1 * Only raise on nested tasks if $CELLULOID_DEBUG is set ## [0.15.0] (2013-09-04) [0.15.0]: https://github.com/celluloid/celluloid/compare/v0.14.0...v0.15.0 * Remove legacy support for "bang"-method based async invocation * Generic timeout support with Celluloid#timeout * Implement recursion detection for #inspect, avoiding infinite loop bugs * Fix various inheritance anomalies in class attributes (e.g. mailbox_class) * Avoid letting version.rb define an unusable Celluloid module * Remove "Shutdown completed cleanly" message that was annoying everyone * Subclass all Celluloid exceptions from Celluloid::Error * Log all unhandled messages * Celluloid::Conditions are now usable ubiquitously, not just inside actors * Introspection support for number of threads in the Celluloid thread pool * Use a ThreadGroup to track the threads in the Celluloid thread pool * Reimplement signal system on top of Conditions * Add metadata like the current method to Celluloid::StackDumps ## [0.14.0] (2013-05-07) [0.14.0]: https://github.com/celluloid/celluloid/compare/v0.13.0...v0.14.0 * Use a Thread-subclass for Celluloid * Implement actor-local variables * Add helper methods to the class * Move IO::Mailbox to EventedMailbox to remove dependency between celluloid-io and celluloid-zmq. This makes it easier to maintain the evented style of Mailbox. * Install the `at_exit` handler by default * Show backtrace for all tasks. Currently only for TaskThread * Implement mailbox bounds where overflow is logged * Fix Thread self-join * Execute blocks on the sender by default * Fix CPU counter on windows ## [0.13.0] [0.13.0]: https://github.com/celluloid/celluloid/compare/v0.12.4...v0.13.0 * API change: Require Celluloid with: require 'celluloid/autostart' to automatically start support actors and configure at_exit handler which automatically terminates all actors. * API change: use_mailbox has been removed * API change: finalizers must be declared with "finalizer :my_finalizer" * Bugfix: receivers don't crash when methods are called incorrectly * Celluloid::Condition provides ConditionVariable-like signaling * Shutdown timeout reduced to 10 seconds * Stack traces across inter-actor calls! Should make Celluloid backtraces much easier to understand * Celluloid#call_chain_id provides UUIDs for calls across actors * Give all thread locals a :celluloid_* prefix ## [0.12.4] [0.12.4]: https://github.com/celluloid/celluloid/compare/v0.12.3...v0.12.4 * Bugfix: Clear dead/crashed actors out of links * Bugfix: Exclusive mode was broken * Bugfix: Celluloid::SupervisionGroup#run was broken * Celluloid::ClassMethods#proxy_class allows configurable proxies * Improved error messages for Fiber-related problems * Better object leakage detection when inspecting * Use #public_send to dispatch Celluloid methods * #idle_size and #busy_size for Celluloid::PoolManager ## [0.12.3] [0.12.3]: https://github.com/celluloid/celluloid/compare/v0.12.2...v0.12.3 * Bugfix: Ensure exclusive mode works correctly for per-method case * Bugfix: Exit handlers were not being inherited correctly ## [0.12.2] [0.12.2]: https://github.com/celluloid/celluloid/compare/v0.12.1...v0.12.2 * Disable IncidentReporter by default ## [0.12.1] [0.12.1]: https://github.com/celluloid/celluloid/compare/v0.12.0...v0.12.1 * Fix bug in unsetting of exclusive mode * New incident report system for providing better debugging reports * Revert BasicObject proxies for now... they are causing problems * String inspect that reveals bare object leaks * Fix bug reporting proper task statuses * Initial thread dumper support * Remove Celluloid#alive? as it cannot be called in any manner that will ever return anything but true, rendering it useless ## [0.12.0] [0.12.0]: https://github.com/celluloid/celluloid/compare/v0.11.1...v0.12.0 * Alternative async syntax: actor.async.method in lieu of actor.method! Original syntax still available but will be removed in Celluloid 1.0 * Alternative future syntax: actor.future.method in lieu of future(:method) * All methods in the Celluloid module are now available on its singleton * The #join and #kill methods are no longer available on the actor proxy. Please use Celluloid::Actor.join(actor) and .kill(actor) instead. * Celluloid::Future#ready? can be used to query for future readiness * Celluloid::Group constant removed. Please use Celluloid::SupervisionGroup * #monitor, #unmonitor, and #monitoring? provide unidirectional linking * Linking is now performed via a SystemEvent * SystemEvents are no longer exceptions. Boo exceptions as flow control! * Celluloid::Mailbox#system_event eliminated and replaced with Mailbox#<< SystemEvents are now automatically high priority * The task_class class method can be used to override the class used for tasks, allowing different task implementations to be configured on an actor-by-actor-basis * Celluloid::TaskThread provides tasks backed by Threads instead of Fibers * ActorProxy is now a BasicObject * A bug prevented Celluloid subclasses from retaining custom mailboxes defined by use_mailbox. This is now fixed. * `exclusive` class method without arguments makes the whole actor exclusive ## [0.11.1] [0.11.1]: https://github.com/celluloid/celluloid/compare/v0.11.0...v0.11.1 * 'exclusive' class method marks methods as always exclusive and runs them outside of a Fiber (useful if you need more stack than Fibers provide) * Celluloid::PoolManager returns its own class when #class is called, instead of proxying to a cell/actor in the pool. * #receive now handles SystemEvents internally * Celluloid::Timers extracted into the timers gem, which Celluloid now uses for its own timers ## [0.11.0] [0.11.0]: https://github.com/celluloid/celluloid/compare/v0.10.0...v0.11.0 * Celluloid::Application constant permanently removed * Celluloid::Pool removed in favor of Celluloid.pool * Celluloid::Group renamed to Celluloid::SupervisionGroup, old name is still available and has not been deprecated * Celluloid::ThreadPool renamed to Celluloid::InternalPool to emphasize its internalness * Support for asynchronously calling private methods inside actors * Future is now an instance method on all actors * Async call exception logs now contain the failed method * MyActor#async makes async calls for those who dislike the predicate syntax * abort can now accept a string instead of an exception object and will raise RuntimeError in the caller's context ## [0.10.0] [0.10.0]: https://github.com/celluloid/celluloid/compare/v0.9.1...v0.10.0 * Celluloid::Actor.current is now the de facto way to obtain the current actor * #terminate now uses system messages, making termination take priority over other pending methods * #terminate! provides asynchronous termination ## [0.9.1] [0.9.1]: https://github.com/celluloid/celluloid/compare/v0.9.0...v0.9.1 * Recurring timers with Celluloid#every(n) { ... } * Obtain UUIDs with Celluloid.uuid * Obtain the number of CPU cores available with Celluloid.cores * Celluloid::Pool defaults to one actor per CPU core max by default ## [0.9.0] [0.9.0]: https://github.com/celluloid/celluloid/compare/v0.8.0...v0.9.0 * Celluloid::Pool supervises pools of actors * Graceful shutdown which calls #terminate on all actors * Celluloid::Actor.all returns all running actors * Celluloid#exclusive runs a high priority block which prevents other methods from executing * Celluloid.exception_handler { |ex| ... } defines a callback for notifying exceptions (for use with Airbrake, exception_notifier, etc.) ## [0.8.0] [0.8.0]: https://github.com/celluloid/celluloid/compare/v0.7.2...v0.8.0 * Celluloid::Application is now Celluloid::Group * Futures no longer use a thread unless created with a block * No more future thread-leaks! Future threads auto-terminate now * Rename Celluloid#async to Celluloid#defer * Celluloid#tasks now returns an array of tasks with a #status attribute * Reduce coupling between Celluloid and DCell. Breaks compatibility with earlier versions of DCell. * Celluloid::FSMs are no longer actors themselves * Benchmarks using benchmark_suite ## [0.7.2] [0.7.2]: https://github.com/celluloid/celluloid/compare/v0.7.1...v0.7.2 * Workaround fiber problems on JRuby 1.6.5.1 in addition to 1.6.5 * Fix class displayed when inspecting dead actors ## [0.7.1] [0.7.1]: https://github.com/celluloid/celluloid/compare/v0.7.0...v0.7.1 * More examples! * Cancel all pending tasks when actors crash * Log all errors that occur during signaling failures * Work around thread-local issues on rbx (see 52325ecd) ## [0.7.0] [0.7.0]: https://github.com/celluloid/celluloid/compare/v0.6.2...v0.7.0 * Celluloid::Task abstraction replaces Celluloid::Fiber * Celluloid#tasks API to introspect on running tasks * Move Celluloid::IO into its own gem, celluloid-io * Finite state machines with Celluloid::FSM * Fix bugs in supervisors handling actors that crash during initialize * Old syntax Celluloid::Future() { ... } deprecated. Please use the #future method or Celluloid::Future.new { ... } to create futures * New timer subsystem! Bullet point-by-bullet point details below * Celluloid#after registers a callback to fire after a given time interval * Celluloid.sleep and Celluloid#sleep let an actor continue processing messages * Celluloid.receive and Celluloid#receive now accept an optional timeout * Celluloid::Mailbox#receive now accepts an optional timeout ## [0.6.2] [0.6.2]: https://github.com/celluloid/celluloid/compare/v0.6.1...v0.6.2 * List all registered actors with Celluloid::Actor.registered * All logging now handled through Celluloid::Logger * Rescue DeadActorError in Celluloid::ActorProxy#inspect ## [0.6.1] [0.6.1]: https://github.com/celluloid/celluloid/compare/v0.6.0...v0.6.1 * Celluloid#links obtains Celluloid::Links for a given actor * The #class method is now proxied to actors * Celluloid::Fiber replaces the Celluloid.fiber and Celluloid.resume_fiber API * Use Thread.mailbox instead of Thread.current.mailbox to obtain the mailbox for the current thread ## [0.6.0] [0.6.0]: https://github.com/celluloid/celluloid/compare/v0.5.0...v0.6.0 * Celluloid::Application classes for describing the structure of applications built with Celluloid * Methods of actors can now participate in the actor protocol directly via Celluloid#receive * Configure custom mailbox types using Celluloid.use_mailbox * Define a custom finalizer for an actor by defining MyActor#finalize * Actor.call and Actor.async API for making direct calls to mailboxes * Fix bugs in Celluloid::Supervisors which would crash on startup if the actor they're supervising also crashes on startup * Add Celluloid.fiber and Celluloid.resume_fiber to allow extension APIs to participate in the Celluloid fiber protocol ## [0.5.0] [0.5.0]: https://github.com/celluloid/celluloid/compare/v0.4.0...v0.5.0 * "include Celluloid::Actor" no longer supported. Use "include Celluloid" * New Celluloid::IO module for actors that multiplex IO operations * Major overhaul of Celluloid::Actor internals (see 25e22cc1) * Actor threads are pooled in Celluloid::Actor::Pool, improving the speed of creating short-lived actors by over 2X * Classes that include Celluloid now have a #current_actor instance method * Celluloid#async allows actors to make indefinitely blocking calls while still responding to messages * Fix a potential thread safety bug in Thread#mailbox * Experimental Celluloid::TCPServer for people wanting to write servers in Celluloid. This may wind up in another gem, so use at your own risk! * Magically skip ahead a few version numbers to impart the magnitude of this release. It's my versioning scheme and I can do what I wanna. ## [0.4.0] [0.4.0]: https://github.com/celluloid/celluloid/compare/v0.3.0...v0.4.0 * This version was mysteriously lost to the sands of time ## [0.3.0] [0.3.0]: https://github.com/celluloid/celluloid/compare/v0.2.2...v0.3.0 * This version was also mysteriously lost to the sands of time ## [0.2.2] [0.2.2]: https://github.com/celluloid/celluloid/compare/v0.2.1...v0.2.2 * AbortErrors now reraise in caller scope and get a caller-focused backtrace * Log failed async calls instead of just letting them fail silently * Properly handle arity of synchronous calls * Actors can now make async calls to themselves * Resolve crashes that occur when sending responses to exited/dead callers ## [0.2.1] [0.2.1]: https://github.com/celluloid/celluloid/compare/v0.2.0...v0.2.1 * Hack around a bug of an indeterminate cause (2baba3d2) ## [0.2.0] [0.2.0]: https://github.com/celluloid/celluloid/compare/v0.1.0...v0.2.0 * Support for future method calls with MyActor#future * Initial signaling support via MyActor#signal and MyActor#wait * Just "include Celluloid" works in lieu of "include Celluloid::Actor" * Futures terminate implicitly when their values are obtained * Add an underscore prefix to all of Celluloid's instance variables so they don't clash with user-defined ones. ## [0.1.0] [0.1.0]: https://github.com/celluloid/celluloid/compare/v0.0.3...v0.1.0 * Fiber-based reentrant actors. Requires Ruby 1.9 * MyActor.new (where MyActor includes Celluloid::Actor) is now identical to .spawn * Terminate actors with MyActor#terminate * Obtain current actor with Celluloid.current_actor * Configurable logger with Celluloid.logger * Synchronization now based on ConditionVariables instead of Celluloid::Waker * Determine if you're in actor scope with Celluloid.actor? ## [0.0.3] [0.0.3]: https://github.com/celluloid/celluloid/compare/v0.0.1...v0.0.3 * Remove self-referential dependency in gemspec ## 0.0.1 * Initial release [@ioquatix]: https://github.com/ioquatix [@TiagoCardoso1983]: https://github.com/TiagoCardoso1983