CHANGES
=======

* Fixed: Implemented manual way to flush tables
* Fixed: Changed to refresh every 1.5 secs now
* Fixed: Suppressed warning notifying intended behaviour
* Fixed: removed extra argument in patch lambda
* Fixed: patched other method calling external service
* Fixed: Removed neccessary import, patched method calling external service
* Fixed: Double initialize removed
* Fixed #50: View logs in the web ui
* Fixed: Lower TTL for msgs, use REDIS options if provided
* Fixed: Moved user\_data\_store can now be shared
* Aligned brackets
* First implementation of the log persistence through expiration
* Modified Tests
* Modified Run-Redirection to '/admin/job' and removed 'run\_task' template
* Aligned brackets
* dynamicFields issue resolved with clone()
* Added Form-Prefill for Task Context
* Updated: Added doc contribution lines to the README
* Removed security instance, improved readabilty with spaces between comments and imports
* Some corrections
* Checking without security instance
* remove raise abort, as abort already raise
* add test for new scheduler implementation and add assertion type for task view
* Removed  from User model
* Added Remove Button in context form
* add column "enabled" for a Task, used as a flag to run it or not. A task will be enabled only with a context and a valid cron string
* Reverted: Reset the original implementation of scheduler. These pairs of commits were mere PoC for the CI and shouldn't live in production
* Refactored: Renamed password2 to new\_password in web/views
* Fixed: Kill spawned processes
* Reverted: Reset the original way of app creation
* get task using .get
* refactor
* Worker cannot be created, Only ModelViews visble on the Menu
* rename var
* remove everything related to DbFactory and the class itself, importing db from models since we spawn the process and not fork it anymore is enough. Also move mp.get\_method as a module variable it doesn't have to be called several time
* remove unused import
* remove \_\_init\_\_ in TaskRunner and move everything in start(), this allow us to instanciate the Class without going through the full process. Related tests changed to fit the new implementation
* Modified User create\_view
* Added tests
* TaskRunner process is now spawned and no more forked, TaskRunner.start is now called into \_\_init\_\_ this allow us to directly call TaskRunner class in Process() from Scheduler. Also create a simple DBDactory class which do nothing more than calling SqlAlchemy, the only purpose is to call the same class from models and task\_runner
* Used copy.copy(task) to send task with overwritten context
* Fixed: App generator used to isolate app creation, linked to new db instance
* Fixed: Kill the testprocess after spawning them
* Fixed: Make local instance of DB
* Fixed: Work with db.session instead
* Fixed: Give app context to db query
* Fixed: Tried other approach to create the egg\_info first
* Fixed: ContextualVersionConflict fixed. Something goes wrong on the CI when removing and reinstalling packages due to builtin behavior, this is due to \*.egg-info/ manual removals. https://github.com/pypa/pip/issues/4537
* Resolve "Polish installation instructions"
* Updated: Correct usage information
* Passing custom context from scheduler to wrapper
* Configured Tasks moved to Configured\_Run Channel
* renamed variables
* Modified test
* Refactored: Rewritten installation instructions. This was first constructed when less information was available, should be fine now
* Added absolute path to templates
* Resolved merge conflicts
* Added fixture for context\_processor
* Added fixture for context\_processor
* Added form object
* Added admin base template
* Added login form
* Modified tests
* Modified tests
* removed admin/master
* Added app.app\_context
* Added preserve\_context
* Added app context
* Added Restyled Login Form, added generic login error to avoid account enumeration
* Added BaseModelView
* Added BaseModelView
* Added Email validator and Password confirmation
* instantiate fresh db connection for each TaskRunner to avoid race condition and problem when a runner SELECT, UPDATE or COMMIT. Also change Redis SET TTL to 60
* Improved Redirections: to Admin, to Login and Modified tests accordingly
* Created hmset, hmget and hdel command for handlings dicts of Custom Configurations
* add bcrypt to requirements
* Refactored: Pytest way of testing raised exceptions
* fix filtering tasks, now we get only tasks with a cron\_string value
* Fixed: Correct call to Root logger and proper dynamic handler addition
* Fixed: Correct pytest Exception asserting
* Fixed: RedisBackend() now also returns production environment
* Enhancement: Print pid when spawning scheduler in foreground
* Refactored: RedisBackend funct cleaned up
* Fixed: Incorrect way of starting a subprocess
* Fixed: No timetuple was passed to cronex.check\_trigger()
* Fixed: Incorrect filter to exclude manual tasks
* Refactored: Moved logging configuration inside of the spawned process
* Fixed: Unskipped the tests for SchedulerRunner entrypoint
* Fixed: Filter out manual tasks when querying scheduled tasks
* Fixed: Replaced all occurences with the new get\_tasks. I was too fast
* Refactored: Renamed to get\_tasks() in Elector. What's being returned is actually a generator and not purely a single item
* Refactored: Tests passing by mocking loghandler
* Refactored: Removed static function from method
* Fixed: Moved to a selfcontained logger instance in TaskRunner
* Refactored: Renamed to get\_task() in Elector
* Refactored: Remove prefix from module vars
* Fixed: Merged master
* Fixed: Tests depending on real Redis backend
* Fixed: Merged master, fixed conflict in web/\_\_init\_\_
* Fixed: Updated job method in TaskRunner & backend now has is\_task\_new()
* Refactored: Renamed RedisProxy's fn to \_decode\_response
* Refactored: TaskRunner with \_\_init\_\_ & suggestions
* Refactored: TaskRunner's functions declared static & merge w master
* Modified Manual Run, Added Configured Run, added list actions, Added Tests, some more changes to support this
* Refactored: Better way to handle test database was added
* Refactored: Removed obsolete statements & added to create\_admin
* merge with master
* Modified test for pushing redis\_list
* typo and remove ununsed import
* modify the way to run the worker, now passing TaskRunner() to an independant Process. This runner will handle to run the actual worker
* change some logs for more useful ones
* remove redundant log
* Refactored: Try different approach for using test\_db
* Refactored: Redid the way DB was used when testing
* Allow user to enter task name, modified endpoint for , update backend conftest to match changes in master
* pull from master, merge and resolve conflicts
* pull master and resolv a conflict
* rename Wrapper related files, class, test to TaskRunner. Remove unused method "get\_worker\_module" and the test related, but add more check in "test\_full\_process\_calling\_run" to still verify if the worker is loaded. Remove method "logger" to use only "logging.info"
* Updated tests for WorkerAddContext Template
* Updated WorkerAddContext Template
* Fixed: Merge conflicts resolved
* Refactored: Use WEB\_TESTING as the indicator for env
* Fixed: Specify app to templates
* Fixed: WorkerDetector tests no longer failing
* Added test\_db URI to gitlab CI
* Updated README
* Updated README
* Updated uri to test connection string
* Updated README
* Fixed: Incorrect version requirement
* Point to test database
* Added fire to requirements
* updated readme
* removed unused imports
* modified tests and added test for content-type
* remove jobs\_handler module and relative tests and code in conftest. This module is replaced by skidward.scheduler
* remove POC code, and unused modeul "scheduler"
* Tests added
* Moved some fixtures here
* Renamed argument
* Moved Mock objects from conftest
* Added test settings to environment variables
* move test\_wrapper into wrapper folder
* remove import function from contest
* change import order, it is a test to make tests pass again on CI
* Modified template with WTForm
* MAJOR - modify wrapper implementation and tests
* MAJOR - modify scheduler implementation and tests
* Dynamically add form fields for add\_context
* Write small tests to verify CLI functionality
* Additional tests added
* Renamed user to not present a DB instance
* Removing default port from connstr. Perhaps the port is concatenated to the db name?
* CI can connect but DB isn't created. By default the image will create a DB the same name as the user, so hopefully this will work
* Updated extra environment vars
* Added postgres service to CI file
* forgot to remove comment after testing
* remove pdb call
* import order changed in conftest and remove pdb calls
* Remove unused import
* Added create-admin functionality. Removed unnecessary statements
* Moved config to app.py
* set SQLALCHEMY\_DATABASE\_URI to use in memory
* remove pdb in tests
* change a bit the wrapper implementation, add tests and add fixture to conftest, mainly copy/paste for load\_module part and initialise in memory database
* Added FLASK\_DEBUG
* some corrections
* Little modifications in tests
* backend wil now decode by default every byte string to string. I added some tests for this feature and modify the current implementation to handle that
* Added tests
* remove comment line as it has not to be added later
* Moved cli to \_\_main\_\_. Only necessary functions exposed. Callable with  for example
* Reshaped the app object to prevent circular imports
* Added Template for worker\_add\_context on Manual-Run
* remove comment for imports, it is messing up order, and remove p.join we do not want to wait for the child process to end
* commit pseudo code and test draft
* set wakeup\_timer as global, implement wrapper section but still commented to while this part is not merged and fix minor issue. Add a test to run the full process, need to implement the wrapper part to write the latest test
* remove job creation as it'll be handled by the wrapper, use BaseQuery.get instead of calling .query.filter as it's directly returning the task object, change naming for the function calling the wrapper and modify tests regarding those changes
* Scheduler.py : add try/except, fix code to create a job and minor modificatios. Conftest.py : add fixture to initialize in memory database. Test\_scheduler.py : add tests for the db related functions
* Corrected Typos
* Corrected Typos
* Use Python-Fire to expose bootstrapping functionalities
* Call custom RedisBackend instead of actual redis, move redis\_client from global to local variable called once process started, mainly because during test session RedisBackend was instanciate before TESTING var env was set, so we were going to use actual redis methods. Also changed get\_tasks\_to\_be\_run() as it was returning a list of bool instead of a list of available tasks. Several tests are added
* force set() to encode as utf8 to match real case, also adding some verification to get() and rpop() to avoid assertion. Tests are updated regarding those changes
* Redefined Admin Interface to have sing admin instance
* Move JobStatus enum to models
* get and rpop check if there is something in the list before trying to .encode() the result. also rename few value in tests to match real cases
* add new Dummy functions (set, get, rpop, exists) and related tests
* Removed deploy\_app as it's not relevant
* lpush task to 'MANUAL\_RUN'
* Removed job\_creation and unused imports
* remove returns, and decode directly when get() from redis as the check if something has to be gotten was done previously
* decode redis returned value as we get byteString. also return a task when is\_task\_ready\_to\_run is called instead of True/False
* move check for MANUAL\_RUN task after the scheduled task check
* first scheduler draft, copied pseudo code defined in wiki pages
* Resolved merge conflicts
* Resolved merge conflicts
* Added form\_override and Removed inheriting from SkidwardView
* Created draft for bootstrap and deploy script
* Moved worker\_detector into skidward package
* Executed Manual Run
* Added relationship from Job to Task
* removed 'lazy=noload'
* Added tests
* Added list actions to Run manually, render JSON field for Context
* Modifies Jobs relationship
* modified job repr from task\_id to task
* added SQLAlchemy-Utils to requirements
* Created 'Task' model, updated 'Job' model and relationship among 'Worker->Task->Job'
* Moved 'ModelViews' to 'views.py', display 'current\_user' on UI and some imports reformatted to be PEP8 complaint
* Used environment variables for testing endpoints
* erratum move back enable\_testing autouse fixture into conftest
* import mock from unittest instead of installing mock package
* move conftest and test\_backend into skidward/tests move test\_jobs\_handler into skidward/tests/jobs\_handler
* move conftest and test\_backend into skidward/tests move test\_jobs\_handler into skidward/tests/jobs\_handler
* remove the original backend file
* pull master and fix import typo
* move backend into skidward/skidward and modidy tests, also add import to handle new models location
* remove requirements files and use global files
* add test for exception in backend
* cast dict\_key as list, as there is only one key the loop is maybe an overkill
* add comments, use string instead of casting an int into a string, add assertions,
* Setup more docs, write boilerplate steps
* rename tests to be clearer
* Only one backend is used, renamed 'backends' to 'backend', refactored code to remove list related stuff. Modified tests regarding those changes
* Moved Models outside web
* Remove usage of dotenv and use monkeypatch.setenv instead Also remove from backend.py a global and instead call directly the class
* remove unused import
* Moved .env to project root
* Initial commit of index and src files
* Add markdown support in the setup file
* merge with master, remove local .env to use the global one. Add some settings to the global .env.default file
* remove comment change str.encode() into .encode('utf-8') in Confest change setup\_dummy\_backend into a fixture
* unit test for backend
* run automatically a fixture to add to .env the variable TESTING, remove the part to unset it as it's done when leaving the test
* some modifications to fit the behavior of the redis LRANGE command
* Adjusted wildcards for docs' generated dirs
* Add initial sphinx setup. Both Makefile and Windows make.bat options. Uses recommonmark for markdown support. Uses Read The Docs theme
* Ignore generated files from docs
* Added read-the-docs theme as requirement
* Markdown flavour for Sphinx added
* Added sphinx as dev requirement
* remove unused import
* rename function
* Conftest: 	setup all fixture to use the new backend implementation for Redis 	add and remove environment variable TESTING during test session 	mock sqlalchey generator returned after .filter
* Replaced move cmd to copy, to leave committed files alone
* Switched to pathlib to reach .env file. Apparently since Python3.5 the pathlib has been introduced to offer an easier way of navigating cross platform. Switched from paths using os.path to pathlib to offer crossplatform functionality
* add module to redirect redis calls depending of test env or real env
* Locked version on 3.6.7
* Create .env file in CI and set some defaults for testing
* Use absolute pathing
* Modified path
* Added fixture which loads env vars before executing test
* Added extra settings in hopes of silencing the warnings
* Moved web-tests to separate directory
* move module into skidward/skidward
* change current config to new values gotten from .env
* Use .env files to store config
* Ignore .env files
* unused import
* add a test when no job ready remove fixture mock\_job, not needed if I create two seperate tests and not using parametrize
* remove foo variable
* add conftest to mock a part of session used. Rename few variables
* Removed pre-commit file
* change table and test name. Use Enum instead of string
* Moved worker\_detector to skidward
* Only return module on load, not dict
* Convert to use of dict from list, renamed file to be pep8 compliant, updated tests
* remove tools made for test only
* use config parameter to define timer when process will check DB
* remove credentials
* add test to verify data push to redis
* rename job state as there is no more election for the moment
* Changed default password hash to SHA512\_crypt from bcrypt
* Missing newlines added
* dev requirements && pre-commit-config for black's PEP8 enforcemnt added
* Update requirements.txt
* use proper attribute to set the readme content type
* Moved password option to separate prompt. Use hash\_password instead of encrypt\_password due to deprecationwarnings
* rename as for now we are not talking about election anymore
* only distribute master branch
* remove build artifacts
* add home page
* remove thread part, for now do as simple as possible
* add tests and coverage check
* delete and create Jobs table to erase everything and start again from healthy env
* do not look for tests in poc folders
* adding dependencies
* Some typing cleanup
* Updated mock object to take all arguments of super
* Renamed module, rewritten and expanded tests and refactored detector
* install the library itself with its dependencies
* Now using Redis instead of homemade election process, we also change the goal for now, there is no more election, process just check from db if there is a job awaiting, in that case it adds it into redis list. Schedulers shall handle the lpop part to run the job
* add script to populate db for test purpose
* update gitlab CI instructions
* add requirements and update package structure
* update structure for publishing
* First draft, create  a job table, start election process and grant the first scheduler
* Update requirements.txt
* Update requirements.txt
* Update requirements.txt
* Add LICENSE
* Removed entrypoint in module & added requirements.txt
* web-requirement.txt
* Additional testing
* Helpermethods and fixtures moved
* Closing the stream connection at end of execution
* Ignore unused config sections
* Ignored redis dump
* Added missing type
* Sets logging handler to custom handler and emits a msg
* Initial tests added for redis\_log\_handler
* Stringified incoming LogRecord
* Setup added for packaging
* Initial stream to redis working
* Deleted .idea/vcs.xml
* Changed type checking to a more flexible form
* Updated README and added CLI for creation of Superuser
* Added and README.md and Packaged into web---Plz take this one into merge
* Added and README.md and Packaged into web
* Tests added
* Restructured PoC to be properly testable
* PEP8 and mypy compliant. Added newlines where necessary Added mypy configuration file and more static typing
* Restructured as packaging
* Updated admin interface with models and implemented logins with flask-security
* Simpler check for module names
* #2: Plugin detection - 2 workers added
* Removed BIN file .DS\_Store and added to gitignore
* #2: Detector added. Can be packaged to be run as
* Don't track .pyc files
* Created flask admin interface with Users Model
* Initial commit
