[cwn] Attn: Development Editor, Latest OCaml Weekly News
Alan Schmitt
alan.schmitt at polytechnique.org
Tue Mar 21 03:07:03 PDT 2023
Hello
Here is the latest OCaml Weekly News, for the week of March 14 to 21,
2023.
Table of Contents
─────────────────
Js_of_ocaml 5.1
Petrol 1.2.0 release - Postgres Support + User-extensible types
Docfd: TUI fuzzy document finder 0.2.3
OCamlot - Activitypub server written in OCaml
new versions of VS Code extensions Alcotest and Expect and Inline tests, now on Open VSX too
Autofonce, a modern runner for GNU Autotests suites
Release of piece_rope 0.9.0
Old CWN
Js_of_ocaml 5.1
═══════════════
Archive: <https://discuss.ocaml.org/t/ann-js-of-ocaml-5-1/11662/1>
Hhugo announced
───────────────
I’m pleased to announce the release of js_of_ocaml 5.1. It should soon
be able available in opam.
Js_of_ocaml is a compiler from OCaml bytecode to JavaScript. It makes
it possible to run pure OCaml programs in JavaScript environment like
browsers and Node.js.
This release includes many significant changes. Here are some of the
notable ones:
• Js_of_ocaml now understands most `es6' features (but `import' and
`export')
• JavaScript files generated by js_of_ocaml are now UTF-8 encoded.
• Change the memory representation of OCaml strings to use JS ones.
String still represent sequences of bytes and only contains
codepoints in the range `[0-255]'.
• Improved support for OCaml 5 effects, performing partial CPS
transformation to significantly improve perfs (see
<http://ocsigen.org/js_of_ocaml/5.1.0/manual/performances>)
• Various improvements to make the compiler faster.
• Separate compilation only link compilation units that are needed,
similar to `ocamlc', and generate much smaller js files
See the [Changelog] for other changes.
[Changelog]
<https://github.com/ocsigen/js_of_ocaml/blob/master/CHANGES.md>
Petrol 1.2.0 release - Postgres Support + User-extensible types
═══════════════════════════════════════════════════════════════
Archive:
<https://discuss.ocaml.org/t/ann-petrol-1-2-0-release-postgres-support-user-extensible-types/11691/1>
Kiran Gopinathan announced
──────────────────────────
I’m pleased to announce the latest release of Petrol - [A high level
typed SQL API for OCaml] (in the process of being published to opam).
This latest release is exciting as it now adds Postgresql support
(previously Petrol only supported Sqlite3).
Petrol makes using SQL from OCaml a breeze:
┌────
│ open Petrol
│ open Petrol.Sqlite3
│
│ (* define a new schema *)
│ let schema = StaticSchema.init ()
│
│ (* declare a table *)
│ let example_table, Expr.[name; age] =
│ StaticSchema.declare_table schema ~name:"example"
│ Schema.[
│ field "name" ~ty:Type.text;
│ field "age" ~ty:Type.int
│ ]
└────
and here’s how you write queries:
┌────
│ (* create a query *)
│ let insert_person ~name:n ~age:a db =
│ Query.insert ~table:example_table
│ ~values:Expr.[
│ name := s n;
│ age := i a
│ ]
│ |> Request.make_zero
│ |> Petrol.exec db
└────
Petrol compiles down to Caqti queries under the hood, and comes with a
nifty migration system built-in, so you can seamlesly update your
database tables without disrupting end users:
┌────
│ (* declare a table with a migration for a new [age] column in version 1.2.0 *)
│ let t, Expr.[id;age;url] =
│ VersionedSchema.declare_table db ~name:"person"
│ Schema.[
│ field ~constraints:[primary_key ~name:"bookmark_id" ()] "id" ~ty:Type.int;
│ field "age" ~ty:Type.int;
│ field "url" ~ty:Type.text;
│ ]
│ ~migrations:[v_1_2_0, [
│ Caqti_request.Infix.(Caqti_type.unit ->. Caqti_type.unit)
│ {sql|ALTER TABLE person ADD COLUMN age INTEGER DEFAULT 1000|sql}
│ ]]
└────
This and more is explained in the documentation, along with a nifty
quick-starter guide:
<https://gopiandcode.github.io/petrol/petrol/index.html>
I’ve spent some time tuning the documentation to make it easy to pick
up!
You may also want to check out the tests to see it in action:
<https://github.com/Gopiandcode/petrol/tree/master/test>
Previous discussion:
<https://discuss.ocaml.org/t/ann-petrol-1-0-0-a-high-level-typed-sql-api-for-ocaml-designed-to-go-fast/11166>
[A high level typed SQL API for OCaml]
<https://github.com/Gopiandcode/petrol>
Docfd: TUI fuzzy document finder 0.2.3
══════════════════════════════════════
Archive:
<https://discuss.ocaml.org/t/ann-docfd-tui-fuzzy-document-finder-0-2-3/11698/1>
Darren announced
────────────────
I’m happy to share Docfd, an interactive TUI tool finding the text
file you need quickly.
• [Repo]
• [Statically linked binary]
(Will submit to opam when time frees up a bit.)
[Repo] <https://github.com/darrenldl/docfd>
[Statically linked binary]
<https://github.com/darrenldl/docfd/releases/tag/0.2.3>
Screenshots and interface
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
Searching `left is' in the repo root
<https://global.discourse-cdn.com/business7/uploads/ocaml/original/2X/9/9afad805f2b647c9229116b7b7648105bcb84a9e.png>
Searching `[github]' in the repo root
<https://global.discourse-cdn.com/business7/uploads/ocaml/original/2X/9/9623d259c89bbaaf5feb109a42faf7e1dde6010f.png>
The TUI is divided into three sections:
• Left is the list of documents which satisfy the search constraints
• Top right is the preview of the document
• Bottom right is the ranked content search result list
• Bottom bar is the search interface
Controls
╌╌╌╌╌╌╌╌
Docfd operates in modes, the initial mode is `NAVIGATION' mode
`NAVIGATION' mode
• Scroll down the document list
• `j' or down arrow
• Scroll down with mouse wheel when hovering above the area
• Scroll up the document list
• `k' or up arrow
• Scroll up with mouse wheel when hovering above the area
• Scroll down the content search result list
• `Shift~+~j' or ~Shift~+Down arrow
• Scroll down with mouse wheel when hovering above the area
• Scroll up the document list
• `Shift~+~k' or ~Shift~+Up arrow
• Scroll up with mouse wheel when hovering above the area
• Open document
• `Enter'
• Docfd tries to use `$VISUAL' first, if that fails then Docfd
tries `$EDITOR'
• Switch to `CONTENT SEARCH' mode
• `/'
• Exit Docfd
• `q' or `Ctrl+c'
`CONTENT SEARCH' mode
• Content search field is active in this mode
• `Enter' to confirm search constraints and exit search mode
Limitations
╌╌╌╌╌╌╌╌╌╌╌
• Docfd is focused on typical desktop use, so simplicity of components
is often favoured over strict performance
• That being said, the in-memory index and search should still be
performant enough
• No on-disk index is built
OCamlot - Activitypub server written in OCaml
═════════════════════════════════════════════
Archive:
<https://discuss.ocaml.org/t/ann-ocamlot-activitypub-server-written-in-ocaml/11699/1>
Kiran Gopinathan announced
──────────────────────────
I’m pleased to announce the release of a project that I’ve been
working on, on-and-off for a while now: an activitypub server in OCaml
— OCamlot.
<https://github.com/Gopiandcode/ocamlot>
It’s wildly incomplete, and currently only the bare-bones minimum to
be a considered an activitypub server, but it’s coming along nicely.
Currently it supports:
• profiles, custom profile pictures, about
• likes, reposts
• replies
and that’s all.
Some screenshots:
• Feed
<https://global.discourse-cdn.com/business7/uploads/ocaml/optimized/2X/6/65e8cbb291c93f6bb1592e7aba861a09879559a9_2_1034x484.png>
• Writing replies:
<https://global.discourse-cdn.com/business7/uploads/ocaml/optimized/2X/b/be50c1293ab9fd424c10b5855a0ab0402695e56c_2_1034x430.png>
• Listing users:
<https://global.discourse-cdn.com/business7/uploads/ocaml/optimized/2X/8/861c06d96320d80df7cdfce33825ab3dd911a7c8_2_1034x214.png>
• Profile page:
<https://global.discourse-cdn.com/business7/uploads/ocaml/optimized/2X/c/ca5d18579af38d44c57fb2d1a813ca5ca5ac85c3_2_1034x386.png>
• Post replies
<https://global.discourse-cdn.com/business7/uploads/ocaml/optimized/2X/0/079f47b31fd8f54bf3d4fc1943662fb44355af19_2_1034x398.png>
Now, the things that this community would care about:
• The server is implemented using dream:
<https://github.com/Gopiandcode/ocamlot/blob/master/lib/server/server.ml>
• The underlying database is Postgres (or Sqlite), accessed from OCaml
using Caqti + [Petrol]:
<https://github.com/Gopiandcode/ocamlot/blob/master/lib/database/tables.ml>
• Ingesting and producing activitypub entities is done using the
decoders library:
<https://github.com/Gopiandcode/ocamlot/blob/master/lib/activitypub/types.ml>
• Rendering is all done server-side using tyxml:
<https://github.com/Gopiandcode/ocamlot/tree/master/lib/view>
Seeing as there has been some interest in this community recently
about activitypub integration in OCaml, I figured this might be
interesting.
I have an instance running on over at <https://ocamlot.xyz> – as a
warning, I’ve done most of my testing locally using pleroma, so there
may be some slight issues interacting with other server
implementations at the moment.
Also would be happy to field any questions regarding navigating the
activitypub spec as well. I plan to write up my experiences somewhere
at some point in the future.
[Petrol]
<https://discuss.ocaml.org/t/ann-petrol-1-2-0-release-postgres-support-user-extensible-types/11691>
new versions of VS Code extensions Alcotest and Expect and Inline tests, now on Open VSX too
════════════════════════════════════════════════════════════════════════════════════════════
Archive:
<https://discuss.ocaml.org/t/ann-new-versions-of-vs-code-extensions-alcotest-and-expect-inline-tests-now-on-open-vsx-too/11700/1>
Roland Csaszar announced
────────────────────────
I’ve just updated both VS Code testing extensions, as of now they are
available at the Open VSX Registry too.
Bugfixes: The Opam environment of the project’s root is used, so the
Dune executable in the sandbox of the project directory is used by
default if such a sandbox exists. Otherwise the environment of the
current Opam switch. If Dune does not work (a call of `dune --version'
fails), an error message box is displayed.
Expect & Inline PPX
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
• [VS Marketplace]
• [Open VSX]
• [GitHub]
[VS Marketplace]
<https://marketplace.visualstudio.com/items?itemName=release-candidate.vscode-ocaml-expect-inline>
[Open VSX]
<https://open-vsx.org/extension/Release-Candidate/vscode-ocaml-expect-inline>
[GitHub]
<https://github.com/Release-Candidate/vscode-ocaml-expect-inline>
Alcotest & Inline Alcotest
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
• [VS Marketplace]
• [Open VSX]
• [GitHub]
[VS Marketplace]
<https://marketplace.visualstudio.com/items?itemName=release-candidate.vscode-ocaml-alcotest-test-adapter>
[Open VSX]
<https://open-vsx.org/extension/Release-Candidate/vscode-ocaml-alcotest-test-adapter>
[GitHub]
<https://github.com/Release-Candidate/vscode-ocaml-alcotest-test-adapter>
Changelog
╌╌╌╌╌╌╌╌╌
• Add error message window if `dune' does not work in a workspace.
◊ Bugfixes
• Use the current Opam environment to be able to use local executables
like `dune'.
◊ Internal Changes
• Add tests to check the parsing of `opam env'.
Autofonce, a modern runner for GNU Autotests suites
═══════════════════════════════════════════════════
Archive:
<https://discuss.ocaml.org/t/autofonce-a-modern-runner-for-gnu-autotests-suites/11727/1>
Fabrice Le Fessant announced
────────────────────────────
I am not sure it might be helpful to the OCaml community, as we
already have well integrated test frameworks, but here is a tool I
wrote in OCaml to work with GNU projects: `autofonce' is a modern
runner for testsuites created for the GNU Autoconf tools.
Compared to Autoconf tools, its main features are:
• improved terminal output
• automatic parallel execution
• promotion of tests results to fix tests
• extended syntax
• filtering by keywords, numbers and ranges
• execution from any project directory
A typical Autoconf test looks like:
┌────
│ # Start of a test, and the name that will be displayed
│ AT_SETUP([Example test])
│
│ # can be used to select tests to run:
│ AT_KEYWORDS([example test autofonce])
│
│ # create a file ~file~ with its content
│ AT_DATA([file], [
│ content of file
│ on multiple lines
│ ])
│
│ # call some command, check its exit code, stdout, stderr
│ AT_CHECK([cat file], [0], [stdout of my command], [stderr of my command])
│ # you can do more, ignore some results, run more tests in case of failure, etc.
│
│ # end of the test
│ AT_CLEANUP
└────
I personally like the syntax better than the one of `cram' tests,
though there is some weird escaping issues with brackets (see the
section in the doc).
Compatibility with Autoconf is only partial, as it uses a grammar
interpretation of what should actually be `m4' macros, but it was good
enough to run the full GnuCOBOL testsuite after a few fixes (that
actually improved the testsuite).
The package is on Opam, but sources, documentation and static binaries
are available from Github:
<https://github.com/ocamlpro/autofonce>
Release of piece_rope 0.9.0
═══════════════════════════
Archive:
<https://discuss.ocaml.org/t/ann-release-of-piece-rope-0-9-0/11734/1>
Humza Shahid announced
──────────────────────
I’m not sure how useful this is to others, but I published my first
open source package to opam which can be used by anyone interested in
it.
It is the same data structure used for editing text in VS Code [1] and
AbiWord [2], with a few modifications to make it persistent and
functional.
It provides some nice features on top which include:
• Serialising and deserialising the structure to a file for persistent
undo/redo.
• Translating between offsets of different Unicode encodings (UTF-8,
UTF-16 and UTF-32) for interaction with external systems and
languages.
• There is a computationally expensive function to rebuild the
structure, optimising it for memory usage and performance. (The idea
was to use this in a GUI app when the user is inactive and
rebuilding in that case - the core structure is fast but the
perfectionist in me wanted it to be as fast and lean in memory as
possible.)
There are some similar packages others may find useful like Zed which
are a more battle-tested implementation of a
similar-but-not-quite-the-same data structure as this is a new
implementation.
Feel free to comment or open issues for any bugs you find during
usage. Hopefully someone else out there will find this useful too.
• [1]
<https://code.visualstudio.com/blogs/2018/03/23/text-buffer-reimplementation>
• [2] <http://e98cuenc.free.fr/wordprocessor/piecetable.html>
Old CWN
═══════
If you happen to miss a CWN, you can [send me a message] and I’ll mail
it to you, or go take a look at [the archive] or the [RSS feed of the
archives].
If you also wish to receive it every week by mail, you may subscribe
[online].
[Alan Schmitt]
[send me a message] <mailto:alan.schmitt at polytechnique.org>
[the archive] <https://alan.petitepomme.net/cwn/>
[RSS feed of the archives] <https://alan.petitepomme.net/cwn/cwn.rss>
[online] <http://lists.idyll.org/listinfo/caml-news-weekly/>
[Alan Schmitt] <https://alan.petitepomme.net/>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.idyll.org/pipermail/caml-news-weekly/attachments/20230321/4590e0cf/attachment-0001.html>
More information about the caml-news-weekly
mailing list