Skip to content

Commit

Permalink
Update
Browse files Browse the repository at this point in the history
  • Loading branch information
pyrustic committed Sep 2, 2021
1 parent 1405eac commit 38a221c
Show file tree
Hide file tree
Showing 88 changed files with 3,441 additions and 4,093 deletions.
157 changes: 70 additions & 87 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,152 +1,135 @@

<!-- Image -->
<div align="center">
<img src="https://raw.githubusercontent.com/pyrustic/misc/master/media/hubstore_cover.png" alt="Hubstore Cover">
<img src="https://raw.githubusercontent.com/pyrustic/misc/master/media/ecosystem.png" alt="Hubstore Cover">
<br>
<p align="center">
Hubstore - built with Pyrustic
Overview of the Pyrustic Open Ecosystem
</p>
</div>

<!-- Intro Text -->
# Hubstore
`Hubstore` is a lightweight software that allows you to download, install, manage, and run `Python` `desktop applications`.
<b> Distribute, promote, discover, install, and run Python desktop applications </b>

This is an [emailware](https://en.wiktionary.org/wiki/emailware). You are encouraged to send a [feedback](#contact).
This project is part of the [Pyrustic Open Ecosystem](https://pyrustic.github.io).

<!-- Quick Links -->
[Demo](#demo) | [Features](#features) | [Installation](#installation)

<!-- Table of contents -->
## Table Of Contents
- [Overview](#overview)
- [Demo](#demo)
- [Philosophy](#philosophy)
- [Features](#features)
- [Installation](#installation)
- [License](#license)
- [Contact](#contact)

<!-- Overview -->
## Overview
Once you have developed a Python desktop application with or without [Pyrustic](https://github.com/pyrustic/pyrustic#readme), the next goal is to distribute it to end-users.

You can use `Pyrustic` to build the distribution package (Wheel) and then publish your application on Github with the `Pyrustic` tool `Hubway`.

You can still ignore `Pyrustic` and use your favorite tools to build a Wheel then release it as an asset on Github.

Now imagine a modern lightweight desktop application where end-users could simply type your Github profile name slash your repository name (Example: pyrustic/demo) or simply paste your repository URL (Example: https://github.com/pyrustic/demo).

End-users will then just click a button to get the latest version of the built distribution (Wheel) of your project and then decide to install it.
[Installation](#installation) | [User side](#user-side) | [Developer side](#developer-side)

This modern lightweight desktop application exists: `Hubstore`.

What else end-users could do ? Well, they can update the previously installed app, rollback to a previous version (because the latest release sucks ! and yes `Hubstore` makes backup duh !), uninstall apps (with its dependencies !), open more than one apps with the possibility of closing them from the `Hubstore` taskbar. And guess what, end-users don't have to think about your application's dependencies because `Hubstore` takes care of these details and end-users aren't probably even programmers !

`Hubstore` will assign a beautiful default image to your app once it is installed. As a software producer, you can control this detail and some others details like `requirements.txt` you would expect the end-users to `pip install`, or the script you would like `Hubstore` to execute at installation and/or uninstallation. It is easy to configure these details, just open the command-line tool Pyrustic `Manager`, issue the command `init` (yes even in existing project, it shouldn't break it, but you know this is still Beta, so... ;-), go inside the JSON file `hubstore.json` in the folder `$APP_DIR/pyrustic_data`, change the values, build a Wheel, publish a new release on Github, done ! So easy !

`Hubstore` is built with the `Pyrustic` framework and is available on PyPI. As `Hubstore` consumes Python standard package format `Wheel`, it is compatible with lot of existing projects.
## Overview
`Hubstore` allows software developers to distribute their apps to users through [Github](https://github.com/about).

Only three constraints:
- you have to follow the conventional Python project structure as described in the [Python Packaging User Guide](https://packaging.python.org/tutorials/packaging-projects/);
- you need to have a `__main__.py` file in the source package;
- the project name should be the same as the source package.
Let's visit both sides of the distribution pipeline.

In fact, these aren't constraints but simply `elegance` and [proactivity](https://en.wikipedia.org/wiki/Proactivity). It will save you a lot of trouble in the future (believe me). By the way, the Pyrustic command-line tool `Manager` will take care of these details for you, you will just need to link a project directory, then issue the command `init`. `Manager` can be used programmatically and is an optional tool.
### The user side
Let's discover Hubstore through a series of screenshots

<div align="center">
<img src="https://raw.githubusercontent.com/pyrustic/misc/master/media/hubstore-empty.png" alt="Figure" width="800">
<p align="center">
<i> A minimalist, clean and elegant graphical user interface </i>
</p>
</div>

This is a beta version of `Hubstore`, so it's recommended to be a curious hacker and play with a [demo](https://github.com/pyrustic/pyrustic#tutorial) project.
<br>

<div align="center">
<img src="https://raw.githubusercontent.com/pyrustic/misc/master/media/hubstore-app-installer.png" alt="Figure" width="800">
<p align="center">
<i> Type developer/app-name in the search bar to install an app </i>
</p>
</div>

The repository [hubstore-apps](https://github.com/pyrustic/hubstore-apps) will store a curated list of `Hubstore` trendy compatible apps. Therefore, if you like this project and/or want to showcase your app, you know what to do :-)
<br>

<!-- Demo -->
## Demo
<!-- Image -->
<div align="center">
<img src="https://raw.githubusercontent.com/pyrustic/misc/master/media/hubstore_demo_1.gif" alt="Hubstore First Time" width="650">
<img src="https://raw.githubusercontent.com/pyrustic/misc/master/media/hubstore-app-info.png" alt="Figure" width="800">
<p align="center">
Using Hubstore for the first time. You can really reproduce it as it.
<i> You can rollback to the previously installed version of an app </i>
</p>
</div>

<br>
<br>

<!-- Image -->
<div align="center">
<img src="https://raw.githubusercontent.com/pyrustic/misc/master/media/hubstore_demo_2.gif" alt="Hubstore Fictional" width="650">
<img src="https://raw.githubusercontent.com/pyrustic/misc/master/media/hubstore-autocomplete.png" alt="Figure" width="800">
<p align="center">
This is obviously fictional
<i> Hubstore uses <a href="https://github.com/pyrustic/suggestion">Suggestion</a> to implement the autocomplete feature </i>
</p>
</div>

<br>

<!-- Philosophy -->
## Philosophy
### Wisdom from Antiquity
<!-- Image -->
<div align="center">
<img src="https://raw.githubusercontent.com/pyrustic/misc/master/media/diogenes.jpg" alt="Diogenes" width="650">
<img src="https://raw.githubusercontent.com/pyrustic/misc/master/media/hubstore-apps-running.png" alt="Figure" width="800">
<p align="center">
By <a href="https://en.wikipedia.org/wiki/en:Jean-L%C3%A9on_G%C3%A9r%C3%B4me" class="extiw" title="w:en:Jean-Léon Gérôme">Jean-Léon Gérôme</a> - <a href="https://en.wikipedia.org/wiki/en:Walters_Art_Museum" class="extiw" title="w:en:Walters Art Museum">Walters Art Museum</a>: <a href="https://thewalters.org/" rel="nofollow"></a> <a rel="nofollow" class="external text" href="https://thewalters.org/">Home page</a>&nbsp;<a href="https://art.thewalters.org/detail/31957" rel="nofollow"></a> <a rel="nofollow" class="external text" href="https://art.thewalters.org/detail/31957">Info about artwork</a>, Public Domain, <a href="https://commons.wikimedia.org/w/index.php?curid=323523">Link</a>
<i> Install apps, run apps, and close apps from the same interface </i>
</p>
</div>

<br>

> He owned a cup which served also as a bowl for food but threw it away when he saw a boy drinking water from his hands and realized one did not even need a cup to sustain oneself.</p>
>
> --Mark, J. J. (2014, August 02). [Diogenes of Sinope](href="https://www.ancient.eu/Diogenes_of_Sinope/). Ancient History Encyclopedia. Retrieved from https://www.ancient.eu/Diogenes_of_Sinope/
<div align="center">
<img src="https://raw.githubusercontent.com/pyrustic/misc/master/media/hubstore-promoted.png" alt="Figure" width="800">
<p align="center">
<i> Discover new apps through the Promoted feature </i>
</p>
</div>

<br>

### Advertisement from the twentieth century
<!-- Image -->
<div align="center">
<img src="https://raw.githubusercontent.com/pyrustic/misc/master/media/ibm.jpg" alt="IBM" width="650">
<p align="justify">
By Cecile &amp; Presbrey advertising agency for International Business Machines. - Scanned from the December 1951 issue of Fortune by <a href="//commons.wikimedia.org/wiki/User:Swtpc6800" title="User:Swtpc6800">User:Swtpc6800</a> Michael Holley. The image was touched up with Adobe Photo Elements., Public Domain, <a href="https://commons.wikimedia.org/w/index.php?curid=17480483">Link</a>
<img src="https://raw.githubusercontent.com/pyrustic/misc/master/media/hubstore-bug-report.png" alt="Figure" width="800">
<p align="center">
<i> Built-in bug reporting system to allow users to help improve the apps </i>
</p>
</div>

<br>

<!-- Features -->
## Features
You can export and import a list of apps. You can auth yourself with your Github personal access token to increase the API rate limit.
It is easy to generate a personal access token. Read this [article](https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/creating-a-personal-access-token).

You can update your apps, and even rollback to the previous version if the update is buggy.

Play with `Hubstore` to discover more about it.

### The developer side
Once you have developed a Python desktop application with or without [Pyrustic Framework](https://github.com/pyrustic/pyrustic#readme), the next goal is to distribute it to end users.

Suppose you already have a Github profile and have already created a repository named as your project name.

<!-- Installation -->
## Installation
`Hubstore` is available on [PyPI](https://pypi.org/) (the Python Package Index) to simplify the life of Python developers.
To allow users to access your apps through Hubstore, you need to publish your app's distribution package (Wheel) on Github. Concretely, it is a question of doing this:
- test your project;
- create the distribution package (Wheel) of your application (the project must have a `__main__.py` entry point);
- create a `Release` on Github;
- upload the `Wheel` file of your application as a `Release asset`.

If you have never installed a package from PyPI, you must install the pip tool enabling you to download and install a PyPI package. There are several methods which are described on this [page](https://pip.pypa.io/en/latest/installing/).
You can use the [Backstage](https://github.com/pyrustic/backstage) project management tool's `build` and `release` commands, respectively, to automate these steps. `Backstage` also manages the versioning of your project.

Then, the user just has to copy and paste the URL of your project's repository into `Hubstore`.

`Hubstore` assigns a default nice image to your app. You can modify the image by editing the configuration file `$APP_DIR/pyrustic_data/hubstore/img.json`. The image must have the following characteristics: `200x80 .PNG`

To `promote` other apps of which you are the author or friend of the authors, modify the configuration file `$APP_DIR/pyrustic_data/hubstore/promotion.json` as follows:
```bash
$ pip install hubstore --upgrade --upgrade-strategy eager
{
"developer/app-name": "A short description",
"developer/another-app-name": "A short description"
}
```

I recommend you to try the demo: just type `pyrustic/demo` in `Hubstore`. You can go to check the demo code source, it has a conventional Python project structure, there are not any voodoo magic. You can alter the __main__.py file and put there a dumb Tkinter calc code, build the project with your favorite tool or with `Pyrustic Manager`, publish it on Github, then update the previous installed version via `Hubstore`. By the way, `Hubstore` doesn't mess with sys.path or any environment variable. It is fully cross platform, and it doesn't use any virtual environment tool, just the good old vanilla Python ;)

`Hubstore` simply take profit of the elegance of Python itself to avoid platform-specific scripts/stuff/voodoo.


`Hubstore` is built with `Pyrustic framework` and is available on PyPI. As `Hubstore` uses the standard Python `Wheel` package format, it is compatible with many existing projects.

## Installation
If you have never installed a package from PyPI, you must install the pip tool enabling you to download and install a PyPI package. There are several methods which are described on this [page](https://pip.pypa.io/en/latest/installing/).

<!-- License -->
## License
`Pyrustic` is licensed under the terms of the permissive free software license `MIT License`.
### Install for the first time
```bash
$ pip install hubstore
```

<!-- Contact -->
## Contact
Hi ! I'm Alex, operating by ["Crocker's Rules"](http://sl4.org/crocker.html)
<!-- Image -->
![email](https://raw.githubusercontent.com/pyrustic/misc/master/media/email.png)
### Upgrade
```bash
$ pip install hubstore --upgrade --upgrade-strategy eager
```

Note: this project is for early-adopters ! Work in progress...
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.0.9
0.1.0
66 changes: 19 additions & 47 deletions docs/reference/README.md
Original file line number Diff line number Diff line change
@@ -1,106 +1,78 @@

# Reference Overview

[hubstore.\_\_init\_\_](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.\_\_init\_\_.md)
[hubstore.\_\_init\_\_](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.\_\_init\_\_.md#hubstore\_\_init\_\_)
<br>


[hubstore.\_\_main\_\_](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.\_\_main\_\_.md)
[hubstore.\_\_main\_\_](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.\_\_main\_\_.md#hubstore\_\_main\_\_)
<br>


[hubstore.hooking.\_\_init\_\_](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.hooking.\_\_init\_\_.md)
[hubstore.core.\_\_init\_\_](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.core.\_\_init\_\_.md#hubstorecore\_\_init\_\_)
<br>


[hubstore.hooking.ante\_build\_hook](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.hooking.ante\_build\_hook.md)
[hubstore.host.\_\_init\_\_](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.host.\_\_init\_\_.md#hubstorehost\_\_init\_\_)
<br>


[hubstore.hooking.ante\_release\_hook](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.hooking.ante\_release\_hook.md)
[hubstore.misc.\_\_init\_\_](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.misc.\_\_init\_\_.md#hubstoremisc\_\_init\_\_)
<br>


[hubstore.hooking.post\_build\_hook](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.hooking.post\_build\_hook.md)
[hubstore.misc.constant](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.misc.constant.md#hubstoremiscconstant)
<br>


[hubstore.hooking.post\_release\_hook](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.hooking.post\_release\_hook.md)
[hubstore.misc.funcs](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.misc.funcs.md#hubstoremiscfuncs)
<br>


[hubstore.host.\_\_init\_\_](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.host.\_\_init\_\_.md)
[hubstore.misc.theme](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.misc.theme.md#hubstoremisctheme)
<br>


[hubstore.host.constants](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.host.constants.md)
[hubstore.view.\_\_init\_\_](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.view.\_\_init\_\_.md#hubstoreview\_\_init\_\_)
<br>


[hubstore.host.core](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.host.core.md)
[hubstore.view.about](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.view.about.md#hubstoreviewabout)
<br>


[hubstore.host.main\_host](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.host.main\_host.md)
[hubstore.view.info](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.view.info.md#hubstoreviewinfo)
<br>


[hubstore.misc.\_\_init\_\_](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.misc.\_\_init\_\_.md)
[hubstore.view.installer](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.view.installer.md#hubstoreviewinstaller)
<br>


[hubstore.misc.funcs](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.misc.funcs.md)
[hubstore.view.main](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.view.main.md#hubstoreviewmain)
<br>


[hubstore.misc.my\_theme](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.misc.my\_theme.md)
[hubstore.view.openlist](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.view.openlist.md#hubstoreviewopenlist)
<br>


[hubstore.view.\_\_init\_\_](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.view.\_\_init\_\_.md)
[hubstore.view.pane](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.view.pane.md#hubstoreviewpane)
<br>


[hubstore.view.about\_view](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.view.about\_view.md)
[hubstore.view.promoted](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.view.promoted.md#hubstoreviewpromoted)
<br>


[hubstore.view.app\_info\_view](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.view.app\_info\_view.md)
[hubstore.view.report](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.view.report.md#hubstoreviewreport)
<br>


[hubstore.view.auth\_view](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.view.auth\_view.md)
[hubstore.view.toolbar](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.view.toolbar.md#hubstoreviewtoolbar)
<br>


[hubstore.view.central\_view](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.view.central\_view.md)
<br>


[hubstore.view.downloader\_view](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.view.downloader\_view.md)
<br>


[hubstore.view.exception\_view](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.view.exception\_view.md)
<br>


[hubstore.view.footer\_view](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.view.footer\_view.md)
<br>


[hubstore.view.header\_view](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.view.header\_view.md)
<br>


[hubstore.view.import\_list\_view](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.view.import\_list\_view.md)
<br>


[hubstore.view.init\_view](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.view.init\_view.md)
<br>


[hubstore.view.main\_view](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.view.main\_view.md)
[hubstore.view.views](https://github.com/pyrustic/hubstore/blob/master/docs/reference/content/hubstore.view.views.md#hubstoreviewviews)
<br>

Loading

0 comments on commit 38a221c

Please sign in to comment.