Commit graph

327 commits

Author SHA1 Message Date
Brett Smith
a9eab2d4ea meta_receivable_documentation: Start hook. 2020-03-31 11:42:21 -04:00
Brett Smith
1fc9363b26 data: Add is_credit() and is_debit() methods to Posting.
The main motivation for this change is to make sure that higher-level
code deals with the fact that self.units.number can be None, and has
an easy way to do so.

I'm not sure all our code is *currently* doing the right thing for this
case, because I'm not sure it will ever actually come up. It's possible
that earlier Beancount plugins fill in decimal amounts for postings
that are originally loaded with self.units.number=None. I'll have to see
later whether this case comes up in reality, and then deal with it if so.
For now the safest strategy seems to be that most code should operate
when self.units.number is None.
2020-03-31 10:07:25 -04:00
Brett Smith
a0a3b04e50 meta_receipt: Accept paypal-id in lieu of receipt for PayPal credits. 2020-03-30 15:48:19 -04:00
Brett Smith
381160f0de meta_receipt: Accept invoice in lieu of receipt for credit card charges. 2020-03-30 15:48:19 -04:00
Brett Smith
7cac21b780 meta_receipt: Applies to both credits and debits. 2020-03-30 15:47:30 -04:00
Brett Smith
5a5caf0ddc meta_receipt: Clean unused import. 2020-03-30 15:16:04 -04:00
Brett Smith
2d49f7dfbc data: Add Account.is_checking() method. 2020-03-30 15:01:25 -04:00
Brett Smith
959bda307b typing: Refine any generics when possible.
These were tightened up by running mypy with --disallow-any-generics
and cleaning up reported errors.

There are still a couple of cases I don't know how to deal with
right now that prevent me from setting that option permanently:

* plugin/__init__.py sets up a dict where the key is a Directive
  and its value is a set of hooks that correspond to that type
  of directive. The relationship between key and value is not
  expressable through the type system, and any other solution would
  make the code way more involved and less dynamic.

* The type variable used in _GenericRange still isn't quite right,
  in the sense that specifying a value for CT creates more errors
  I don't know how to deal with. Protocols seem like the right
  solution for that but they apparently didn't land for Python 3.7
  that I can see.
2020-03-29 23:28:03 -04:00
Brett Smith
22d5b7e90a setup: Disallow untyped calls. 2020-03-29 23:22:35 -04:00
Brett Smith
747ef25da6 setup: Disallow untyped defs.
Mostly this meant giving annotations to low-value functions like
the error classes and __init_subclass__, but it's worth it for
the future strictness+documentation value.
2020-03-29 23:18:40 -04:00
Brett Smith
e6894c2b46 setup: Enable stricter type checking.
This caught the "return instead of raise" bug in meta_project.
2020-03-29 19:39:09 -04:00
Brett Smith
d9dca2cd68 data: Posting.is_payment casts threshold to address typing issue. 2020-03-29 15:32:51 -04:00
Brett Smith
d8c7242208 meta_approval: Pass configured payment_threshold to is_payment. 2020-03-29 14:41:57 -04:00
Brett Smith
043644d194 meta_approval: Start hook. 2020-03-29 11:14:51 -04:00
Brett Smith
30d371278a plugin: Refactor hooks to use new payment-related methods. 2020-03-29 10:30:54 -04:00
Brett Smith
5f85d9c747 config: Add Config.payment_threshold() method.
This just returns a constant for now, but we know it may need to be
configurable in the future.  Other code can start using this now
to be configurable in the future.
2020-03-29 10:21:37 -04:00
Brett Smith
93feb2f4a3 data: Add Posting.is_payment() method. 2020-03-29 10:18:51 -04:00
Brett Smith
2909c405e6 meta_receipt: Start hook. 2020-03-28 22:19:49 -04:00
Brett Smith
7658aaedf8 plugin: Refactor _RequireLinksPostingMetadataHook out of MetaInvoice.
This will be a common hook type.
2020-03-28 14:48:49 -04:00
Brett Smith
d9420ac2b6 meta_invoice: Start hook. 2020-03-28 14:31:17 -04:00
Brett Smith
46cfc558ec plugin: Link checkers use Metadata class. 2020-03-28 13:36:56 -04:00
Brett Smith
9b63d898af data: Add Metadata class.
As I start writing more link-checking hooks, I want a common place to
write link-parsing code.  This new class will be that place.
2020-03-28 13:35:38 -04:00
Brett Smith
2cb131423f errors: Redo InvalidMetadataError.
This needs to be generally usable for transactions.
2020-03-28 09:47:40 -04:00
Brett Smith
33cb734b19 config: Create cache database files with 0o600 mode.
I wasn't too worried about this earlier because the cache mainly stores
a bunch of numbers, but there's a little more than that: the generated
URLs also include original attachment filenames, which might be sensitive
(referencing people's names, bank names, etc.). Tighten security
accordingly.
2020-03-27 10:55:30 -04:00
Brett Smith
a8407c7b6a rtutil: Add RTLinkCache class to cache links to disk.
This will greatly reduce RT requests across multiple runs
and speed up link checking/conversion.
2020-03-27 07:35:45 -04:00
Brett Smith
1155212376 config: Add Config.cache_dir_path method. 2020-03-25 15:15:38 -04:00
Brett Smith
e8e7137216 rtutil: Fix parsing server URLs that include /REST/. 2020-03-25 10:18:09 -04:00
Brett Smith
a3630ab04e rtutil: Add docstring with basic rationale. 2020-03-25 10:18:01 -04:00
Brett Smith
2fb7826ab4 rtutil: Clean unused code. 2020-03-25 10:12:50 -04:00
Brett Smith
a61b74308f rtutil: Make RT.parse a classmethod.
Because it works, and I can imagine it being useful to have this
method more handy to other code.
2020-03-25 00:13:18 -04:00
Brett Smith
4874a107e8 meta_rt_links: Start hook. 2020-03-25 00:12:20 -04:00
Brett Smith
c4ce59da75 config: Add Config.rt_wrapper method.
This returns a cached version of the new rtutil.RT class,
so that a single process can easily grab references to one
instance with one cache of ticket/attachment data, etc.
2020-03-24 23:30:31 -04:00
Brett Smith
9fbc658aa6 rtutil: Add RT.parse method.
This method can parse the ticket and (optional) attachment IDs
out of our short-hand link formats, both for Ledger and Beancount.
2020-03-24 18:24:31 -04:00
Brett Smith
d5a6141f6d rtutil: Start module.
For now, this is basically the Python version of
ledger-tag-convert.plx.  It knows how to create RT web links from
ticket and attachment IDs.  It confirms that those objects actually
exist too.  It may grow to encompass other functionality in the
future.
2020-03-24 17:23:54 -04:00
Brett Smith
f09f029fc4 config: Add Config.rt_client method. 2020-03-24 09:08:08 -04:00
Brett Smith
8d3816a8fd config: Add Config.rt_credentials method.
This loads settings from the same environment variables and ~/.rtrc
file as the rt CLI.

Note that it does *not* support RTCONFIG and the config file
searching, because right now that seems like more work for more
trouble to me.
2020-03-23 15:19:15 -04:00
Brett Smith
d845332c7e meta_entity: Clean unused imports. 2020-03-21 13:55:42 -04:00
Brett Smith
ad268f049d meta_entity: Start hook. 2020-03-21 13:53:33 -04:00
Brett Smith
5c6043311b meta_repo_links: Start hook. 2020-03-20 16:47:06 -04:00
Brett Smith
1500d2d9d8 meta_project: Start hook. 2020-03-20 12:08:10 -04:00
Brett Smith
0d370c445b plugin: User configuration is passed to hooks on initialization. 2020-03-19 17:23:27 -04:00
Brett Smith
84d8adb7f6 plugin: Move hook initialization from HookRegistry to run().
Makes more sense here so run can report errors in hook configuration.
2020-03-19 16:42:13 -04:00
Brett Smith
71531913d5 config: Start module.
Ultimately all values that come from user configuration will be generated
here.
2020-03-19 14:31:21 -04:00
Brett Smith
a78db2ed36 data: Add docstrings. 2020-03-19 12:19:34 -04:00
Brett Smith
4fee91ad48 data.Account: Use multi-arg is_under in is_real_asset. 2020-03-19 10:43:20 -04:00
Brett Smith
7cd569be7b data.Account: Add is_income method. 2020-03-19 10:23:55 -04:00
Brett Smith
b7089f5ddf plugin: Add meta_income_type validator. 2020-03-19 09:52:43 -04:00
Brett Smith
9b8563f3f0 data.Account: is_under accepts multiple arguments. 2020-03-19 09:47:10 -04:00
Brett Smith
cbd94d9b75 core: Make MetadataEnum aliases optional. 2020-03-18 18:23:42 -04:00
Brett Smith
89aaae821b data.Account: Exclude PrepaidVacation from "real" assets.
Same rationale as PrepaidExpenses.
2020-03-18 16:25:37 -04:00
Brett Smith
3f9e67de3a meta_tax_implication: Don't enforce on Assets:PrepaidExpenses. 2020-03-18 09:00:47 -04:00
Brett Smith
28238643a3 data.Account: Add is_real_asset method. 2020-03-18 08:59:03 -04:00
Brett Smith
661fe676e1 Document known typecheck failures. 2020-03-18 08:24:07 -04:00
Brett Smith
b2ef561c85 data: Introduce Posting class.
Our version of Posting is interface-compatible with Beancount's,
but makes stronger guarantees about the data types for our
higher-level code to rely on.
2020-03-18 07:48:08 -04:00
Brett Smith
163ecbc7d3 data: iter_postings uses Account. 2020-03-17 18:06:43 -04:00
Brett Smith
6c0f23b2fa data: Start Account class. 2020-03-17 18:05:24 -04:00
Brett Smith
3a73bc2239 data: Start iter_postings function. 2020-03-17 17:08:47 -04:00
Brett Smith
f4978046b8 data: Start module with PostingMeta class.
As I'm pushing to reimplement payment-report/income-report, I see query and
reporting tools will want easy access to these kinds of views, so here it
starts.
2020-03-17 17:08:05 -04:00
Brett Smith
3fbc14d377 Improve organization between modules.
* Rename _typing to beancount_types to better reflect what it is.
* LessComparable isn't a Beancount type, so move that to
  plugin.core with its dependent helper classes.
* Errors are a core Beancount concept, so move that module to the
  top level and have it include appropriate type definitions.
2020-03-15 16:03:57 -04:00
Brett Smith
a41feb94b3 plugin: Transform posting hooks into transaction hooks.
I feel like posting hooks a case of premature optimization in early
development. This approach reduces the number of special cases in
the code and allows us to more strongly reason about hooks in the
type system.
2020-03-15 15:50:14 -04:00
Brett Smith
c9ff4ab746 plugin: Settle on words-with-dashes metadata keys. 2020-03-15 10:36:49 -04:00
Brett Smith
ee038d7b7d plugin.core: Add type hints. 2020-03-08 18:24:51 -04:00
Brett Smith
547ae65780 plugin.core: _meta_set properly handles when post.meta is None.
post is a NamedTuple, so attribute assignment is not allowed.
Instead we have to construct a whole new Posting.
2020-03-08 11:32:03 -04:00
Brett Smith
c3c19b0ad2 plugin.core: Document base classes.
Since so much other code is built on these, I wanted to make sure I
wrote this while it was all fresh in my head.
2020-03-06 10:37:54 -05:00
Brett Smith
6e0c31f0ab plugin.core: Add missing import. 2020-03-06 09:24:15 -05:00
Brett Smith
d34db71542 plugin: Introduce HookRegistry.
This is the layer that keeps track of the different groups of hooks and
can filter them before runtime. The idea here is that you'll be able
to do things like skip hooks that require network access when you don't
have it, or skip CPU-intensive hooks when you don't need them, etc.
2020-03-06 09:22:55 -05:00
Brett Smith
e9e2bb9b00 plugin: Rename the main method of hooks from check to run.
This will be more appropriate when we have hooks that do more than
check metadata.
2020-03-05 17:48:59 -05:00
Brett Smith
53329c7a23 plugin: Start entry point.
This doesn't integrate with existing hooks but at least sketches out the
main loop.
2020-03-05 17:41:58 -05:00
Brett Smith
dbe9362987 meta_tax_implication: Initial module and tests. 2020-03-05 15:48:10 -05:00
Brett Smith
5849b562d0 expenseAllocation: Switch to own MetadataEnum class.
Python's own enum works fine for the simple values that expenseAllocation
uses, but it won't work as well for metadata like taxImplication where
many of the values aren't legal Python identifiers. Introduce our own
MetadataEnum class with the necessary functionality, and switch to that.
2020-03-05 15:33:27 -05:00
Brett Smith
16c47c64b2 expenseAllocation: Date-limit the transactions we work on.
This prevents the plugin from giving meaning to postings that
might not really be there.
2020-03-05 14:37:47 -05:00
Brett Smith
910b95c942 errors: Add a __repr__.
This makes the errors easier to understand in test failures.
2020-03-05 13:57:20 -05:00
Brett Smith
34090df23f expenseAllocation: Set default values by account. 2020-03-05 13:44:36 -05:00
Brett Smith
99f97d3f58 expenseAllocation: Accept 'admin' shorthand for 'administration'. 2020-03-05 12:23:03 -05:00
Brett Smith
d436a388f7 expenseAllocation: Only check Expenses postings. 2020-03-05 12:10:05 -05:00
Brett Smith
7862919022 expenseAllocation: Start checker.
This is the simplest version of a common validation we're going to do:
make sure that a particular piece of metadata has one of a set of
values.

This checker needs some bounds checking but I wanted to err on the
side of committing this early because it introduces so much base
infrastructure.
2020-03-05 12:05:13 -05:00
Brett Smith
c5dd7984bc Initial commit: license, setup.py, gitignore, skeleton structure. 2020-03-05 09:33:23 -05:00