Git Product home page Git Product logo

agda-pkg's Introduction

pypi versions Build Status downloads

Agda-pkg is a simple tool to manage Agda libraries with extra features like installing libraries from different kind of sources.

This tool does not modify Agda at all, it just manages systematically the directory .agda with .agda/defaults and .agda/libraries files used by Agda to locate the available libraries. For more information about how Agda package system works, please read the official documentation here.

Quick Start

The most common usages of agda-pkg are the following:

  • To install Agda-pkg just run the following command:
$ pip3 install agda-pkg
  • To install your library, go to the root directory of your source code and run:
$ apkg install --editable .
$ apkg init
$ apkg install standard-library
$ apkg install [email protected]
  • To install a Github repository with a specific version release:
$ apkg install --github agda/agda-stdlib --version v1.3
  • To install a library from a Github repository with a specific branch with a specific library name:
$ apkg install --github plfa/plfa.github.io --branch dev --name plfa

Indexed libraries

Library name Latest version URL
agda-base v0.2 https://github.com/pcapriotti/agda-base.git
agda-categories v0.1.3.1 https://github.com/agda/agda-categories.git
agda-metis v0.2.1 https://github.com/jonaprieto/agda-metis.git
agda-prelude df679cf https://github.com/UlfNorell/agda-prelude.git
agda-prop v0.1.2 https://github.com/jonaprieto/agda-prop.git
agda-real e1558b62 https://gitlab.com/pbruin/agda-real.git
agda-ring-solver d1ed21c https://github.com/oisdk/agda-ring-solver.git
agdarsec v0.3.0 https://github.com/gallais/agdarsec.git
alga-theory 0fdb96c https://github.com/algebraic-graphs/agda.git
ataca a9a7c06 https://github.com/jespercockx/ataca.git
cat v1.6.0 https://github.com/fredefox/cat.git
cubical v0.2 https://github.com/agda/cubical.git
FiniteSets c8c2600 https://github.com/L-TChen/FiniteSets.git
fotc apia-1.0.2 https://github.com/asr/fotc.git
generic f448ab3 https://github.com/effectfully/Generic.git
hott-core 1037d82 https://github.com/HoTT/HoTT-Agda.git
hott-theorems 1037d82 https://github.com/HoTT/HoTT-Agda.git
HoTT-UF-Agda 9d0f38e https://github.com/martinescardo/HoTT-UF-Agda-Lecture-Notes.git
ial v1.5.0 https://github.com/cedille/ial.git
lightweight-prelude b2d440a https://github.com/L-TChen/agda-lightweight-prelude.git
MtacAR 5417230 https://github.com/L-TChen/MtacAR.git
plfa dev-20.07 https://github.com/plfa/plfa.github.io.git
routing-library thesis https://github.com/MatthewDaggitt/agda-routing.git
standard-library v1.4-rc1 https://github.com/agda/agda-stdlib.git

Usage manual

Initialisation of the package index

The easiest way to install libraries is by using the package index. agda-pkg uses a local database to maintain a register of all libraries available in your system. To initialize the index and the database please run the following command:

$ apkg init
Indexing libraries from https://github.com/agda/package-index.git

Note. To use a different location for your agda files defaults and libraries, you can set up the environment variable AGDA_DIR before run apkg as follows:

$ export AGDA_DIR=$HOME/.agda

Other way is to create a directory .agda in your directory and run agda-pkg from that directory. agda-pkg will prioritize the .agda directory in the current directory.

Help command

Check all the options of a command or subcommand by using the flag --help.

$ apkg --help
$ apkg install --help

Upgrade the package index

Recall updating the index every once in a while using upgrade.

$ apkg upgrade
Updating Agda-Pkg from https://github.com/agda/package-index.git

If you want to index your library go to the package index and make PR.

Environmental variables

If there is an issue with your installation or you suspect something is going wrong. You might want to see the environmental variables used by apkg.

$ apkg environment

List all the packages available

To see all the packages available run the following command:

$ apkg list

The list command option comes with the flag --full to display more details.

Installation of packages

Install a library is now easy. We have multiple ways to install a package.

$ apkg install standard-library
$ apkg install .

or even much simpler:

$ apkg install

Installing a library creates a copy for agda in the directory assigned by agda-pkg. If you want your current directory to be taken into account for any changes use the --editable option. as shown below.

$ apkg install --editable .
  • from a github repository
$ apkg install --github agda/agda-stdlib --version v1.1
  • from a git repository
$ apkg install http://github.com/jonaprieto/agda-prop.git

To specify the version of a library, we use the flag --version

$ apkg install standard-library --version v1.0

Or simpler by using @ or == as it follows.

$ apkg install [email protected]
$ apkg install standard-library==v1.0

Multiple packages at once

To install multiple libraries at once, we have two options:

  1. Using the inline method
$ apkg install standard-library agda-base

Use @ or == if you need a specific version, see above examples.

  1. Using a requirement file:

Generate a requirement file using apkg freeze:

$ apkg freeze > requirements.txt
$ cat requirements.txt
standard-library==v1.1

Now, use the flag -r to install all the listed libraries in this file:

$ apkg install -r requirements.txt

Check all the options of this command with the help information:

$ apkg install --help

Uninstalling a package

Uninstalling a package will remove the library from the visible libraries for Agda.

  • using the name of the library
$ apkg uninstall standard-library
  • infering the library name from the current directory
$ apkg uninstall .

And if we want to remove the library completely (the sources and everything), we use the flag --remove-cache.

$ apkg uninstall standard-library --remove-cache

Update a package to latest version

We can get the latest version of a package from the versions registered in the package-index.

  • Update all the installed libraries:
$ apkg update
  • Update a specific list of libraries. If some library is not installed, this command will installed the latest version of it.
$ apkg update standard-library agdarsec

See packages installed

$ apkg freeze
standard-library==v1.1

This command is useful to keep in a file the versions used for your project to install them later.

$ apkg freeze > requirements.txt

To install from this requirement file run this command.

$ apkg install < requirements.txt

Approximate search of packages

We make a search (approximate) by using keywords and title of the packages from the index. To perform such a search, see the following example:

$ apkg search metis
1 result in 0.0012656739999998834seg
cubical
url: https://github.com/agda/cubical.git
installed: False

Get all the information of a package

$ apkg info cubical

Creating a library for Agda-Pkg

In this section, we describe how to build a library.

To build a project using agda-pkg, we just run the following command:

$ apkg create

Some questions are going to be prompted in order to create the necessary files for Agda and for Agda-Pkg.

The output is a folder like the following showed below.

Directory structure of an agda library

A common Agda library has the following structure:

$ tree -L 1 mylibrary/
mylibrary/
├── LICENSE
├── README.md
├── mylibrary.agda-lib
├── mylibrary.agda-pkg
├── src
└── test

2 directories, 3 files

.agda-lib library file

$ cat mylibrary.agda-lib
name: mylibrary  -- Comment
depend: LIB1 LIB2
  LIB3
  LIB4
include: PATH1
  PATH2
  PATH3

.agda-pkg library file

This file only works for agda-pkg. The idea of this file is to provide more information about the package, pretty similar to the cabal files in Haskell. This file has priority over its version .agda-lib.

$ cat mylibrary.agda-pkg
name:              mylibrary
version:           v0.0.1
author:
    - AuthorName1
    - AuthorName2
category:          cat1, cat2, cat3
homepage:          http://github.com/user/mylibrary
license:           MIT
license-file:      LICENSE.md
source-repository: http://github.com/user/mylibrary.git
tested-with:       2.6.0
description:       Put here a description.

include:
    - PATH1
    - PATH2
    - PATH3
depend:
    - LIB1
    - LIB2
    - LIB3
    - LIB4

Using with Nix or NixOS

A nix-shell environment that loads agda-pkg as well as agda and agda-mode for Emacs is available. To use this, apkg can put the necessary files in your project folder by running one of the following commands:

$ curl -L https://gist.github.com/jonaprieto/53e55263405ee48a831d700f27843931/download | tar -xvz --strip-components=1

or if you already have installed agda-pkg:

$ apkg nixos

Then, you will have the following files:

./hello-world.agda
./agda_requirements.txt
./shell.nix
./deps.nix
./emacs.nix

From where you can run the nix shell.

$ nix-shell

To launch Emacs with agda-mode enabled, run mymacs in the newly launched shell; mymacs will also load your ~/.emacs file if it exists. If you are using Spacemacs, you will need to edit shell.nix to use ~/.spacemacs instead.

The files provided by the commands above are also available in this repository (apkg/support/nix) and in a third-party example repository to give an idea of exactly which files need to be copied to your project.

Example:

$ cat hello-world.agda
module hello-world where
open import IO
main = run (putStrLn "Hello, World!")

Run mymacs hello-world.agda then type C-c C-x C-c in emacs to compile the loaded hello world file.

Configuration

Edit any of the nix expressions as needed. In particular:

  1. To add Agda dependencies via agda-pkg, edit agda_requirements.txt
  2. To add more 4Haskell or other system dependencies or other target-language dependencies, edit deps.nix.
  3. To add or alter the editor used, change the myEmacs references in shell.nix or add similar derivations.
  4. Optionally, create .emacs_user_config in the repository root directory and add any additional config, such as (setq agda2-backend "GHC") to use GHC by default when compiling Agda files from emacs.

About

This is a proof of concept of an Agda Package Manager. Contributions are always welcomed.

agda-pkg's People

Contributors

apkgbot avatar bbarker avatar dependabot[bot] avatar jonaprieto avatar merua avatar soimort avatar wbadart avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

agda-pkg's Issues

apkg not installed

I have installed agda-pkg with the command "pip3 install agda-pkg. But the command apkg is not installed.

Generate HTML

Hello,

I'm new to Agda, and one thing I find very useful for learning are the clickable html versions of libraries that can be generated via the --html option. Is generating a global html file something agda-pkg might be capable of? That would be a very nice feature if not.

Best,

Chris

All commands need to be able to write to defaults and libraries

At the moment any command seems to need to be able to write to defaults and libraries, even commands that I would have thought do not need to do this, such as --help list or info. As these files are readonly on my system I can not use these commands as I get the following error:

Errno 30] Read-only file system: '/home/alex/.agda/libraries'
Traceback (most recent call last):
  File "/nix/store/gdw9gfkvk9xd3yflaj409xpbnr8drcz3-agda-pkg-0.1.49/bin/.apkg-wrapped", line 6, in <module>
    from apkg.apkg import cli
  File "/nix/store/gdw9gfkvk9xd3yflaj409xpbnr8drcz3-agda-pkg-0.1.49/lib/python3.7/site-packages/apkg/apkg.py", line 13, in <module>
    from .commands              import *
  File "/nix/store/gdw9gfkvk9xd3yflaj409xpbnr8drcz3-agda-pkg-0.1.49/lib/python3.7/site-packages/apkg/commands/__init__.py", line 15, in <module>
    writeAgdaDirFiles()
  File "<string>", line 2, in writeAgdaDirFiles
  File "/nix/store/ajzmrzs9qj4gfmilas81gphig9vc7snq-python3.7-pony-0.7.13/lib/python3.7/site-packages/pony/orm/core.py", line 528, in new_func
    result = func(*args, **kwargs)
  File "/nix/store/gdw9gfkvk9xd3yflaj409xpbnr8drcz3-agda-pkg-0.1.49/lib/python3.7/site-packages/apkg/service/writeAgdaDirFiles.py", line 70, in writeAgdaDirFiles
    AGDA_DEFAULTS_PATH.write_text(default_libraries)
  File "/nix/store/2dcsn57cgaxs92ha5swihrab0g3l2h6g-python3-3.7.7/lib/python3.7/pathlib.py", line 1235, in write_text
    with self.open(mode='w', encoding=encoding, errors=errors) as f:
  File "/nix/store/2dcsn57cgaxs92ha5swihrab0g3l2h6g-python3-3.7.7/lib/python3.7/pathlib.py", line 1203, in open
    opener=self._opener)
  File "/nix/store/2dcsn57cgaxs92ha5swihrab0g3l2h6g-python3-3.7.7/lib/python3.7/pathlib.py", line 1058, in _opener
    return self._accessor.open(self, flags, mode)
OSError: [Errno 30] Read-only file system: '/home/alex/.agda/defaults'

I suppose a workaround for now would be if I made a temporary $AGDA_DIR ?

Info always returns include as `src/`

It seems that the include field of apkg info [library] is always 'src/' no matter what the actual value is. For example ial has include: . in it's agda-lib file but i get

env AGDA_DIR=/tmp result/bin/apkg info ial
{ 'cached': False,
  'default': True,
  'depend': [],
  'description': None,
  'editable': False,
  'fromGit': True,
  'fromIndex': True,
  'fromUrl': False,
  'include': 'src/',
  'index_path': PosixPath('/home/alex/[email protected]/package-index/src/ial/versions/v1.5.0'),
  'installed': False,
  'keywords': [],
  'library': 'ial',
  'license': '',
  'origin': 'https://github.com/cedille/ial.git',
  'sha': 'b5da04caa93ac0e1aca1a88e2c0bc57cd73bd4c3',
  'source_path': PosixPath('/home/alex/[email protected]/package-sources/[email protected]'),
  'testedWith': [],
  'version': 'v1.5.0'}

Failing upgrading the list of available packages

I'm getting this.

$ apkg upgrade
Indexing libraries from https://github.com/apkgbot/package-index.git
  Current version of the index: c2a515cea7ca93f8eb83975ce08ab8d17eb4aced
error: Object agda-metis cannot be stored in the database. IntegrityError: UNIQUE constraint failed: Library.name

It seems a problem with the package-index and its content.

Be flexible when the specified version is X.X when it must be vX.X

There's no big reason to not try installing the version number with the v prefix.
This is what I got:

$ apkg info standard-library
....
versions: v0.17,v0.16.1

And if I try without the "v"

$ apkg install [email protected]
Installing (standard-library) from the index...
error:  no versions for this library.
error:                     Index may be corrupted. Try $ apkg init
Unsuccessfully installation (standard-library).

Nowadays, I have got to put the prefix "v" but it's annoying...

$ apkg install [email protected]
Installing (standard-library) from the index..

Easy way to make a fake library from a given file

Imagine I just have one file and this is my library. In order to use later in somewhere else
or just for distributing as a gist, it would be very nice to install it in somehow.

$ ls
test.agda
$ apkg install test.lagda
...
Generating the library structure...
Registering test.lagda as Test library...
....

info of a library

Just show the file that saves the information of the package .agda-lib

Indexed web release of PLFA instead of dev release

The current README lists the indexed version of PLFA as "stable-web-2019.09", which is the release without any Agda code in there. (Also, the versioning is out of date, "stable-web-2019.09" is called web-19.08.)

The releases you'd want to index, if at all, are the dev releases. The latest dev release is "dev-20.07".

agda-pkg does not work with standard library >= 1.5

Standard library 1.5 and above uses standard-library-<version> as its name, and apkg tries to find that in the index. However, since the index has standard-library/versions/v1.5, not standard-library-1.5/versions/v1.5, it cannot find file descriptor and failed to install standard library.

It would be greatly appreciated if this can be fixed.

doctor command

Check the status of the all packages installed:

  • missing dependencies
  • unwritable directories
  • Agda version installed

Can't install standard-library

Hi there,

First day using agda and agda-pkg. I tried setting it up with Python 3.8, but can't seem to install the standard-library:

[nix-shell:~/workspace/LearningAgda]$ rm -fr .agda/*
(venv)
[nix-shell:~/workspace/LearningAgda]$ apkg init
Indexing libraries from https://github.com/agda/package-index.git
  Current version of the index: 50921702a9df75e1683db56bcd093952c26749da
0 libraries indexed.
(venv)
[nix-shell:~/workspace/LearningAgda]$ ls .agda/
(venv)
[nix-shell:~/workspace/LearningAgda]$ echo $AGDA_DIR
/home/brandon/workspace/LearningAgda
(venv)
[nix-shell:~/workspace/LearningAgda]$ apkg install standard-library
Unsuccessfully installation (standard-library).
(venv)
[nix-shell:~/workspace/LearningAgda]$ apkg install [email protected]
Unsuccessfully installation (standard-library).
(venv)

TODO finished v0.1.29

  • Index some popular libraries

  • install dependencies if the user approves that.

  • Read relevant environment variables like AGDA_DIR

  • Offer the chance to generate pkg file and normal files

  • README document the alternative format file .agda-pkg

  • Improve help messages

  • Specify the version of agda to install packages

  • Update command

  • Split the install command in index/local/urls/gits

  • Install from the git repositories with version as tag (commit)

    • Create a temporal directory
    • Install as a local package
    • Mark the package as git repository
  • Install from the git repositories using info from the index

    • Check the index, the file url
    • Check the version to exists (git tag..)
    • Install as a git repository
    • git checkout on the package source with the tag or commit
  • Travis at least on OSX

  • Pip package

Is agda-pkg maintained?

I've just published agda-python, which packages Agda as a Python package. The repository includes a small GitHub Action, which installs Agda from PyPI. It'd be really neat if I could use agda-pkg to add support for library management to the action.

Unfortunately, the project doesn't seem to have had any commits in the past two years, and #47 seems to imply there's no active maintainer.

Is it still maintained? Does it still work?

agda-pkg should not overwrite existing defaults and libraries

A user may already have her own .agda/defaults and .agda/libraries before using agda-pkg.
Currently apkg seems to overwrite these without any warning, which is not always desirable.

I propose three possible improvements:

  1. Show a warning and ask the user before overwriting anything.
  2. Generate some backup files in the same directory.
  3. Keep existing settings in the managed defaults and libraries files.

Easy way to uninstall a local package

Nowadays, we must provide the library name to the uninstall command,
sometimes is just annoying, better if, without arguments, apkg tries to infer and
uninstall the library from the current directory

$ apkg uninstall .

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.