Commit Graph

665 Commits

Author SHA1 Message Date
Matthias Beyer 76dfe23f65 Add StdIoFileAbstraction module documentation 2017-06-18 11:33:18 +02:00
Matthias Beyer e5c8e9a1ac Add simple tests 2017-06-18 11:33:18 +02:00
Matthias Beyer aede9a112b Add first code draft for JSON mapper implementation 2017-06-18 11:33:17 +02:00
Matthias Beyer 08f9eb3d83 Add new dependencies: Serde* 2017-06-18 11:31:55 +02:00
Matthias Beyer af2b629a86 Add VersionError kind 2017-06-18 11:31:55 +02:00
Matthias Beyer 4abd9dd7cf Split into module-files 2017-06-18 11:31:55 +02:00
Matthias Beyer 447f2610ef Make StdIo backend abstract over IO->"fs"->IO mapper 2017-06-18 11:31:55 +02:00
Matthias Beyer 146e2a1140 Implement backend code for in-memory IO backend
This commit implements a backend which reads from a Read when created
and writes to a Write when dropped.

This way, one can initialize stores which are build from commandline
feeded JSON or TOML (currently JSON is implemented/about to be
implemented).
2017-06-18 11:31:55 +02:00
Matthias Beyer 5b8c138922 Add fn StoreId::local_push() for altering the local part of a StoreId 2017-06-17 17:21:27 +02:00
Matthias Beyer 1f26460b90 Make libimagstore::file_abstraction pub 2017-06-17 12:51:29 +02:00
Matthias Beyer ac8ea872cb Remove "TODO"-comment 2017-06-12 19:29:57 +02:00
Matthias Beyer bec59c1f8a Remove warnings by returning errors explicitely 2017-06-09 13:27:06 +02:00
Matthias Beyer 81449f48d6 Re-export file abstraction types 2017-06-09 13:22:45 +02:00
Matthias Beyer f82813bc3d Use in-memory backend in store tests 2017-06-09 11:15:55 +02:00
Matthias Beyer eeccd148f3 Transform backend code from compiletime-injection to dependency-injection
The title might be a bit inaccurate, but I cannot think of something
better.

Before the change
=================

Before this change, we had a compiletime backend for the store. This
means that the actual filesystem operations were compiled into the store
either as real filesystem operations (in a normal debug or release
build) but as a in-memory variant in the 'test' case.
So tests did not hit the filesystem when running.
This gave us us the possibility to run tests concurrently with multiple
stores that did not interfere with eachother.

Problem
=======

This approach worked perfectly well until we started to test not the
store itself but crates that depend on the store implementation.
When running tests in a crate A that depends on the store, the store
itself was compiled with the filesystem-hitting-backend.
This was problematic, as tests could not be implemented without hitting
the filesystem.

After the change
================

After this change, the backend code is injected into the store via
dependency injection (the `Store::new()` function automatically uses the
filesystem-backend).
The store can be created with a the in-memory backend when running tests
now.

Implementation
==============

The implementation of this is rather stupid, despite the big diff in
this commit.

Lets have a look at the `Store` code changes first and then we'll
discuss the `file_abstraction` changes this commit introduces.

libimagstore::fs_abstraction
----------------------------

The filesystem was abstracted via a trait `FileAbstraction` which
contains the essential functions for working with the filesystem.

Two implementations are provided in the code:

    * FSFileAbstraction
    * InMemoryFileAbstraction

whereas the first actually works with the filesystem and the latter
works with an in-memory HashMap that is used as filesystem.

Further, the trait `FileAbstractionInstance` was introduced for
functions which are executed on actual instances of content from the
filesystem, which was previousely tied into the general abstraction
mechanism.

So, the `FileAbstraction` trait is for working with the filesystem, the
`FileAbstractionInstance` trait is for working with instances of content
from the filesystem (speak: actual Files).

The `FileAbstraction` trait requires a function to be implemented that
can be used to create a `FileAbstractionInstance` object from it.

In case of the `FSFileAbstractionInstance`, which is the implementation
of the `FileAbstractionInstance` for the actual filesystem-hitting code,
the underlying resource is managed like with the old code before.
The `InMemoryFileAbstractionInstance` implementation is corrosponding to
the `InMemoryFileAbstraction` implementation - for the in-memory
"filesystem".

The implementation of the `get_file_content()` function had to be
changed to return a `String` rather than a `&mut Read` because of
lifetime issues.
This change is store-internally and the API of the store itself was not
affected.

libimagstore::store::Store changes
----------------------------------

So, first we need to make sure that the store knows the actual backend.
Therefor, the `new()` method was renamed to `new_with_backend()` and got
another parameter: the backend implementation.
A new `new()` function was created for convenience and
backwards-compatibility with the rest of the imag codebase (and also
because nobody wants to pass the backend manually all the time).

As the backend is abstracted via a trait, and the store should not
change its interface, the new `Store` member was introduced inside a
`Box`.

All calls (`remove_file()`, `copy()`, `rename()` and `create_dir_all()`)
were refactored from `FileAbstraction::*` calls into `self.backend.*`
calls.

libimagstore::store::StoreEntry changes
---------------------------------------

The `StoreEntry` type is constructed in the store internally for holding
a `StoreId` object as well as some status and the file abstraction code.

This object is constructed via a `new()` function that got a new
parameter: a `&Box<FileAbstraction>` to the backend abstraction the
store uses.
This backend is now used to create a new `FileAbstractionInstance`
object for the `StoreEntry`.

Also the `StoreEntry::get_entry()` code had to be adapted to the new
`Entry::from_str()` function interface.

This commit message is partially added as comment in the code.

Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
2017-06-09 11:15:55 +02:00
Matthias Beyer 72f0664976 Merge pull request #952 from matthiasbeyer/remove-hooks-impl-link-consistency-check-in-libimagentrylink
Remove hooks impl link consistency check in libimagentrylink
2017-06-06 22:30:00 +02:00
Matthias Beyer 0840739eca Merge pull request #954 from matthiasbeyer/remove-hooks-more-store-debugging
Remove hooks more store debugging
2017-06-06 19:07:19 +02:00
Matthias Beyer 33390acf23 Allow custom data in errors to be displayed 2017-06-06 19:04:53 +02:00
Matthias Beyer fa0e8130b6 Add debug output to Store::move_by_id 2017-06-06 13:16:09 +02:00
Matthias Beyer 1c18db56e6 Add debug output to Store::save_to_other_location 2017-06-06 13:16:09 +02:00
Matthias Beyer c06d8c319f Add debug output to Store::save_as 2017-06-06 13:16:09 +02:00
Matthias Beyer e157a906bd Add debug output to Store::save_to 2017-06-06 13:16:09 +02:00
Matthias Beyer fc854f3647 Add debug output to Store::delete 2017-06-06 13:16:09 +02:00
Matthias Beyer 79623e1db2 Add debug output to Store::retrieve_copy 2017-06-06 13:16:09 +02:00
Matthias Beyer ef0a76a02f Add debug output to Store::update 2017-06-06 13:16:09 +02:00
Matthias Beyer bc80a3b7d5 Add debug output to Store::walk 2017-06-06 13:15:56 +02:00
Matthias Beyer a3466ae548 Add debug output to Store::retrieve_for_module 2017-06-06 11:13:09 +02:00
Matthias Beyer 13e80445ae Add debug output to Store::get 2017-06-06 11:13:09 +02:00
Matthias Beyer 6cb5300cd9 Add debug output to Store::retrieve 2017-06-06 11:13:09 +02:00
Matthias Beyer c4584bf1ca Add debug output in Store::create() 2017-06-06 11:13:09 +02:00
Matthias Beyer a70d7d347a Add file-system file locking functionality in the store 2017-06-06 11:12:49 +02:00
Matthias Beyer 204ef24703 Remove hook support from store 2017-06-06 11:12:37 +02:00
Matthias Beyer 8253fb9795 libimagutil does not provide macros anymore 2017-05-04 16:28:10 +02:00
Matthias Beyer 4472449696 Add new dependency: is_match = 0.1 2017-05-04 16:20:15 +02:00
Matthias Beyer 89d8abefe7 Ignore duplicated keys 2017-05-03 21:40:05 +02:00
Matthias Beyer 18e13c999b Add test for more generic function
Also add test whether duplicated keys get ignored
2017-05-03 21:39:41 +02:00
Matthias Beyer 83ca7c8cfb Add tests for configuration 2017-05-03 21:31:35 +02:00
Matthias Beyer 4257ec1026 Merge pull request #930 from matthiasbeyer/update-toml
Dependency: toml: 0.2.* -> 0.4.*
2017-05-03 21:19:06 +02:00
Matthias Beyer 2bad2ef501 Adapt to use toml 0.4 2017-05-03 18:09:57 +02:00
Matthias Beyer 1da56c6d9d Merge pull request #919 from matthiasbeyer/prepare-0.3.0
Prepare 0.3.0
2017-05-03 17:49:18 +02:00
Matthias Beyer 585b5ffad6 dependency: toml: 0.2.* -> 0.4.* 2017-05-03 17:46:37 +02:00
Matthias Beyer ab99675562 Add tests for StoreId 2017-05-03 17:09:21 +02:00
Matthias Beyer 9650f46e23 Version strings: 0.2.0 -> 0.3.0 2017-05-03 10:48:26 +02:00
Matthias Beyer 2c8bc035ee Rename test 2017-05-02 17:43:28 +02:00
Matthias Beyer 5b93f3848c Merge pull request #911 from matthiasbeyer/libimagstore/storeid-exists-interface-result
Redefine return type of StoreId::exists()
2017-04-22 11:20:50 +02:00
Matthias Beyer 9396accc28 Merge pull request #916 from matthiasbeyer/superceed-898
Simplify FoldResult implementation
2017-04-22 11:19:56 +02:00
Matthias Beyer 111943e0eb Fix StoreId::exists() call with try!() 2017-04-21 21:08:45 +02:00
Matthias Beyer d3af023166 Redefine return type of StoreId::exists() 2017-04-21 21:08:45 +02:00
Matthew Piziak 9fa115500d Simplify FoldResult implementation
- Add tests for FoldResult
- Make documentation more explicit
- Assert failure accumulator in test

Submitted-by: Matthew Piziak <matthew.piziak@gmail.com>
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
2017-04-21 21:08:38 +02:00
Matthias Beyer fb0ba1d8bc Remove unused variable 2017-04-21 21:08:03 +02:00