What's coming up in imag (2)
This is the second article on what is coming up in imag.
In the last 14 days was not that much noise in the repository, though some interesting things happened anyways.
What happened
In the following sections I will describe the PRs that have been merged in the last 14 days.
In general: There were a lot of documentation improvements and also two rather critical bugs have been fixed.
libimagtag/init
The initial codebase for libimagtag was merged. Finally, we have tagging
support in form of a library! libimagtag includes a trait Tagable which is
implemented on EntryHeader and Entry, so a user of the library can simply
call some_entry.add_tag(some_tag) to add a tag.
The user interface for this library is rather simple, though we have now moved some functionality into a library which grants us compatibility over several modules, as entries from all modules now get tagged in the very same way.
This will also come in handy when filtering for tags, for example.
libimagstore/clean-warnings
Some warnings have been removed from the store compiling step, which results in better code quality. These warnings were nothing serious (as the development of the whole suite is not in a usable state, yet), but they will of course be removed (and turned into errors) before the first release of the suite.
doc/alphabetical-ordering
The documentation on the modules is now in alphabetical order. The non-alphabetical order becomes an issue as the number of modules slowly increases, so I switched it to alphabetical order.
doc/linking
The chapter on how linking between modules should work, was added. Finally we have something we can refer to when implementing the linking library, yay!
Of course, the implementation of the linking library was started as well and is in good progress so far.
libimagrt/config-in-toml
This was a major change. The configuration file was in some ini-like format
before and now we simply use TOML. We use TOML already internally for our header
format and it turned out to be great (and toml-rs, the rust library for toml
is awesome as hell), so why not also using it for our configuration file format?
This removed a dependency for the config crate and we already have the
knowledge how to toml-rs crate works, so there is no overhead in learning
another API!
doc/add-module-files
This added simply some files for documentation of modules. Nothing too serious here.
doc/libimagutil
This added documentation for the libimagutil, which already has some really
nice and useful functionality and will get some more as we make progress, so I
started to add the appropriate documentation notes in the document.
libimagutil/ismatch-util
This was an awesome piece of rust macro!
It happens that we often do things like
if match foo { Value::String(_) => true, _ => false } {
// something
}
in our rust code, when using toml-rs for example. One rather complex thing
which came up just today (and is therefor not yet included, but I'll write about
the problem here) was
if match foo { Some::Type::A(_) => true, _ => false } ||
match foo { Some::Type::B(_) => true, _ => false } {
// something
}
The macro which was introduced by this merge simplifies this noisy mess. The following is equivalent to the upper:
if ismatch!(foo, Some::Type::A(_)) || ismatch!(foo, Some::Type::B(_)) {
// something
}
It is way more readable, isn't it?
libimagstore/update-glob
The glob crate dependency was updated as the 0.2.10 release had some bugs
(mainly the PatternError which did not implement std::error::Error) which
got solved in 0.2.11.
Thanks to the author for fast response times on issues and questions!
libimagstore/fix-addimplicitdirectory_creating
This was a bugfix, as the store did not yet create directories inside the store.
I started to write a module for imag and tested it by creating a foo/bar and
it failed silently. I checked why and it was because the store library did not
create the foo directory inside the store. Fixed that and it worked, so I
extracted the patch from my module feature branch and submitted it as own PR.
libimagstore/revert-idinstore-check
This was also a hard one. There was a checking function in the store which tried to validate that a store id is inside the store (on the filesystem).
This function was buggy. It was not only this function, but also the algorithm
which created the store ids. It generated the store ids (which are actually just
PathBufs) as absolute paths, so foo would become /foo. This was a bug.
The store ids are no longer absolute but relative. The store now adds its own path as prefix for each ID and everything just works now.
What's coming up
Lets have a look what might be merged in the next 14 days.
First of all, there is, of course, the hook system. It is completed, though it is neiter reviewed nor merged, yet. I guess it might get some more tweaks but it will get merged with rather minor fixes instead of big changes. I'm really looking forward to get this into imag!
The second thing is: There are a lot of pending PRs which are for libraries. I
want to introduce the linking library, a “notes” library which will be the
foundation for the “notes” module, tagging filters in libimagentryfilter and
libimagentrymarkup which is a utility to translate entry markup content into
HTML (for viewing with a browser).
All these libraries (besides libimagentrymarkup) are ready for merging as far
as I can see, though there was no review, yet.
I also want to add a store feature so one can move an entry (Store::move()
and Store::save_as() will be introduced for this). The interface is ready and
submitted as PR, though there is no implementation yet.
There are some modules pending as well: A imag view utility for viewing
content (mainly a frontend to libimagentrymarkup, though it will also make use
of things from libimagentryfilter and possibly others as well), a imag tag
utility to modify tags of arbitrary entries and imag link for linking
arbitrary entries. There's also a pending PR for imag counter which will add a
simple counter module to the imag suite.
All these modules are waiting for the libraries described above to be merged.
imag counter
The imag counter module will be a rather simple module. It supports creating, deleting and listing counters and of course incrementing, decrementing, setting and re-setting them.
This is planned for the first release.
After that, I want to enhance the functionality of the library and provide
several counting mechanisms (and composability so other modules can use the
library to use the imag counter functionality in arbitrary ways). I want to be
able to count and get a graph which shows on which dates (or times) I did the
most incrementing-steps, so the counter needs to save the dates it was
incremented.
All these things are rather trivial to implement, though I want to make the interface as generic as possible (and provide some simple things like described above), which makes this task rather non-trivial. That's why this is planned for later and not implemented in the first step.
github pages
Another problem I'm working on is github pages. I want to upload the imag crate documentation to github pages, though it is not that simple as the repository does not contain only one crate but several.
I also want to include the code-coverage statistics later on, though this would be another step and would be done in a seperate PR later on.
Readme update
The README.md file of the repository will get an update in the next few days,
so it will list a lot more information on what the repository contains and what
to expect from the project.
Random thoughts
Lets see... We have some awesome PRs merged in the last 14 days, there are more awesome PRs in the pipeline and about to be merged... so awesomeness everywhere, isn't it?
Well, yes. I really want to get the libraries merged into the master branch. After that and after the hook system is merged, I can implement modules for imag and I'm also able to implement hooks for imag. And I can develop them in parallel, as they do not depend on each other. This is really important to me, as I do not get blocked from my own PRs!
Let's hope we get this stuff in! Maybe this weekend, as I have a hacking session with some of my friends planned for tomorrow, so lets see... maybe I can report some major progress in 14 days!
tags: #linux #open source #programming #rust #software #tools #imag