diff options
author | Christian Mollekopf <chrigi_1@fastmail.fm> | 2015-10-09 10:21:58 +0200 |
---|---|---|
committer | Christian Mollekopf <chrigi_1@fastmail.fm> | 2015-10-09 10:21:58 +0200 |
commit | 055ca386419b6f10bce60232c2a425c2931da6ed (patch) | |
tree | 9869305ccedaba66b687635d1b71d7ae1546a4fa | |
parent | 4fa375062d6ba14947923c01bffbf06ce91325bf (diff) | |
download | kube-055ca386419b6f10bce60232c2a425c2931da6ed.tar.gz kube-055ca386419b6f10bce60232c2a425c2931da6ed.zip |
Added documentation
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | docs/design.md | 94 | ||||
-rw-r--r-- | docs/index.md | 4 | ||||
-rw-r--r-- | docs/project.md | 38 | ||||
-rw-r--r-- | docs/requirements.md | 85 | ||||
-rw-r--r-- | mkdocs.yml | 1 |
6 files changed, 223 insertions, 0 deletions
@@ -3,3 +3,4 @@ | |||
3 | *.diff | 3 | *.diff |
4 | *.patch | 4 | *.patch |
5 | *.swp | 5 | *.swp |
6 | site | ||
diff --git a/docs/design.md b/docs/design.md new file mode 100644 index 00000000..2e2b6997 --- /dev/null +++ b/docs/design.md | |||
@@ -0,0 +1,94 @@ | |||
1 | # Architecture / Design | ||
2 | |||
3 | ## Overview | ||
4 | Kontact Quick is supposed to be a small and concise codebase that is easy to modify and evolve. | ||
5 | |||
6 | It's following a reactive model, where in one direction we have controllers generating modifications, and in the other direction models updating themselves on changes. | ||
7 | |||
8 | The overall architecture is split into three layers; Ui, Domain Logic and Infrastructure. | ||
9 | |||
10 | ``` | ||
11 | +----------------------------+ | ||
12 | | UI | | ||
13 | +----------------------------+ | ||
14 | | | | ||
15 | | Domain Logic | | ||
16 | | | | ||
17 | +--------------+------+------+ | ||
18 | | | | | | ||
19 | | Akonadi Next |Config| ... | | ||
20 | | | | | | ||
21 | +--------------+------+------+ | ||
22 | ``` | ||
23 | |||
24 | The UI Layer consists of views (mostly written in QML), view-models (models that are view specific and potentially implement user interaction details), and the glue code to use various controllers from the interface. Different UI layers may exist for different form factors. | ||
25 | |||
26 | The domain logic layer holds the application state. It povides models to access data and controllers to act upon it. The domain logic is by definition Kontact Quick specific and not sharable with other applications, at it needs to be taylored exactly according to the requirements of Kontact Quick. | ||
27 | |||
28 | The infrastructure layer provides: | ||
29 | |||
30 | * Data access (Akonadi Next) | ||
31 | * Configuration (Config files, etc.) | ||
32 | * Various functionality provided by libraries (email sending, ldap, iTip handling, iCal implementation (kcalcore), vCard implementation, ...) | ||
33 | Various bits of the infrastructure layer may be exchanged on different platforms, to i.e. integrate into native infrastructure providers on a platform. | ||
34 | |||
35 | Note: By using the onion architecture we ensure the infrastructure is exchangable just as well as the UI. | ||
36 | |||
37 | ## Domain Logic | ||
38 | |||
39 | ### Models | ||
40 | Self-updating models are used to implement the read-only part of the application. | ||
41 | By using QAbstractItemModels we can reuse the existing update mechanism, have something that works well with QML, and avoid implementing a boatload of boilerplate code for hand-coded domain objects. | ||
42 | |||
43 | Models should always be reactive and configured with a query, so they are asynchronous. | ||
44 | |||
45 | By implementing everything according to that model we can later on achieve lazy-loading of properties and zero-copy (or at least close to zero-copy) directly from storage without modifying anything besides data access. | ||
46 | |||
47 | ### Controllers | ||
48 | Use-case specific controllers are used to operate on the data. Controllers allow to completely separate the modifications from the view. | ||
49 | Rather than splitting controllers by domain type (e.g. an email controller, or a calendar controller), we specifically write controllers for specific usecases (e.g. an email editor), that exposes all required actions. That way we ensure that the API's a UI is working with is always clear an consice, and that we have all domain logic captured in the domain logic layer, rather than the UI layer. | ||
50 | Of course controllers will need to share functionality internally as soon as an action is available from more than one place. | ||
51 | |||
52 | ## Infrastructure | ||
53 | |||
54 | The infrastructure layer interfaces with the rest of the system. It is the place where we can integrate with various native infrastructure parts. | ||
55 | |||
56 | ### Akonadi Next | ||
57 | Akonadi Next is used for primary data access and handles all synchronization. | ||
58 | |||
59 | ### Configuration | ||
60 | Configuration as traditionally store in config files in ~/.kde | ||
61 | |||
62 | ### Notification | ||
63 | Notifications for the system. | ||
64 | |||
65 | ### Files | ||
66 | Store/Load/Shared stuff (attachments, events, ....) | ||
67 | * Additional to the basic store/load stuff that may need further abstraction for mobile platforms beyond what qt provides. | ||
68 | * Android Intents/Libpurpose (share with various applications etc). | ||
69 | |||
70 | ### Import/Export | ||
71 | Same as files? Import/Export calendar data | ||
72 | |||
73 | ### RFC implementations | ||
74 | * iCal: KCalCore | ||
75 | * vCard: KContacts | ||
76 | * iTip: extract from kdepim repo | ||
77 | |||
78 | ### Cryptography | ||
79 | * PGP, PEP | ||
80 | * ObjectTreeParser | ||
81 | |||
82 | Keyselection, encryption, decryption, signing | ||
83 | Probably requires access to identities in some way. | ||
84 | |||
85 | ### MIME-Message parsing | ||
86 | * ObjectTreeParser | ||
87 | * KMime | ||
88 | |||
89 | ## Interaction with external applications | ||
90 | External applications, like the KDE calendar plasmoid, should be able to load parts of Kontact Quick when available. It should for instance be possible to load the Event editor as embeddable QML component, that is fully functional. That way it becomes very easy for third parties to provide extra functionality if Kontact Quick is installed, without having to reimplement the Domain Logic (as is the case if only data access is provided through akonadi). | ||
91 | |||
92 | The same mechanism should probably be used by Kontact Quick itself to ensure loose coupling and allow mashups with various content types. | ||
93 | |||
94 | Note: We'll probably want a component-viewer application to easily load and test individual components (similar to plasmoidviewer). | ||
diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 00000000..e6a7193c --- /dev/null +++ b/docs/index.md | |||
@@ -0,0 +1,4 @@ | |||
1 | # Documentation | ||
2 | This documentation is built using [mkdocs.org](http://mkdocs.org). | ||
3 | |||
4 | Use `mkdocs serve` to run a local webserver to view the docs. | ||
diff --git a/docs/project.md b/docs/project.md new file mode 100644 index 00000000..85778eee --- /dev/null +++ b/docs/project.md | |||
@@ -0,0 +1,38 @@ | |||
1 | # Vision | ||
2 | Kontact Quick aims to be an enterprise-ready PIM solution, that has a high-quality and rock solid core. The focus of the core is on high-quality code, maintainability, stability and performance. | ||
3 | |||
4 | We strive to keep the core to the necessary minimum, with minimal dependencies and maximum portability, and in a way that it is maintainable by a small team. | ||
5 | We also strive to keep the solution agile so that work by corporate partners can be executed upstream. | ||
6 | |||
7 | Experimental or advanced features are supported as optional addons, to not affect the high quality of the core product. | ||
8 | |||
9 | Kontact Quick aims to be available on various form-factors and platforms. | ||
10 | |||
11 | # Project Structure | ||
12 | While this is an open project that welcomes participation from everyone who's interested, we do have an explicit team strucuture to ensure it's clear to everyone who's repsonsible for what. External contributions are alwas welcome and the team is of course open for extension. | ||
13 | |||
14 | Team Lead: Christian Mollekopf | ||
15 | Team Members: Michael Bohlender, Sandro Knauss, Aaron Seigo | ||
16 | |||
17 | It's the team leads responsibility to: | ||
18 | |||
19 | * Organize regular online meetings (medium yet unknown) | ||
20 | * Give direction to the product and ensure it's followed. | ||
21 | * Direct development and oversee decisions | ||
22 | * Ensure documentation of decisions | ||
23 | |||
24 | ## Decision making process | ||
25 | Decisions are generally made in discussion with the team, and result in documentation or an item on the roadmap. Non-trivial decisions are always either discussed on the mailinglist or in an online meeting. | ||
26 | |||
27 | Should the team not be able to reach consensus, the team lead makes the final decision. | ||
28 | |||
29 | NOTE: We should probably have a phabricator board for open decisions. | ||
30 | |||
31 | ## Planning | ||
32 | All planning happens on the KDE Phabricator instance: https://phabricator.kde.org/project/view/43/ | ||
33 | |||
34 | ## Releases / Milestones | ||
35 | Releases will follow achieved milestones. Milestones are assembled from tasks on the roadmap. | ||
36 | |||
37 | ## Versioning | ||
38 | The product will follow the semantic versioning scheme (semver.org), with each feature release corresponding to a milestone on phabricator. | ||
diff --git a/docs/requirements.md b/docs/requirements.md new file mode 100644 index 00000000..1b1f5f24 --- /dev/null +++ b/docs/requirements.md | |||
@@ -0,0 +1,85 @@ | |||
1 | # Personas | ||
2 | Note: This is a draft only | ||
3 | |||
4 | ## Roadwarrior | ||
5 | * Fires up Kontact quickly to see what's up next (it's not constantly open) | ||
6 | * Has to deal with bad/intermitted network connection | ||
7 | * Relies on offline capabilities to access content | ||
8 | * Uses various mobile devices | ||
9 | |||
10 | ## Average Desktop User | ||
11 | * Relies on notifications to immediately see when he's contacted. | ||
12 | * Requires a simple and efficient UI | ||
13 | * Doesn't customize a lot | ||
14 | * Has constant internet access | ||
15 | * Works 9 to 5, doesn't care outside of business hours | ||
16 | |||
17 | ## Power Desktop User | ||
18 | * Inherits Average Desktop User Requirements | ||
19 | * Regularly checks email on the go (mobile) | ||
20 | * Regularly checks calendar on the go (mobile) | ||
21 | * Creates events on the go (mobile) | ||
22 | |||
23 | # Kontact Inventory | ||
24 | We need to go through the current codebase, assess what features are available, how the implementation looks and where it is, and to what extent the code is reusable. | ||
25 | This will help us in figuring out the useful feature set, and will allow us to reuse the lessons learned that are embedded in the codebase. | ||
26 | |||
27 | This inventory is currently hosted in an ikiwiki (ikiwiki.info) git repository(kde:scratch/aseigo/KontactCodebaseInventory.git) | ||
28 | |||
29 | # Target platforms | ||
30 | The codebase is supposed to be portable across a range of platforms. | ||
31 | Initially we'll work on a reasonably recent linux distribution though. | ||
32 | |||
33 | The aimed for minimum bar is: | ||
34 | |||
35 | Linux: | ||
36 | |||
37 | * Fedora 22 | ||
38 | * Ubuntu 12.04 | ||
39 | * Centos/RHEL 7 | ||
40 | |||
41 | Windows: | ||
42 | |||
43 | * 7sp1 | ||
44 | |||
45 | OS X: | ||
46 | |||
47 | * ? | ||
48 | |||
49 | Android: | ||
50 | |||
51 | * 5.0 | ||
52 | |||
53 | # Dependencies | ||
54 | Since the codebase needs to be portable across various platforms old and new, dependencies should be managed that they are as little and as low as possible. While we don't want to reinvent the wheel constantly or work with ancient technology, each additional dependency or dependency bump needs to be justified and we need to evaluate wether that results in a problem with any of the target platforms. This evaluation of course includes transitive dependencies. | ||
55 | |||
56 | Currently available dependencies: | ||
57 | |||
58 | * GCC 4.6.3 / MSVC 2013 | ||
59 | * Qt 5.2 | ||
60 | |||
61 | # Codebase | ||
62 | |||
63 | ## Requirements | ||
64 | * Each module has at least rudimentary tests that can then be extended | ||
65 | * Tests need to be deterministic, no random timeouts to check if something already happened, only `QTRY_VERIFY` and alike is allowed. | ||
66 | * Clear layering. No depending on akonadi from everywhere. | ||
67 | * Each module comes with a clear set of justified dependencies. | ||
68 | * Commented code is only allowed in conjunction with a task in phabricator. No dead/commented code. | ||
69 | * Each module requires a clear interface that allows the module internals to be replaced eventually. | ||
70 | * UI modules need to be separated from non-UI parts. All UI parts need to be eventually replacable by QML equivalents. | ||
71 | * No dialogs in non-UI parts. | ||
72 | * New features are only added after having been selected from the roadmap for a future release | ||
73 | * An accounts based configuration for everything | ||
74 | * No non-persistant data in config files (collection ids...) | ||
75 | |||
76 | * No KParts | ||
77 | * No KXMLGui | ||
78 | |||
79 | ## Guidelines | ||
80 | * Singletons that hold a modifyable state should be avoided. | ||
81 | * Where standards are available we strive to follow those, and deviations from the standard are avoided as much as possible. Repurposing of standard elements should be avoided altogether. | ||
82 | * Fallbacks (i.e. for configs ), should be applied in a single place only, and should be avoided wherever possible. | ||
83 | * Libraries need to be purpose built and with clear responsibilities. No artificial boundaries that don't help something. | ||
84 | * Modal dialogs should be avoided. | ||
85 | |||
diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 00000000..30b80930 --- /dev/null +++ b/mkdocs.yml | |||
@@ -0,0 +1 @@ | |||
site_name: Kontact Quick | |||