From b12b0e12e1db5be148d46947b824fef848b40982 Mon Sep 17 00:00:00 2001
From: taylordowns2000 Registry process to query and maintain a list of adaptors available for
writing jobs. Currently it queries NPM for all modules in the Usage Caching By default the results are cached to disk, and will be reused every start. In order to disable or configure caching pass see: The process uses Caching By default the results are cached to disk, and will be reused every start. In order to disable or configure caching pass see: The process uses Timeouts There is a 'general' timeout of 30s, this is used for GenServer calls like
Destructures an NPM style package name into module name and version. Example Destructures an NPM style package name into module name and version. Example The OpenFn CLI returns JSON formatted log lines, which are decoded and added
-to a There are two kinds of output: These are usually for general logging, and debugging. The above is the equivalent of the output of a commandapply_user_email(user, password, attrs)
Examples
-
+iex> apply_user_email(user, "valid password", %{email: ...})
-{:ok, %User{}}role: :superuser
-iex> apply_user_email(user, "invalid password", %{email: ...})
-{:error, %Ecto.Changeset{}}
iex> apply_user_email(user, "valid password", %{email: ...})
+{:ok, %User{}}role: :superuser
+iex> apply_user_email(user, "invalid password", %{email: ...})
+{:error, %Ecto.Changeset{}}
change_scheduled_deletion(user, attrs \\ %{
Examples
-
+iex> change_scheduled_deletion(user)
-%Ecto.Changeset{data: %User{}}
iex> change_scheduled_deletion(user)
+%Ecto.Changeset{data: %User{}}
change_superuser_registration(attrs \\ %{})
Examples
-
+iex> change_superuser_registration(user)
-%Ecto.Changeset{data: %User{}}
iex> change_superuser_registration(user)
+%Ecto.Changeset{data: %User{}}
change_user_email(user, attrs \\ %{})
Examples
-
+iex> change_user_email(user)
-%Ecto.Changeset{data: %User{}}
iex> change_user_email(user)
+%Ecto.Changeset{data: %User{}}
change_user_password(user, attrs \\ %{})
Examples
-
+iex> change_user_password(user)
-%Ecto.Changeset{data: %User{}}
iex> change_user_password(user)
+%Ecto.Changeset{data: %User{}}
change_user_registration(attrs \\ %{})
Examples
-
+iex> change_user_registration(user)
-%Ecto.Changeset{data: %User{}}
iex> change_user_registration(user)
+%Ecto.Changeset{data: %User{}}
delete_token(token)
Examples
-iex> delete_token(token)
-{:ok, %UserToken{}}
+
+iex> delete_token(token)
+{:error, %Ecto.Changeset{}}iex> delete_token(token)
+{:ok, %UserToken{}}
-iex> delete_token(token)
-{:error, %Ecto.Changeset{}}
delete_user(user)
Examples
-iex> delete_user(user)
-{:ok, %User{}}
+
+iex> delete_user(user)
+{:error, %Ecto.Changeset{}}iex> delete_user(user)
+{:ok, %User{}}
-iex> delete_user(user)
-{:error, %Ecto.Changeset{}}
deliver_update_email_instructions(user, cur
Examples
-
+iex> deliver_update_email_instructions(user, current_email, &Routes.user_update_email_url(conn, :edit, &1))
-{:ok, %{to: ..., body: ...}}
iex> deliver_update_email_instructions(user, current_email, &Routes.user_update_email_url(conn, :edit, &1))
+{:ok, %{to: ..., body: ...}}
deliver_user_confirmation_instructions(user
Examples
-
iex> deliver_user_confirmation_instructions(user, &Routes.user_confirmation_url(conn, :edit, &1))
-{:ok, %{to: ..., body: ...}}
+
+iex> deliver_user_confirmation_instructions(confirmed_user, &Routes.user_confirmation_url(conn, :edit, &1))
+{:error, :already_confirmed}iex> deliver_user_confirmation_instructions(user, &Routes.user_confirmation_url(conn, :edit, &1))
+{:ok, %{to: ..., body: ...}}
-iex> deliver_user_confirmation_instructions(confirmed_user, &Routes.user_confirmation_url(conn, :edit, &1))
-{:error, :already_confirmed}
deliver_user_reset_password_instructions(us
Examples
-
+iex> deliver_user_reset_password_instructions(user, &Routes.user_reset_password_url(conn, :edit, &1))
-{:ok, %{to: ..., body: ...}}
iex> deliver_user_reset_password_instructions(user, &Routes.user_reset_password_url(conn, :edit, &1))
+{:ok, %{to: ..., body: ...}}
get_token!(id)
Examples
-iex> get_token!(123)
-%UserToken{}
+
iex> get_token!(123)
+%UserToken{}
-iex> get_token!(456)
+iex> get_token!(456)
** (Ecto.NoResultsError)
get_user!(id)
Examples
-iex> get_user!(123)
-%User{}
+
@@ -1348,10 +1348,10 @@ iex> get_user!(123)
+%User{}
-iex> get_user!(456)
+iex> get_user!(456)
** (Ecto.NoResultsError)
get_user_by_email(email)
Examples
-iex> get_user_by_email("foo@example.com")
-%User{}
+
@@ -1380,10 +1380,10 @@ iex> get_user_by_email("foo@example.com")
+%User{}
-iex> get_user_by_email("unknown@example.com")
+iex> get_user_by_email("unknown@example.com")
nil
get_user_by_email_and_password(email, passw
Examples
-
iex> get_user_by_email_and_password("foo@example.com", "correct_password")
-%User{}
+
@@ -1412,10 +1412,10 @@ iex> get_user_by_email_and_password("foo@example.com", "correct_password")
+%User{}
-iex> get_user_by_email_and_password("foo@example.com", "invalid_password")
+iex> get_user_by_email_and_password("foo@example.com", "invalid_password")
nil
get_user_by_reset_password_token(token)
Examples
-iex> get_user_by_reset_password_token("validtoken")
-%User{}
+
@@ -1583,8 +1583,8 @@ iex> get_user_by_reset_password_token("validtoken")
+%User{}
-iex> get_user_by_reset_password_token("invalidtoken")
+iex> get_user_by_reset_password_token("invalidtoken")
nil
list_users()
Examples
-
+iex> list_users()
-[%User{}, ...]
iex> list_users()
+[%User{}, ...]
register_superuser(attrs)
Examples
-iex> register_superuser(%{field: value})
-{:ok, %User{}}
+
+iex> register_superuser(%{field: bad_value})
+{:error, %Ecto.Changeset{}}iex> register_superuser(%{field: value})
+{:ok, %User{}}
-iex> register_superuser(%{field: bad_value})
-{:error, %Ecto.Changeset{}}
register_user(attrs)
Examples
-iex> register_user(%{field: value})
-{:ok, %User{}}
+
+iex> register_user(%{field: bad_value})
+{:error, %Ecto.Changeset{}}iex> register_user(%{field: value})
+{:ok, %User{}}
-iex> register_user(%{field: bad_value})
-{:error, %Ecto.Changeset{}}
reset_user_password(user, attrs)
Examples
-iex> reset_user_password(user, %{password: "new long password", password_confirmation: "new long password"})
-{:ok, %User{}}
+
+iex> reset_user_password(user, %{password: "valid", password_confirmation: "not the same"})
+{:error, %Ecto.Changeset{}}iex> reset_user_password(user, %{password: "new long password", password_confirmation: "new long password"})
+{:ok, %User{}}
-iex> reset_user_password(user, %{password: "valid", password_confirmation: "not the same"})
-{:error, %Ecto.Changeset{}}
update_user_password(user, password, attrs)
Examples
-
iex> update_user_password(user, "valid password", %{password: ...})
-{:ok, %User{}}
+
+iex> update_user_password(user, "invalid password", %{password: ...})
+{:error, %Ecto.Changeset{}}iex> update_user_password(user, "valid password", %{password: ...})
+{:ok, %User{}}
-iex> update_user_password(user, "invalid password", %{password: ...})
-{:error, %Ecto.Changeset{}}
request(request)
Examples
-request = %HTTPoison.Request{
+
+request(request)request = %HTTPoison.Request{
method: :post,
url: "https://my.website.com",
body: "{\"foo\": 3}",
- headers: [{"Accept", "application/json"}]
-}
+ headers: [{"Accept", "application/json"}]
+}
-request(request)
request(method, url, body \\ "",
Examples
-
+request(:post, "https://my.website.com", "{\"foo\": 3}", [{"Accept", "application/json"}])
request(:post, "https://my.website.com", "{\"foo\": 3}", [{"Accept", "application/json"}])
@openfn
organization and
filters out modules that are known not to be adaptors.# Starting the process
-AdaptorRegistry.start_link()
+AdaptorRegistry.start_link()
# Getting a list of all adaptors
-Lightning.AdaptorRegistry.AdaptorRegistry.all()
start_link/1
.:continue
to return before the adaptors have been queried.
+start_link/1
.:continue
to return before the adaptors have been queried.
This does mean that the first call to the process will be delayed until
the handle_continue/2
has finished.all/1
and also internally when the modules are being queried. NPM can
@@ -411,10 +411,10 @@ resolve_package_name(package_name)
-
+iex> resolve_package_name("@openfn/language-salesforce@1.2.3")
-{ "@openfn/language-salesforce", "1.2.3" }
-iex> resolve_package_name("@openfn/language-salesforce")
-{ "@openfn/language-salesforce", nil }
iex> resolve_package_name("@openfn/language-salesforce@1.2.3")
+{ "@openfn/language-salesforce", "1.2.3" }
+iex> resolve_package_name("@openfn/language-salesforce")
+{ "@openfn/language-salesforce", nil }
create_attempt(work_order, job, reason)
Examples
-iex> create_attempt(%{field: value})
-{:ok, %Attempt{}}
+
+iex> create_attempt(%{field: bad_value})
+{:error, %Ecto.Changeset{}}iex> create_attempt(%{field: value})
+{:ok, %Attempt{}}
-iex> create_attempt(%{field: bad_value})
-{:error, %Ecto.Changeset{}}
request(request)
Examples
-request = %HTTPoison.Request{
+
+request(request)request = %HTTPoison.Request{
method: :post,
url: "https://my.website.com",
body: "{\"foo\": 3}",
- headers: [{"Accept", "application/json"}]
-}
+ headers: [{"Accept", "application/json"}]
+}
-request(request)
request(method, url, body \\ "",
Examples
-
+request(:post, "https://my.website.com", "{\"foo\": 3}", [{"Accept", "application/json"}])
request(:post, "https://my.website.com", "{\"foo\": 3}", [{"Accept", "application/json"}])
Logs
Result
struct.{"level":"<<level>>","name":"<<module>>","message":"..."],"time":<<timestamp>>}
{"message":["<<message|filepath|output>>"]}
Result
struct.
There are two kinds of output:
{"level":"<<level>>","name":"<<module>>","message":"..."],"time":<<timestamp>>}
These are usually for general logging, and debugging.
{"message":["<<message|filepath|output>>"]}
The above is the equivalent of the output of a command
diff --git a/Lightning.Credentials.html b/Lightning.Credentials.html index 6b6b711356..ab24911b59 100644 --- a/Lightning.Credentials.html +++ b/Lightning.Credentials.html @@ -277,8 +277,8 @@iex> change_credential(credential)
-%Ecto.Changeset{data: %Credential{}}
+iex> change_credential(credential)
+%Ecto.Changeset{data: %Credential{}}
iex> create_credential(%{field: value})
-{:ok, %Credential{}}
+iex> create_credential(%{field: value})
+{:ok, %Credential{}}
-iex> create_credential(%{field: bad_value})
-{:error, %Ecto.Changeset{}}
+iex> create_credential(%{field: bad_value})
+{:error, %Ecto.Changeset{}}
iex> delete_credential(credential)
-{:ok, %Credential{}}
+iex> delete_credential(credential)
+{:ok, %Credential{}}
-iex> delete_credential(credential)
-{:error, %Ecto.Changeset{}}
+iex> delete_credential(credential)
+{:error, %Ecto.Changeset{}}
iex> get_credential!(123)
-%Credential{}
+iex> get_credential!(123)
+%Credential{}
-iex> get_credential!(456)
+iex> get_credential!(456)
** (Ecto.NoResultsError)
iex> can_credential_be_shared_to_user(credential_id, user_id)
-[]
+iex> can_credential_be_shared_to_user(credential_id, user_id)
+[]
-iex> can_credential_be_shared_to_user(credential_id, user_id)
-["52ea8758-6ce5-43d7-912f-6a1e1f11dc55"]
+iex> can_credential_be_shared_to_user(credential_id, user_id)
+["52ea8758-6ce5-43d7-912f-6a1e1f11dc55"]
iex> list_credentials()
-[%Credential{}, ...]
+iex> list_credentials()
+[%Credential{}, ...]
iex> list_credentials_for_user(123)
-[%Credential{user_id: 123}, %Credential{user_id: 123},...]
+iex> list_credentials_for_user(123)
+[%Credential{user_id: 123}, %Credential{user_id: 123},...]
iex> update_credential(credential, %{field: new_value})
-{:ok, %Credential{}}
+iex> update_credential(credential, %{field: new_value})
+{:ok, %Credential{}}
-iex> update_credential(credential, %{field: bad_value})
-{:error, %Ecto.Changeset{}}
+iex> update_credential(credential, %{field: bad_value})
+{:error, %Ecto.Changeset{}}
iex> change_dataclip(dataclip)
-%Ecto.Changeset{data: %Dataclip{}}
+iex> change_dataclip(dataclip)
+%Ecto.Changeset{data: %Dataclip{}}
iex> change_run(run)
-%Ecto.Changeset{data: %Run{}}
+iex> change_run(run)
+%Ecto.Changeset{data: %Run{}}
iex> create_dataclip(%{field: value})
-{:ok, %Dataclip{}}
+iex> create_dataclip(%{field: value})
+{:ok, %Dataclip{}}
-iex> create_dataclip(%{field: bad_value})
-{:error, %Ecto.Changeset{}}
+iex> create_dataclip(%{field: bad_value})
+{:error, %Ecto.Changeset{}}
iex> create_run(%{field: value})
-{:ok, %Run{}}
+iex> create_run(%{field: value})
+{:ok, %Run{}}
-iex> create_run(%{field: bad_value})
-{:error, %Ecto.Changeset{}}
+iex> create_run(%{field: bad_value})
+{:error, %Ecto.Changeset{}}
iex> delete_dataclip(dataclip)
-{:ok, %Dataclip{}}
+iex> delete_dataclip(dataclip)
+{:ok, %Dataclip{}}
-iex> delete_dataclip(dataclip)
-{:error, %Ecto.Changeset{}}
+iex> delete_dataclip(dataclip)
+{:error, %Ecto.Changeset{}}
iex> delete_run(run)
-{:ok, %Run{}}
+iex> delete_run(run)
+{:ok, %Run{}}
-iex> delete_run(run)
-{:error, %Ecto.Changeset{}}
+iex> delete_run(run)
+{:error, %Ecto.Changeset{}}
iex> get_dataclip("27b73932-16c7-4a72-86a3-85d805ccff98")
-%Dataclip{}
+iex> get_dataclip("27b73932-16c7-4a72-86a3-85d805ccff98")
+%Dataclip{}
-iex> get_dataclip("27b73932-16c7-4a72-86a3-85d805ccff98")
+iex> get_dataclip("27b73932-16c7-4a72-86a3-85d805ccff98")
nil
-iex> get_dataclip(%Run{id: "a uuid"})
-%Dataclip{}
+iex> get_dataclip(%Run{id: "a uuid"})
+%Dataclip{}
iex> get_dataclip!(123)
-%Dataclip{}
+iex> get_dataclip!(123)
+%Dataclip{}
-iex> get_dataclip!(456)
+iex> get_dataclip!(456)
** (Ecto.NoResultsError)
iex> get_run!(123)
-%Run{}
+iex> get_run!(123)
+%Run{}
-iex> get_run!(456)
+iex> get_run!(456)
** (Ecto.NoResultsError)
@@ -1064,8 +1064,8 @@ list_dataclips()
Examples
-iex> list_dataclips()
-[%Dataclip{}, ...]
+iex> list_dataclips()
+[%Dataclip{}, ...]
@@ -1174,8 +1174,8 @@ list_runs()
Examples
-iex> list_runs()
-[%Run{}, ...]
+iex> list_runs()
+[%Run{}, ...]
@@ -1330,11 +1330,11 @@ update_dataclip(dataclip, attrs)
Examples
-iex> update_dataclip(dataclip, %{field: new_value})
-{:ok, %Dataclip{}}
+iex> update_dataclip(dataclip, %{field: new_value})
+{:ok, %Dataclip{}}
-iex> update_dataclip(dataclip, %{field: bad_value})
-{:error, %Ecto.Changeset{}}
+iex> update_dataclip(dataclip, %{field: bad_value})
+{:error, %Ecto.Changeset{}}
@@ -1362,11 +1362,11 @@ update_run(run, attrs)
Examples
-iex> update_run(run, %{field: new_value})
-{:ok, %Run{}}
+iex> update_run(run, %{field: new_value})
+{:ok, %Run{}}
-iex> update_run(run, %{field: bad_value})
-{:error, %Ecto.Changeset{}}
+iex> update_run(run, %{field: bad_value})
+{:error, %Ecto.Changeset{}}
diff --git a/Lightning.InvocationReasons.html b/Lightning.InvocationReasons.html
index a486834547..7079d5aeab 100644
--- a/Lightning.InvocationReasons.html
+++ b/Lightning.InvocationReasons.html
@@ -273,11 +273,11 @@ create_reason(attrs \\ %{})
Examples
-iex> create_reason(%{field: value})
-{:ok, %InvocationReason{}}
+iex> create_reason(%{field: value})
+{:ok, %InvocationReason{}}
-iex> create_reason(%{field: bad_value})
-{:error, %Ecto.Changeset{}}
+iex> create_reason(%{field: bad_value})
+{:error, %Ecto.Changeset{}}
diff --git a/Lightning.Jobs.Job.html b/Lightning.Jobs.Job.html
index 3feb54aa62..96c016f9e9 100644
--- a/Lightning.Jobs.Job.html
+++ b/Lightning.Jobs.Job.html
@@ -336,17 +336,17 @@ put_workflow(changeset, workflow)
Attaches a workflow to a job, this is useful when you have an unpersisted
Workflow changeset - and want it to be created at the same time as a Job.
Example:
workflow =
- Ecto.Changeset.cast(
- %Lightning.Workflows.Workflow{},
- %{ "project_id" => attrs[:project_id], "id" => Ecto.UUID.generate() },
- [:project_id, :id]
- )
+ Ecto.Changeset.cast(
+ %Lightning.Workflows.Workflow{},
+ %{ "project_id" => attrs[:project_id], "id" => Ecto.UUID.generate() },
+ [:project_id, :id]
+ )
job =
- %Job{}
- |> Ecto.Changeset.change()
- |> Job.put_workflow(workflow)
- |> Job.changeset(attrs)
+ %Job{}
+ |> Ecto.Changeset.change()
+ |> Job.put_workflow(workflow)
+ |> Job.changeset(attrs)
iex> change_job(job)
-%Ecto.Changeset{data: %Job{}}
+iex> change_job(job)
+%Ecto.Changeset{data: %Job{}}
iex> create_job(%{field: value})
-{:ok, %Job{}}
+iex> create_job(%{field: value})
+{:ok, %Job{}}
-iex> create_job(%{field: bad_value})
-{:error, %Ecto.Changeset{}}
+iex> create_job(%{field: bad_value})
+{:error, %Ecto.Changeset{}}
iex> delete_job(job)
-{:ok, %Job{}}
+iex> delete_job(job)
+{:ok, %Job{}}
-iex> delete_job(job)
-{:error, %Ecto.Changeset{}}
+iex> delete_job(job)
+{:error, %Ecto.Changeset{}}
iex> get_job!(123)
-%Job{}
+iex> get_job!(123)
+%Job{}
-iex> get_job!(456)
+iex> get_job!(456)
** (Ecto.NoResultsError)
iex> update_job(job, %{field: new_value})
-{:ok, %Job{}}
+iex> update_job(job, %{field: new_value})
+{:ok, %Job{}}
-iex> update_job(job, %{field: bad_value})
-{:error, %Ecto.Changeset{}}
+iex> update_job(job, %{field: bad_value})
+{:error, %Ecto.Changeset{}}
diff --git a/Lightning.Pipeline.StateAssembler.html b/Lightning.Pipeline.StateAssembler.html
index ca611eafda..f27a64a90f 100644
--- a/Lightning.Pipeline.StateAssembler.html
+++ b/Lightning.Pipeline.StateAssembler.html
@@ -121,7 +121,7 @@ For the most common jobs, an inbound webhook will store an :http_request
type
-dataclip. The reason that is created is associated with the dataclip.
At runtime, the initial state for a Run will be in the shape of:
{ "data": <the dataclip>, "configuration": <the job's credential> }
At runtime, the initial state for a Run will be in the shape of:
{ "data": <the dataclip>, "configuration": <the job's credential> }
saved-inputs
diff --git a/Lightning.Policies.Permissions.html b/Lightning.Policies.Permissions.html index e3b6c7c0c9..5557e74f6a 100644 --- a/Lightning.Policies.Permissions.html +++ b/Lightning.Policies.Permissions.html @@ -115,13 +115,13 @@This module defines a unique interface managing authorizations in Lightning.
Users in Lightning have instance-wide and project-wide roles which determine their level of access to resources in the application. Fo rmore details see the documentation.
These authorizations policies are all implemented under the lib/lightning/policies
folder. In that folder you can find 3 files:
users.ex
file has all the policies for the instances wide access levelsproject_users.ex
file has all the policies for the project wide access levelspermissions.ex
file defines the Lightning.Policies.Permissions.can/4
interface. Which is a wrapper around the Bodyguard.permit/4
function.
-We use that interface to be able to harmonize the use of policies accross the entire app.All the policies are tested in the test/lightning/policies
folder. And the test are written in a way that allows the reader to quickly who can do what in the app.
We have two variants of the Lightning.Policies.Permissions.can/4
interface:
Lightning.Policies.Permissions.can(policy, action, actor, resource)
returns :ok
if the actor can perform the action on the resource and {:error, :unauthorized}
otherwise.Lightning.Policies.Permissions.can?(policy, action, actor, resource)
returns true
if the actor can perform the action on the resource and false
otherwise.Here is an example of how we the Lightning.Policies.Permissions.can/4
interface to check if the a user can edit a job or not
can_edit_job = Lightning.Policies.ProjectUsers |> Lightning.Policies.Permissions.can?(:edit_job, socket.assigns.current_user, socket.assigns.project)
+We use that interface to be able to harmonize the use of policies accross the entire app.All the policies are tested in the test/lightning/policies
folder. And the test are written in a way that allows the reader to quickly who can do what in the app.
We have two variants of the Lightning.Policies.Permissions.can/4
interface:
Lightning.Policies.Permissions.can(policy, action, actor, resource)
returns :ok
if the actor can perform the action on the resource and {:error, :unauthorized}
otherwise.Lightning.Policies.Permissions.can?(policy, action, actor, resource)
returns true
if the actor can perform the action on the resource and false
otherwise.
Here is an example of how we the Lightning.Policies.Permissions.can/4
interface to check if the a user can edit a job or not
can_edit_job = Lightning.Policies.ProjectUsers |> Lightning.Policies.Permissions.can?(:edit_job, socket.assigns.current_user, socket.assigns.project)
-if can_edit_job do
+if can_edit_job do
# allow user to edit the job
-else
+else
# quick user out
-end
+end
iex> can(Lightning.Policies.Users, :create_workflow, user, project)
+iex> can(Lightning.Policies.Users, :create_workflow, user, project)
:ok
-iex> can(Lightning.Policies.Users, :create_project, user, %{})
-{:error, :unauthorized}
+iex> can(Lightning.Policies.Users, :create_project, user, %{})
+{:error, :unauthorized}
iex> can(Lightning.Policies.Users, :create_workflow, user, project)
+iex> can(Lightning.Policies.Users, :create_workflow, user, project)
true
-iex> can(Lightning.Policies.Users, :create_project, user, %{})
+iex> can(Lightning.Policies.Users, :create_project, user, %{})
false
iex> change_project(project)
-%Ecto.Changeset{data: %Project{}}
+iex> change_project(project)
+%Ecto.Changeset{data: %Project{}}
iex> create_project(%{field: value})
-{:ok, %Project{}}
+iex> create_project(%{field: value})
+{:ok, %Project{}}
-iex> create_project(%{field: bad_value})
-{:error, %Ecto.Changeset{}}
+iex> create_project(%{field: bad_value})
+{:error, %Ecto.Changeset{}}
iex> delete_project(project)
-{:ok, %Project{}}
+iex> delete_project(project)
+{:ok, %Project{}}
-iex> delete_project(project)
-{:error, %Ecto.Changeset{}}
+iex> delete_project(project)
+{:error, %Ecto.Changeset{}}
iex> export_project(:yaml, project_id)
-{:ok, string}
+iex> export_project(:yaml, project_id)
+{:ok, string}
iex> get_project!(123)
-%Project{}
+iex> get_project!(123)
+%Project{}
-iex> get_project!(456)
+iex> get_project!(456)
** (Ecto.NoResultsError)
iex> get_project_user!(123)
-%ProjectUser{}
+iex> get_project_user!(123)
+%ProjectUser{}
-iex> get_project_user!(456)
+iex> get_project_user!(456)
** (Ecto.NoResultsError)
@@ -824,16 +824,16 @@ get_project_user_role(user, project)
Examples
-iex> get_project_user_role(user, project)
+iex> get_project_user_role(user, project)
:admin
-iex> get_project_user_role(user, project)
+iex> get_project_user_role(user, project)
:viewer
-iex> get_project_user_role(user, project)
+iex> get_project_user_role(user, project)
:editor
-iex> get_project_user_role(user, project)
+iex> get_project_user_role(user, project)
:owner
@@ -862,10 +862,10 @@ get_project_with_users!(id)
Examples
-iex> get_project!(123)
-%Project{}
+iex> get_project!(123)
+%Project{}
-iex> get_project!(456)
+iex> get_project!(456)
** (Ecto.NoResultsError)
@@ -976,8 +976,8 @@ list_projects()
Examples
-iex> list_projects()
-[%Project{}, ...]
+iex> list_projects()
+[%Project{}, ...]
@@ -1435,11 +1435,11 @@ update_project(project, attrs)
Examples
-iex> update_project(project, %{field: new_value})
-{:ok, %Project{}}
+iex> update_project(project, %{field: new_value})
+{:ok, %Project{}}
-iex> update_project(project, %{field: bad_value})
-{:error, %Ecto.Changeset{}}
+iex> update_project(project, %{field: bad_value})
+{:error, %Ecto.Changeset{}}
@@ -1467,11 +1467,11 @@ update_project_user(project_user, attrs)
Examples
-iex> update_project_user(project_user, %{field: new_value})
-{:ok, %ProjectUser{}}
+iex> update_project_user(project_user, %{field: new_value})
+{:ok, %ProjectUser{}}
-iex> update_project_user(projectUser, %{field: bad_value})
-{:error, %Ecto.Changeset{}}
+iex> update_project_user(projectUser, %{field: bad_value})
+{:error, %Ecto.Changeset{}}
@@ -1521,8 +1521,8 @@ validate_for_deletion(project, attrs)
Examples
-iex> validate_for_deletion(project)
-%Ecto.Changeset{data: %Project{}}
+iex> validate_for_deletion(project)
+%Ecto.Changeset{data: %Project{}}
diff --git a/Lightning.Runtime.LogAgent.html b/Lightning.Runtime.LogAgent.html
index 2d339de345..2ed8e5fd83 100644
--- a/Lightning.Runtime.LogAgent.html
+++ b/Lightning.Runtime.LogAgent.html
@@ -115,9 +115,9 @@
Agent facility to consume STDOUT/STDERR byte by byte.
Since it works on a byte by byte basis, you will need to perform line-splitting
-yourself.
Usage:
{:ok, log} = LogAgent.start_link()
-"foo" = LogAgent.process_chunk(log, {:stdout, "foo"})
-"foobar" = LogAgent.process_chunk(log, {:stdout, "bar"})
+yourself.Usage:
{:ok, log} = LogAgent.start_link()
+"foo" = LogAgent.process_chunk(log, {:stdout, "foo"})
+"foobar" = LogAgent.process_chunk(log, {:stdout, "bar"})
diff --git a/Lightning.Scrubber.html b/Lightning.Scrubber.html
index cd6a31d505..47506f7b04 100644
--- a/Lightning.Scrubber.html
+++ b/Lightning.Scrubber.html
@@ -114,11 +114,11 @@
-Process used to scrub strings of sensitive information.
Can be started via start_link/1
.
{:ok, scrubber} =
- Lightning.Scrubber.start_link(
+Process used to scrub strings of sensitive information.
Can be started via start_link/1
.
{:ok, scrubber} =
+ Lightning.Scrubber.start_link(
samples:
- Lightning.Credentials.sensitive_values_for(credential)
- )
Takes an optional :name
key, in case you need to name the process.
+ Lightning.Credentials.sensitive_values_for(credential)
+ )
Takes an optional :name
key, in case you need to name the process.
diff --git a/Lightning.TaskWorker.html b/Lightning.TaskWorker.html
index 3e005b83ea..6b6497d8e4 100644
--- a/Lightning.TaskWorker.html
+++ b/Lightning.TaskWorker.html
@@ -117,7 +117,7 @@
A TaskWorker with concurrency limits.
A simple concurrency limiter that wraps Task.Supervisor
, which already does
have the ability to specify max_children
; it throws an error when
that limit is exceeded.
To use it, start it like any other process; ideally in your supervision tree.
...,
- {Lightning.TaskWorker, name: :cli_task_worker, max_tasks: 4}
Options
:max_tasks
Defaults to the number of system schedulers available to the vm.
+ {Lightning.TaskWorker, name: :cli_task_worker, max_tasks: 4}
Options
:max_tasks
Defaults to the number of system schedulers available to the vm.
diff --git a/Lightning.Validators.html b/Lightning.Validators.html
index 47ff04d93f..d4e1f3bd89 100644
--- a/Lightning.Validators.html
+++ b/Lightning.Validators.html
@@ -192,10 +192,10 @@ validate_exclusive(changeset, fields, messa
Validate that only one of the fields is set at a time.
Example:
changeset
-|> validate_exclusive(
- [:source_job_id, :source_trigger_id],
+|> validate_exclusive(
+ [:source_job_id, :source_trigger_id],
"source_job_id and source_trigger_id are mutually exclusive"
-)
+)
diff --git a/Lightning.WorkOrderService.html b/Lightning.WorkOrderService.html
index b81f283c63..ef8006a035 100644
--- a/Lightning.WorkOrderService.html
+++ b/Lightning.WorkOrderService.html
@@ -342,11 +342,11 @@ create_work_order(attrs \\ %{})
Examples
-iex> create_work_order(%{field: value})
-{:ok, %WorkOrder{}}
+iex> create_work_order(%{field: value})
+{:ok, %WorkOrder{}}
-iex> create_work_order(%{field: bad_value})
-{:error, %Ecto.Changeset{}}
+iex> create_work_order(%{field: bad_value})
+{:error, %Ecto.Changeset{}}
diff --git a/Lightning.Workflows.html b/Lightning.Workflows.html
index 0bdce258a1..4400c5a8d6 100644
--- a/Lightning.Workflows.html
+++ b/Lightning.Workflows.html
@@ -349,8 +349,8 @@ change_workflow(workflow, attrs \\ %{})
Examples
-iex> change_workflow(workflow)
-%Ecto.Changeset{data: %Workflow{}}
+iex> change_workflow(workflow)
+%Ecto.Changeset{data: %Workflow{}}
@@ -402,11 +402,11 @@ create_workflow(attrs \\ %{})
Examples
-iex> create_workflow(%{field: value})
-{:ok, %Workflow{}}
+iex> create_workflow(%{field: value})
+{:ok, %Workflow{}}
-iex> create_workflow(%{field: bad_value})
-{:error, %Ecto.Changeset{}}
+iex> create_workflow(%{field: bad_value})
+{:error, %Ecto.Changeset{}}
@@ -434,11 +434,11 @@ delete_workflow(workflow)
Examples
-iex> delete_workflow(workflow)
-{:ok, %Workflow{}}
+iex> delete_workflow(workflow)
+{:ok, %Workflow{}}
-iex> delete_workflow(workflow)
-{:error, %Ecto.Changeset{}}
+iex> delete_workflow(workflow)
+{:error, %Ecto.Changeset{}}
@@ -539,10 +539,10 @@ get_workflow!(id)
Examples
-iex> get_workflow!(123)
-%Workflow{}
+iex> get_workflow!(123)
+%Workflow{}
-iex> get_workflow!(456)
+iex> get_workflow!(456)
** (Ecto.NoResultsError)
@@ -623,8 +623,8 @@ list_workflows()
Examples
-iex> list_workflows()
-[%Workflow{}, ...]
+iex> list_workflows()
+[%Workflow{}, ...]
@@ -654,8 +654,8 @@ mark_for_deletion(workflow, attrs \\ %{})
Examples
-iex> change_request_deletion(workflow)
-%Ecto.Changeset{data: %Workflow{}}
+iex> change_request_deletion(workflow)
+%Ecto.Changeset{data: %Workflow{}}
@@ -733,11 +733,11 @@ update_workflow(workflow, attrs)
Examples
-iex> update_workflow(workflow, %{field: new_value})
-{:ok, %Workflow{}}
+iex> update_workflow(workflow, %{field: new_value})
+{:ok, %Workflow{}}
-iex> update_workflow(workflow, %{field: bad_value})
-{:error, %Ecto.Changeset{}}
+iex> update_workflow(workflow, %{field: bad_value})
+{:error, %Ecto.Changeset{}}
diff --git a/Lightning.epub b/Lightning.epub
index f4f8ef10eca718043fb3873b469ed1d816e46099..b0dd7d6a024c4186ac5228f8ef3e93f9bbe9352f 100644
GIT binary patch
delta 81897
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