Rename libs

This commit is contained in:
Mayel de Borniol 2023-12-30 22:30:56 +00:00
parent 9e493e16a9
commit e1a9e44894
58 changed files with 128 additions and 129 deletions

View file

@ -53,7 +53,7 @@ The code is broadly composed namespaces such as these, many of which are package
Contexts are were we put any core logic. A context often is circumscribed to providing logic for a particular object type (e. g. `Bonfire.Posts` implements `Bonfire.Data.Social.Post`).
All Bonfire objects use an ULID as their primary key. We use the `Pointers` library (with extra logic in `Bonfire.Common.Pointers`) to reference any object by its primary key without knowing what type it is beforehand. This is very useful as it allows for example following or liking many different types of objects (as opposed to say only a user or a post) and this approach allows us to store the context of the like/follow by only storing its primary key (see `Bonfire.Data.Social.Follow`) for an example.
All Bonfire objects use an ULID as their primary key. We use the `Needle` library (with extra logic in `Bonfire.Common.Needle`) to reference any object by its primary key without knowing what type it is beforehand. This is very useful as it allows for example following or liking many different types of objects (as opposed to say only a user or a post) and this approach allows us to store the context of the like/follow by only storing its primary key (see `Bonfire.Data.Social.Follow`) for an example.
Context modules usually have `one/2`, `many/2`, and `many_paginated/1` functions for fetching objects, which in turn call a `query/2` function. These take a keyword list as filters (and an optional `opts` argument) allowing objects to be fetched by arbitrary criteria.
@ -94,7 +94,7 @@ Here is an incomplete sample of some of current extensions and modules:
- `Bonfire.GraphQL` (GraphQL API abstractions)
- `Queery` and `Bonfire.Repo.Query` (Helpers for making queries on the database)
- `Bonfire.Repo` (Ecto repository)
- `Flexto` (to extend DB schemas in config, especially useful for adding associations)
- `Exto` (to extend DB schemas in config, especially useful for adding associations)
- `AbsintheClient` (for querying the API from within the server)
@ -123,7 +123,7 @@ Here is an incomplete sample of some of current extensions and modules:
- Schemas
- Resolvers
- Sometimes Plugs (eg `Bonfire.Web.Plugs.UserRequired` and `Bonfire.Web.LivePlugs.UserRequired`)
- Other extensions or libraries (eg `Pointers` or `Bonfire.Common` which are used by most other extensions)
- Other extensions or libraries (eg `Needle` or `Bonfire.Common` which are used by most other extensions)
## Naming
@ -132,7 +132,7 @@ It is said that naming is one of the four hard problems of computer science (alo
### Naming guidelines
- Module names mostly begin with `Bonfire.` unless they belong to a more generic library (eg `Pointers` or `ValueFlows`)
- Module names mostly begin with `Bonfire.` unless they belong to a more generic library (eg `Needle` or `ValueFlows`)
- Everything within an extension begins with the context name and a `.` (eg `Bonfire.Social.Migrations`)
- Database schemas should be named in the singular (eg `Bonfire.Data.Social.Post`)
- Context modules are named in plural where possible (eg `Bonfire.Posts`)

View file

@ -14,7 +14,7 @@ Circles allow a user to categorise work colleagues differently from friends, for
Verbs represent actions that the user could perform, such as reading a post or replying to a message.
Each verb has a unique ID, like the table IDs from `pointers`, which must be known to the system through configuration.
Each verb has a unique ID, like the table IDs from `Needle`, which must be known to the system through configuration.
## Permissions

View file

@ -12,9 +12,9 @@ A social network, by contrast, is actually a graph of objects. Objects need to b
A simple example would be likes, you might have a `likes` table with `liked_post_id` field that references the `post` table. But you don't just have posts that can be liked, but also videos, images, polls, etc, each with their own table, but probably do not want to have to add `liked_video_id`, `liked_image_id`, etc?
We needed the flexibility to have a foreign key that can reference any referenceable object. We call our system `Pointers`.
We needed the flexibility to have a foreign key that can reference any referenceable object. We call our system `Needle`.
This guide is a brief introduction to Pointers. It assumes some foundational knowledge:
This guide is a brief introduction to Needle. It assumes some foundational knowledge:
* Basic understanding of how relational databases like Postgresql work, in particular:
* Tables being made up of fields.
@ -43,15 +43,15 @@ In PostgreSQL, we actually store `ULID`s as `UUID` columns, thanks to both being
## It's just a table
The `pointers` system is mostly based around a single table represented by the `Pointers.Pointer` schema with the following fields:
The `Needle` system is mostly based around a single table represented by the `Needle.Pointer` schema with the following fields:
* `id` (ULID) - the database-wide unique id for the object, primary key.
* `table_id` (ULID) - identifies the type of the object, references `Pointers.Table`.
* `table_id` (ULID) - identifies the type of the object, references `Needle.Table`.
* `deleted_at` (timestamp, default: `null`) - when the object was deleted.
Every object that is stored in the system will have a record in this table. It may also have records in other tables (handy for storing more than 3 fields about the object!).
Don't worry about `Pointers.Table` for now, just know that every object type will have a record there so `Pointers.Pointer.table_id` can reference it.
Don't worry about `Needle.Table` for now, just know that every object type will have a record there so `Needle.Pointer.table_id` can reference it.
## Mixins - storing data about objects
@ -64,14 +64,14 @@ record or not record information for each mixin. Sample mixins include:
In this way, they are reusable across different object types. One mixin may (or may not) be used by any number of objects. This is mostly driven by the type of the object we are storing, but can also be driven by user input.
Mixins are just tables too! The only requirement is they have a `ULID` primary key which references `Pointers.Pointer`. The developer of the mixin is free to put whatever other fields they want in the table, so long as they have that primary-key-as-reference (which will be automatically added for you by the `mixin_schema` macro).
Mixins are just tables too! The only requirement is they have a `ULID` primary key which references `Needle.Pointer`. The developer of the mixin is free to put whatever other fields they want in the table, so long as they have that primary-key-as-reference (which will be automatically added for you by the `mixin_schema` macro).
Here is a sample mixin definition for a user profile:
```elixir
defmodule Bonfire.Data.Social.Profile do
use Pointers.Mixin,
use Needle.Mixin,
otp_app: :bonfire_data_social,
source: "bonfire_data_social_profile"
@ -84,10 +84,10 @@ defmodule Bonfire.Data.Social.Profile do
end
```
Aside from `use`ing `Pointers.Mixin` instead of `Ecto.Schema` and calling `mixin_schema` instead of
Aside from `use`ing `Needle.Mixin` instead of `Ecto.Schema` and calling `mixin_schema` instead of
`schema`, pretty similar to a standard Ecto schema, right?
The arguments to `use Pointers.Mixin` are:
The arguments to `use Needle.Mixin` are:
* `otp_app`: the OTP app name to use when loading dynamic configuration, e.g. the current extension or app (required)
* `source`: the underlying table name to use in the database
@ -98,18 +98,18 @@ We will cover dynamic configuration later. For now, you can use the OTP app that
Multimixins are like mixins, except that where an object may have 0 or 1 of a particular mixins, an object may have any number of a particular multimixin.
For this to work, a multimixin must have a *compound primary key* which must contain an `id` column referencing `Pointers.Pointer` and at least one other field which will collectively be unique.
For this to work, a multimixin must have a *compound primary key* which must contain an `id` column referencing `Needle.Pointer` and at least one other field which will collectively be unique.
An example multimixin is used for publishing an item to feeds:
```elixir
defmodule Bonfire.Data.Social.FeedPublish do
use Pointers.Mixin,
use Needle.Mixin,
otp_app: :bonfire_data_social,
source: "bonfire_data_social_feed_publish"
alias Pointers.Pointer
alias Needle.Pointer
mixin_schema do
belongs_to :feed, Pointer, primary_key: true
@ -132,20 +132,20 @@ For example, the ID for the `Feed` table is: `1TFEEDS0NTHES0V1S0FM0RTA1S`, which
* They must be 26 characters in length.
* The first character must be a digit in the range 0-7.
To help you with this, the `Pointers.ULID.synthesise!/1` method takes an alphanumeric binary and tries to return you it transliterated into a valid ULID. Example usage:
To help you with this, the `Needle.ULID.synthesise!/1` method takes an alphanumeric binary and tries to return you it transliterated into a valid ULID. Example usage:
```
iex(1)> Pointers.ULID.synthesise!("itfeedsonthesouls")
iex(1)> Needle.ULID.synthesise!("itfeedsonthesouls")
11:20:28.299 [error] Too short, need 9 chars.
:ok
iex(2)> Pointers.ULID.synthesise!("itfeedsonthesoulsofmortalsandothers")
iex(2)> Needle.ULID.synthesise!("itfeedsonthesoulsofmortalsandothers")
11:20:31.819 [warn] Too long, chopping off last 9 chars
"1TFEEDS0NTHES0V1S0FM0RTA1S"
iex(3)> Pointers.ULID.synthesise!("itfeedsonthesoulsofmortals")
iex(3)> Needle.ULID.synthesise!("itfeedsonthesoulsofmortals")
"1TFEEDS0NTHES0V1S0FM0RTA1S"
iex(4)> Pointers.ULID.synthesise!("gtfeedsonthesoulsofmortals")
iex(4)> Needle.ULID.synthesise!("gtfeedsonthesoulsofmortals")
11:21:03.268 [warn] First character must be a digit in the range 0-7, replacing with 7
"7TFEEDS0NTHES0V1S0FM0RTA1S"
@ -158,7 +158,7 @@ Virtuals are the simplest and most common type of object. Here's a definition of
```elixir
defmodule Bonfire.Data.Social.Block do
use Pointers.Virtual,
use Needle.Virtual,
otp_app: :bonfire_data_social,
table_id: "310CK1NGSTVFFAV01DSSEE1NG1",
source: "bonfire_data_social_block"
@ -171,7 +171,7 @@ defmodule Bonfire.Data.Social.Block do
end
```
It should look quite similar to a mixin definition, except that we `use` `Pointers.Virtual` this time (passing an additional `table_id` argument) and we call the `virtual_schema` macro.
It should look quite similar to a mixin definition, except that we `use` `Needle.Virtual` this time (passing an additional `table_id` argument) and we call the `virtual_schema` macro.
The primary limitation of a virtual is that you cannot put extra fields into one. This also means that `belongs_to` is not generally permitted because it results in adding a field. `has_one` and `has_many` work just fine as they do not cause the creation of fields in the schema.
@ -195,7 +195,7 @@ Here is a definition of a pointable type (indicating an ActivityPub activity who
```elixir
defmodule Bonfire.Data.Social.APActivity do
use Pointers.Pointable,
use Needle.Pointable,
otp_app: :bonfire_data_social,
table_id: "30NF1REAPACTTAB1ENVMBER0NE",
source: "bonfire_data_social_apactivity"
@ -219,7 +219,7 @@ Most virtuals are incredibly simple to migrate for:
```elixir
defmodule Bonfire.Data.Social.Post.Migration do
import Pointers.Migration
import Needle.Migration
alias Bonfire.Data.Social.Post
def migrate_post(), do: migrate_virtual(Post)
@ -233,7 +233,7 @@ If you need to do more work, it can be a little trickier. Here's an example for
defmodule Bonfire.Data.Social.Block.Migration do
import Ecto.Migration
import Pointers.Migration
import Needle.Migration
import Bonfire.Data.Edges.Edge.Migration
alias Bonfire.Data.Social.Block
@ -270,13 +270,13 @@ Example:
defmodule Bonfire.Data.Social.APActivity.Migration do
@moduledoc false
use Ecto.Migration
import Pointers.Migration
import Needle.Migration
alias Bonfire.Data.Social.APActivity
defp make_apactivity_table(exprs) do
quote do
require Pointers.Migration
Pointers.Migration.create_pointable_table(Bonfire.Data.Social.APActivity) do
require Needle.Migration
Needle.Migration.create_pointable_table(Bonfire.Data.Social.APActivity) do
Ecto.Migration.add :json, :jsonb
unquote_splicing(exprs)
end
@ -311,15 +311,15 @@ Mixins look much like pointables:
```elixir
defmodule Bonfire.Data.Social.Profile.Migration do
import Pointers.Migration
import Needle.Migration
alias Bonfire.Data.Social.Profile
# create_profile_table/{0,1}
defp make_profile_table(exprs) do
quote do
require Pointers.Migration
Pointers.Migration.create_mixin_table(Bonfire.Data.Social.Profile) do
require Needle.Migration
Needle.Migration.create_mixin_table(Bonfire.Data.Social.Profile) do
Ecto.Migration.add :name, :text
Ecto.Migration.add :summary, :text
Ecto.Migration.add :website, :text
@ -367,7 +367,7 @@ Similar to mixins:
defmodule Bonfire.Data.Social.FeedPublish.Migration do
import Ecto.Migration
import Pointers.Migration
import Needle.Migration
alias Bonfire.Data.Social.FeedPublish
@feed_publish_table FeedPublish.__schema__(:source)
@ -376,10 +376,10 @@ defmodule Bonfire.Data.Social.FeedPublish.Migration do
defp make_feed_publish_table(exprs) do
quote do
require Pointers.Migration
Pointers.Migration.create_mixin_table(Bonfire.Data.Social.FeedPublish) do
require Needle.Migration
Needle.Migration.create_mixin_table(Bonfire.Data.Social.FeedPublish) do
Ecto.Migration.add :feed_id,
Pointers.Migration.strong_pointer(), primary_key: true
Needle.Migration.strong_pointer(), primary_key: true
unquote_splicing(exprs)
end
end
@ -434,4 +434,4 @@ scenarios by now:
* [bonfire_data_edges](https://github.com/bonfire-networks/bonfire_data_edges/) (feat. bonus triggers)
If you want to know exactly what's happening, you may want to read the code for
[Pointers.Migration](https://github.com/bonfire-networks/pointers/blob/main/lib/migration.ex).
[Needle.Migration](https://github.com/bonfire-networks/needle/blob/main/lib/migration.ex).

View file

@ -82,7 +82,7 @@
| file_info | MIT | 0.0.4 | https://hex.pm/packages/file_info |
| file_system | WTFPL | 0.2.10 | https://hex.pm/packages/file_system |
| flame_on | MIT | 0.5.0 | https://hex.pm/packages/flame_on |
| flexto | Apache 2.0 | 0.2.3 | https://github.com/bonfire-networks/flexto |
| exto | Apache 2.0 | 0.2.3 | https://github.com/bonfire-networks/exto |
| floki | MIT | 0.32.1 | https://hex.pm/packages/floki |
| gen_smtp | BSD-2-Clause; Unrecognized license | 1.2.0 | https://hex.pm/packages/gen_smtp |
| geo | MIT | 3.4.3 | https://hex.pm/packages/geo |
@ -143,7 +143,7 @@
| plug_cowboy | Apache 2.0 | 2.5.2 | https://hex.pm/packages/plug_cowboy |
| plug_crypto | Apache 2.0 | 1.2.2 | https://hex.pm/packages/plug_crypto |
| pointers | Apache 2.0 | 0.6.0 | https://github.com/bonfire-networks/pointers |
| pointers_ulid | MIT | 0.2.2 | https://github.com/bonfire-networks/pointers_ulid |
| needle_ulid | MIT | 0.2.2 | https://github.com/bonfire-networks/needle_ulid |
| postgrex | Apache 2.0 | 0.16.3 | https://hex.pm/packages/postgrex |
| pseudo_gettext | Undefined | 0.1.0 | https://github.com/tmbb/pseudo_gettext |
| ranch | ISC | 1.8.0 | https://hex.pm/packages/ranch |

View file

@ -80,7 +80,7 @@
| file_info | MIT | 0.0.4 | https://hex.pm/packages/file_info |
| file_system | WTFPL | 0.2.10 | https://hex.pm/packages/file_system |
| flame_on | MIT | 0.2.1 | https://hex.pm/packages/flame_on |
| flexto | Apache 2.0 | 0.2.3 | https://github.com/bonfire-networks/flexto |
| exto | Apache 2.0 | 0.2.3 | https://github.com/bonfire-networks/exto |
| floki | MIT | 0.32.0 | https://hex.pm/packages/floki |
| gen_smtp | BSD 2-clause; Unrecognized license | 1.1.1 | https://hex.pm/packages/gen_smtp |
| geo | MIT | 3.4.3 | https://hex.pm/packages/geo |
@ -139,7 +139,7 @@
| plug_cowboy | Apache 2.0 | 2.5.2 | https://hex.pm/packages/plug_cowboy |
| plug_crypto | Apache 2.0 | 1.2.2 | https://hex.pm/packages/plug_crypto |
| pointers | Apache 2.0 | 0.6.0 | https://github.com/bonfire-networks/pointers |
| pointers_ulid | MIT | 0.2.2 | https://github.com/bonfire-networks/pointers_ulid |
| needle_ulid | MIT | 0.2.2 | https://github.com/bonfire-networks/needle_ulid |
| poolboy | Unlicense; Apache 2.0; ISC | 1.5.2 | https://hex.pm/packages/poolboy |
| postgrex | Apache 2.0 | 0.16.2 | https://hex.pm/packages/postgrex |
| ranch | ISC | 1.8.0 | https://hex.pm/packages/ranch |

View file

@ -41,7 +41,7 @@
| exsync | BSD 3-Clause; Unrecognized license | 0.2.4 | https://hex.pm/packages/exsync |
| faker | MIT | 0.16.0 | https://hex.pm/packages/faker |
| file_system | WTFPL | 0.2.10 | https://hex.pm/packages/file_system |
| flexto | Apache 2.0 | 0.2.2 | https://github.com/bonfire-networks/flexto |
| exto | Apache 2.0 | 0.2.2 | https://github.com/bonfire-networks/exto |
| floki | MIT | 0.30.1 | https://hex.pm/packages/floki |
| gen_smtp | BSD 2-clause; Unrecognized license | 0.15.0 | https://hex.pm/packages/gen_smtp |
| geo | MIT | 3.4.2 | https://hex.pm/packages/geo |
@ -84,7 +84,7 @@
| plug_cowboy | Apache 2.0 | 2.5.0 | https://hex.pm/packages/plug_cowboy |
| plug_crypto | Apache 2.0 | 1.2.2 | https://hex.pm/packages/plug_crypto |
| pointers | Apache 2.0 | 0.5.1 | https://github.com/bonfire-networks/pointers |
| pointers_ulid | MIT | 0.2.2 | https://github.com/bonfire-networks/pointers_ulid |
| needle_ulid | MIT | 0.2.2 | https://github.com/bonfire-networks/needle_ulid |
| poolboy | Unlicense; Apache 2.0; ISC | 1.5.2 | https://hex.pm/packages/poolboy |
| postgrex | Apache 2.0 | 0.15.8 | https://hex.pm/packages/postgrex |
| query_elf | Apache 2.0 | 0.3.0 | https://github.com/bonfire-networks/query_elf |

View file

@ -46,7 +46,7 @@ pointable_schema_extensions = [
:bonfire_pages
]
config :pointers, :search_path, pointable_schema_extensions
config :needle, :search_path, pointable_schema_extensions
# Search these apps/extensions for context or queries modules to index (i.e. they contain modules with a query_module/0 or context_modules/0 function)
context_and_queries_extensions =
@ -125,8 +125,8 @@ config :bonfire_data_access_control,
]
#### Alias modules for readability
alias Pointers.Pointer
alias Pointers.Table
alias Needle.Pointer
alias Needle.Table
alias Bonfire.Data.AccessControl.Acl
alias Bonfire.Data.AccessControl.Circle
@ -193,7 +193,7 @@ alias Bonfire.Files.Media
alias Bonfire.Tag
alias Bonfire.Tag.Tagged
#### Flexto Stitching
#### Exto Stitching
## WARNING: This is the flaky magic bit. We use configuration to
## compile extra stuff into modules. If you add new fields or
@ -457,7 +457,7 @@ pointer_mixins =
:feed_publishes
])
config :pointers, Pointer,
config :needle, Pointer,
code:
(quote do
field(:dummy, :any, virtual: true)
@ -479,7 +479,7 @@ config :pointers, Pointer,
unquote_splicing(pointer_mixins)
end)
config :pointers, Table, []
config :needle, Table, []
# now let's weave everything else together for convenience
# bonfire_data_access_control

View file

@ -94,7 +94,7 @@ config :bonfire, Bonfire.Common.TestInstanceRepo,
# priv: flavour_path <> "/repo"
# ecto query filtering
# config :query_elf, :id_types, [:id, :binary_id, Pointers.ULID]
# config :query_elf, :id_types, [:id, :binary_id, Needle.ULID]
# disable Tzdata and replace with Tz library
config :tzdata, :autoupdate, :disabled
@ -109,8 +109,8 @@ config :elixir, :dbg_callback, {Untangle, :custom_dbg, []}
config :surface, :compiler, warn_on_undefined_props: false
config :paper_trail,
item_type: Pointers.ULID,
originator_type: Pointers.ULID,
item_type: Needle.ULID,
originator_type: Needle.ULID,
originator_relationship_options: [references: :id],
originator: [name: :user, model: Bonfire.Data.Identity.User]

View file

@ -29,7 +29,7 @@ bonfire_data_shared_user = "https://github.com/bonfire-networks/bonfire_data_sha
bonfire_tag = "https://github.com/bonfire-networks/bonfire_tag#main"
## UTILS
arrows = "https://github.com/bonfire-networks/arrows"
# arrows = "https://github.com/bonfire-networks/arrows"
activity_pub = "https://github.com/bonfire-networks/activity_pub#develop"
mfm_parser = "https://akkoma.dev/AkkomaGang/mfm-parser.git"
nodeinfo = "https://github.com/bonfire-networks/nodeinfo#main"
@ -39,9 +39,9 @@ emote = "https://github.com/bonfire-networks/emote#master"
paginator = "https://github.com/bonfire-networks/paginator#main"
voodoo = "https://github.com/bonfire-networks/voodoo#main"
ecto_sparkles = "https://github.com/bonfire-networks/ecto_sparkles#main"
flexto = "https://github.com/bonfire-networks/flexto#main"
pointers = "https://github.com/bonfire-networks/pointers#main"
pointers_ulid = "https://github.com/bonfire-networks/pointers_ulid#main"
# exto = "https://github.com/bonfire-networks/exto#main"
# needle = "https://github.com/bonfire-networks/needle#main"
# needle_ulid = "https://github.com/bonfire-networks/needle_ulid#main"
#twinkle_star = "https://github.com/bonfire-networks/twinkle_star"
#tree_magic = "https://github.com/bonfire-networks/tree_magic.ex"
live_admin = "https://github.com/bonfire-networks/live_admin"
@ -58,7 +58,7 @@ capsule_supplement = "https://github.com/bonfire-networks/capsule_supplement#wit
# beacon_live_admin = "https://github.com/beaconCMS/beacon_live_admin"
# bonfire_website = "https://github.com/bonfire-networks/bonfire_website#main"
bonfire_open_id = "https://github.com/bonfire-networks/bonfire_open_id#main"
# bonfire_open_id = "https://github.com/bonfire-networks/bonfire_open_id#main"
# boruta = "https://gitlab.com/patatoid/boruta_auth#master"
# rauversion_extension = "https://github.com/mayel/rauversion-phx.git#modular-extension-step2"
@ -81,8 +81,8 @@ paper_trail = "https://github.com/bonfire-networks/paper_trail#with-pointers"
# sentry = "https://github.com/getsentry/sentry-elixir"
bonfire_editor_ck = "https://github.com/bonfire-networks/bonfire_editor_ck#main"
bonfire_editor_quill = "https://github.com/bonfire-networks/bonfire_editor_quill#main"
# bonfire_editor_ck = "https://github.com/bonfire-networks/bonfire_editor_ck#main"
# bonfire_editor_quill = "https://github.com/bonfire-networks/bonfire_editor_quill#main"
bonfire_editor_milkdown = "https://github.com/bonfire-networks/bonfire_editor_milkdown"
# bonfire_gatherings = "https://github.com/bonfire-networks/bonfire_gatherings"

View file

@ -26,7 +26,7 @@ wobserver_ng = "~> 1.14"
# DB
ecto_sql = "~> 3.8"
flexto = "~> 0.2.3"
exto = "~> 0.3"
postgrex = ">= 0.16.2"
ecto_psql_extras = "~> 0.7.4"
# endo = "~> 0.1"

View file

@ -1,7 +1,7 @@
defmodule Bonfire.Repo.Migrations.InitPointers do
@moduledoc false
use Ecto.Migration
import Pointers.Migration
import Needle.Migration
def up do
init_pointers_ulid_extra()

View file

@ -3,7 +3,7 @@ defmodule Bonfire.Repo.Migrations.AddFiles do
use Ecto.Migration
import Bonfire.Files.Media.Migrations
import Pointers.Migration
import Needle.Migration
def up do
Bonfire.Files.Media.Migrations.migrate_media()

View file

@ -3,7 +3,7 @@ defmodule Bonfire.Social.Repo.Migrations.ImportSocial do
use Ecto.Migration
import Bonfire.Social.Migrations
import Pointers.Migration
import Needle.Migration
def up do
migrate_social()

View file

@ -3,7 +3,7 @@ defmodule Bonfire.Social.Graph.Repo.Migrations.ImportSocial do
use Ecto.Migration
import Bonfire.Social.Graph.Migrations
import Pointers.Migration
import Needle.Migration
def up do
migrate_social()

View file

@ -3,7 +3,7 @@ defmodule Bonfire.Posts.Repo.Migrations.ImportSocial do
use Ecto.Migration
import Bonfire.Posts.Migrations
import Pointers.Migration
import Needle.Migration
def up do
migrate_social()

View file

@ -3,7 +3,7 @@ defmodule Bonfire.Messages.Repo.Migrations.ImportSocial do
use Ecto.Migration
import Bonfire.Messages.Migrations
import Pointers.Migration
import Needle.Migration
def up do
migrate_social()

View file

@ -2,7 +2,7 @@ defmodule Bonfire.Social.Repo.Migrations.ProfileImages do
@moduledoc false
use Ecto.Migration
import Pointers.Migration
import Needle.Migration
def up do
drop_if_exists(

View file

@ -2,7 +2,7 @@ defmodule Bonfire.Social.Repo.Migrations.PeeredURI do
@moduledoc false
use Ecto.Migration
import Pointers.Migration
import Needle.Migration
def up do
alter table("bonfire_data_activity_pub_peered") do

View file

@ -3,7 +3,7 @@ defmodule Bonfire.Repo.Migrations.AddFilesMixin do
use Ecto.Migration
import Bonfire.Files.Migrations
import Pointers.Migration
import Needle.Migration
def up do
# cleanup old stuff

View file

@ -2,11 +2,11 @@ defmodule Bonfire.Social.Repo.Migrations.InstanceAdminUser do
@moduledoc false
use Ecto.Migration
import Pointers.Migration
import Needle.Migration
def up do
alter table("bonfire_data_access_control_instance_admin") do
Ecto.Migration.add_if_not_exists(:user_id, weak_pointer(Pointers.Pointer))
Ecto.Migration.add_if_not_exists(:user_id, weak_pointer(Needle.Pointer))
end
end

View file

@ -2,7 +2,7 @@ defmodule Bonfire.Files.Repo.Migrations.FilesRefactor do
@moduledoc false
use Ecto.Migration
import Pointers.Migration
import Needle.Migration
def up do
alter table("bonfire_files_media") do

View file

@ -2,7 +2,7 @@ defmodule Bonfire.Data.Identity.Repo.Migrations.SettingsJson do
@moduledoc false
use Ecto.Migration
import Pointers.Migration
import Needle.Migration
def up do
alter table("bonfire_data_identity_settings") do

View file

@ -1,7 +1,7 @@
defmodule Bonfire.Repo.Migrations.InitPointers do
@moduledoc false
use Ecto.Migration
import Pointers.Migration
import Needle.Migration
def up do
init_pointers_ulid_extra()

View file

@ -3,7 +3,7 @@ defmodule Bonfire.Repo.Migrations.AddFiles do
use Ecto.Migration
import Bonfire.Files.Media.Migrations
import Pointers.Migration
import Needle.Migration
def up do
Bonfire.Files.Media.Migrations.migrate_media()

View file

@ -3,7 +3,7 @@ defmodule Bonfire.Social.Repo.Migrations.ImportSocial do
use Ecto.Migration
import Bonfire.Social.Migrations
import Pointers.Migration
import Needle.Migration
def up do
migrate_social()

View file

@ -2,7 +2,7 @@ defmodule Bonfire.Social.Repo.Migrations.ProfileImages do
@moduledoc false
use Ecto.Migration
import Pointers.Migration
import Needle.Migration
def up do
drop_if_exists(

View file

@ -2,7 +2,7 @@ defmodule Bonfire.Social.Repo.Migrations.PeeredURI do
@moduledoc false
use Ecto.Migration
import Pointers.Migration
import Needle.Migration
def up do
alter table("bonfire_data_activity_pub_peered") do

View file

@ -3,7 +3,7 @@ defmodule Bonfire.Repo.Migrations.AddFilesMixin do
use Ecto.Migration
import Bonfire.Files.Migrations
import Pointers.Migration
import Needle.Migration
def up do
# cleanup old stuff

View file

@ -2,11 +2,11 @@ defmodule Bonfire.Social.Repo.Migrations.InstanceAdminUser do
@moduledoc false
use Ecto.Migration
import Pointers.Migration
import Needle.Migration
def up do
alter table("bonfire_data_access_control_instance_admin") do
Ecto.Migration.add_if_not_exists(:user_id, weak_pointer(Pointers.Pointer))
Ecto.Migration.add_if_not_exists(:user_id, weak_pointer(Needle.Pointer))
end
end

View file

@ -1,7 +1,7 @@
defmodule Bonfire.Repo.Migrations.InitPointers do
@moduledoc false
use Ecto.Migration
import Pointers.Migration
import Needle.Migration
def up do
init_pointers_ulid_extra()

View file

@ -3,7 +3,7 @@ defmodule Bonfire.Repo.Migrations.AddFiles do
use Ecto.Migration
import Bonfire.Files.Media.Migrations
import Pointers.Migration
import Needle.Migration
def up do
Bonfire.Files.Media.Migrations.migrate_media()

View file

@ -3,7 +3,7 @@ defmodule Bonfire.Social.Repo.Migrations.ImportSocial do
use Ecto.Migration
import Bonfire.Social.Migrations
import Pointers.Migration
import Needle.Migration
def up do
migrate_social()

View file

@ -2,7 +2,7 @@ defmodule Bonfire.Social.Repo.Migrations.ProfileImages do
@moduledoc false
use Ecto.Migration
import Pointers.Migration
import Needle.Migration
def up do
drop_if_exists(

View file

@ -2,7 +2,7 @@ defmodule Bonfire.Social.Repo.Migrations.PeeredURI do
@moduledoc false
use Ecto.Migration
import Pointers.Migration
import Needle.Migration
def up do
alter table("bonfire_data_activity_pub_peered") do

View file

@ -3,7 +3,7 @@ defmodule Bonfire.Repo.Migrations.AddFilesMixin do
use Ecto.Migration
import Bonfire.Files.Migrations
import Pointers.Migration
import Needle.Migration
def up do
# cleanup old stuff

View file

@ -3,7 +3,7 @@ defmodule Bonfire.Pages.Repo.Migrations.ImportPages do
use Ecto.Migration
import Bonfire.Pages.Migrations
import Pointers.Migration
import Needle.Migration
def up do
migrate_pages()

View file

@ -1,7 +1,7 @@
defmodule Bonfire.Repo.Migrations.InitPointers do
@moduledoc false
use Ecto.Migration
import Pointers.Migration
import Needle.Migration
def up do
init_pointers_ulid_extra()

View file

@ -3,7 +3,7 @@ defmodule Bonfire.Repo.Migrations.AddFiles do
use Ecto.Migration
import Bonfire.Files.Media.Migrations
import Pointers.Migration
import Needle.Migration
def up do
Bonfire.Files.Media.Migrations.migrate_media()

View file

@ -3,7 +3,7 @@ defmodule Bonfire.Social.Repo.Migrations.ImportSocial do
use Ecto.Migration
import Bonfire.Social.Migrations
import Pointers.Migration
import Needle.Migration
def up do
migrate_social()

View file

@ -2,7 +2,7 @@ defmodule Bonfire.Social.Repo.Migrations.ProfileImages do
@moduledoc false
use Ecto.Migration
import Pointers.Migration
import Needle.Migration
def up do
drop_if_exists(

View file

@ -2,7 +2,7 @@ defmodule Bonfire.Social.Repo.Migrations.PeeredURI do
@moduledoc false
use Ecto.Migration
import Pointers.Migration
import Needle.Migration
def up do
alter table("bonfire_data_activity_pub_peered") do

View file

@ -3,7 +3,7 @@ defmodule Bonfire.Repo.Migrations.AddFilesMixin do
use Ecto.Migration
import Bonfire.Files.Migrations
import Pointers.Migration
import Needle.Migration
def up do
# cleanup old stuff

View file

@ -1,7 +1,7 @@
defmodule Bonfire.Repo.Migrations.InitPointers do
@moduledoc false
use Ecto.Migration
import Pointers.Migration
import Needle.Migration
def up do
init_pointers_ulid_extra()

View file

@ -3,7 +3,7 @@ defmodule Bonfire.Repo.Migrations.AddFiles do
use Ecto.Migration
import Bonfire.Files.Media.Migrations
import Pointers.Migration
import Needle.Migration
def up do
Bonfire.Files.Media.Migrations.migrate_media()

View file

@ -3,7 +3,7 @@ defmodule Bonfire.Social.Repo.Migrations.ImportSocial do
use Ecto.Migration
import Bonfire.Social.Migrations
import Pointers.Migration
import Needle.Migration
def up do
migrate_social()

View file

@ -2,7 +2,7 @@ defmodule Bonfire.Social.Repo.Migrations.ProfileImages do
@moduledoc false
use Ecto.Migration
import Pointers.Migration
import Needle.Migration
def up do
drop_if_exists(

View file

@ -2,7 +2,7 @@ defmodule Bonfire.Social.Repo.Migrations.PeeredURI do
@moduledoc false
use Ecto.Migration
import Pointers.Migration
import Needle.Migration
def up do
alter table("bonfire_data_activity_pub_peered") do

View file

@ -3,7 +3,7 @@ defmodule Bonfire.Repo.Migrations.AddFilesMixin do
use Ecto.Migration
import Bonfire.Files.Migrations
import Pointers.Migration
import Needle.Migration
def up do
# cleanup old stuff

View file

@ -1,8 +1,8 @@
defmodule Bonfire.Repo.Migrations.InitPointers do
@moduledoc false
use Ecto.Migration
import Pointers.Migration
# import Pointers.ULID.Migration
import Needle.Migration
# import Needle.ULID.Migration
def up do
init_pointers()

View file

@ -1,8 +1,8 @@
defmodule Bonfire.Repo.Migrations.InitPointersULID do
@moduledoc false
use Ecto.Migration
# import Pointers.Migration
import Pointers.ULID.Migration
# import Needle.Migration
import Needle.ULID.Migration
def change do
init_pointers_ulid_extra()

View file

@ -3,7 +3,7 @@ defmodule Bonfire.Repo.Migrations.AddFiles do
use Ecto.Migration
import Bonfire.Files.Media.Migrations
import Pointers.Migration
import Needle.Migration
def up do
Bonfire.Files.Media.Migrations.migrate_media()

View file

@ -3,7 +3,7 @@ defmodule Bonfire.Social.Repo.Migrations.ImportSocial do
use Ecto.Migration
import Bonfire.Social.Migrations
import Pointers.Migration
import Needle.Migration
def up do
migrate_social()

View file

@ -2,7 +2,7 @@ defmodule Bonfire.Social.Repo.Migrations.ProfileImages do
@moduledoc false
use Ecto.Migration
import Pointers.Migration
import Needle.Migration
def up do
drop_if_exists(

View file

@ -2,7 +2,7 @@ defmodule Bonfire.Social.Repo.Migrations.PeeredURI do
@moduledoc false
use Ecto.Migration
import Pointers.Migration
import Needle.Migration
def up do
alter table("bonfire_data_activity_pub_peered") do

View file

@ -3,7 +3,7 @@ defmodule Bonfire.Repo.Migrations.AddFilesMixin do
use Ecto.Migration
import Bonfire.Files.Migrations
import Pointers.Migration
import Needle.Migration
def up do
# cleanup old stuff

View file

@ -274,7 +274,7 @@ update-deps-all: deps-unlock-unused pre-update-deps
just js-ext-deps outdated
-just mix "hex.outdated --all"
# Update a specify dep (eg. `just update.dep pointers`)
# Update a specify dep (eg. `just update.dep needle`)
update-dep dep: pre-update-deps
just update-fork $dep pull
just mix-remote "deps.update $dep"
@ -360,39 +360,39 @@ dep-clone-local dep repo:
deps-clone-local-all:
curl -s https://api.github.com/orgs/bonfire-networks/repos?per_page=500 | ruby -rrubygems -e 'require "json"; JSON.load(STDIN.read).each { |repo| %x[just dep.clone.local dep="#{repo["name"]}" repo="#{repo["ssh_url"]}" ]}'
# Switch to using a local path, eg: just dep.go.local pointers
# Switch to using a local path, eg: just dep.go.local needle
dep-go-local dep:
just dep-go-local-path $dep $EXT_PATH$dep
# Switch to using a local path, specifying the path, eg: just dep.go.local dep=pointers path=./libs/pointers
# Switch to using a local path, specifying the path, eg: just dep.go.local dep=needle path=./libs/needle
dep-go-local-path dep path:
just dep-local add $dep $path
just dep-local enable $dep $path
# Switch to using a git repo, eg: just dep.go.git pointers https://github.com/bonfire-networks/pointers (specifying the repo is optional if previously specified)
# Switch to using a git repo, eg: just dep.go.git needle https://github.com/bonfire-networks/needle (specifying the repo is optional if previously specified)
dep-go-git dep repo:
-just dep-git add $dep $repo
just dep-git enable $dep NA
just dep-local disable $dep NA
# Switch to using a library from hex.pm, eg: just dep.go.hex dep="pointers" version="_> 0.2" (specifying the version is optional if previously specified)
# Switch to using a library from hex.pm, eg: just dep.go.hex dep="needle" version="_> 0.2" (specifying the version is optional if previously specified)
dep-go-hex dep version:
-just dep-hex add dep=$dep version=$version
just dep-hex enable $dep NA
just dep-git disable $dep NA
just dep-local disable $dep NA
# add/enable/disable/delete a hex dep with messctl command, eg: `just dep-hex enable pointers 0.2`
# add/enable/disable/delete a hex dep with messctl command, eg: `just dep-hex enable needle 0.2`
dep-hex command dep version:
just messctl "$command $dep $version"
just mix "deps.clean $dep"
# add/enable/disable/delete a git dep with messctl command, eg: `just dep-hex enable pointers https://github.com/bonfire-networks/pointers#main
# add/enable/disable/delete a git dep with messctl command, eg: `just dep-hex enable needle https://github.com/bonfire-networks/needle#main
dep-git command dep repo:
just messctl "$command $dep $repo config/deps.git"
just mix "deps.clean $dep"
# add/enable/disable/delete a local dep with messctl command, eg: `just dep-hex enable pointers ./libs/pointers`
# add/enable/disable/delete a local dep with messctl command, eg: `just dep-hex enable needle ./libs/needle`
dep-local command dep path:
just messctl "$command $dep $path config/deps.path"
just mix "deps.clean $dep"
@ -726,7 +726,7 @@ shell:
@imix *args='':
just cmd iex -S mix $@
# Run a specific mix command, eg: `just mix deps.get` or `just mix "deps.update pointers"`
# Run a specific mix command, eg: `just mix deps.get` or `just mix "deps.update needle"`
@mix *args='':
echo % mix $@
{{ if MIX_ENV == "prod" { "just mix-maybe-prod $@" } else { "just cmd mix $@" } }}
@ -737,7 +737,7 @@ shell:
@mix-maybe-prod-pre-release *args='':
{{ if path_exists("./_build/prod/rel/bonfire/bin/bonfire")=="true" { "echo Ignoring mix commands since we already have a prod release (delete _build/prod/rel/bonfire/bin/bonfire if you want to build a new release)" } else { "just cmd mix $@" } }}
# Run a specific mix command, while ignoring any deps cloned into forks, eg: `just mix-remote deps.get` or `just mix-remote deps.update pointers`
# Run a specific mix command, while ignoring any deps cloned into forks, eg: `just mix-remote deps.get` or `just mix-remote deps.update needle`
mix-remote *args='': init
echo % WITH_FORKS=0 mix $@
{{ if WITH_DOCKER == "total" { "docker compose run -e WITH_FORKS=0 web mix $@" } else {"WITH_FORKS=0 mix $@"} }}

10
mix.exs
View file

@ -116,7 +116,7 @@ defmodule Bonfire.Umbrella.MixProject do
deps_prefixes: [
docs: [
"bonfire",
"pointers",
"needle",
"paginator",
"ecto_shorts",
"ecto_sparkles",
@ -124,7 +124,7 @@ defmodule Bonfire.Umbrella.MixProject do
"activity_pub",
"arrows",
"ecto_materialized_path",
"flexto",
"exto",
"grumble",
"linkify",
"verbs",
@ -134,7 +134,7 @@ defmodule Bonfire.Umbrella.MixProject do
],
test: [
"bonfire",
"pointers",
"needle",
# "paginator",
"ecto_shorts",
"ecto_sparkles",
@ -147,7 +147,7 @@ defmodule Bonfire.Umbrella.MixProject do
data: [
"bonfire_data_",
"bonfire_data_edges",
"pointers",
"needle",
"bonfire_boundaries",
"bonfire_tag",
"bonfire_classify",
@ -279,7 +279,7 @@ defmodule Bonfire.Umbrella.MixProject do
~r/^Bonfire.Fail?/,
~r/^Bonfire.Files?/,
~r/^Bonfire.Mailer?/,
~r/^Pointers?/
~r/^Needle?/
],
"Feature extensions": [~r/^Bonfire.?/, ~r/^ValueFlows.?/],
Federation: [

View file

@ -6,7 +6,7 @@
"acceptor_pool": {:hex, :acceptor_pool, "1.0.0", "43c20d2acae35f0c2bcd64f9d2bde267e459f0f3fd23dab26485bf518c281b21", [:rebar3], [], "hexpm", "0cbcd83fdc8b9ad2eee2067ef8b91a14858a5883cb7cd800e6fcd5803e158788"},
"activity_pub": {:git, "https://github.com/bonfire-networks/activity_pub", "f6169b79eccdecd39b9805511f715f1010529104", [branch: "develop"]},
"argon2_elixir": {:hex, :argon2_elixir, "4.0.0", "7f6cd2e4a93a37f61d58a367d82f830ad9527082ff3c820b8197a8a736648941", [:make, :mix], [{:comeonin, "~> 5.3", [hex: :comeonin, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "f9da27cf060c9ea61b1bd47837a28d7e48a8f6fa13a745e252556c14f9132c7f"},
"arrows": {:git, "https://github.com/bonfire-networks/arrows", "277b3bc4babbcf89ea5e7e7fb670e6c13d796026", []},
"arrows": {:hex, :arrows, "0.1.1", "c414e21173115987578bda1bf35a60cde228a16d7e52d9f6c76e1c8914c22c79", [:mix], [], "hexpm", "ce6de75d7cb43a032e9856826c5bace8f43434ee574e4a6a412f9d3b3931062e"},
"assert_value": {:hex, :assert_value, "0.10.3", "bb4cc3f497e1eba276e1e55eb1574bb8657752539a72259d1d7e17e15bd98f6d", [:mix], [], "hexpm", "ca51af160d9ab14b283deac1d48ff72414257792a399dbe3d5cb384f4f3d625b"},
"bamboo": {:hex, :bamboo, "2.3.0", "d2392a2cabe91edf488553d3c70638b532e8db7b76b84b0a39e3dfe492ffd6fc", [:mix], [{:hackney, ">= 1.15.2", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:mime, "~> 1.4 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "dd0037e68e108fd04d0e8773921512c940e35d981e097b5793543e3b2f9cd3f6"},
"bamboo_campaign_monitor": {:hex, :bamboo_campaign_monitor, "0.1.0", "e4b60354a2186c75e9a338fdd932e027b8bbeba9c274245546291429671e8753", [:mix], [{:bamboo, ">= 1.2.0", [hex: :bamboo, repo: "hexpm", optional: false]}, {:hackney, ">= 1.6.5", [hex: :hackney, repo: "hexpm", optional: false]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "5b60a27ab2b8596f274f22d3cb8bd8d8f3865667f1ec181bfa6635aa7646d79a"},
@ -128,13 +128,13 @@
"excellent_migrations": {:hex, :excellent_migrations, "0.1.6", "5ac916760cee8c63f55a2dbf3eadabb699a60adde5943ce069c1f7ee93f92963", [:mix], [{:credo, "~> 1.5", [hex: :credo, repo: "hexpm", optional: true]}], "hexpm", "c39269b0e4c0412b3e87fd77fe7ce8dd0e8470a6ec3df7d150b8d198b69a0239"},
"exdiff": {:hex, :exdiff, "0.1.5", "3e55bd840214508fd478d91fb07f1671d90d2f0d6f5266296e3b596e07d92305", [:mix], [], "hexpm", "b1ccef642edc28ed3acf1b08c8dbc6e42852d18dfe51b453529588e53c733eba"},
"expo": {:hex, :expo, "0.5.1", "249e826a897cac48f591deba863b26c16682b43711dd15ee86b92f25eafd96d9", [:mix], [], "hexpm", "68a4233b0658a3d12ee00d27d37d856b1ba48607e7ce20fd376958d0ba6ce92b"},
"exto": {:git, "https://github.com/bonfire-networks/exto", "44273bc9e530ea9752f534a46836475af12e0355", [branch: "main"]},
"faker": {:hex, :faker, "0.17.0", "671019d0652f63aefd8723b72167ecdb284baf7d47ad3a82a15e9b8a6df5d1fa", [:mix], [], "hexpm", "a7d4ad84a93fd25c5f5303510753789fc2433ff241bf3b4144d3f6f291658a6a"},
"fast_ngram": {:hex, :fast_ngram, "1.2.0", "0652c25d3f66e69e6780121cf19200442fe70da689b39ccaa8998da6ee2f65cc", [:mix], [], "hexpm", "90c949c5b00314d8117a5bf2fbf6a05ef945ce4cad66a47bc26f8d9ec30dc1bd"},
"fetch_favicon": {:git, "https://github.com/bonfire-networks/fetch_favicon", "5fbcbbd633e954c90c3a6c3a7daf2230a189e919", [branch: "master"]},
"file_info": {:hex, :file_info, "0.0.4", "2e0e77f211e833f38ead22cb29ce53761d457d80b3ffe0ffe0eb93880b0963b2", [:mix], [{:mimetype_parser, "~> 0.1.2", [hex: :mimetype_parser, repo: "hexpm", optional: false]}], "hexpm", "50e7ad01c2c8b9339010675fe4dc4a113b8d6ca7eddce24d1d74fd0e762781a5"},
"file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"},
"finch": {:hex, :finch, "0.16.0", "40733f02c89f94a112518071c0a91fe86069560f5dbdb39f9150042f44dcfb1a", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.3", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 0.2.6 or ~> 1.0", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "f660174c4d519e5fec629016054d60edd822cdfe2b7270836739ac2f97735ec5"},
"flexto": {:git, "https://github.com/bonfire-networks/flexto", "44273bc9e530ea9752f534a46836475af12e0355", [branch: "main"]},
"floki": {:hex, :floki, "0.35.2", "87f8c75ed8654b9635b311774308b2760b47e9a579dabf2e4d5f1e1d42c39e0b", [:mix], [], "hexpm", "6b05289a8e9eac475f644f09c2e4ba7e19201fd002b89c28c1293e7bd16773d9"},
"flow": {:hex, :flow, "0.15.0", "503717c0e367b5713336181d5305106840f64abbad32c75d7af5ef1bb0908e38", [:mix], [{:gen_stage, "~> 0.14.0", [hex: :gen_stage, repo: "hexpm", optional: false]}], "hexpm", "d7ecbd4dd38a188494bc996d5014ef8335f436a0b262140a1f6441ae94714581"},
"forecastr": {:git, "https://github.com/bonfire-networks/forecastr", "84235e51e4cd36ca4df03a24718b4367e296c053", []},
@ -204,6 +204,7 @@
"mogrify": {:git, "https://github.com/chaskiq/mogrify.git", "48e237d2332d24ddf5996f78b13d8bc97221b094", [branch: "identify-option"]},
"mox": {:hex, :mox, "1.1.0", "0f5e399649ce9ab7602f72e718305c0f9cdc351190f72844599545e4996af73c", [:mix], [], "hexpm", "d44474c50be02d5b72131070281a5d3895c0e7a95c780e90bc0cfe712f633a13"},
"nebulex": {:hex, :nebulex, "2.5.2", "2d358813ccb2eeea525e3a29c270ad123d3337e97ed9159d9113cf128108bd4c", [:mix], [{:decorator, "~> 1.4", [hex: :decorator, repo: "hexpm", optional: true]}, {:shards, "~> 1.1", [hex: :shards, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "61a122302cf42fa61eca22515b1df21aaaa1b98cf462f6dd0998de9797aaf1c7"},
"needle_ulid": {:git, "https://github.com/bonfire-networks/needle_ulid", "c20fe48d846a0f3c6074f2c6a4b0edafffe45803", [branch: "main"]},
"neuron": {:hex, :neuron, "5.1.0", "dd321d5c2d9c03706ee7161ab49f8af634bfd1becb6fb95d8caa28bc95b6c655", [:mix], [{:httpoison, "~> 1.0 or ~> 2.0", [hex: :httpoison, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "23cddb0e0dd9c0eea247bc5b4bc3e1f8b52dbaf63f1637623920ec0b2385b6ce"},
"nimble_csv": {:hex, :nimble_csv, "1.2.0", "4e26385d260c61eba9d4412c71cea34421f296d5353f914afe3f2e71cce97722", [:mix], [], "hexpm", "d0628117fcc2148178b034044c55359b26966c6eaa8e2ce15777be3bbc91b12a"},
"nimble_options": {:hex, :nimble_options, "1.1.0", "3b31a57ede9cb1502071fade751ab0c7b8dbe75a9a4c2b5bbb0943a690b63172", [:mix], [], "hexpm", "8bbbb3941af3ca9acc7835f5655ea062111c9c27bcac53e004460dfd19008a99"},
@ -252,8 +253,6 @@
"plug_cowboy": {:hex, :plug_cowboy, "2.6.1", "9a3bbfceeb65eff5f39dab529e5cd79137ac36e913c02067dba3963a26efe9b2", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "de36e1a21f451a18b790f37765db198075c25875c64834bcc82d90b309eb6613"},
"plug_crypto": {:hex, :plug_crypto, "2.0.0", "77515cc10af06645abbfb5e6ad7a3e9714f805ae118fa1a70205f80d2d70fe73", [:mix], [], "hexpm", "53695bae57cc4e54566d993eb01074e4d894b65a3766f1c43e2c61a1b0f45ea9"},
"plug_http_validator": {:git, "https://github.com/bonfire-networks/plug_http_validator", "dbc277f8a328bc44107174fb1770b1376337697a", [branch: "pr-naive-datetime"]},
"pointers": {:git, "https://github.com/bonfire-networks/pointers", "81836571494c0d73927128f0504f6f92bd390035", [branch: "main"]},
"pointers_ulid": {:git, "https://github.com/bonfire-networks/pointers_ulid", "c20fe48d846a0f3c6074f2c6a4b0edafffe45803", [branch: "main"]},
"poison": {:hex, :poison, "5.0.0", "d2b54589ab4157bbb82ec2050757779bfed724463a544b6e20d79855a9e43b24", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "11dc6117c501b80c62a7594f941d043982a1bd05a1184280c0d9166eb4d8d3fc"},
"poolboy": {:hex, :poolboy, "1.5.2", "392b007a1693a64540cead79830443abf5762f5d30cf50bc95cb2c1aaafa006b", [:rebar3], [], "hexpm", "dad79704ce5440f3d5a3681c8590b9dc25d1a561e8f5a9c995281012860901e3"},
"postgrex": {:hex, :postgrex, "0.17.4", "5777781f80f53b7c431a001c8dad83ee167bcebcf3a793e3906efff680ab62b3", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "6458f7d5b70652bc81c3ea759f91736c16a31be000f306d3c64bcdfe9a18b3cc"},