Squashed commit of the following:

commit a0ec337b
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Wed Oct 2 08:48:55 2024 +0200

    [VERSION] +1 to 0.0.7.3.1

commit a23a0113
Merge: b6e13788 c2531060
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Wed Oct 2 08:09:39 2024 +0200

    Merge remote-tracking branch 'origin/adinapoli/issue-408' into dev

commit b6e13788
Merge: 1bd9f15d 0771f383
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Wed Oct 2 08:09:18 2024 +0200

    Merge remote-tracking branch 'origin/adinapoli/issue-407' into dev

commit 1bd9f15d
Merge: e3ee761d 4c97676e
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Wed Oct 2 08:08:57 2024 +0200

    Merge remote-tracking branch 'origin/adinapoli/improve-error-at-startup' into dev

commit e3ee761d
Merge: 5e28eafa 139b5372
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Wed Oct 2 08:08:08 2024 +0200

    Merge remote-tracking branch 'origin/fix/removes_check_json' into dev

commit c2531060
Author: Alfredo Di Napoli <alfredo.dinapoli@gmail.com>
Date:   Mon Sep 30 12:58:30 2024 +0200

    Increase timeout (and better error reporting) in testMarkProgress

commit 5e28eafa
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Aug 26 13:02:06 2024 +0200

    Test ngrams update after docs trashing

commit 0771f383
Author: Alfredo Di Napoli <alfredo.dinapoli@gmail.com>
Date:   Fri Sep 27 16:08:52 2024 +0200

    Restore swagger.json

commit 4c97676e
Author: Alfredo Di Napoli <alfredo.dinapoli@gmail.com>
Date:   Fri Sep 27 12:09:15 2024 +0200

    Improve startup error from runDbCheck

    Previously we would fail with a generic message suggesting to run
    `gargantext-init`, but that wouldn't always be the case; sometimes
    there might be problems connecting to the database, and we want to
    show the raw exception. This code should help diagnosing what's wrong.

    It also changes the error hint to report the correct executable, as
    these days we use `gargantext-cli init` instead.

commit f9f45da4
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Aug 26 09:56:37 2024 +0200

    test we can search in a docs list for a given query

commit 45eff945
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu Sep 26 17:04:24 2024 +0200

    [DOC] Adding a fix

commit 99f2f347
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu Sep 26 17:00:52 2024 +0200

    [FIX] Back to previous Order 2 WIP

commit c62924ad
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu Sep 26 16:21:53 2024 +0200

    [VERSION] +1 to 0.0.7.3

commit 9deb5304
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu Sep 26 16:16:01 2024 +0200

    [RENAME] sql with version

commit f11ef8bf
Merge: 43564cbe bde48039
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu Sep 26 14:33:13 2024 +0200

    Merge remote-tracking branch 'origin/304-dev-toml-config-rewrite-and-update-deps-9.4.8' into dev

commit 139b5372
Author: yacourt <acourt.yoelis@gmail.com>
Date:   Thu Sep 26 09:56:28 2024 +0200

    removes trigger & function from schema.sql

commit 43564cbe
Merge: 82d9289a 653e5e8f
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu Sep 26 09:28:44 2024 +0200

    Merge remote-tracking branch 'origin/update-readme' into dev

commit 653e5e8f
Author: Grégoire Locqueville <gregoireloc@gmail.com>
Date:   Wed Sep 25 17:24:09 2024 +0200

    Correcting a command that got typo-ed in the README

commit 82d9289a
Author: yacourt <acourt.yoelis@gmail.com>
Date:   Wed Sep 25 14:23:36 2024 +0200

    removes function, drop trigger and add sql files to vc

commit bde48039
Merge: dee5e4dc ec01d870
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Wed Sep 25 06:36:37 2024 +0200

    Merge branch 'dev' into 304-dev-toml-config-rewrite-and-update-deps-9.4.8

commit ec01d870
Merge: 651caaee 177173ea
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Mon Sep 23 10:31:23 2024 +0200

    Merge remote-tracking branch 'origin/304-dev-toml-config-rewrite-and-update-deps' into dev

commit 651caaee
Merge: 5fd34f93 5d50f716
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Mon Sep 23 10:30:49 2024 +0200

    Missing merge

commit 5fd34f93
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Mon Sep 23 10:29:04 2024 +0200

    [VERSION] +1 to 0.0.7.2.8

commit abe060c5
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Mon Sep 23 10:25:50 2024 +0200

    [DOC] Fix readm, script executed in nix-shell

commit bcb77a73
Merge: 9273840a f777d222
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Mon Sep 23 10:15:01 2024 +0200

    [FIX] merge conflicts

commit 9273840a
Merge: 226110a6 45a7d53d
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Mon Sep 23 10:14:30 2024 +0200

    Merge remote-tracking branch 'origin/update-readme' into dev

commit 5d50f716
Author: Grégoire Locqueville <gregoireloc@gmail.com>
Date:   Fri Sep 20 11:16:04 2024 +0200

    Don't exclude default language from configuration parsing

    For some reason the default language (namely EN) was ignored when reading
    the configuration file. After discussion with anoe, it appears that
    this exclusion happens for historical reasons, so this commit removes it.

commit 177173ea
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Fri Sep 20 08:30:42 2024 +0200

    [refactor] constraints cleanup, move errors arbitrary to test.instances

commit 08df697f
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Fri Sep 20 07:25:57 2024 +0200

    [refactor] Arbitrary instances removal from code, move to Test.Instances

commit a1ad5275
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Thu Sep 19 22:00:19 2024 +0200

    [refactor] some redundant constraints removed

commit 5d2efe0d
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Thu Sep 19 21:37:15 2024 +0200

    [config] Settings removed completely

    Now everything is in Core/Config

commit 39b0d18c
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Thu Sep 19 20:55:38 2024 +0200

    [toml] more settings refactor into gargconfig

commit 9d454100
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Thu Sep 19 19:55:09 2024 +0200

    [toml] output nlp_default as EN as well

commit f406450a
Author: Grégoire Locqueville <gregoireloc@gmail.com>
Date:   Thu Sep 19 17:04:37 2024 +0200

    Improve conversion script interface

    `gargantext-cli ini` now takes two optional arguments:
    - `--ini-path somefile.ini`: will read the configuration from `somefile.ini`.
      Defaults to `gargantext.ini`
    - `--toml-path somefile.toml`: will write the configuration converted to TOML
      into `somefile.toml` (warning: it will erase the former file if there is already one!)
      Defaults to `gargantext-settings.toml`

    Since it writes to a file, the command no longer outputs the configuration
    to standard output.

commit 3681ba9f
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Thu Sep 19 09:27:00 2024 +0200

    Merge branch '304-dev-toml-config-rewrite-and-update-deps' into 238-dev-async-job-worker

    I moved HasConfig to Core/Config instead of it being in Database.Prelude

commit 261fb04e
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Thu Sep 19 05:37:21 2024 +0200

    [config] more refactoring of Settings into GargConfig (jwt)

commit 8bbeb216
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Wed Sep 18 19:24:51 2024 +0200

    [settings] loglevel moved to garg config

commit 45a7d53d
Author: Grégoire Locqueville <gregoireloc@gmail.com>
Date:   Wed Sep 18 18:52:54 2024 +0200

    Added .png files to .gitignore

    Calligraphy generates diagrams based on the code, in PNG format.
    Those should not be versioned.

commit 0be8b795
Author: Grégoire Locqueville <gregoireloc@gmail.com>
Date:   Wed Sep 18 18:51:01 2024 +0200

    Update documentation

    Did a few corrections in the README. Also removed docs from the repository,
    since those are now at https://formation.gargantext.org/#/share/Notes/114236

commit f777d222
Author: Grégoire Locqueville <gregoireloc@gmail.com>
Date:   Wed Sep 18 17:50:24 2024 +0200

    Update project dependencies

commit e23ebf0a
Author: Grégoire Locqueville <gregoireloc@gmail.com>
Date:   Wed Sep 18 17:44:54 2024 +0200

    Remove obsolete GHC option

commit 0902bab3
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Wed Sep 18 15:47:08 2024 +0200

    [config] some Settings moved directly to GargConfig

    Eventually, Settings will be removed

commit 226110a6
Merge: 9bfa18b3 5c443218
Author: Grégoire Locqueville <gregoireloc@gmail.com>
Date:   Wed Sep 18 15:35:39 2024 +0200

    Merge branch 'dev' into '388-remove-obsolete-ghc-option'

    # Conflicts:
    #   bin/update-project-dependencies

commit dee5e4dc
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Wed Sep 18 06:32:37 2024 +0200

    [test] try with sequential update

commit bad7fbd9
Merge: 732af93b 5c443218
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Mon Sep 16 21:38:19 2024 +0200

    Merge branch 'dev' into 304-dev-toml-config-rewrite-and-update-deps-9.4.8

commit 732af93b
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Mon Sep 16 17:16:50 2024 +0200

    [nix] pkgs update

commit 94941e06
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Mon Sep 16 10:59:46 2024 +0200

    [ghc] 9.4.8 migration for CI

commit 5c443218
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Fri Sep 13 12:01:37 2024 +0200

    [VERSION] +1 to 0.0.7.2.7

commit 3076dae6
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Fri Sep 13 12:01:04 2024 +0200

    [FIX] server script

commit 206c847b
Merge: 9a75d273 9e1d7ebf
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Fri Sep 13 09:32:02 2024 +0200

    Merge remote-tracking branch 'origin/304-dev-toml-config-rewrite-and-update-deps' into dev

commit ae068ccf
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Fri Sep 13 08:36:15 2024 +0200

    [stack] save lts-21.25.yaml from stackage

commit ee6fc1c4
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Fri Sep 13 07:05:39 2024 +0200

    [stack] allow-newer: true

commit 9e1d7ebf
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Fri Sep 13 06:56:49 2024 +0200

    [stack] allow-newer: true

commit afe06669
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Thu Sep 12 15:15:36 2024 +0200

    [ghc] more deps updating to ghc 9.4.8

commit bff41104
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Thu Sep 12 13:05:54 2024 +0200

    [ghc] 9.4.8

commit 1a940644
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Thu Sep 12 12:10:40 2024 +0200

    [tests] fix job progress test (order of array insert)

commit 9a75d273
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu Sep 12 12:09:07 2024 +0200

    [VERSION] +1 to 0.0.7.2.6

commit 8ce6fba6
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Thu Sep 12 11:42:04 2024 +0200

    [ghc] more deps fixes, also test small fix

commit 7d9f08f2
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu Sep 12 11:39:51 2024 +0200

    File name

commit bcf9f81e
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu Sep 12 11:38:53 2024 +0200

    [DOC] Gitlab template issue

commit 95f311fb
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Thu Sep 12 10:52:38 2024 +0200

    [ghc] fix dependencies

    Remove allow-newer:*, allow-older:* in cabal.project file and instead
    list these explicitly. This is a big step for managing dependencies.

commit f10826f5
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Wed Sep 11 15:25:42 2024 +0200

    [stm] update to 2.5.3.0

    Maybe TBQueue is broken on CI:
    https://github.com/haskell/stm/issues/76

commit e5a892b9
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Wed Sep 11 13:36:57 2024 +0200

    [test] increase jobs timeout for checking the job results

commit 81a1a72f
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Wed Sep 11 12:26:09 2024 +0200

    [bin] update-project-dependencies

commit 0ecdc882
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Wed Sep 11 09:38:18 2024 +0200

    [tests] fix tests hanging

    Also, changed exceptions to safe

commit 7056810c
Merge: 0d0b33f0 6d02842f
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Tue Sep 10 12:50:26 2024 +0200

    Merge branch 'dev' into 304-dev-toml-config-rewrite

commit 6d02842f
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Tue Sep 10 12:11:52 2024 +0200

    [VERSION] +1 to 0.0.7.2.5

commit 802e0cdf
Author: Grégoire Locqueville <gregoireloc@gmail.com>
Date:   Wed Aug 21 15:04:18 2024 +0200

    Remove useless code, dependencies, warnings

    - Re-enable orphan warnings that were manually disabled in many modules
    - Remove non-Haskell files that were just sitting in the source tree
    - Remove modules that were not called from anywhere
    - Remove unused dependencies

    This is not exhaustive by any means. In particular, some more weeding out
    can be achieved by looking at individual functions and even branches of
    functions. Weeder can help with that.

commit 0b5ce744
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Mon Sep 9 10:46:46 2024 +0200

    [VERSION] +1 to 0.0.7.2.4

commit 0d0b33f0
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Thu Sep 5 19:58:02 2024 +0200

    [tests] fixes to tests blocking

commit 409e2465
Author: mzheng <1363-mzheng@users.noreply.gitlab.iscpif.fr>
Date:   Thu Sep 5 15:58:36 2024 +0200

    changed HyperdataDocument so it follows the type Document in HAL

commit 39a8897b
Merge: d6efe396 7fc403c9
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu Sep 5 13:23:29 2024 +0200

    Merge remote-tracking branch 'origin/fix/386' into dev

commit d6efe396
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu Sep 5 13:22:53 2024 +0200

    [VERSION] +1 to 0.0.7.2.3

commit f1128c83
Merge: 6f938e86 e598d3f0
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu Sep 5 13:14:32 2024 +0200

    Merge remote-tracking branch 'origin/389-update-and-improve-weeder-file' into dev

commit 6f938e86
Merge: ebc0fd38 b7d40780
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu Sep 5 13:02:13 2024 +0200

    Merge remote-tracking branch 'origin/393-api-openalex-fix-adapt-ngrams_url-field-following-an-api-change-causing-an-externalapierror' into dev

commit b7d40780
Author: Fabien Maniere <fabien.maniere@cnrs.fr>
Date:   Thu Sep 5 12:35:09 2024 +0200

    update cabal.project hash

commit ebc0fd38
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu Sep 5 11:31:57 2024 +0200

    [FIX] nlp text cleaning

commit 69d97371
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Wed Sep 4 22:01:03 2024 +0200

    [test] fix refactorings in tests

commit 3abe4a26
Author: Fabien Maniere <fabien.maniere@cnrs.fr>
Date:   Wed Sep 4 16:01:43 2024 +0200

    change the pointed commit hash for crawler openalex

commit fd814407
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Wed Sep 4 13:25:27 2024 +0200

    [README] update readme with TOML

    Also, set gargantext-settings.toml as the default file

commit 7fc403c9
Author: yacourt <acourt.yoelis@gmail.com>
Date:   Tue Sep 3 16:57:32 2024 +0200

    fix(cleanTextForNLP): removes transformation for hyphaneted words

commit 5bb981be
Author: yacourt <acourt.yoelis@gmail.com>
Date:   Tue Sep 3 16:51:55 2024 +0200

    configure coreNLP tokenization to group hyphaneted words

commit 8ce28ab3
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Wed Sep 4 09:49:30 2024 +0200

    [config] more config refactoring

commit 7c074fc8
Merge: 294ed193 e53d4b86
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Wed Sep 4 09:46:18 2024 +0200

    Merge remote-tracking branch 'origin/fix/386' into dev

commit f40638e7
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Wed Sep 4 07:29:00 2024 +0200

    [bin] update-project-dependencies

commit 5585a91b
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Wed Sep 4 07:27:36 2024 +0200

    [config] gc_frames type instead of separate urls in GargConfig

commit 3b3f5109
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Wed Sep 4 07:06:40 2024 +0200

    [CLI] INI to TOML works now

commit e53d4b86
Author: yacourt <acourt.yoelis@gmail.com>
Date:   Tue Sep 3 16:57:32 2024 +0200

    fix(cleanTextForNLP): removes transformation for hyphaneted words

commit 4e21f839
Author: yacourt <acourt.yoelis@gmail.com>
Date:   Tue Sep 3 16:51:55 2024 +0200

    configure coreNLP tokenization to group hyphaneted words

commit 294ed193
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Tue Sep 3 09:46:18 2024 +0200

    [VERSION] +1 to 0.0.7.2.2

commit 19f4848f
Merge: 1e1396c4 3e8ebc35
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Tue Sep 3 07:03:18 2024 +0200

    Merge branch 'adinapoli/issue-392' into 304-dev-toml-config-rewrite

commit 3e8ebc35
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Tue Sep 3 06:20:19 2024 +0200

    [deps] udpate-project-dependencies

commit 15b732f5
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Sep 2 16:05:14 2024 +0200

    ws: remove calls to recvMalloc

    Remove the calls to `recvMalloc` in favour of using the (patched) `recv`
    from the original nanomsg library, which shouldn't segfault anymore. The
    reason for using `recv` are a few, but mostly the fact that `recv` can
    allocated arbitrary-long payloads data (up to the 1MB limit) without an
    hardcoded limit like `recvMalloc` was imposing. Furthermore, `recv` does
    resource cleanup for us via `c_nn_freemsg`, whereas `recvMalloc` is not
    thread/exception safe. Consider the implementation:

    ```
    recvMalloc :: Receiver a => Socket a -> Int -> IO ByteString
    recvMalloc (Socket t sid) numBytes = do
      ptr <- mallocBytes numBytes
      -- receive by blocking the thread
      len <- c_nn_recv sid ptr (#const NN_MSG) 0 -- (#const NN_DONTWAIT)
      str <- C.packCStringLen (castPtr ptr, fromIntegral len)
      free ptr
      return str
    ```

    If any exception (synchronous or asynchronous) strikes _before_ the call
    to `free`, we would be leaking C memory.

commit 7c0d6ba0
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Sep 2 13:41:58 2024 +0200

    ws: make Dispatcher abstract

    The `Dispatcher` type is now opaque and not exported by
    `.AsyncUpdates.Dispatcher`, and it has been moved out of the `.Types`.

    This ensures that we can make the internal record fields private, and
    offer accessors for things like `terminateDispatcher`. This preserve
    information hiding and allows us to change the internal way of
    terminating a dispatcher (for example switching away from normal
    `forkIO` in favour of `async` & co) while not breaking client's code.

commit 65053486
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Sep 2 13:21:43 2024 +0200

    ws: abstract with pattern in withNotifications

    This commit refactors the common pattern `bracket init deinit use` in
    `withNotifications` in `drivers.hspec.Main`, so that `withNotifications`
    in atomic and the user doesn't incur in the pattern of using the init
    and deinit functions independently from the `bracket`.

    To be faithful about what I preach, we should do the same for
    `startCoreNLPServer` and `stopCoreNLPServer`.

commit c5336b22
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Sep 2 13:11:40 2024 +0200

    ws: tighten the dispatcher public API

    This commit tightens up the public API exposed by the Dispatcher,
    for similar reasons as we had for the CentralExchange.

commit b09e6de2
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Sep 2 12:51:41 2024 +0200

    ws: tighten CentralExchange API

    This commit tigthen the public API for the `.CentralExchange` module,
    so that it's clear which are the exported (public) functions, and
    we do not leak the transport layer used by the central exchange

commit 2a1439e3
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Sep 2 10:39:44 2024 +0200

    portRouteInfo shows status of proxy

    This commit does two things: it reports the status of the microservices
    proxy in the `portRouteInfo`, so that if that's disabled we would
    immediately know, and it also stop spawn the proxy `Application` in case
    it's disabled. This wasn't the case before; previously we would be
    spawing the proxy process even though it was "morally" disabled.

commit 1e1396c4
Merge: 6d6384ff 24d11d63
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Fri Aug 30 16:27:51 2024 +0200

    Merge branch 'dev' into 304-dev-toml-config-rewrite

commit 6d6384ff
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Fri Aug 30 16:18:53 2024 +0200

    [toml] notifications

commit 24d11d63
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Fri Aug 30 09:25:14 2024 +0200

    [VERSION] +1 to 0.0.7.2.1

commit 5de36645
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu Aug 29 14:29:42 2024 +0200

    [VERSION] +1 to 0.0.7.2.1

commit bd8b6659
Merge: c624d176 5f74a8a5
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu Aug 29 14:23:48 2024 +0200

    Merge remote-tracking branch 'origin/issue-380' into dev

commit 9e4f7476
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Thu Aug 29 14:10:53 2024 +0200

    [config] proper NLP table parsing

commit c624d176
Author: mzheng <1363-mzheng@users.noreply.gitlab.iscpif.fr>
Date:   Thu Aug 29 11:37:07 2024 +0200

    formating addGroup

commit 5f74a8a5
Author: lchapron <loic.chapron77@gmail.com>
Date:   Thu Aug 29 11:22:25 2024 +0200

    fix tsv error import

commit 96a23581
Author: mzheng <1363-mzheng@users.noreply.gitlab.iscpif.fr>
Date:   Wed Aug 28 10:56:48 2024 +0200

    add grouping when creating a corpus from HAL

commit 19585ea5
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Thu Aug 29 08:44:51 2024 +0200

    [test] add test-data/test_config.toml

commit 326a0002
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Thu Aug 29 07:10:09 2024 +0200

    [bin] update-project-dependencies

commit 86ab220b
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Wed Aug 28 18:48:58 2024 +0200

    [toml] implement full config, refactoring of types

    Also, tests pass now, locally

commit 3e499383
Merge: 34476655 9144bad9
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Wed Aug 28 17:45:02 2024 +0200

    Merge remote-tracking branch 'origin/dev' into 304-dev-toml-config-rewrite

commit 34476655
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Wed Aug 28 16:12:58 2024 +0200

    [toml] gargantext-settings.toml_toModify

commit 76eb1cf0
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Wed Aug 28 16:08:12 2024 +0200

    [toml] rewrite config to a toml file

commit 9144bad9
Merge: 5f59fdb2 e0dd2db8
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Mon Aug 26 17:12:31 2024 +0200

    [Commit Missing]

commit 5f59fdb2
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Mon Aug 26 15:37:36 2024 +0200

    [VERSION] +1 to 0.0.7.2

commit c370578f
Merge: dfb65fb8 ea21bbbe
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Mon Aug 26 15:21:24 2024 +0200

    Merge remote-tracking branch 'origin/683-dev-graph-explorer-legend' into dev

commit dfb65fb8
Merge: f262753d 9360652c
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Mon Aug 26 15:20:55 2024 +0200

    [MERGE] fix conflicts

commit f262753d
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Mon Aug 26 11:08:03 2024 +0200

    [FIX] install script

commit e598d3f0
Author: Grégoire Locqueville <gregoireloc@gmail.com>
Date:   Fri Aug 23 12:17:23 2024 +0200

    Update Weeder configuration

    Updatd from the old `.dhall` format to the new `.toml` format
    using a script provided by the author of Weeder:
    https://github.com/ocharles/weeder/issues/130

commit 9bfa18b3
Author: Grégoire Locqueville <gregoireloc@gmail.com>
Date:   Fri Aug 23 10:54:52 2024 +0200

    Update cabal.project hash

commit ea21bbbe
Author: Karen Konou <konoukaren@gmail.com>
Date:   Thu Aug 22 13:56:36 2024 +0200

    [Graph API] fix cluster renaming

commit 475399cd
Author: Grégoire Locqueville <gregoireloc@gmail.com>
Date:   Thu Aug 22 11:32:02 2024 +0200

    Save .hie files to default location

commit 9360652c
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Aug 19 14:55:03 2024 +0200

    ngrams: test via client upload of JSON docslist

commit 95fef4a4
Merge: 68a2d7de d6c03dc3
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Tue Aug 20 07:45:54 2024 +0200

    Merge branch 'dev' into 341-dev-websockets

commit 190eaad2
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Aug 19 11:51:00 2024 +0200

    ngrams: Do not compute score on trashed docs

commit b9200c5b
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Aug 19 11:37:31 2024 +0200

    Add Test.API.Authentication to other-modules

commit e0dd2db8
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Aug 19 10:49:48 2024 +0200

    Update project dependencies

commit e3241819
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Aug 19 10:32:49 2024 +0200

    Allow more results from partial match search

commit 7649e70b
Author: Karen Konou <konoukaren@gmail.com>
Date:   Mon Aug 19 10:07:12 2024 +0200

    [Graph api] Legend update endpoint

commit d6c03dc3
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Wed Jul 31 17:12:51 2024 +0200

    [VERSION] +1 to 0.0.7.1.16

commit f7c124b6
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Wed Jul 31 17:07:12 2024 +0200

    To update the project hash dependences:
    - edit bin/update-project-dependencies
    - fix the values of :
      - sha256sum cabal.project
      - sha256sum cabal.project.freeze
    - nix-shell $ ./bin/update-project-dependencies
    - git add -u
    - git commit

commit 3a7b6d08
Merge: aab8701a 238628a4
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Wed Jul 31 16:55:10 2024 +0200

    Merge remote-tracking branch 'origin/update-to-last-oacrawler-commit' into dev-stable

commit 238628a4
Author: Yoelis Acourt <acourt.yoelis@gmail.com>
Date:   Wed Jul 31 16:20:07 2024 +0200

    fix: #379 openalex update to last commit

commit aab8701a
Merge: 931417cf 9d33fc20
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Wed Jul 31 09:33:01 2024 +0200

    Merge branch 'testing' into stable

commit 9d33fc20
Merge: 788a943e 6208742b
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Wed Jul 31 09:32:59 2024 +0200

    Merge branch 'dev' into testing

commit 6208742b
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Wed Jul 31 09:32:19 2024 +0200

    [VERSION] +1 to 0.0.7.1.15

commit 68a2d7de
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Tue Jul 30 13:27:25 2024 +0200

    [tests] move Arbitrary Hyperdata.User instance to Test.Instances

commit c799819a
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Tue Jul 30 13:12:38 2024 +0200

    [tests] add missing files

commit 3000e4b7
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Tue Jul 30 13:03:32 2024 +0200

    [refactor] remove unnecessary LANGUAGE pragmas

    Also, fix for notifications throttle delay value

commit efc0fe8e
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Tue Jul 30 12:04:45 2024 +0200

    [nix] add stack, because it's needed for tests

commit 8cf5cba8
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Tue Jul 30 10:45:12 2024 +0200

    [tests] add aeson tests, some test fixes

commit bc5bde39
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Mon Jul 29 21:44:59 2024 +0200

    [central exchange] add Eq, fix tests

commit 58526e66
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Mon Jul 29 10:31:29 2024 +0200

    [stack] update-project-dependencies

commit e0326e9c
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Mon Jul 29 07:56:56 2024 +0200

    [websockets] send job progress in notification

    Also, throttle messages to avoid flooding the client

commit 39f8f17d
Merge: 69ed7b65 c262ec0e
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Fri Jul 26 18:05:14 2024 +0200

    Merge branch 'dev' into 341-dev-websockets

commit 69ed7b65
Merge: 1f747d2e 0e037e1f
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Thu Jul 25 16:02:29 2024 +0200

    Merge branch 'dev' into 341-dev-websockets

commit 931417cf
Merge: 9ccf88ff 788a943e
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Wed Jul 24 11:45:43 2024 +0200

    Merge branch 'testing' into stable

commit 788a943e
Merge: 2e83eaa8 c262ec0e
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Wed Jul 24 11:45:41 2024 +0200

    Merge branch 'dev' into testing

commit c262ec0e
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Wed Jul 24 11:30:14 2024 +0200

    [VERSION] +1 to 0.0.7.1.14

commit 91464cfb
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Jul 22 12:21:33 2024 +0200

    Publish in notes is now URL sharing

    This commit maps the "Publish" action inside CodiMD/HedgeDoc to the
    share URL feature.

commit e4222dfc
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Jul 22 11:32:32 2024 +0200

    Support port in share URL if localhost

commit d5153d39
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Tue Jul 16 09:21:36 2024 +0200

    Share URL improvement and tests

    This commit improves a bit the ShareURL internal API by wrapping the
    returned URL into a proper `ShareURL` type (that internally uses a typed
    representation for the URL).

commit 47e775a4
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Tue Jul 23 16:59:09 2024 +0200

    [VERSION] +1 to 0.0.7.1.13

commit 610eabe2
Merge: 520c7701 dd00da1b
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Tue Jul 23 09:45:02 2024 +0200

    Merge remote-tracking branch 'origin/582-dev-phylo-default-behavior' into dev

commit 520c7701
Merge: ec845b10 9378fb7e
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Tue Jul 23 09:41:12 2024 +0200

    Merge remote-tracking branch 'origin/adinapoli/issue-374' into dev

commit dd00da1b
Author: Karen Konou <konoukaren@gmail.com>
Date:   Mon Jul 22 15:51:26 2024 +0200

    [Phylo] Don't serve the 'cleopatre' phylo when no data is present

commit 9378fb7e
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Jul 22 10:10:15 2024 +0200

    Fix local reverse proxy version mismatch

    Fixes #374 by not using a bespoke config file, but rather setting
    the `window.domain` and `window.urlpath` via regex substitution.

    This avoids using an old `window.version` that would cause the
    refresh modal to popup every time after each upgrade of HedgeDoc /
    CodiMD.

commit ec845b10
Author: mzheng <1363-mzheng@users.noreply.gitlab.iscpif.fr>
Date:   Mon Jul 22 10:08:25 2024 +0200

    remove --minimize-conflict-set

commit 56317d50
Author: mzheng <1363-mzheng@users.noreply.gitlab.iscpif.fr>
Date:   Fri Jul 19 11:26:56 2024 +0200

    renaming HAL.Corpus to HAL.Document

commit 13359943
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Wed Jul 17 14:04:14 2024 +0200

    [VERSION] +1 to 0.0.7.1.12

commit 37545535
Merge: 6d63b50c a8dcfe1a
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Wed Jul 17 11:00:41 2024 +0200

    Merge remote-tracking branch 'origin/adinapoli/issue-370' into dev

commit 6d63b50c
Author: Grégoire Locqueville <gregoireloc@gmail.com>
Date:   Tue Jul 16 17:50:55 2024 +0200

    Added tooling documentation

    The new files in `docs/` explain:
    1. How to get one's editor to play nice with HLS
       and the Gargantext project
    2. To interact with the server/database from within GHCI

    A reference to them has been added to the `README`.

commit a8dcfe1a
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Jul 15 14:13:44 2024 +0200

    Allow local write frame to work via the microservices proxy

commit 9ccf88ff
Merge: 598b2bf7 2e83eaa8
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Mon Jul 15 15:35:01 2024 +0200

    Merge branch 'testing' into stable

commit 2e83eaa8
Merge: e6a28179 3329c788
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Mon Jul 15 15:34:59 2024 +0200

    Merge branch 'dev' into testing

commit 3329c788
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Mon Jul 15 15:34:21 2024 +0200

    [VERSION] +1 to 0.0.7.1.11

commit 8bde229c
Merge: 3c13ae54 fcf9279e
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Mon Jul 15 15:14:54 2024 +0200

    Merge remote-tracking branch 'origin/adinapoli/issue-369' into dev

commit 3c13ae54
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Mon Jul 15 15:05:36 2024 +0200

    [VERSION] +1 to 0.0.7.1.10

commit f3c4b508
Merge: bc89eed7 f15d2fee
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Mon Jul 15 15:04:33 2024 +0200

    [MERGE]

commit bc89eed7
Merge: 81ae8313 24d1c8d2
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Mon Jul 15 14:29:30 2024 +0200

    Merge remote-tracking branch 'origin/365-documentation-improve-readme' into dev

commit fcf9279e
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Jul 15 14:14:30 2024 +0200

    Amend test-data settings.toml

commit 6e38e501
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Jul 15 11:37:52 2024 +0200

    Disable the proxy by default

commit 8f4ffdcd
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Jul 15 11:23:39 2024 +0200

    Change gargantext-settings.toml for proxy sub-section

commit 24d1c8d2
Author: Grégoire Locqueville <gregoireloc@gmail.com>
Date:   Fri Jul 12 11:02:03 2024 +0200

    Some more README restructuration

    This time I think I am clear on what the building & running process is
    and what the purpose of each command is, and I tried to make it clear again.

    This may be deemed too verbose:
    - Maybe I went into too many basic details, I'll be happy to discuss
      what the right level of detail is;
    - But I also think there are too many ways to do the same thing
      documented in the README. It might be worth settling on one recommended way,
      and documenting the rest in an appendix or something like that.

commit 81ae8313
Author: mzheng <1363-mzheng@users.noreply.gitlab.iscpif.fr>
Date:   Fri Jul 12 09:59:02 2024 +0200

    update project dependencies

commit 1b8fc113
Author: mzheng <1363-mzheng@users.noreply.gitlab.iscpif.fr>
Date:   Fri Jul 12 09:52:01 2024 +0200

    update cabal.project for the HAL crawler

commit 0e037e1f
Author: Grégoire Locqueville <gregoireloc@gmail.com>
Date:   Thu Jul 11 10:27:04 2024 +0200

    New README improvements abt. compiling and running

    Fixed some typos introduced in the previous edit,
    clarified a couple of points, and restructured the doc some more
    as I got a better grasp on the process.

commit a481b2cb
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Wed Jul 10 09:21:43 2024 +0200

    [VERSION] +1 to 0.0.7.1.9

commit db028cda
Merge: de6f0a3d ef9dbb47
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Tue Jul 9 16:20:07 2024 +0200

    Merge remote-tracking branch 'origin/adinapoli/issue-364' into dev

commit ef9dbb47
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Jul 8 10:32:29 2024 +0200

    Guard the reverse proxy under the classic Garg Authentication scheme

    While doing this, I have also fixed a bug in the current implementation
    of ThrowAll (formerly named `throwAll'`).

commit de6f0a3d
Merge: e947e2b9 731d4bc4
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Tue Jul 9 09:19:03 2024 +0200

    Merge remote-tracking branch 'origin/adinapoli/issue-350' into dev

commit 731d4bc4
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Jun 10 11:30:46 2024 +0200

    Add routes subcommand to CLI

    It integrates servant-routes which allows to list and export the
    server backend routes.

commit 1f747d2e
Merge: 260ab012 020b6819
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Mon Jul 8 19:33:38 2024 +0200

    Merge branch 'dev' into 341-dev-websockets

commit e947e2b9
Author: Grégoire Locqueville <gregoireloc@gmail.com>
Date:   Mon Jul 8 14:36:00 2024 +0200

    README improvements

    Various clarifications and reformulations based on my experience using
    the README to build and run Gargantext. In particular:
    - Information related to development has been given its own section
    - Docker Compose has been added to the list of prerequisites
    - Information pertaining to using Stack has been moved to an annex file
    - The content to be copypasted into a `cabal.project.local` file has been moved
      out of the README into a separate file `cabal.project.local_toCopy`

    Those may not be the best decisions, I am happy to discuss them if
    needed

commit 020b6819
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Mon Jul 8 09:14:24 2024 +0200

    [DOC] fix dead url

commit 717ea3b9
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Mon Jul 8 09:09:02 2024 +0200

    [DOC] public URL first in DOC indeed

commit f15d2fee
Author: lchapron <loic.chapron77@gmail.com>
Date:   Fri Jul 5 16:48:54 2024 +0200

    fix TSV import test

commit 9c1c0360
Author: lchapron <loic.chapron77@gmail.com>
Date:   Fri Jul 5 10:28:16 2024 +0200

    more TSV testing

commit 05e98637
Author: lchapron <loic.chapron77@gmail.com>
Date:   Tue Jul 2 14:27:43 2024 +0200

    add test to TSV import error message

commit c5671e08
Author: lchapron <loic.chapron77@gmail.com>
Date:   Fri Jun 28 16:26:13 2024 +0200

    Improv TSV import error message

commit 639b5d94
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Fri Jul 5 13:27:20 2024 +0200

    [VERSION] +1 to 0.0.7.1.8

commit d187e0b3
Merge: b843188e 7a46e772
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Fri Jul 5 13:16:12 2024 +0200

    Merge remote-tracking branch 'origin/242-dev-phylo-websearch' into dev

commit b843188e
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Fri Jul 5 12:01:50 2024 +0200

    [VERSION] +1 to 0.0.7.1.7.4

commit 6a9f31d6
Merge: 7903d14b 9a236dd8
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Fri Jul 5 11:59:36 2024 +0200

    Merge remote-tracking branch 'gregoire/remove-johnsnownlp' into dev

commit 7903d14b
Author: Yoelis Acourt <acourt.yoelis@gmail.com>
Date:   Thu Jul 4 17:20:50 2024 +0200

    [DOCS]: add description of the frontend build step

commit 9a236dd8
Author: Grégoire Locqueville <gregoireloc@gmail.com>
Date:   Thu Jul 4 16:01:52 2024 +0200

    Remove seemingly obsolete "johnsnownlp" service

    The service was causing docker compose to fail. It seems to simply no
    longer be available.

commit 2506aeb6
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu Jul 4 14:57:17 2024 +0200

    [VERSION] +1 to 0.0.7.1.7.3

commit 7a46e772
Author: Karen Konou <konoukaren@gmail.com>
Date:   Thu Jul 4 11:29:53 2024 +0200

    [Graph/Phylo] Doclist filtering

commit 9632276f
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Jul 1 16:31:19 2024 +0200

    Move GargConfig into gargantext

    This commit moves `GargConfig` and the other config-related
    data structures back into gargantext, so that they can be edited
    and expanded without needing to worry about the prelude project.

commit 761189eb
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Wed Jul 3 14:03:17 2024 +0200

    [DOC] https instead of ssh by default

commit 567ea4a4
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Wed Jul 3 11:33:50 2024 +0200

    [DOC] fix

commit 4b220387
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Wed Jul 3 11:31:51 2024 +0200

    [FIX] README to init

commit 97d1283d
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Wed Jul 3 11:18:51 2024 +0200

    [DOC] Fix readme

commit e73b0fb3
Merge: 9a203130 cfd82856
Author: Karen Konou <konoukaren@gmail.com>
Date:   Wed Jul 3 10:04:38 2024 +0200

    Merge branch 'dev' into 242-dev-phylo-websearch

commit cfd82856
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Tue Jul 2 09:22:38 2024 +0200

    [TEST][FIX] File Extension

commit 21064e86
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Tue Jul 2 09:03:06 2024 +0200

    [VERSION] +1 to 0.0.7.1.7.2

commit 0ad98105
Merge: 6a0c62d6 f9332b80
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Tue Jul 2 09:01:27 2024 +0200

    Merge remote-tracking branch 'origin/adinapoli/issue-355' into dev

commit f9332b80
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Jul 1 13:59:39 2024 +0200

    Use goldenVsString

    Using goldenVsStringDiff creates problems with CI trying to locale
    `gargantext-cli -- golden-file-diff`.

commit 6a0c62d6
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Mon Jul 1 15:16:57 2024 +0200

    Style Guidelines improvement, thank you Alfredo

commit 26d65e3b
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Mon Jul 1 14:16:46 2024 +0200

    Developer Guidelines, adding style

commit 8d07ed51
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Jul 1 12:38:42 2024 +0200

    Port golden-file-diff to CLI

commit a4c1fbec
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Jul 1 12:22:55 2024 +0200

    Port gargantext-upgrade to CLI

commit f28aafdb
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Jul 1 12:07:14 2024 +0200

    Port phylo-profile to CLI

commit 1905b024
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Jul 1 11:52:50 2024 +0200

    Port phylo to CLI executable

commit 409c8423
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Jul 1 10:29:45 2024 +0200

    Port gargantext-invitations to CLI

commit 5760e558
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Jul 1 10:08:31 2024 +0200

    Port gargantext-init to CLI

commit 1310b3a3
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Jul 1 09:25:34 2024 +0200

    Port gargantext-import to CLI

commit d765ec00
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Thu Jun 27 09:02:28 2024 +0200

    Port `gargantext-admin` into `gargantext-cli`

commit 598b2bf7
Author: Karen Konou <konoukaren@gmail.com>
Date:   Wed Jun 26 11:47:07 2024 +0200

    [API tests] fix tsv upload

commit a8ad31d0
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu Jun 27 14:33:42 2024 +0200

    [VERSION] +1 to 0.0.7.1.7.1

commit 15b563af
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu Jun 27 09:53:22 2024 +0200

    [FIX] stack

commit 12910164
Merge: f246fa1c d0f47d30
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu Jun 27 09:52:38 2024 +0200

    Merge remote-tracking branch 'origin/360-dev-tsv-test' into dev

commit f246fa1c
Merge: 0b2f43f2 9fa05bd7
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu Jun 27 09:52:23 2024 +0200

    Merge

commit d0f47d30
Merge: a4eb1721 0b2f43f2
Author: Karen Konou <konoukaren@gmail.com>
Date:   Thu Jun 27 09:07:07 2024 +0200

    Merge branch 'dev' into 360-dev-tsv-test

commit 0b2f43f2
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu Jun 27 09:01:04 2024 +0200

    [FIX] Stack deps

commit a4eb1721
Author: Karen Konou <konoukaren@gmail.com>
Date:   Wed Jun 26 11:47:07 2024 +0200

    [API tests] fix tsv upload

commit 9fa05bd7
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Wed Jun 26 08:17:39 2024 +0200

    Remove db-obfuscation flag from stack.yaml

commit ca5f6c02
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Wed Jun 26 08:05:02 2024 +0200

    Fix executables

commit 4b6991a3
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Jun 24 15:30:20 2024 +0200

    Hook CORS and middleware

commit bb91161a
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Tue Jun 18 11:23:54 2024 +0200

    Serve a custom /config to correctly setup websocket for proxies

    This commit extends the reverse proxy for the microservices so that it
    would serve a custom `/config` file which would contain the correct
    baseUrl to initialise the websocket connection correctly.

commit d2d35f97
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Jun 17 16:53:10 2024 +0200

    Support multiple disjointed notes

    Still needs to fix some hardcoded URLs. The problem with websockets is
    that they use the first URL fragment to determine the documentId,
    therefore we cannot proxy to `http://localhost:8009/notes/<frameId>`
    because the underlying WS connection will use `noteId=notes`, which is
    wrong.

commit 16bece62
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Jun 17 14:59:24 2024 +0200

    Slight refactoring of proxy code

commit 4ab1ebbb
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Jun 17 12:55:33 2024 +0200

    Use forked http-reverse-proxy, better regex substitution

commit 11e497c2
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Jun 17 10:03:51 2024 +0200

    Make microservices proxy settings configurable

commit 78687085
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Jun 17 07:54:27 2024 +0200

    Move reverse proxy on separate port

commit b0be91da
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Wed Jun 12 07:39:46 2024 +0200

    Experiment with reverse proxy same domain

commit d13740f9
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Tue Jun 25 15:33:46 2024 +0200

    [VERSION] +1 to 0.0.7.1.7

commit 19c7c2db
Merge: 5589b7ae 7c1bc974
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Tue Jun 25 15:19:36 2024 +0200

    Merge remote-tracking branch 'origin/adinapoli/issue-355' into dev

commit 5ec3c2af
Merge: df4e87cf e6a28179
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Tue Jun 25 14:32:19 2024 +0200

    Merge branch 'testing' into stable

commit e6a28179
Merge: a9f7b166 5589b7ae
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Tue Jun 25 14:32:18 2024 +0200

    Merge branch 'dev' into testing

commit 5589b7ae
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Tue Jun 25 09:58:18 2024 +0200

    [VERSION] +1 to 0.0.7.1.6.5

commit 7c1bc974
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Tue Jun 25 09:49:33 2024 +0200

    CLI: Replace DB obfuscation executable

commit f789b2e4
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Jun 24 16:47:48 2024 +0200

    CLI: Add the filter-terms command

commit 702882d0
Merge: 0087a0f8 843c3f32
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Tue Jun 25 09:11:43 2024 +0200

    Merge remote-tracking branch 'origin/dev-phylo-csv-fix' into dev

commit 0087a0f8
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Fri Jun 21 14:01:15 2024 +0200

    [VERSION] +1 to 0.0.7.1.6.4

commit 45efa38e
Merge: 379a89e3 f8b663b1
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Fri Jun 21 13:47:34 2024 +0200

    Merge remote-tracking branch 'origin/330-node-terms-institutes-missing-with-hal-request' into dev

commit 260ab012
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Fri Jun 21 12:47:28 2024 +0200

    [tests] add draft for websocket tests

commit c87f2791
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Thu Jun 20 18:36:33 2024 +0200

    [test] add Test.Core.AsyncUpdates

commit 6f767241
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Thu Jun 20 18:34:34 2024 +0200

    [tests] some fixes to invoking dispatcher and central exchange

commit 99f21ab0
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Thu Jun 20 12:52:10 2024 +0200

    [stack] update project dependencies hashes

commit 96915688
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Thu Jun 20 07:38:19 2024 +0200

    [tests] dummy WebSocketPending HasClient implementation

commit dca7d379
Merge: 5286cb51 e147c115
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Wed Jun 19 21:09:26 2024 +0200

    Merge branch 'dev' into 341-dev-websockets

commit 843c3f32
Author: Karen Konou <konoukaren@gmail.com>
Date:   Wed Jun 19 16:32:57 2024 +0200

    Fix parsing of old phylo files

commit 379a89e3
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Wed Jun 19 15:09:18 2024 +0200

    [FIX] Metrics

commit 9a203130
Author: Karen Konou <konoukaren@gmail.com>
Date:   Wed Jun 19 14:13:21 2024 +0200

    [Contexts for ngrams] Support AND search

commit f8b663b1
Author: mzheng <1363-mzheng@users.noreply.gitlab.iscpif.fr>
Date:   Tue Jun 18 13:47:09 2024 +0200

    update cabal.project for the crawler HAL

commit 5286cb51
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Tue Jun 18 07:37:42 2024 +0200

    [websockets] some tests fixes

    But they still don't work because there is no HasClient implemented
    for the websocket server.

commit db5ec697
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Mon Jun 17 21:37:46 2024 +0200

    [websockets] some refactoring (split to smaller modules)

commit 991c637c
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Mon Jun 17 18:31:37 2024 +0200

    [refactor] openalex fix, refactoring, fix dispatcher logging

commit e147c115
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Mon Jun 17 09:39:10 2024 +0200

    [VERSION] +1 to 0.0.7.1.6.3

commit 1953a22a
Merge: a930e685 487f0689
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Mon Jun 17 09:15:21 2024 +0200

    Merge remote-tracking branch 'origin/348-csv-tsv-in-all-codebase' into dev

commit 5bf220f1
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Mon Jun 17 07:52:41 2024 +0200

    [websockets] ce/dispatcher bind/connect constants

    This makes it easier to change protocols, ports etc.

commit 0d3eb314
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Mon Jun 17 06:58:43 2024 +0200

    [docker-compose] add caddy as a frontend

commit 01f44faa
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Mon Jun 17 06:58:10 2024 +0200

    [websockets] implement CE typeclass, fixes to haskell-nanomsg

commit ea87bb15
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Thu Jun 13 12:43:46 2024 +0200

    [websockets] fix routing (frontend is a catch-all)

commit 487f0689
Author: lchapron <loic.chapron77@gmail.com>
Date:   Thu Jun 13 11:51:31 2024 +0200

    FIX csv -> tsv link back and front

commit f824ffaf
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Wed Jun 12 14:10:35 2024 +0200

    [ws] some small refactoring

commit a417606f
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Tue Jun 11 18:39:35 2024 +0200

    [websockets] named routes compiles now, but /ws endpoint not reachable...

commit 0a86c5fc
Author: lchapron <loic.chapron77@gmail.com>
Date:   Tue Jun 11 10:46:09 2024 +0200

    FIX test csv->tsv

commit a930e685
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Tue Jun 11 09:31:45 2024 +0200

    [VERSION] +1 to 0.0.7.1.6.2

commit e67a7435
Merge: 85353a92 49946361
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Tue Jun 11 07:34:22 2024 +0200

    Merge branch 'dev' into 341-dev-websockets

commit ff0a77cd
Author: lchapron <loic.chapron77@gmail.com>
Date:   Fri Jun 7 16:46:35 2024 +0200

    Change CSV into TSV

commit 49946361
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu Jun 6 09:27:21 2024 +0200

    [VERSION] +1 to 0.0.7.1.6.1

commit 85353a92
Merge: 671aa21b 319a5c26
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Wed Jun 5 21:11:06 2024 +0200

    Merge branch 'dev' into 341-dev-websockets

commit 671aa21b
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Wed Jun 5 17:17:11 2024 +0200

    [ws] dispatcher & central exchange ports in constants module

commit e2a437a9
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Wed Jun 5 09:30:57 2024 +0200

    Convert GraphQL API to Named routes

commit 319a5c26
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Tue Jun 4 17:12:11 2024 +0200

    [VERSION] +1 to 0.0.7.1.6

commit 2b67dad8
Merge: 0a4a4d95 406b3e58
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Tue Jun 4 16:26:16 2024 +0200

    Merge remote-tracking branch 'origin/adinapoli/issue-271' into dev

commit 0a4a4d95
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Mon Jun 3 16:18:09 2024 +0200

    [VERSION] +1 to 0.0.7.1.5.5

commit a50b228a
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Jun 3 15:51:19 2024 +0200

    Remove NoUserFound error constructor

commit 406b3e58
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Jun 3 15:42:14 2024 +0200

    Update dependencies

commit e578bc9c
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Tue May 28 11:53:07 2024 +0200

    Derive generic clients

commit 65750c75
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Tue May 28 09:25:36 2024 +0200

    Remove old (unnamed) API

    This beefy commit removes the old (unnamed) Servant API.

commit 6240e820
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon May 13 12:04:30 2024 +0200

    Named server handlers

    This big commit ties the knot with the named _routes_ by providing
    concrete server (i.e. handlers) implementations.

commit a66c60ed
Merge: c5274cff 144dce2d
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Fri May 31 18:36:14 2024 +0200

    Merge branch 'dev' into 341-dev-websockets

commit 144dce2d
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu May 30 10:41:21 2024 +0200

    [VERSION] +1 to 0.0.7.1.5.4

commit c5274cff
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Wed May 29 21:39:56 2024 +0200

    [websockets] migrate to StmContainers.Set

commit 5bcb8731
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Wed May 29 10:43:20 2024 +0200

    [websockets] ws server test for nanomsg

    Also, will use stm containers

commit df4e87cf
Merge: 09b38151 a9f7b166
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Wed May 29 09:51:03 2024 +0200

    Merge branch 'testing' into stable

commit a9f7b166
Merge: 48c9cdac b0807fb9
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Wed May 29 09:51:02 2024 +0200

    Merge branch 'dev' into testing

commit 51da71fd
Merge: 72a457c5 b0807fb9
Author: lchapron <loic.chapron77@gmail.com>
Date:   Tue May 28 16:04:37 2024 +0200

    Merge branch '345-docs-tsv-export-import-check-and-maintain-consistency-between-export-and-import-formats' of https://gitlab.iscpif.fr/gargantext/haskell-gargantext into 345-docs-tsv-export-import-check-and-maintain-consistency-between-export-and-import-formats

commit 72a457c5
Author: lchapron <loic.chapron77@gmail.com>
Date:   Tue May 28 16:02:28 2024 +0200

    Improve export (tab and quote)

commit b0807fb9
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Tue May 28 09:20:39 2024 +0200

    [VERSION] +1 to 0.0.7.1.5.3

commit 708029b2
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Mon May 27 20:49:07 2024 +0200

    [ws] remove textual ping/pong, replace with ping control frame

commit 5cb7a700
Author: Fabien Maniere <fabien.maniere@cnrs.fr>
Date:   Mon May 27 15:07:23 2024 +0200

    ignore logs and +

commit dd00dc43
Merge: e7ad54d4 ec9d0590
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Mon May 27 10:36:51 2024 +0200

    Merge branch 'dev' into 341-dev-websockets

commit e7ad54d4
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Sat May 25 08:25:04 2024 +0200

    [ws] implement jwt token authorization

commit 200f3b52
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Sat May 25 06:58:48 2024 +0200

    [ws] add ping/pong, add notification function, unique subscriptions

commit 09b38151
Merge: 9dcd9aae 48c9cdac
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Fri May 24 16:48:41 2024 +0200

    Merge branch 'testing' into stable

commit 48c9cdac
Merge: 083c6bab ec9d0590
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Fri May 24 16:48:39 2024 +0200

    Merge branch 'dev' into testing

commit ec9d0590
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Fri May 24 16:47:55 2024 +0200

    [ADM] nix config for easy deployment

commit 9dcd9aae
Merge: 557fdde4 083c6bab
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Fri May 24 14:35:58 2024 +0200

    Merge branch 'testing' into stable

commit 083c6bab
Merge: c5bd963b cfe5d19b
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Fri May 24 14:35:32 2024 +0200

    Merge branch 'dev' into testing

commit cfe5d19b
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Fri May 24 14:35:19 2024 +0200

    [VERSION] +1 to 0.0.7.1.5.2

commit 2f355079
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Fri May 24 14:29:01 2024 +0200

    [FIX] Order 2 for small corpora

commit 9de83328
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Thu May 23 14:32:18 2024 +0200

    [websockets] initial implementation of async notifications

    I'm currently able to do the following:
    - start gargantext-server (as it hosts central exchange and
    dispatcher, currently)
    - start a websocket connection:
      websocat ws://localhost:8008/ws
    - subscibe to a topic (in websocat):
      {"request": "subscribe", "topic": {"type": "update_tree", "node_id":
      15}}
    - optionally subscibe to other node_ids or start other websocat's with
      different subscriptions (can be multiple)
    - fire up
      cabal v2-run gargantext-central-exchange -- client
      This triggers a node_id: 15 and node_id: 16 notification to be sent

    You can send your own notifications, e.g. with Python:
    import json
    import nanomsg as n
    s = n.Socket(n.PUSH)
    s.connect('tcp://localhost:5560')
    s.send(json.dumps({'type': 'update_tree_first_level', 'node_id': 15}))

commit 63bf3a0b
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu May 23 09:29:12 2024 +0200

    [VERSION] +1 to 0.0.7.1.5.1

commit 9ea7d5f3
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Wed May 22 18:14:16 2024 +0200

    [central-exchange] very simple implementation using nanomsg

commit e83ba7dd
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu May 16 14:57:49 2024 +0200

    [VERSION] +1 to 0.0.7.1.5

commit 20e54d08
Merge: d77bc855 59dcfb62
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu May 16 14:51:16 2024 +0200

    Merge remote-tracking branch 'origin/337-node-phylo-export-the-phylo-in-json-and-dot-format' into dev

commit 557fdde4
Merge: 890bce11 59dcfb62
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu May 16 14:36:25 2024 +0200

    Merge remote-tracking branch 'origin/337-node-phylo-export-the-phylo-in-json-and-dot-format' into stable

commit 890bce11
Merge: 60a9fcf0 4477c6c7
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu May 16 14:31:59 2024 +0200

    Merge remote-tracking branch 'origin/adinapoli/issue-271' into stable

commit 60a9fcf0
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu May 16 10:11:23 2024 +0200

    [ADMIN] File for metrics

commit c5bd963b
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu May 16 10:11:23 2024 +0200

    [ADMIN] File for metrics

commit d77bc855
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu May 16 10:11:23 2024 +0200

    [ADMIN] File for metrics

commit c87222ba
Merge: fed848e0 4477c6c7
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu May 16 09:53:38 2024 +0200

    Merge remote-tracking branch 'origin/adinapoli/issue-271' into dev

commit 59dcfb62
Author: mzheng <1363-mzheng@users.noreply.gitlab.iscpif.fr>
Date:   Tue May 14 11:51:13 2024 +0200

    small refactoring

commit d4e01a75
Author: mzheng <1363-mzheng@users.noreply.gitlab.iscpif.fr>
Date:   Mon May 6 16:11:47 2024 +0200

    add phylo export dot format

commit 210b31cf
Author: mzheng <1363-mzheng@users.noreply.gitlab.iscpif.fr>
Date:   Tue Apr 16 14:31:29 2024 +0200

    commenting DOT export for now

commit d05e9762
Author: mzheng <1363-mzheng@users.noreply.gitlab.iscpif.fr>
Date:   Thu Apr 11 14:59:09 2024 +0200

    fixed the name of the file

commit d752d875
Author: mzheng <1363-mzheng@users.noreply.gitlab.iscpif.fr>
Date:   Thu Apr 11 14:43:50 2024 +0200

    added dummy user data to test the new endpoint

commit fed848e0
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Tue May 14 09:21:25 2024 +0200

    [VERSION] +1 to 0.0.7.1.4

commit dc0df15d
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Mon May 13 06:39:14 2024 +0200

    [websockets] async update: external/internal communication

commit d79c579a
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Sat May 11 06:53:13 2024 +0200

    [websocket] add Subscription data

commit 245bc254
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Sat May 11 06:34:12 2024 +0200

    [websocket] remark on public notifications

commit a0b836b0
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Sat May 11 06:33:09 2024 +0200

    [websockets] remark on UserSource/UserAction

commit 914fd977
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Sat May 11 06:14:30 2024 +0200

    [websockets] AsyncUpdates more info on architecture

commit e1de4c8a
Merge: c08f2b6e fa24156a
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Fri May 10 20:45:44 2024 +0200

    Merge branch 'dev' into 341-dev-websockets

commit c08f2b6e
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Thu May 9 11:16:32 2024 +0200

    [websockets] add websocket to routes

    Also, removed EKG (I don't know how to make it work with WS)

commit 4477c6c7
Author: Alfredo Di Napoli <alfredo@well-typed.com>
Date:   Mon Apr 29 14:52:19 2024 +0200

    Add Named Servant API routes

    This big commit adds a separate module hierarchy for Servant named
    routes (see https://www.tweag.io/blog/2022-02-24-named-routes/ ) which
    will make working with servant endpoints more pleasant (especially when
    it comes to emitted errors).

    This still doesn't do anything to wire the routes to the concrete
    handlers.

commit ca339d93
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Thu May 9 10:08:50 2024 +0200

    [websockets] some stub datatypes

commit 6b0ddc61
Merge: bc86389a f56e8fc8
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Tue May 7 19:51:37 2024 +0200

    Merge branch 'testing' into stable

commit f56e8fc8
Merge: c870f857 fa24156a
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Tue May 7 19:51:31 2024 +0200

    Merge branch 'dev' into testing

commit fa24156a
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Tue May 7 08:53:58 2024 +0200

    [VERSION] +1 to 0.0.7.1.3

commit b24d81e7
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu May 2 11:58:21 2024 +0200

    [VERSION] +1 to 0.0.7.1.2

commit ddefee50
Merge: 9ef97b9a ca1aa195
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Mon Apr 29 20:32:47 2024 +0200

    Merge branch 'dev' into 169-dev-singulars-plurals-remove-map-list-size

commit bc86389a
Merge: 2735207e c870f857
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Fri Apr 19 09:40:23 2024 +0200

    Merge branch 'testing' into stable

commit c870f857
Merge: c97234ed cd0fea68
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Fri Apr 19 09:40:16 2024 +0200

    Merge branch 'dev' into testing

commit 2735207e
Merge: 17d18697 c97234ed
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu Apr 18 14:35:10 2024 +0200

    Merge branch 'testing' into stable

commit c97234ed
Merge: 2f308bcf abf437c8
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu Apr 18 14:35:02 2024 +0200

    merge

commit 2f308bcf
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Tue Apr 16 11:42:49 2024 +0200

    [FIX] update hash project

commit 9ef97b9a
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Mon Apr 8 14:51:13 2024 +0200

    [ngrams] fix grouping to use mapListSize

commit dd95bc6c
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Wed Apr 3 12:10:05 2024 +0200

    [refactor] intercalate " " -> unwords

commit 7d777a10
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Tue Apr 2 18:53:55 2024 +0200

    [ngrams] try without map list size to fix singulars/plurals issue

commit 956df688
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Tue Apr 2 17:45:18 2024 +0200

    some more refactorings, comments to code i didn't understand

commit 166f9c19
Merge: 7f8a865a a4ab001a
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Tue Apr 2 10:36:06 2024 +0200

    Merge branch 'dev' into 169-dev-singulars-plurals

commit 7f8a865a
Author: Przemysław Kaminski <pk@intrepidus.pl>
Date:   Wed Mar 27 10:36:27 2024 +0100

    [refactor] more explicit type constructors

    It's better to enumerate fields than not - easier to search later.

    Also, a performance improvement for queryNgramsOccurrences (no VALUES).

commit 17d18697
Merge: 5f18e148 574631df
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu Mar 21 10:18:39 2024 +0100

    [MERGE] Stable Version

commit 5f18e148
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Mon Jan 15 15:21:35 2024 +0100

    [DOC] README

commit 4c116964
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Mon Jan 15 15:13:16 2024 +0100

    [DOC] README

commit 351df158
Merge: 1a5ee7b6 555a1c96
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Mon Jan 15 11:57:35 2024 +0100

    Merge branch 'stable-dev' into stable

commit 1a5ee7b6
Merge: 62862406 113fffba
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu Nov 30 08:54:16 2023 +0100

    Merge branch 'dev-stable' into stable

commit 62862406
Merge: 473b72fc 1d836ed3
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu Oct 19 10:35:00 2023 +0200

    Merge commit '1d836ed3' into stable

commit 473b72fc
Merge: 72bfe439 2e537215
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu Sep 14 09:37:40 2023 +0200

    Merge branch 'testing' into stable

commit 72bfe439
Merge: dc2cc142 7e923b2e
Author: Alexandre Delanoë <devel+git@delanoe.org>
Date:   Thu Jul 27 10:03:19 2023 +0200

    Merge remote-tracking branch 'origin/dev-contributing' into stable
parent 0564d0ad
......@@ -19,6 +19,9 @@ TAGS
*.swp
.dir-locals.el
# VSCode
.vscode
# UI
gui
purescript-gargantext
......@@ -29,8 +32,9 @@ doc
deps
_darcs
*.pdf
*.sql
*.png
*.ini
*.toml
!test-data/test_config.ini
# Runtime
......@@ -51,3 +55,7 @@ gargantext_profile_out.dot
.pre-commit-config.yaml
nix/cache/haskell.nix/gc-roots/
result*
dev.jwk
.psc-ide-port
logs/
# Optimising CI speed by using tips from https://blog.nimbleways.com/let-s-make-faster-gitlab-ci-cd-pipelines/
image: adinapoli/gargantext:v3.4
#image: adinapoli/gargantext:v3.4
image: cgenie/gargantext:9.4.8
variables:
STACK_ROOT: "${CI_PROJECT_DIR}/.stack-root"
......@@ -37,7 +38,7 @@ cabal:
- .cabal/
policy: pull-push
script:
- nix-shell --run "./bin/update-project-dependencies $CABAL_STORE_DIR && cabal --store-dir=$CABAL_STORE_DIR v2-build --flags 'test-crypto no-phylo-debug-logs' --ghc-options='-O0 -fclear-plugins'"
- nix-shell --run "./bin/update-project-dependencies $CABAL_STORE_DIR && cabal --store-dir=$CABAL_STORE_DIR v2-build all --flags 'test-crypto no-phylo-debug-logs' --ghc-options='-O0 -fclear-plugins'"
allow_failure: false
bench:
......
## Summary
(Summarize the bug encountered concisely with the version of code)
## Steps to reproduce
(How one can reproduce the issue - this is very important)
## What is the current bug behavior?
(What actually happens)
## What is the expected correct behavior?
(What you should see instead)
## Relevant logs and/or screenshots
(Paste any relevant logs - use code blocks (```) to format console output, logs, and code, as
it's very hard to read otherwise.)
## Possible fixes
(If you can, link to the line of code that might be responsible for the problem)
This diff is collapsed.
# Contributing
## Code contribution
We use Git to share and merge our code.
## Style
We are using the common Haskell Style:
https://github.com/tibbe/haskell-style-guide/blob/master/haskell-style.md
## Code Of Conduct
Be constructive as sharing our code of conduct
## Chat with us
We are on IRC: [irc.oftc.net, channel #gargantext](ircs://irc.oftc.net:6697/#gargantext)
You can join via Matrix, just search for: #_oftc_#gargantext:matrix.org
You can also join via XMPP: <xmpp://#gargantext%irc.oftc.net@irc.jabberfr.org?join>
......@@ -39,6 +39,7 @@ all developers about how to:
The rest of the document try to answer all those questions.
## Glossary
- GIT: _Git_ is a distributed version control system
......@@ -57,7 +58,29 @@ The rest of the document try to answer all those questions.
The following is a non-exhaustive list of the development guidelines.
### Main working Branches
### Style
When we code, we try to use the [common Haskell Style guide](https://github.com/tibbe/haskell-style-guide/blob/master/haskell-style.md).
1. For new files, use the referenced style guide;
2. For older files, which might have been written using a different code style, try to respect whichever style guide was used to write the file (to ensure consistency and minimise unwanted changes);
3. Resist the urge of making style modifications mixed to general refactoring; rather separate those into independent commits, so that they are easy to revert if unwanted / not needed
### Code Of Conduct
Please be constructive as sharing our [code of conduct](https://gitlab.iscpif.fr/gargantext/main/blob/master/CODE_OF_CONDUCT.md).
### Chat with us !
We are on IRC: [irc.oftc.net, channel #gargantext](ircs://irc.oftc.net:6697/#gargantext)
You can join via Matrix, just search for: #_oftc_#gargantext:matrix.org
You can also join via XMPP: <xmpp://#gargantext%irc.oftc.net@irc.jabberfr.org?join>
## Git Collaboration Guidelines
### Git Main working Branches
3 main branches are used in the distributed version control system (Git) of GarganText:
- _dev_ branch for latest development
......
This diff is collapsed.
{
"corpusPath" : "Gargantext_DocsList-nodeId-185487.csv",
"listPath" : "Gargantext_NgramsList-185488.csv",
"corpusPath" : "Gargantext_DocsList-nodeId-185487.tsv",
"listPath" : "Gargantext_NgramsList-185488.tsv",
"outputPath" : "data",
"corpusParser" : {
"tag" : "Csv",
"_csv_limit" : 1500000
"tag" : "Tsv",
"_tsv_limit" : 1500000
},
"listParser" : "V3",
"phyloName" : "bpa",
......
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeApplications #-}
module Main where
import Control.DeepSeq
......
{-|
Module : Main.hs
Description : Gargantext Admin tools
Copyright : (c) CNRS, 2017-Present
License : AGPL + CECILL v3
Maintainer : team@gargantext.org
Stability : experimental
Portability : POSIX
-}
{-# LANGUAGE Strict #-}
module Main where
import Gargantext.API.Dev (withDevEnv, runCmdDev)
import Gargantext.API.Errors.Types
import Gargantext.Database.Action.User.New (newUsers)
import Gargantext.Database.Admin.Types.Node
import Gargantext.Database.Prelude (Cmd'')
import Gargantext.Prelude
import Gargantext.API.Admin.EnvTypes (DevEnv)
import qualified Data.List.NonEmpty as NE
main :: IO ()
main = do
(iniPath:mails) <- getArgs
withDevEnv iniPath $ \env -> do
x <- runCmdDev env ((newUsers $ NE.map cs (NE.fromList mails)) :: Cmd'' DevEnv BackendInternalError (NonEmpty UserId))
putStrLn (show x :: Text)
pure ()
import Prelude (IO, id, (.))
import Data.Aeson (encode)
import Codec.Serialise (deserialise)
import qualified Data.ByteString.Lazy as L
import Gargantext.Core.NodeStory (NodeListStory)
main :: IO ()
main = L.interact (encode . (id :: NodeListStory -> NodeListStory) . deserialise)
{-|
Module : Main.hs
Description : Gargantext central exchange for async notifications
Copyright : (c) CNRS, 2017-Present
License : AGPL + CECILL v3
Maintainer : team@gargantext.org
Stability : experimental
Portability : POSIX
-}
{-# LANGUAGE Strict #-}
module Main where
import Control.Concurrent (threadDelay)
import Control.Monad (join, mapM_)
import Data.ByteString.Char8 qualified as C
import Data.Text qualified as T
import Gargantext.Core.AsyncUpdates.CentralExchange (gServer)
import Gargantext.Core.AsyncUpdates.Constants (ceBind, ceConnect)
import Gargantext.Prelude
import Nanomsg
import Options.Applicative
data Command =
CEServer
| SimpleServer
| WSServer
| Client
parser :: Parser (IO ())
parser = subparser
( command "ce-server" (info (pure gServer) idm)
<> command "simple-server" (info (pure simpleServer) idm)
<> command "ws-server" (info (pure wsServer) idm)
<> command "client" (info (pure gClient) idm) )
main :: IO ()
main = join $ execParser (info parser idm)
simpleServer :: IO ()
simpleServer = do
withSocket Pull $ \s -> do
_ <- bind s ceBind
putText "[simpleServer] receiving"
forever $ do
mr <- recv s
C.putStrLn mr
-- case mr of
-- Nothing -> pure ()
-- Just r -> C.putStrLn r
-- threadDelay 10000
wsServer :: IO ()
wsServer = do
withSocket Pull $ \ws -> do
_ <- bind ws "ws://*:5560"
forever $ do
putText "[wsServer] receiving"
r <- recv ws
C.putStrLn r
gClient :: IO ()
gClient = do
withSocket Push $ \s -> do
_ <- connect s ceConnect
-- let str = C.unwords (take 10 $ repeat "hello")
let str = "{\"type\": \"update_tree_first_level\", \"node_id\": -1}"
C.putStrLn $ C.pack "sending: " <> str
send s str
withSocket Push $ \s -> do
_ <- connect s ceConnect
let str2 = "{\"type\": \"update_tree_first_level\", \"node_id\": -2}"
C.putStrLn $ C.pack "sending: " <> str2
send s str2
module CLI.Admin (
adminCLI
, adminCmd
) where
import CLI.Parsers
import CLI.Types
import Data.List.NonEmpty qualified as NE
import Data.Text qualified as T
import Gargantext.API.Admin.EnvTypes
import Gargantext.API.Dev
import Gargantext.API.Errors
import Gargantext.Core.Types
import Gargantext.Database.Action.User.New
import Gargantext.Database.Prelude
import Gargantext.Prelude
import Options.Applicative
import Prelude (String)
adminCLI :: AdminArgs -> IO ()
adminCLI (AdminArgs settingsPath mails) = do
withDevEnv settingsPath $ \env -> do
x <- runCmdDev env ((newUsers $ NE.map cs (NE.fromList mails)) :: Cmd'' DevEnv BackendInternalError (NonEmpty UserId))
putStrLn (show x :: Text)
adminCmd :: HasCallStack => Mod CommandFields CLI
adminCmd = command "admin" (info (helper <*> fmap CLISub admin_p) (progDesc "Create users."))
admin_p :: Parser CLICmd
admin_p = fmap CCMD_admin $ AdminArgs
<$> settings_p
<*> ( option (maybeReader emails_p) ( long "emails"
<> metavar "email1,email2,..."
<> help "A comma-separated list of emails."
) )
emails_p :: String -> Maybe [String]
emails_p s = case T.splitOn "," (T.pack s) of
[] -> Nothing
xs -> pure $ map T.unpack xs
module Main where
module CLI.FileDiff where
import Prelude
import CLI.Types
import Data.List qualified as L
import Data.Text qualified as T
import Data.Text.IO qualified as TIO
import Data.TreeDiff.Class
import Data.TreeDiff.Pretty
import qualified Data.Text as T
import qualified Data.Text.IO as TIO
import System.Environment (getArgs)
import System.Exit (exitFailure)
import Control.Monad (unless)
import qualified Data.List as L
import Gargantext.Prelude (HasCallStack, unless, exitFailure)
import Options.Applicative
import Prelude
-- | Renders in a pretty way the content of two golden files. The
-- first file should contain the expected output, the second the
-- actual data generated by the test suite.
main :: IO ()
main = do
(refPath:newPath:_) <- getArgs
fileDiffCLI :: GoldenFileDiffArgs -> IO ()
fileDiffCLI (GoldenFileDiffArgs refPath newPath) = do
ref <- T.lines <$> TIO.readFile refPath
new <- T.lines <$> TIO.readFile newPath
......@@ -25,3 +24,17 @@ main = do
unless (L.null differences) $ do
putStrLn $ show $ ansiWlEditExpr $ ediff' (map fst differences) (map snd differences)
exitFailure
fileDiffCmd :: HasCallStack => Mod CommandFields CLI
fileDiffCmd = command "golden-file-diff" (info (helper <*> fmap CLISub filediff_p) (progDesc "Compare the output of two golden files."))
filediff_p :: Parser CLICmd
filediff_p = fmap CCMD_golden_file_diff $ GoldenFileDiffArgs
<$> ( strOption ( long "expected"
<> metavar "FILEPATH"
<> help "Path to the file containing the expected output."
) )
<*> ( strOption ( long "actual"
<> metavar "FILEPATH"
<> help "Path to the file containing the actual output."
) )
module CLI.FilterTermsAndCooc (
filterTermsAndCoocCmd
, filterTermsAndCoocCLI
-- * Testing functions
, testCorpus
, testTermList
) where
import CLI.Types
import Control.Concurrent.Async as CCA (mapConcurrently)
import Data.Aeson ( encode )
import Data.Map.Strict qualified as DM
import Data.Text (pack)
import Data.Text qualified as DT
import Data.Text.Lazy qualified as DTL
import Data.Text.Lazy.Encoding qualified as TLE
import Data.Tuple.Extra (both)
import Data.Vector qualified as DV
import GHC.Generics
import Gargantext.Core.Text.Context (TermList)
import Gargantext.Core.Text.Corpus.Parsers.TSV (readTSVFile, tsv_title, tsv_abstract, tsv_publication_year, fromMIntOrDec, defaultYear)
import Gargantext.Core.Text.List.Formats.TSV (tsvMapTermList)
import Gargantext.Core.Text.Metrics.Count (coocOnContexts, Coocs)
import Gargantext.Core.Text.Terms.WithList ( Patterns, buildPatterns, extractTermsWithList )
import Gargantext.Prelude
import Options.Applicative
------------------------------------------------------------------------
-- OUTPUT format
data CoocByYear = CoocByYear { year :: Int
, nbContexts :: NbContexts
, coocurrences :: Map (Text, Text) Coocs
} deriving (Show, Generic)
data CoocByYears = CoocByYears { years :: [CoocByYear] }
deriving (Show, Generic)
type NbContexts = Int
instance ToJSON CoocByYear
instance ToJSON CoocByYears
------------------------------------------------------------------------
filterTermsAndCoocCLI :: CorpusFile -> TermListFile -> OutputFile -> IO ()
filterTermsAndCoocCLI (CorpusFile corpusFile) (TermListFile termListFile) (OutputFile outputFile) = do
--corpus :: IO (DM.IntMap [[Text]])
eCorpusFile <- readTSVFile corpusFile
case eCorpusFile of
Right cf -> do
let corpus = DM.fromListWith (<>)
. DV.toList
. DV.map (\n -> (fromMIntOrDec defaultYear $ tsv_publication_year n, [(tsv_title n) <> " " <> (tsv_abstract n)]))
. snd $ cf
-- termListMap :: [Text]
termList <- tsvMapTermList termListFile
putText $ show $ length termList
let patterns = buildPatterns termList
-- r <- mapConcurrentlyChunked (filterTermsAndCooc patterns) (DM.toList corpus)
r <- mapConcurrently (filterTermsAndCooc patterns) (DM.toList corpus)
writeFile outputFile $ DTL.toStrict $ TLE.decodeUtf8 $ encode (CoocByYears r)
Left e -> panicTrace $ "Error: " <> e
filterTermsAndCooc
:: Patterns
-> (Int, [Text])
-> IO CoocByYear -- (Int, (Map (Text, Text) Coocs))
filterTermsAndCooc patterns (year, ts) = do
logWork "start"
r <- coocOnContexts identity <$> mapM (\x -> {-log "work" >>-} terms' patterns x) ts
logWork "stop"
pure $ CoocByYear year (length ts) (DM.mapKeys (both DT.unwords) r)
where
logWork m = do
tid <- myThreadId
(p, _) <- threadCapability tid
putText . unwords $
["filterTermsAndCooc:", m, show year, "on proc", show p]
--terms' :: Patterns -> Text -> Corpus [[Text]]
terms' :: Applicative f => Patterns -> Text -> f [[Text]]
terms' pats txt = pure $ concat $ extractTermsWithList pats txt
-- | TODO Minimal Example
--testCooc = do
-- let patterns = buildPatterns testTermList
-- mapM (\x -> {-log "work" >>-} terms' patterns x) $ catMaybes $ map (head . snd) testCorpus
-- --mapConcurrently (filterTermsAndCooc patterns) testCorpus
testCorpus :: [(Int, [Text])]
testCorpus = [ (1998, [pack "The beees"])
, (1999, [ pack "The bees and the flowers"
--, pack "The bees and the flowers"
])
]
testTermList :: TermList
testTermList = [ ([pack "bee"], [[pack "bees"]])
, ([pack "flower"], [[pack "flowers"]])
]
--
-- CLI API
--
filterTermsAndCoocCmd :: HasCallStack => Mod CommandFields CLI
filterTermsAndCoocCmd = command "filter-terms" (info (helper <*> fmap CLISub filterTerms) (progDesc "Filter Terms and Cooc."))
filterTerms :: Parser CLICmd
filterTerms = CCMD_filter_terms_and_cooc
<$> (option str (long "corpus-file" <> metavar "FILE"))
<*> (option str (long "terms-list-file" <> metavar "FILE"))
<*> (option str (long "output-file" <> metavar "FILE"))
{-|
Module : Main.hs
Module : Import.hs
Description : Gargantext Import Corpus
Copyright : (c) CNRS, 2017-Present
License : AGPL + CECILL v3
......@@ -12,10 +12,14 @@ Import a corpus binary.
-}
{-# LANGUAGE Strict #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE LambdaCase #-}
module Main where
module CLI.Import where
import Data.Text qualified as Text
import CLI.Parsers
import CLI.Types
import Gargantext.API.Admin.EnvTypes (DevEnv(..), DevJobHandle(..))
import Gargantext.API.Dev (withDevEnv, runCmdGargDev)
import Gargantext.API.Errors.Types ( BackendInternalError )
......@@ -23,66 +27,62 @@ import Gargantext.API.Node () -- instances
import Gargantext.Core (Lang(..))
import Gargantext.Core.Text.Corpus.Parsers (FileFormat(..), FileType(..))
import Gargantext.Core.Types.Individu (User(..))
import Gargantext.Core.Types.Query (Limit)
import Gargantext.Core.Types.Query
import Gargantext.Database.Action.Flow (flowCorpusFile, flowAnnuaire, TermType(..))
import Gargantext.Database.Action.Flow.Types (FlowCmdM)
import Gargantext.Database.Admin.Types.Node (CorpusId)
import Gargantext.Database.Query.Tree.Root (MkCorpusUser(MkCorpusUserNormalCorpusName))
import Gargantext.Prelude
import Gargantext.Utils.Jobs.Monad ( MonadJobStatus, JobHandle )
import Options.Applicative
import Prelude (String)
import qualified Data.Text as T
main :: IO ()
main = do
[fun, user, name, iniPath, limit, corpusPath] <- getArgs
--{-
importCLI :: ImportArgs -> IO ()
importCLI (ImportArgs fun user name settingsPath limit corpusPath) = do
let
--tt = (Unsupervised EN 6 0 Nothing)
tt = (Multi EN)
format = CsvGargV3 -- CsvHal --WOS
limit' = case (readMaybe limit :: Maybe Limit) of
Nothing -> panicTrace $ "Cannot read limit: " <> (Text.pack limit)
Just l -> l
tt = Multi EN
format = TsvGargV3
corpus :: forall m. (FlowCmdM DevEnv BackendInternalError m, MonadJobStatus m, JobHandle m ~ DevJobHandle) => m CorpusId
mkCorpusUser = MkCorpusUserNormalCorpusName (UserName $ cs user) (cs name :: Text)
corpus = flowCorpusFile mkCorpusUser limit' tt format Plain corpusPath Nothing DevJobHandle
corpus = flowCorpusFile mkCorpusUser limit tt format Plain corpusPath Nothing DevJobHandle
corpusCsvHal :: forall m. (FlowCmdM DevEnv BackendInternalError m, MonadJobStatus m, JobHandle m ~ DevJobHandle) => m CorpusId
corpusCsvHal = flowCorpusFile mkCorpusUser limit' tt CsvHal Plain corpusPath Nothing DevJobHandle
corpusTsvHal :: forall m. (FlowCmdM DevEnv BackendInternalError m, MonadJobStatus m, JobHandle m ~ DevJobHandle) => m CorpusId
corpusTsvHal = flowCorpusFile mkCorpusUser limit tt TsvHal Plain corpusPath Nothing DevJobHandle
annuaire :: forall m. (FlowCmdM DevEnv BackendInternalError m, MonadJobStatus m, JobHandle m ~ DevJobHandle) => m CorpusId
annuaire = flowAnnuaire (MkCorpusUserNormalCorpusName (UserName $ cs user) "Annuaire") (Multi EN) corpusPath DevJobHandle
{-
let debatCorpus :: forall m. FlowCmdM DevEnv BackendInternalError m => m CorpusId
debatCorpus = do
docs <- liftIO ( splitEvery 500
<$> take (read limit :: Int)
<$> readFile corpusPath
:: IO [[GrandDebatReference ]]
)
flowCorpus (Text.pack user) (Text.pack name) (Multi FR) (map (map toHyperdataDocument) docs)
--}
withDevEnv settingsPath $ \env -> do
void $ case fun of
IF_corpus
-> runCmdGargDev env corpus
IF_corpusTsvHal
-> runCmdGargDev env corpusTsvHal
IF_annuaire
-> runCmdGargDev env annuaire
importCmd :: HasCallStack => Mod CommandFields CLI
importCmd = command "import" (info (helper <*> fmap CLISub import_p) (progDesc "Import CLI."))
withDevEnv iniPath $ \env -> do
_ <- if fun == "corpus"
then runCmdGargDev env corpus
else pure 0 --(cs "false")
renderImportFunction :: ImportFunction -> T.Text
renderImportFunction = T.drop 3 . T.pack . show
_ <- if fun == "corpusCsvHal"
then runCmdGargDev env corpusCsvHal
else pure 0 --(cs "false")
import_p :: Parser CLICmd
import_p = fmap CCMD_import $ ImportArgs
<$> ( option (eitherReader function_p) ( long "function"
<> help ("The function to use, one between: " <> (T.unpack $ T.intercalate "," $ map renderImportFunction [minBound .. maxBound]))
) )
<*> ( option str ( long "user") )
<*> ( option str ( long "name") )
<*> settings_p
<*> (fmap Limit ( option auto ( long "limit" <> metavar "INT" <> help "The limit for the query") ))
<*> ( option str ( long "corpus-path" <> help "Path to corpus file") )
_ <- if fun == "annuaire"
then runCmdGargDev env annuaire
else pure 0
{-
_ <- if corpusType == "csv"
then runCmdDev env csvCorpus
else if corpusType == "debat"
then runCmdDev env debatCorpus
else panic "corpusType unknown: try \"csv\" or \"debat\""
-}
pure ()
function_p :: String -> Either String ImportFunction
function_p = \case
"corpus" -> Right IF_corpus
"corpusTsvHal" -> Right IF_corpusTsvHal
"annuaire" -> Right IF_annuaire
xs -> Left $ "Unrecognised function: " <> xs
{-|
Module : Ini.hs
Description : Gargantext Ini file
Copyright : (c) CNRS, 2024-Present
License : AGPL + CECILL v3
Maintainer : team@gargantext.org
Stability : experimental
Portability : POSIX
Import a corpus binary.
-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE Strict #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE TypeApplications #-}
module CLI.Ini where
import CLI.Types
import Control.Monad.Logger (LogLevel(LevelDebug))
import Data.Text qualified as T
import Data.Text.IO qualified as T (writeFile)
import Database.PostgreSQL.Simple qualified as PGS
import Gargantext.Core.Config qualified as Config
import Gargantext.Core.Config.Ini.Ini qualified as Ini
import Gargantext.Core.Config.Ini.Mail qualified as IniMail
import Gargantext.Core.Config.Ini.NLP qualified as IniNLP
import Gargantext.Core.Config.Types qualified as CTypes
import Gargantext.Prelude
import Options.Applicative
import Servant.Client.Core (parseBaseUrl)
import Toml qualified
iniCLI :: IniArgs -> IO ()
iniCLI iniArgs = do
let iniPath = fromMaybe "gargantext.ini" $ ini_path iniArgs
let tomlPath = fromMaybe "gargantext-settings.toml" $ toml_path iniArgs
putStrLn $ "Reading configuration from file " <> iniPath <> "..."
ini <- Ini.readConfig iniPath
iniMail <- IniMail.readConfig iniPath
iniNLP <- IniNLP.readConfig iniPath
connInfo <- Ini.readDBConfig iniPath
let c = convertConfigs ini iniMail iniNLP connInfo
T.writeFile tomlPath (show (Toml.encode c) :: Text)
putStrLn $ "Converted configuration into TOML and wrote it to file " <> tomlPath
iniCmd :: HasCallStack => Mod CommandFields CLI
iniCmd = command "ini" (info (helper <*> fmap CLISub iniParser)
(progDesc "Parse .ini file and output a corresponding .toml file."))
iniParser :: Parser CLICmd
iniParser = fmap CCMD_ini $ IniArgs <$>
(optional . strOption $ long "ini-path" <> help "Path to the input ini file" ) <*>
(optional . strOption $ long "toml-path" <> help "Path to the output .toml file")
convertConfigs :: Ini.GargConfig -> IniMail.MailConfig -> IniNLP.NLPConfig -> PGS.ConnectInfo -> Config.GargConfig
convertConfigs ini@(Ini.GargConfig { .. }) iniMail nlpConfig connInfo =
Config.GargConfig { _gc_secrets = CTypes.SecretsConfig { _s_master_user = _gc_masteruser
, _s_secret_key = _gc_secretkey
, _s_jwk_file = CTypes.JWKFile "dev.jwk" }
, _gc_datafilepath
, _gc_mail_config = iniMail
, _gc_nlp_config = nlpConfig
, _gc_frontend_config = mkFrontendConfig ini
, _gc_database_config = connInfo
, _gc_notifications_config = defaultNotificationsConfig
, _gc_frames = CTypes.FramesConfig { _f_write_url = _gc_frame_write_url
, _f_calc_url = _gc_frame_calc_url
, _f_visio_url = _gc_frame_visio_url
, _f_searx_url = _gc_frame_searx_url
, _f_istex_url = _gc_frame_istex_url }
, _gc_jobs = CTypes.JobsConfig { _jc_max_docs_parsers = _gc_max_docs_parsers
, _jc_max_docs_scrapers = _gc_max_docs_scrapers
, _jc_js_job_timeout = _gc_js_job_timeout
, _jc_js_id_timeout = _gc_js_id_timeout }
, _gc_apis = CTypes.APIsConfig { _ac_pubmed_api_key = _gc_pubmed_api_key
, _ac_epo_api_url = _gc_epo_api_url
, _ac_scrapyd_url }
, _gc_log_level = LevelDebug
}
where
_ac_scrapyd_url =
case parseBaseUrl "http://localhost:6800" of
Nothing -> panicTrace "Cannot parse base url for scrapyd"
Just b -> b
mkFrontendConfig :: Ini.GargConfig -> CTypes.FrontendConfig
mkFrontendConfig (Ini.GargConfig { .. }) =
CTypes.FrontendConfig { _fc_url = _gc_url
, _fc_backend_name = _gc_backend_name
, _fc_url_backend_api = _gc_url_backend_api
, _fc_cors
, _fc_microservices
, _fc_appPort = 3000
, _fc_cookie_settings = CTypes.defaultCookieSettings }
where
_fc_cors = CTypes.CORSSettings { _corsAllowedOrigins = [
toCORSOrigin "https://demo.gargantext.org"
, toCORSOrigin "https://formation.gargantext.org"
, toCORSOrigin "https://academia.sub.gargantext.org"
, toCORSOrigin "https://cnrs.gargantext.org"
, toCORSOrigin "https://imt.sub.gargantext.org"
, toCORSOrigin "https://helloword.gargantext.org"
, toCORSOrigin "https://complexsystems.gargantext.org"
, toCORSOrigin "https://europa.gargantext.org"
, toCORSOrigin "https://earth.sub.gargantext.org"
, toCORSOrigin "https://health.sub.gargantext.org"
, toCORSOrigin "https://msh.sub.gargantext.org"
, toCORSOrigin "https://dev.sub.gargantext.org"
, toCORSOrigin "http://localhost:8008"
, toCORSOrigin "http://localhost:8108"
, toCORSOrigin "http://localhost:3000"
]
, _corsAllowedHosts = []
, _corsUseOriginsForHosts = True }
_fc_microservices = CTypes.MicroServicesSettings { _msProxyPort = 8009
, _msProxyEnabled = False }
toCORSOrigin :: Text -> CTypes.CORSOrigin
toCORSOrigin url =
case parseBaseUrl (T.unpack url) of
Nothing -> panicTrace $ "Cannot parse base url for: " <> url
Just b -> CTypes.CORSOrigin b
defaultNotificationsConfig :: CTypes.NotificationsConfig
defaultNotificationsConfig =
CTypes.NotificationsConfig { _nc_central_exchange_bind = "tcp://*:5560"
, _nc_central_exchange_connect = "tcp://localhost:5560"
, _nc_dispatcher_bind = "tcp://*:5561"
, _nc_dispatcher_connect = "tcp://localhost:5561" }
{-|
Module : Main.hs
Description : Gargantext Import Corpus
Module : Init.hs
Description : Gargantext Init Script
Copyright : (c) CNRS, 2017-Present
License : AGPL + CECILL v3
Maintainer : team@gargantext.org
Stability : experimental
Portability : POSIX
Import a corpus binary.
Initialise the Gargantext dataset.
-}
{-# LANGUAGE Strict #-}
module Main where
module CLI.Init where
import CLI.Parsers
import CLI.Types
import Data.List.NonEmpty qualified as NE
import Gargantext.API.Dev (withDevEnv, runCmdDev)
import Gargantext.API.Errors.Types
import Gargantext.API.Node () -- instances only
import Gargantext.Core.Config (GargConfig(..))
import Gargantext.Core.Config.Types (SecretsConfig(..))
import Gargantext.Core.Config.Utils (readConfig)
import Gargantext.Core.Types.Individu (User(..), arbitraryNewUsers, NewUser(..), arbitraryUsername, GargPassword(..))
import Gargantext.Database.Action.Flow (getOrMkRoot, getOrMkRootWithCorpus)
import Gargantext.Database.Admin.Trigger.Init (initFirstTriggers, initLastTriggers)
import Gargantext.Database.Admin.Types.Hyperdata (HyperdataCorpus)
import Gargantext.Database.Admin.Types.Node
import Gargantext.Database.Prelude (Cmd, DBCmd)
import Gargantext.Database.Prelude (DBCmd')
import Gargantext.Database.Prelude (DBCmd)
import Gargantext.Database.Query.Table.Node (getOrMkList)
import Gargantext.Database.Query.Table.User (insertNewUsers, )
import Gargantext.Database.Query.Tree.Root (MkCorpusUser(MkCorpusUserMaster))
import Gargantext.Prelude
import Gargantext.Prelude.Config (GargConfig(..), readConfig)
import Options.Applicative
main :: IO ()
main = do
params@[iniPath] <- getArgs
_ <- if length params /= 1
then panicTrace "USAGE: ./gargantext-init gargantext.ini"
else pure ()
initCLI :: InitArgs -> IO ()
initCLI (InitArgs settingsPath) = do
putStrLn ("Enter master user (gargantua) _password_ :" :: Text)
password <- getLine
putStrLn ("Enter master user (gargantua) _email_ :" :: Text)
email <- getLine
cfg <- readConfig iniPath
let secret = _gc_secretkey cfg
cfg <- readConfig settingsPath
let secret = _s_secret_key $ _gc_secrets cfg
let createUsers :: Cmd BackendInternalError Int64
let createUsers :: forall env. DBCmd' env BackendInternalError Int64
createUsers = insertNewUsers (NewUser "gargantua" (cs email) (GargPassword $ cs password)
NE.:| arbitraryNewUsers
)
let
mkRoots :: Cmd BackendInternalError [(UserId, RootId)]
mkRoots :: forall env. DBCmd' env BackendInternalError [(UserId, RootId)]
mkRoots = mapM getOrMkRoot $ map UserName ("gargantua" : arbitraryUsername)
-- TODO create all users roots
let
initMaster :: Cmd BackendInternalError (UserId, RootId, CorpusId, ListId)
initMaster :: forall env. DBCmd' env BackendInternalError (UserId, RootId, CorpusId, ListId)
initMaster = do
(masterUserId, masterRootId, masterCorpusId)
<- getOrMkRootWithCorpus MkCorpusUserMaster
......@@ -69,10 +69,16 @@ main = do
_triggers <- initLastTriggers masterListId
pure (masterUserId, masterRootId, masterCorpusId, masterListId)
withDevEnv iniPath $ \env -> do
withDevEnv settingsPath $ \env -> do
_ <- runCmdDev env (initFirstTriggers secret :: DBCmd BackendInternalError [Int64])
_ <- runCmdDev env createUsers
x <- runCmdDev env initMaster
_ <- runCmdDev env mkRoots
putStrLn (show x :: Text)
pure ()
initCmd :: HasCallStack => Mod CommandFields CLI
initCmd = command "init" (info (helper <*> fmap CLISub init_p) (progDesc "Initialise this Gargantext instance."))
init_p :: Parser CLICmd
init_p = fmap CCMD_init $ InitArgs
<$> settings_p
{-|
Module : Invitations.hs
Description : GarganText Mailing Invitations
Copyright : (c) CNRS, 2017-Present
License : AGPL + CECILL v3
Maintainer : team@gargantext.org
Stability : experimental
Portability : POSIX
-}
{-# LANGUAGE Strict #-}
module CLI.Invitations where
import CLI.Parsers
import CLI.Types
import Gargantext.API.Dev (withDevEnv, runCmdDev)
import Gargantext.API.Errors.Types
import Gargantext.API.Node () -- instances only
import Gargantext.API.Node.Share qualified as Share
import Gargantext.API.Node.Share.Types qualified as Share
import Gargantext.Core.AsyncUpdates.CentralExchange.Types qualified as CET
import Gargantext.Core.NLP (HasNLPServer)
import Gargantext.Core.Types
import Gargantext.Core.Types.Individu (User(..))
import Gargantext.Database.Prelude (CmdRandom)
import Gargantext.Prelude
import Options.Applicative
import Prelude (String)
invitationsCLI :: InvitationsArgs -> IO ()
invitationsCLI (InvitationsArgs settingsPath user node_id email) = do
-- _cfg <- readConfig settingsPath
let invite :: ( CmdRandom env BackendInternalError m
, HasNLPServer env
, CET.HasCentralExchangeNotification env ) => m Int
invite = Share.api (UserName $ cs user) node_id (Share.ShareTeamParams $ cs email)
withDevEnv settingsPath $ \env -> do
void $ runCmdDev env invite
invitationsCmd :: HasCallStack => Mod CommandFields CLI
invitationsCmd = command "invitations" (info (helper <*> fmap CLISub invitations_p) (progDesc "Mailing invitations."))
invitations_p :: Parser CLICmd
invitations_p = fmap CCMD_invitations $ InvitationsArgs
<$> settings_p
<*> ( strOption ( long "user" ) )
<*> ( option (eitherReader node_p) ( long "node-id" <> metavar "POSITIVE-INT" <> help "The node ID.") )
<*> ( strOption ( long "email" <> help "The email address.") )
node_p :: String -> Either String NodeId
node_p i = case readMaybe i of
Nothing -> Left $ i <> " is not a valid integer."
Just xs
| xs < 0 -> Left $ "The node id needs to be a positive integer."
| otherwise
-> Right $ UnsafeMkNodeId xs
......@@ -28,8 +28,10 @@ https://stackoverflow.com/questions/876522/creating-a-copy-of-a-database-in-post
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE Strict #-}
module Main where
module CLI.ObfuscateDB (
obfuscateDB
, obfuscateDBCmd
) where
import Data.Text qualified as T
import Database.PostgreSQL.Simple qualified as PSQL
......@@ -37,23 +39,16 @@ import Database.PostgreSQL.Simple.SqlQQ (sql)
import Gargantext.Core (toDBid)
import Gargantext.Database.Admin.Config ()
import Gargantext.Database.Admin.Types.Node (NodeType(..))
import Gargantext.Prelude hiding (option)
import Gargantext.Prelude
import Gargantext.Prelude.Database (runPGSExecute, runPGSQuery)
import Options.Applicative.Simple
import CLI.Types
import Options.Applicative
data Args = Args {
dbHost :: Text
, dbPort :: Int
, dbName :: Text
, dbUser :: Text
, dbPassword :: Text
} deriving (Show, Eq)
obfuscateDBCmd :: HasCallStack => Mod CommandFields CLI
obfuscateDBCmd = command "obfuscate-db" (info (helper <*> fmap CLISub obfuscateDB_p) (progDesc "Obfuscate a cloned Gargantext DB."))
args :: Parser Args
args = Args
obfuscateDB_p :: Parser CLICmd
obfuscateDB_p = fmap CCMD_obfuscate_db $ ObfuscateDBArgs
<$> ( strOption ( long "db-host"
<> metavar "db-host"
<> help "Location of the DB server"
......@@ -71,17 +66,9 @@ args = Args
<*> ( strOption ( long "db-password"
<> metavar "db-password"
<> value "" ))
main :: IO ()
main = do
(opts, ()) <-
simpleOptions "0.0.1"
"gargantext DB obfuscation"
"Obfuscates a cloned Gargantext DB"
args
empty
obfuscateDB :: ObfuscateDBArgs -> IO ()
obfuscateDB opts = do
putText $ show opts
let ci = PSQL.ConnectInfo { connectHost = T.unpack $ dbHost opts
......@@ -101,7 +88,7 @@ main = do
obfuscateNotes :: PSQL.Connection -> IO ()
obfuscateNotes c = do
let nt = toDBid Notes
_ <- runPGSExecute c [sql|UPDATE nodes SET name = concat('notes-', id) WHERE typename = ?;|] (PSQL.Only nt)
nsNew <- runPGSQuery c [sql|SELECT id, name FROM nodes WHERE typename = ?|] (PSQL.Only nt) :: IO [(Int, Text)]
......
{-| Common parsers for the CLI. -}
module CLI.Parsers where
import Prelude
import Gargantext.Core.Config.Types (SettingsFile(..))
import Options.Applicative
settings_p :: Parser SettingsFile
settings_p = maybe (SettingsFile "gargantext-settings.toml") SettingsFile <$>
optional ( strOption ( long "settings-path"
<> short 'c'
<> metavar "FILEPATH"
<> value "gargantext-settings.toml"
<> showDefault
<> help "Location of the gargantext-settings.toml file"
) )
{-|
Module : Phylo.hs
Description : Gargantext starter binary with Adaptative Phylo
Copyright : (c) CNRS, 2017-Present
License : AGPL + CECILL v3
Maintainer : team@gargantext.org
Stability : experimental
Portability : POSIX
Adaptative Phylo binaries
-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE Strict #-}
module CLI.Phylo where
import CLI.Phylo.Common
import CLI.Types
import Data.Aeson (eitherDecodeFileStrict')
import Data.List (nub)
import Data.Text qualified as T
import GHC.IO.Encoding
import Gargantext.Core.Viz.Phylo
import Gargantext.Core.Viz.Phylo.API.Tools
import Gargantext.Core.Viz.Phylo.PhyloExport (toPhyloExport, dotToFile)
import Gargantext.Core.Viz.Phylo.PhyloMaker (toPhylo, toPhyloWithoutLink)
import Gargantext.Core.Viz.Phylo.PhyloTools (printIOMsg, printIOComment, setConfig)
import Gargantext.Prelude hiding (hash, replace)
import Options.Applicative
import System.Directory (doesFileExist)
phyloCLI :: PhyloArgs -> IO ()
phyloCLI (PhyloArgs configPath) = do
setLocaleEncoding utf8
config_e <- eitherDecodeFileStrict' configPath
case config_e of
Left err -> panicTrace $ T.pack err
Right config -> do
currentLocale <- getLocaleEncoding
printIOMsg $ "Machine locale: " <> show currentLocale
printIOMsg "Starting the reconstruction"
printIOMsg "Parse the corpus"
mapList <- fileToList (listParser config) (listPath config)
corpus <- if (defaultMode config)
then fileToDocsDefault (corpusParser config) (corpusPath config) [Year 3 1 5,Month 3 1 5,Week 4 2 5] mapList
else fileToDocsAdvanced (corpusParser config) (corpusPath config) (timeUnit config) mapList
printIOComment (show (length corpus) <> " parsed docs from the corpus")
printIOComment (show (length $ nub $ concat $ map text corpus) <> " Size ngs_coterms")
printIOComment (show (length mapList) <> " Size ngs_terms List Map Ngrams")
printIOMsg "Reconstruct the phylo"
-- check the existing backup files
let backupPhyloWithoutLink = (outputPath config) <> "backupPhyloWithoutLink_" <> (configToSha BackupPhyloWithoutLink config) <> ".json"
let backupPhylo = (outputPath config) <> "backupPhylo_" <> (configToSha BackupPhylo config) <> ".json"
phyloWithoutLinkExists <- doesFileExist backupPhyloWithoutLink
phyloExists <- doesFileExist backupPhylo
-- reconstruct the phylo
phylo <- if phyloExists
then do
printIOMsg "Reconstruct the phylo from an existing file"
readPhylo backupPhylo
else do
if phyloWithoutLinkExists
then do
printIOMsg "Reconstruct the phylo from an existing file without links"
phyloWithoutLink <- readPhylo backupPhyloWithoutLink
writePhylo backupPhyloWithoutLink phyloWithoutLink
pure $ toPhylo (setConfig config phyloWithoutLink)
else do
printIOMsg "Reconstruct the phylo from scratch"
phyloWithoutLink <- pure $ toPhyloWithoutLink corpus config
writePhylo backupPhyloWithoutLink phyloWithoutLink
pure $ toPhylo (setConfig config phyloWithoutLink)
writePhylo backupPhylo phylo
printIOMsg "End of reconstruction, start the export"
let dot = toPhyloExport (setConfig config phylo)
let output = configToLabel config
dotToFile output dot
phyloCmd :: HasCallStack => Mod CommandFields CLI
phyloCmd = command "phylo" (info (helper <*> fmap CLISub phylo_p) (progDesc "Phylo toolkit."))
phylo_p :: Parser CLICmd
phylo_p = fmap CCMD_phylo $ PhyloArgs
<$> ( strOption ( long "config"
<> metavar "FILEPATH"
<> help "Path to a file containing a JSON to be parsed into a PhyloConfig"
) )
{-# LANGUAGE OverloadedStrings #-}
module Common where
module CLI.Phylo.Common where
import Control.Concurrent.Async (mapConcurrently)
import Crypto.Hash.SHA256 (hash)
......@@ -15,9 +14,9 @@ import Gargantext.API.Ngrams.Prelude (toTermList)
import Gargantext.API.Ngrams.Types
import Gargantext.Core.Text.Context (TermList)
import Gargantext.Core.Text.Corpus.Parsers (FileFormat(..), FileType(..), parseFile)
import Gargantext.Core.Text.Corpus.Parsers.CSV (csv_title, csv_abstract, csv_publication_year, csv_publication_month, csv_publication_day, csv'_source, csv'_title, csv'_abstract, csv'_publication_year, csv'_publication_month, csv'_publication_day, csv'_weight)
import Gargantext.Core.Text.Corpus.Parsers.CSV qualified as Csv
import Gargantext.Core.Text.List.Formats.CSV (csvMapTermList)
import Gargantext.Core.Text.Corpus.Parsers.TSV (tsv_title, tsv_abstract, tsv_publication_year, tsv_publication_month, tsv_publication_day, tsv'_source, tsv'_title, tsv'_abstract, tsv'_publication_year, tsv'_publication_month, tsv'_publication_day, tsv'_weight)
import Gargantext.Core.Text.Corpus.Parsers.TSV qualified as Tsv
import Gargantext.Core.Text.List.Formats.TSV (tsvMapTermList)
import Gargantext.Core.Text.Ngrams (NgramsType(..))
import Gargantext.Core.Text.Terms.WithList (Patterns, buildPatterns, extractTermsWithList)
import Gargantext.Core.Types.Main (ListType(..))
......@@ -76,29 +75,31 @@ wosToDocs limit patterns time path = do
<$> fromRight [] <$> parseFile WOS Plain (path <> file) ) files
-- To transform a Csv file into a list of Document
csvToDocs :: CorpusParser -> Patterns -> TimeUnit -> FilePath -> IO [Document]
csvToDocs parser patterns time path =
-- To transform a Tsv file into a list of Document
tsvToDocs :: CorpusParser -> Patterns -> TimeUnit -> FilePath -> IO [Document]
tsvToDocs parser patterns time path =
case parser of
Wos _ -> Prelude.error "csvToDocs: unimplemented"
Csv limit -> Vector.toList
Wos _ -> Prelude.error "tsvToDocs: unimplemented"
Tsv limit -> Vector.toList
<$> Vector.take limit
<$> Vector.map (\row -> Document (toPhyloDate (Csv.fromMIntOrDec Csv.defaultYear $ csv_publication_year row) (fromMaybe Csv.defaultMonth $ csv_publication_month row) (fromMaybe Csv.defaultDay $ csv_publication_day row) time)
(toPhyloDate' (Csv.fromMIntOrDec Csv.defaultYear $ csv_publication_year row) (fromMaybe Csv.defaultMonth $ csv_publication_month row) (fromMaybe Csv.defaultDay $ csv_publication_day row) time)
(termsInText patterns $ (csv_title row) <> " " <> (csv_abstract row))
<$> Vector.map (\row -> Document (toPhyloDate (Tsv.fromMIntOrDec Tsv.defaultYear $ tsv_publication_year row) (fromMaybe Tsv.defaultMonth $ tsv_publication_month row) (fromMaybe Tsv.defaultDay $ tsv_publication_day row) time)
(toPhyloDate' (Tsv.fromMIntOrDec Tsv.defaultYear $ tsv_publication_year row) (fromMaybe Tsv.defaultMonth $ tsv_publication_month row) (fromMaybe Tsv.defaultDay $ tsv_publication_day row) time)
(termsInText patterns $ (tsv_title row) <> " " <> (tsv_abstract row))
Nothing
[]
time
) <$> snd <$> either (\err -> panicTrace $ "CSV error" <> (show err)) identity <$> Csv.readCSVFile path
Csv' limit -> Vector.toList
) <$> snd <$> either (\err -> panicTrace $ "TSV error" <> (show err)) identity <$> Tsv.readTSVFile path
Tsv' limit -> Vector.toList
<$> Vector.take limit
<$> Vector.map (\row -> Document (toPhyloDate (csv'_publication_year row) (csv'_publication_month row) (csv'_publication_day row) time)
(toPhyloDate' (csv'_publication_year row) (csv'_publication_month row) (csv'_publication_day row) time)
(termsInText patterns $ (csv'_title row) <> " " <> (csv'_abstract row))
(Just $ csv'_weight row)
(map (T.strip . pack) $ splitOn ";" (unpack $ (csv'_source row)))
<$> Vector.map (\row -> Document (toPhyloDate (tsv'_publication_year row) (tsv'_publication_month row) (tsv'_publication_day row) time)
(toPhyloDate' (tsv'_publication_year row) (tsv'_publication_month row) (tsv'_publication_day row) time)
(termsInText patterns $ (tsv'_title row) <> " " <> (tsv'_abstract row))
(Just $ tsv'_weight row)
(map (T.strip . pack) $ splitOn ";" (unpack $ (tsv'_source row)))
time
) <$> snd <$> Csv.readWeightedCsv path
) <$> snd <$> Tsv.readWeightedTsv path
Csv _ -> panicTrace "CSV is currently not supported."
Csv' _ -> panicTrace "CSV is currently not supported."
-- To parse a file into a list of Document
......@@ -107,8 +108,10 @@ fileToDocsAdvanced parser path time lst = do
let patterns = buildPatterns lst
case parser of
Wos limit -> wosToDocs limit patterns time path
Csv _ -> csvToDocs parser patterns time path
Csv' _ -> csvToDocs parser patterns time path
Tsv _ -> tsvToDocs parser patterns time path
Tsv' _ -> tsvToDocs parser patterns time path
Csv _ -> panicTrace "CSV is currently not supported."
Csv' _ -> panicTrace "CSV is currently not supported."
fileToDocsDefault :: CorpusParser -> FilePath -> [TimeUnit] -> TermList -> IO [Document]
fileToDocsDefault parser path timeUnits lst =
......@@ -140,7 +143,7 @@ readListV4 path = do
fileToList :: ListParser -> FilePath -> IO TermList
fileToList parser path =
case parser of
V3 -> csvMapTermList path
V3 -> tsvMapTermList path
V4 -> fromJust
<$> toTermList MapTerm NgramsTerms
<$> readListV4 path
......
{-# LANGUAGE OverloadedStrings #-}
module Main where
module CLI.Phylo.Profile where
import Common
import CLI.Phylo.Common
import Data.Aeson
import Data.List (nub)
import Gargantext.Core.Viz.Phylo
import Gargantext.Core.Viz.Phylo.API.Tools
import Gargantext.Core.Viz.Phylo.PhyloExport (toPhyloExport, dotToFile)
import Gargantext.Core.Viz.Phylo.PhyloMaker (toPhylo, toPhyloWithoutLink)
import Gargantext.Core.Viz.Phylo.PhyloTools (printIOMsg, printIOComment, setConfig, toPeriods, getTimePeriod, getTimeStep)
import Gargantext.Core.Viz.Phylo.PhyloTools
import GHC.IO.Encoding
import GHC.Stack
import Paths_gargantext
import Prelude
import qualified Data.Text as T
import Shelly
import Shelly hiding (command)
import System.Directory
import Options.Applicative
import CLI.Types
--------------
-- | Main | --
......@@ -26,7 +26,7 @@ phyloConfig outdir = PhyloConfig {
corpusPath = "corpus.csv"
, listPath = "list.csv"
, outputPath = outdir
, corpusParser = Csv {_csv_limit = 150000}
, corpusParser = Tsv {_tsv_limit = 150000}
, listParser = V4
, phyloName = "phylo_profile_test"
, phyloScale = 2
......@@ -46,8 +46,8 @@ phyloConfig outdir = PhyloConfig {
}
main :: HasCallStack => IO ()
main = do
phyloProfileCLI :: HasCallStack => IO ()
phyloProfileCLI = do
shelly $ escaping False $ withTmpDir $ \tdir -> do
curDir <- pwd
......@@ -110,3 +110,8 @@ main = do
dotToFile output dot
echo "Done."
phyloProfileCmd :: HasCallStack => Mod CommandFields CLI
phyloProfileCmd =
command "phylo-profile" (info (helper <*> fmap CLISub (pure CCMD_phylo_profile))
(progDesc "Helper to profile phylo code."))
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# OPTIONS_GHC -Wno-orphans #-}
module CLI.Server.Routes (
routesCLI
, routesCmd
) where
import CLI.Types
import Data.Aeson.Encode.Pretty
import Data.ByteString qualified as B
import Data.ByteString.Lazy qualified as BL
import Gargantext.API.Routes.Named
import Options.Applicative
import Prelude
import Servant.API
import Servant.API.Routes
import Servant.API.WebSocket qualified as WS (WebSocketPending)
import Servant.Auth qualified as Servant
routesCmd :: Mod CommandFields CLI
routesCmd = command "routes" (info (helper <*> (fmap CLISub $ fmap CCMD_routes routesParser))
(progDesc "Server routes related commands."))
routesParser :: Parser CLIRoutes
routesParser = hsubparser (
(command "list" (info (helper <*> list_p)
(progDesc "List all the available routes, computed by the Routes types."))) <>
(command "export" (info (helper <*> export_p)
(progDesc "Exports all the routes into a file, for golden-diff testing.")))
)
list_p :: Parser CLIRoutes
list_p = pure CLIR_list
export_p :: Parser CLIRoutes
export_p = CLIR_export <$>
strOption ( long "file" <> metavar "output.json" <> help "Export the routes to a file." )
instance HasRoutes api => HasRoutes (Servant.Auth xs a :> api) where
getRoutes = getRoutes @api
instance HasRoutes WS.WebSocketPending where
getRoutes = []
instance HasRoutes Raw where
getRoutes = []
routesCLI :: CLIRoutes -> IO ()
routesCLI = \case
CLIR_list
-> printRoutes @(NamedRoutes API)
(CLIR_export filePath)
-> B.writeFile filePath . BL.toStrict $ encodePretty (getRoutes @(NamedRoutes API))
module CLI.Types where
import Data.String
import Data.Text (Text)
import Gargantext.Core.Config.Types (SettingsFile(..))
import Gargantext.Core.Types (NodeId)
import Gargantext.Core.Types.Query
import Prelude
newtype CorpusFile = CorpusFile { _CorpusFile :: FilePath }
deriving (Show, Eq, IsString)
newtype TermListFile = TermListFile { _TermsListFile :: FilePath }
deriving (Show, Eq, IsString)
newtype OutputFile = OutputFile { _OutputFile :: FilePath }
deriving (Show, Eq, IsString)
data ObfuscateDBArgs = ObfuscateDBArgs {
dbHost :: !Text
, dbPort :: !Int
, dbName :: !Text
, dbUser :: !Text
, dbPassword :: !Text
} deriving (Show, Eq)
data AdminArgs = AdminArgs
{ settingsPath :: !SettingsFile
, emails :: [String]
} deriving (Show, Eq)
data ImportFunction
= IF_corpus
| IF_corpusTsvHal
| IF_annuaire
deriving (Show, Eq, Enum, Bounded)
data ImportArgs = ImportArgs
{ imp_function :: !ImportFunction
, imp_user :: !Text
, imp_name :: !Text
, imp_settings :: !SettingsFile
, imp_limit :: !Limit
, imp_corpus_path :: !FilePath
} deriving (Show, Eq)
data IniArgs = IniArgs
{ ini_path :: !(Maybe FilePath)
, toml_path :: !(Maybe FilePath)
} deriving (Show, Eq)
data InitArgs = InitArgs
{ init_settings :: !SettingsFile
} deriving (Show, Eq)
data InvitationsArgs = InvitationsArgs
{ inv_settings :: !SettingsFile
, inv_user :: !Text
, inv_node_id :: !NodeId
, inv_email :: !Text
} deriving (Show, Eq)
data PhyloArgs = PhyloArgs
{ phylo_config :: !FilePath
} deriving (Show, Eq)
data UpgradeArgs = UpgradeArgs
{ upgrade_settings :: !SettingsFile
} deriving (Show, Eq)
data GoldenFileDiffArgs = GoldenFileDiffArgs
{ gdf_expected :: !FilePath
, gdf_actual :: !FilePath
} deriving (Show, Eq)
data CLIRoutes
= CLIR_list
| CLIR_export FilePath
deriving (Show, Eq)
data CLICmd
= CCMD_clean_csv_corpus
| CCMD_filter_terms_and_cooc !CorpusFile !TermListFile !OutputFile
| CCMD_obfuscate_db !ObfuscateDBArgs
| CCMD_admin !AdminArgs
| CCMD_import !ImportArgs
| CCMD_ini !IniArgs
| CCMD_init !InitArgs
| CCMD_invitations !InvitationsArgs
| CCMD_phylo !PhyloArgs
| CCMD_phylo_profile
| CCMD_upgrade !UpgradeArgs
| CCMD_golden_file_diff !GoldenFileDiffArgs
| CCMD_routes !CLIRoutes
deriving (Show, Eq)
data CLI =
CLISub CLICmd
deriving (Show, Eq)
{-|
Module : Main.hs
Module : Upgrade.hs
Description : Gargantext Import Corpus
Copyright : (c) CNRS, 2017-Present
License : AGPL + CECILL v3
......@@ -7,24 +7,29 @@ Maintainer : team@gargantext.org
Stability : experimental
Portability : POSIX
Import a corpus binary.
Upgrade a gargantext node.
-}
{-# LANGUAGE Strict #-}
{-# LANGUAGE QuasiQuotes #-}
module Main where
module CLI.Upgrade where
import CLI.Types
import CLI.Parsers
import Data.List qualified as List (cycle, concat, take, unlines)
import Gargantext.API.Dev (withDevEnv)
import Gargantext.API.Node () -- instances only
import Gargantext.Core.Config (GargConfig(..))
import Gargantext.Core.Config.Types (SecretsConfig(..))
import Gargantext.Core.Config.Utils (readConfig)
import Gargantext.Prelude
import Gargantext.Prelude.Config (GargConfig(..), readConfig)
import Options.Applicative
import Prelude qualified
main :: IO ()
main = do
upgradeCLI :: UpgradeArgs -> IO ()
upgradeCLI (UpgradeArgs settingsFile) = do
let ___ = putStrLn ((List.concat
$ List.take 72
......@@ -34,11 +39,6 @@ main = do
putStrLn ("GarganText upgrade to version 0.0.6.9.9.4.4" :: Text)
___
params@[iniPath] <- getArgs
_ <- if length params /= 1
then panicTrace "Usage: ./gargantext-upgrade gargantext.ini"
else pure ()
putStrLn $ List.unlines
[ "Your Database defined in gargantext.ini will be upgraded."
, "We stronlgy recommend you to make a backup using pg_dump."
......@@ -48,10 +48,10 @@ main = do
_ok <- getLine
cfg <- readConfig iniPath
let _secret = _gc_secretkey cfg
cfg <- readConfig settingsFile
let _secret = _s_secret_key $ _gc_secrets cfg
withDevEnv iniPath $ \_env -> do
withDevEnv settingsFile $ \_env -> do
-- _ <- runCmdDev env addIndex
-- _ <- runCmdDev env refreshIndex
......@@ -92,3 +92,10 @@ main = do
-- CREATE INDEX IF NOT EXISTS node_stories_ngrams_id_idx
-- ON node_stories(ngrams_id);
-- |]
upgradeCmd :: HasCallStack => Mod CommandFields CLI
upgradeCmd = command "upgrade" (info (helper <*> fmap CLISub upgrade_p) (progDesc "Upgrade a Gargantext node."))
upgrade_p :: Parser CLICmd
upgrade_p = fmap CCMD_upgrade $ UpgradeArgs
<$> settings_p
{-|
Module : CleanCsvCorpus.hs
Description : Gargantext starter
Copyright : (c) CNRS, 2017-Present
License : AGPL + CECILL v3
Maintainer : team@gargantext.org
Stability : experimental
Portability : POSIX
Given a Gargantext CSV File and its Query This script cleans and
compress the contexts around the main terms of the query.
-}
module CleanCsvCorpus where
import Data.SearchEngine qualified as S
import Data.Set qualified as S
import Data.Text (pack)
import Data.Vector (Vector)
import Data.Vector qualified as V
import Gargantext.Core.Text.Corpus.Parsers.CSV qualified as CSV
import Gargantext.Core.Text.Search
import Gargantext.Prelude
------------------------------------------------------------------------
type Query = [S.Term]
filterDocs :: [DocId] -> Vector CSV.CsvGargV3 -> Vector CSV.CsvGargV3
filterDocs docIds = V.filter (\doc -> S.member (CSV.d_docId doc) $ S.fromList docIds )
main :: IO ()
main = do
let rPath = "/tmp/Gargantext_Corpus.csv"
let wPath = "/tmp/Gargantext_Corpus_bis.csv"
--let q = ["water", "scarcity", "morocco", "shortage","flood"]
let q = ["gratuit", "gratuité", "culture", "culturel"]
eDocs <- CSV.readCSVFile rPath
case eDocs of
Right (h, csvDocs) -> do
putStrLn ("Number of documents before:" <> show (V.length csvDocs) :: Text)
putStrLn ("Mean size of docs:" <> show ( CSV.docsSize csvDocs) :: Text)
let docs = CSV.toDocs csvDocs
let engine = S.insertDocs docs initialDocSearchEngine
let docIds = S.query engine (map pack q)
let docs' = CSV.fromDocs $ filterDocs docIds (V.fromList docs)
putStrLn ("Number of documents after:" <> show (V.length docs') :: Text)
putStrLn ("Mean size of docs:" <> show (CSV.docsSize docs') :: Text)
CSV.writeFile wPath (h, docs')
Left e -> panicTrace $ "Error: " <> e
......@@ -12,129 +12,78 @@ Main specifications to index a corpus with a term list
-}
{-# LANGUAGE Strict #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE TypeApplications #-}
module Main where
import Control.Concurrent.Async as CCA (mapConcurrently)
import Data.Aeson ( ToJSON, encode )
import Data.List.Split (chunksOf)
import Data.Map.Strict qualified as DM
import Data.Text (pack)
import Data.Text qualified as DT
import Data.Text.Lazy qualified as DTL
import Data.Text.Lazy.Encoding qualified as TLE
import Data.Tuple.Extra (both)
import Data.Vector qualified as DV
import Gargantext.Core.Text.Context (TermList)
import Gargantext.Core.Text.Corpus.Parsers.CSV (readCSVFile, csv_title, csv_abstract, csv_publication_year, fromMIntOrDec, defaultYear)
import Gargantext.Core.Text.List.Formats.CSV (csvMapTermList)
import Gargantext.Core.Text.Metrics.Count (coocOnContexts, Coocs)
import Gargantext.Core.Text.Terms.WithList ( Patterns, buildPatterns, extractTermsWithList )
import Gargantext.Prelude
import System.IO (hFlush)
import Prelude
import CLI.FilterTermsAndCooc
import CLI.ObfuscateDB (obfuscateDB, obfuscateDBCmd)
import CLI.Types
import Options.Applicative
import CLI.Admin (adminCLI, adminCmd)
import CLI.FileDiff (fileDiffCLI, fileDiffCmd)
import CLI.Import (importCLI, importCmd)
import CLI.Ini (iniCLI, iniCmd)
import CLI.Init (initCLI, initCmd)
import CLI.Invitations (invitationsCLI, invitationsCmd)
import CLI.Phylo (phyloCLI, phyloCmd)
import CLI.Phylo.Profile (phyloProfileCLI, phyloProfileCmd)
import CLI.Server.Routes (routesCLI, routesCmd)
import CLI.Upgrade (upgradeCLI, upgradeCmd)
runCLI :: CLI -> IO ()
runCLI = \case
CLISub CCMD_clean_csv_corpus
-> putStrLn "TODO."
CLISub (CCMD_filter_terms_and_cooc corpusFile termListFile outputFile)
-> filterTermsAndCoocCLI corpusFile termListFile outputFile
CLISub (CCMD_obfuscate_db args)
-> obfuscateDB args
CLISub (CCMD_admin args)
-> adminCLI args
CLISub (CCMD_import args)
-> importCLI args
CLISub (CCMD_ini args)
-> iniCLI args
CLISub (CCMD_init args)
-> initCLI args
CLISub (CCMD_invitations args)
-> invitationsCLI args
CLISub (CCMD_phylo args)
-> phyloCLI args
CLISub CCMD_phylo_profile
-> phyloProfileCLI
CLISub (CCMD_upgrade args)
-> upgradeCLI args
CLISub (CCMD_golden_file_diff args)
-> fileDiffCLI args
CLISub (CCMD_routes args)
-> routesCLI args
------------------------------------------------------------------------
-- OUTPUT format
data CoocByYear = CoocByYear { year :: Int
, nbContexts :: NbContexts
, coocurrences :: Map (Text, Text) Coocs
} deriving (Show, Generic)
data CoocByYears = CoocByYears { years :: [CoocByYear] }
deriving (Show, Generic)
type NbContexts = Int
instance ToJSON CoocByYear
instance ToJSON CoocByYears
------------------------------------------------------------------------
filterTermsAndCooc
:: Patterns
-> (Int, [Text])
-> IO CoocByYear -- (Int, (Map (Text, Text) Coocs))
filterTermsAndCooc patterns (year, ts) = do
logWork "start"
r <- coocOnContexts identity <$> mapM (\x -> {-log "work" >>-} terms' patterns x) ts
logWork "stop"
pure $ CoocByYear year (length ts) (DM.mapKeys (both DT.unwords) r)
where
logWork m = do
tid <- myThreadId
(p, _) <- threadCapability tid
putText . unwords $
["filterTermsAndCooc:", m, show year, "on proc", show p]
main :: IO ()
main = do
[corpusFile, termListFile, outputFile] <- getArgs
--corpus :: IO (DM.IntMap [[Text]])
eCorpusFile <- readCSVFile corpusFile
case eCorpusFile of
Right cf -> do
let corpus = DM.fromListWith (<>)
. DV.toList
. DV.map (\n -> (fromMIntOrDec defaultYear $ csv_publication_year n, [(csv_title n) <> " " <> (csv_abstract n)]))
. snd $ cf
-- termListMap :: [Text]
termList <- csvMapTermList termListFile
putText $ show $ length termList
let patterns = buildPatterns termList
-- r <- mapConcurrentlyChunked (filterTermsAndCooc patterns) (DM.toList corpus)
r <- mapConcurrently (filterTermsAndCooc patterns) (DM.toList corpus)
writeFile outputFile $ DTL.toStrict $ TLE.decodeUtf8 $ encode (CoocByYears r)
Left e -> panicTrace $ "Error: " <> e
------------------------------------------------------------------------
-- | Tools
mapMP :: MonadIO m => (a -> m b) -> [a] -> m [b]
mapMP f xs = do
bs <- zipWithM g (cycle "-\\|/") xs
liftIO $ hPutStr stderr ("\rDone\n" :: Text)
pure bs
main = runCLI =<< execParser opts
where
g c x = do
liftIO $ hPutStr stderr ['\r',c]
liftIO $ hFlush stderr
f x
-- | Optimi that need further developments (not used yet)
mapConcurrentlyChunked :: (a -> IO b) -> [a] -> IO [b]
mapConcurrentlyChunked f ts = do
caps <- getNumCapabilities
let n = 1 `max` (length ts `div` caps)
concat <$> mapConcurrently (mapM f) (chunksOf n ts)
--terms' :: Patterns -> Text -> Corpus [[Text]]
terms' :: Applicative f => Patterns -> Text -> f [[Text]]
terms' pats txt = pure $ concat $ extractTermsWithList pats txt
-- | TODO Minimal Example
--testCooc = do
-- let patterns = buildPatterns testTermList
-- mapM (\x -> {-log "work" >>-} terms' patterns x) $ catMaybes $ map (head . snd) testCorpus
-- --mapConcurrently (filterTermsAndCooc patterns) testCorpus
testCorpus :: [(Int, [Text])]
testCorpus = [ (1998, [pack "The beees"])
, (1999, [ pack "The bees and the flowers"
--, pack "The bees and the flowers"
])
]
testTermList :: TermList
testTermList = [ ([pack "bee"], [[pack "bees"]])
, ([pack "flower"], [[pack "flowers"]])
]
opts = info (helper <*> allOptions)
( fullDesc
<> progDesc "CLI for the gargantext-server. Type --help for all the commands."
<> header "gargantext-cli tools" )
allOptions :: Parser CLI
allOptions = subparser (
filterTermsAndCoocCmd <>
obfuscateDBCmd <>
adminCmd <>
importCmd <>
iniCmd <>
initCmd <>
invitationsCmd <>
phyloCmd <>
phyloProfileCmd <>
upgradeCmd <>
fileDiffCmd <>
routesCmd
)
{-|
Module : Main.hs
Description : GarganText Mailing Invitations
Copyright : (c) CNRS, 2017-Present
License : AGPL + CECILL v3
Maintainer : team@gargantext.org
Stability : experimental
Portability : POSIX
-}
{-# LANGUAGE Strict #-}
module Main where
import Gargantext.API.Dev (withDevEnv, runCmdDev)
import Gargantext.API.Node () -- instances only
import Gargantext.API.Errors.Types
import Gargantext.Core.NLP (HasNLPServer)
import Gargantext.Core.Types.Individu (User(..))
import Gargantext.Database.Admin.Types.Node
import Gargantext.Database.Prelude (CmdRandom)
import Gargantext.Prelude
import Gargantext.Prelude.Config (readConfig)
import Prelude (read)
import qualified Gargantext.API.Node.Share as Share
main :: IO ()
main = do
params@[iniPath,user,node_id,email] <- getArgs
_ <- if length params /= 4
then panicTrace "USAGE: ./gargantext-init gargantext.ini username node_id student@university.edu"
else pure ()
_cfg <- readConfig iniPath
let invite :: (CmdRandom env BackendInternalError m, HasNLPServer env) => m Int
invite = Share.api (UserName $ cs user) (UnsafeMkNodeId $ (read node_id :: Int)) (Share.ShareTeamParams $ cs email)
withDevEnv iniPath $ \env -> do
_ <- runCmdDev env invite
pure ()
{-|
Module : Main.hs
Description : Gargantext starter binary with Adaptative Phylo
Copyright : (c) CNRS, 2017-Present
License : AGPL + CECILL v3
Maintainer : team@gargantext.org
Stability : experimental
Portability : POSIX
Adaptative Phylo binaries
-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE Strict #-}
module Main where
import Control.Concurrent.Async (mapConcurrently)
import Crypto.Hash.SHA256 (hash)
import Data.Aeson
import Data.ByteString.Char8 qualified as C8
import Data.List (nub, isSuffixOf, tail)
import Data.List.Split
import Data.Maybe (fromJust)
import Data.Text (unpack, replace, pack)
import Data.Text qualified as T
import Data.Vector qualified as Vector
import GHC.IO.Encoding
import Gargantext.API.Ngrams.Prelude (toTermList)
import Gargantext.API.Ngrams.Types
import Gargantext.Core.Text.Context (TermList)
import Gargantext.Core.Text.Corpus.Parsers (FileFormat(..), FileType(..), parseFile)
import Gargantext.Core.Text.Corpus.Parsers.CSV (csv_title, csv_abstract, csv_publication_year, csv_publication_month, csv_publication_day, csv'_source, csv'_title, csv'_abstract, csv'_publication_year, csv'_publication_month, csv'_publication_day, csv'_weight)
import Gargantext.Core.Text.Corpus.Parsers.CSV qualified as Csv
import Gargantext.Core.Text.List.Formats.CSV (csvMapTermList)
import Gargantext.Core.Text.Ngrams (NgramsType(..))
import Gargantext.Core.Text.Terms.WithList (Patterns, buildPatterns, extractTermsWithList)
import Gargantext.Core.Types.Main (ListType(..))
import Gargantext.Core.Viz.Phylo
import Gargantext.Core.Viz.Phylo.API.Tools
import Gargantext.Core.Viz.Phylo.PhyloExport (toPhyloExport, dotToFile)
import Gargantext.Core.Viz.Phylo.PhyloMaker (toPhylo, toPhyloWithoutLink)
import Gargantext.Core.Viz.Phylo.PhyloTools (printIOMsg, printIOComment, setConfig, toPeriods, getTimePeriod, getTimeStep)
import Gargantext.Database.Admin.Types.Hyperdata (HyperdataDocument(..))
import Gargantext.Prelude hiding (hash, replace)
import Prelude qualified
import System.Directory (listDirectory,doesFileExist)
import Common
main :: IO ()
main = do
setLocaleEncoding utf8
currentLocale <- getLocaleEncoding
printIOMsg $ "Machine locale: " <> show currentLocale
printIOMsg "Starting the reconstruction"
printIOMsg "Read the configuration file"
[args] <- getArgs
jsonArgs <- (eitherDecode <$> readJson args) :: IO (Either Prelude.String PhyloConfig)
case jsonArgs of
Left err -> putStrLn err
Right config -> do
printIOMsg "Parse the corpus"
mapList <- fileToList (listParser config) (listPath config)
corpus <- if (defaultMode config)
then fileToDocsDefault (corpusParser config) (corpusPath config) [Year 3 1 5,Month 3 1 5,Week 4 2 5] mapList
else fileToDocsAdvanced (corpusParser config) (corpusPath config) (timeUnit config) mapList
printIOComment (show (length corpus) <> " parsed docs from the corpus")
printIOComment (show (length $ nub $ concat $ map text corpus) <> " Size ngs_coterms")
printIOComment (show (length mapList) <> " Size ngs_terms List Map Ngrams")
printIOMsg "Reconstruct the phylo"
-- check the existing backup files
let backupPhyloWithoutLink = (outputPath config) <> "backupPhyloWithoutLink_" <> (configToSha BackupPhyloWithoutLink config) <> ".json"
let backupPhylo = (outputPath config) <> "backupPhylo_" <> (configToSha BackupPhylo config) <> ".json"
phyloWithoutLinkExists <- doesFileExist backupPhyloWithoutLink
phyloExists <- doesFileExist backupPhylo
-- reconstruct the phylo
phylo <- if phyloExists
then do
printIOMsg "Reconstruct the phylo from an existing file"
readPhylo backupPhylo
else do
if phyloWithoutLinkExists
then do
printIOMsg "Reconstruct the phylo from an existing file without links"
phyloWithoutLink <- readPhylo backupPhyloWithoutLink
writePhylo backupPhyloWithoutLink phyloWithoutLink
pure $ toPhylo (setConfig config phyloWithoutLink)
else do
printIOMsg "Reconstruct the phylo from scratch"
phyloWithoutLink <- pure $ toPhyloWithoutLink corpus config
writePhylo backupPhyloWithoutLink phyloWithoutLink
pure $ toPhylo (setConfig config phyloWithoutLink)
writePhylo backupPhylo phylo
printIOMsg "End of reconstruction, start the export"
let dot = toPhyloExport (setConfig config phylo)
let output = configToLabel config
dotToFile output dot
......@@ -15,7 +15,7 @@ Script to start gargantext with different modes (Dev, Prod, Mock).
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE Strict #-}
{-# LANGUAGE TypeOperators #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
-- {-# OPTIONS_GHC -fno-warn-orphans #-}
{-# LANGUAGE TypeFamilies #-}
......@@ -24,11 +24,13 @@ module Main where
import Data.Text (unpack)
import Data.Version (showVersion)
import GHC.IO.Encoding
import Gargantext.API (startGargantext) -- , startGargantextMock)
import Gargantext.API.Admin.EnvTypes
import Gargantext.API.Admin.Settings
import Gargantext.Core.Config.Types (SettingsFile(..))
import Gargantext.Prelude
import Gargantext.System.Logging
import GHC.IO.Encoding
import Options.Generic
import System.Exit (exitSuccess)
import qualified Paths_gargantext as PG -- cabal magic build module
......@@ -43,8 +45,8 @@ data MyOptions w =
<?> "Possible modes: Dev | Mock | Prod"
, port :: w ::: Maybe Int
<?> "By default: 8008"
, ini :: w ::: Maybe Text
<?> "Ini-file path of gargantext.ini"
, toml :: w ::: Maybe FilePath
<?> "By default: gargantext-settings.toml"
, version :: w ::: Bool
<?> "Show version number and exit"
}
......@@ -60,7 +62,7 @@ main = withLogger () $ \ioLogger -> do
setLocaleEncoding utf8
currentLocale <- getLocaleEncoding
MyOptions myMode myPort myIniFile myVersion <- unwrapRecord
MyOptions myMode myPort mb_tomlFile myVersion <- unwrapRecord
"Gargantext server"
---------------------------------------------------------------
if myVersion then do
......@@ -73,14 +75,14 @@ main = withLogger () $ \ioLogger -> do
Just p -> p
Nothing -> 8008
myIniFile' = case myIniFile of
Nothing -> panicTrace "[ERROR] gargantext.ini needed"
tomlFile = SettingsFile $ case mb_tomlFile of
Nothing -> "gargantext-settings.toml"
Just i -> i
---------------------------------------------------------------
let start = case myMode of
Mock -> panicTrace "[ERROR] Mock mode unsupported"
_ -> startGargantext myMode myPort' (unpack myIniFile')
_ -> startGargantext myMode myPort' tomlFile
logMsg ioLogger INFO $ "Starting with " <> show myMode <> " mode."
logMsg ioLogger INFO $ "Machine locale: " <> show currentLocale
start
......
......@@ -4,5 +4,5 @@ echo "GarganText, build, install, test and documentation"
nix-shell --run "cabal update \\
&& cabal v2-build --ghc-options=-O2 \\
&& cabal --overwrite-policy=always install \\
&& cabal v2-test --test-show-details=streaming \\
&& cabal v2-test \\
&& cabal haddock"
\COPY (select count(*), date_trunc('month', a.date_joined) from auth_user a group by 2) TO '/tmp/users.csv' (FORMAT csv);
\COPY (select count(*), date_trunc('month', a.date_joined) from auth_user a group by 2 ORDER BY 2) TO '/tmp/users.csv' (FORMAT csv);
......
#!/bin/bash
for f in bin/metrics/histo/*sql ; do
./bin/psql gargantext.ini < $f
done
......@@ -12,11 +12,8 @@ stack exec ghc -- --make -O2 -threaded scripts/haskell/dependencies.hs
-}
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TupleSections #-}
{-# LANGUAGE NumericUnderscores #-}
{-# LANGUAGE ViewPatterns #-}
module Main where
......
......@@ -18,12 +18,12 @@ fi
# with the `sha256sum` result calculated on the `cabal.project` and
# `cabal.project.freeze`. This ensures the files stay deterministic so that CI
# cache can kick in.
expected_cabal_project_hash="0d3f7f5beed88c1afe95e0df8a91080440ba59049f3610bf2343132635038d22"
expected_cabal_project_freeze_hash="9b2cac3a02e9b129bd80253fc407782bf10c7ed62ed21be41c720d30ed17ef53"
expected_cabal_project_hash="3afb11e01938b74ae8419caa160180d8f8628a67315a2d689c3a42a76463071e"
expected_cabal_project_freeze_hash="de1726d350936da5f5e15140e3be29bb4f44757c5702defe995c2386f1b4a741"
cabal --store-dir=$STORE_DIR v2-build --dry-run
cabal2stack --system-ghc --allow-newer --resolver lts-21.17 --resolver-file devops/stack/lts-21.17.yaml -o stack.yaml
cabal --store-dir=$STORE_DIR v2-freeze
cabal2stack --system-ghc --allow-newer --resolver lts-21.25 --resolver-file devops/stack/lts-21.25.yaml -o stack.yaml
# Run 'sed' to remove the constraint for 'gargantext', as it doesn't make sense and
# for the test we need to run this with a different flag.
......
-- Generated by stack2cabal
index-state: 2023-12-10T10:34:46Z
-- index-state: 2023-12-10T10:34:46Z
index-state: 2024-09-12T03:02:26Z
with-compiler: ghc-9.4.7
with-compiler: ghc-9.4.8
optimization: 2
packages:
......@@ -29,7 +30,7 @@ source-repository-package
source-repository-package
type: git
location: https://gitlab.iscpif.fr/gargantext/opaleye-textsearch.git
tag: cb07b604bfb7a22aa21dd8918de5cb65c8a4bdf1
tag: 04b5c9044fef44393b66bffa258ca0b0f59c1087
source-repository-package
type: git
......@@ -51,8 +52,8 @@ source-repository-package
source-repository-package
type: git
location: https://github.com/alpmestan/servant-job.git
tag: b4182487cfe479777c11ca19f3c0d47840b376f6
location: https://github.com/adinapoli/servant-job.git
tag: 74a3296dfe1f0c4a3ade91336dcc689330e84156
source-repository-package
type: git
......@@ -63,7 +64,8 @@ source-repository-package
source-repository-package
type: git
location: https://github.com/chessai/eigen.git
tag: 8fff32a43df743c8c83428a86dd566a0936a4fba
tag: 1790fdf9138970dde0dbabf8b270698145a4a88c
-- tag: 8fff32a43df743c8c83428a86dd566a0936a4fba
source-repository-package
type: git
......@@ -88,12 +90,12 @@ source-repository-package
source-repository-package
type: git
location: https://gitlab.iscpif.fr/gargantext/crawlers/epo-proxy-api.git
tag: 9225d046083853200b9045c8d71161e6a234fc5c
tag: cf4e5004f3b002bdef3fcab95e3559d65cdcd858
source-repository-package
type: git
location: https://gitlab.iscpif.fr/gargantext/crawlers/hal.git
tag: b99b9e568c8bdc73af2b8016ed03ba5ee83c2030
tag: 229fdf40b8ccecd527fca5a7bbb554b0deb540dc
source-repository-package
type: git
......@@ -108,7 +110,7 @@ source-repository-package
source-repository-package
type: git
location: https://gitlab.iscpif.fr/gargantext/crawlers/openalex.git
tag: ceb8f2cebd4890b6d9d151ab01ee14e925bc0499
tag: 4eec15855207dc74afc75b94c3764eede4de7b55
source-repository-package
type: git
......@@ -123,8 +125,7 @@ source-repository-package
source-repository-package
type: git
location: https://gitlab.iscpif.fr/gargantext/haskell-gargantext-prelude
-- tag: 618f711a530df56caefbb1577c4bf3d5ff45e214
tag: d4f9bee483d41bbdf8ab4e09efb5a5a8216edff4
tag: bb15d828d5ef36eeaa84cccb00598b585048c88e
source-repository-package
type: git
......@@ -165,12 +166,76 @@ source-repository-package
type: git
location: https://github.com/robstewart57/rdf4h.git
tag: 4fd2edf30c141600ffad6d730cc4c1c08a6dbce4
-- FIXME(adn) Compat-shim while we wait for upstream to catch-up
source-repository-package
type: git
location: https://github.com/garganscript/nanomsg-haskell
tag: 5868db564d7d3c4568ccd11c852292b834d26c55
allow-older: *
allow-newer: *
-- source-repository-package
-- type: git
-- location: https://github.com/jimenezrick/nng-haskell
-- tag: 31e52d7bc720e5fb9daf1c1e8bc1fd156d577af2
source-repository-package
type: git
location: https://github.com/adinapoli/http-reverse-proxy.git
tag: c90b7bc55b0e628d0b71ccee4e222833a19792f8
source-repository-package
type: git
location: https://github.com/fpringle/servant-routes.git
tag: 7694f62af6bc1596d754b42af16da131ac403b3a
source-repository-package
type: git
location: https://github.com/glguy/toml-parser
tag: toml-parser-2.0.1.0
source-repository-package
type: git
location: https://gitlab.iscpif.fr/gargantext/haskell-throttle
tag: 02f5ed9ee2d6cce45161addf945b88bc6adf9059
allow-newer:
accelerate-arithmetic:accelerate
, MissingH:base
, accelerate-utility:accelerate
, base:*
, crawlerHAL:servant
, crawlerISTEX:servant
, crawlerPubMed:servant
, crawlerPubMed:servant-client-core
, iso639:aeson
, iso639:text
, morpheus-graphql-app:text
, morpheus-graphql-client:text
, morpheus-graphql-code-gen-utils:text
, morpheus-graphql-code-gen:text
, morpheus-graphql-core:text
, morpheus-graphql-server:text
, morpheus-graphql-subscriptions:text
, morpheus-graphql:text
, servant-client:servant
, servant-client:servant-client-core
, servant-ekg:base
, servant-ekg:hashable
, servant-ekg:servant
, servant-ekg:text
, servant-ekg:time
, servant-xml-conduit:base
, servant-xml-conduit:bytestring
, servant-xml-conduit:servant
, stemmer:base
allow-older: aeson:hashable
, crawlerHAL:servant-client
, haskell-throttle:time
, hsparql:rdf4h
package gargantext
ghc-options: -fwrite-ide-info -hiedir=".stack-work/hiedb"
ghc-options: -fwrite-ide-info
package hmatrix
ghc-options: -O2 -fsimpl-tick-factor=10000 -fdicts-cheap -fdicts-strict -flate-dmd-anal -fno-state-hack
......
This diff is collapsed.
package gargantext
ghc-options: -fwrite-ide-info
package gargantext-admin
ghc-options: -O0
package gargantext-cli
ghc-options: -O0
package gargantext-db-obfuscation
ghc-options: -O0
package gargantext-import
ghc-options: -O0
package gargantext-init
ghc-options: -O0
package gargantext-invitations
ghc-options: -O0
package gargantext-phylo
ghc-options: -O0
package gargantext-server
ghc-options: -O0
package gargantext-upgrade
ghc-options: -O0
package gargantext-graph
ghc-options: -O0
package hmatrix
ghc-options: -O0
package sparse-linear
ghc-options: -O0
......@@ -3,7 +3,7 @@ FROM ubuntu:noble
## NOTA BENE: In order for this to be built successfully, you have to run ./devops/coreNLP/build.sh first.
ARG DEBIAN_FRONTEND=noninteractive
ARG GHC=9.4.7
ARG GHC=9.4.8
ARG CORENLP=4.5.4
ARG CORE
COPY ./shell.nix /builds/gargantext/shell.nix
......
version: '3'
services:
caddy:
image: caddy:alpine
network: host
ports:
- 8108:8108
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- ../../purescript-gargantext:/srv/purescript-gargantext:ro
#postgres11:
# #image: 'postgres:latest'
# image: 'postgres:11'
......@@ -36,33 +45,35 @@ services:
- ../dbs:/dbs
- ../postgres/schema.sql:/docker-entrypoint-initdb.d/schema.sql:ro
pgadmin:
image: 'dpage/pgadmin4'
ports:
- 8081:80
environment:
PGADMIN_DEFAULT_EMAIL: admin@localhost.lan
PGADMIN_DEFAULT_PASSWORD: admin
# NOTE: Use dbeaver instead, it's nicer and remembers passwords
# (unlike pgadmin when you remove the docker volume)
# pgadmin:
# image: 'dpage/pgadmin4'
# ports:
# - 8081:80
# environment:
# PGADMIN_DEFAULT_EMAIL: admin@localhost.lan
# PGADMIN_DEFAULT_PASSWORD: admin
depends_on:
- postgres
links:
- postgres
volumes:
- pgadmin:/var/lib/pgadmin
# depends_on:
# - postgres
# links:
# - postgres
# volumes:
# - pgadmin:/var/lib/pgadmin
corenlp:
#image: 'cgenie/corenlp-garg:latest'
image: 'cgenie/corenlp-garg:4.5.4'
ports:
- 9000:9000
# corenlp:
# #image: 'cgenie/corenlp-garg:latest'
# image: 'cgenie/corenlp-garg:4.5.4'
# ports:
# - 9000:9000
johnsnownlp:
image: 'johnsnowlabs/nlp-server:latest'
volumes:
- js-cache:/home/johnsnowlabs/cache_pretrained
ports:
- 5000:5000
# johnsnownlp:
# image: 'johnsnowlabs/nlp-server:latest'
# volumes:
# - js-cache:/home/johnsnowlabs/cache_pretrained
# ports:
# - 5000:5000
volumes:
#garg-pgdata:
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
-- This removes the trigger prevening ngrams deletion
-- because the function was not working.
DROP TRIGGER check_ngrams_json_trg ON ngrams;
DROP FUNCTION check_ngrams_json;
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment