From c693d546a1c837111ae822827f248db3280c86b6 Mon Sep 17 00:00:00 2001 From: taylordowns2000 Date: Wed, 23 Aug 2023 12:19:55 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20OpenFn/L?= =?UTF-8?q?ightning@7c602155888e31b23110220c06fcbdc33e6d3259=20?= =?UTF-8?q?=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .build | 4 +- 404.html | 2 +- Lightning.Accounts.User.RolesEnum.html | 2 +- Lightning.Accounts.User.html | 2 +- Lightning.Accounts.UserBackupCode.html | 2 +- Lightning.Accounts.UserNotifier.html | 2 +- Lightning.Accounts.UserTOTP.html | 2 +- Lightning.Accounts.UserToken.html | 2 +- Lightning.Accounts.html | 128 ++++++------ Lightning.AdaptorRegistry.Npm.html | 12 +- Lightning.AdaptorRegistry.html | 14 +- Lightning.AdaptorService.html | 2 +- Lightning.Attempt.html | 2 +- Lightning.AttemptRun.html | 2 +- Lightning.AttemptService.html | 10 +- Lightning.Auditing.Model.html | 2 +- Lightning.Auditing.html | 2 +- Lightning.AuthProviders.AuthConfig.html | 2 +- Lightning.AuthProviders.CacheWarmer.html | 2 +- Lightning.AuthProviders.Google.html | 2 +- Lightning.AuthProviders.Handler.html | 2 +- Lightning.AuthProviders.Store.html | 2 +- Lightning.AuthProviders.WellKnown.html | 12 +- Lightning.AuthProviders.html | 2 +- Lightning.CLI.Result.html | 4 +- Lightning.CLI.html | 2 +- Lightning.Credentials.Audit.html | 2 +- Lightning.Credentials.Credential.html | 2 +- Lightning.Credentials.Schema.html | 2 +- Lightning.Credentials.SchemaDocument.html | 2 +- Lightning.Credentials.SensitiveValues.html | 2 +- Lightning.Credentials.html | 52 ++--- Lightning.Demo.html | 2 +- Lightning.ExportUtils.html | 2 +- Lightning.FailureNotifierView.html | 2 +- Lightning.Helpers.html | 2 +- Lightning.Invocation.Dataclip.html | 2 +- Lightning.Invocation.LogLine.html | 2 +- Lightning.Invocation.Query.html | 2 +- Lightning.Invocation.Run.html | 2 +- Lightning.Invocation.html | 88 ++++---- Lightning.InvocationReason.html | 2 +- Lightning.InvocationReasons.html | 10 +- Lightning.Jobs.Job.html | 20 +- Lightning.Jobs.Query.html | 2 +- Lightning.Jobs.Scheduler.html | 2 +- Lightning.Jobs.Trigger.html | 2 +- Lightning.Jobs.html | 36 ++-- Lightning.MetadataService.Error.html | 2 +- Lightning.MetadataService.html | 2 +- Lightning.Name.html | 2 +- Lightning.ObanManager.html | 2 +- Lightning.Pipeline.Runner.Handler.html | 2 +- Lightning.Pipeline.Runner.html | 2 +- Lightning.Pipeline.StateAssembler.html | 4 +- Lightning.Pipeline.html | 2 +- Lightning.Policies.Permissions.html | 20 +- Lightning.Policies.ProjectUsers.html | 2 +- Lightning.Policies.Provisioning.html | 2 +- Lightning.Policies.Users.html | 2 +- Lightning.Projects.Project.html | 2 +- Lightning.Projects.ProjectCredential.html | 2 +- ...tning.Projects.ProjectUser.DigestEnum.html | 2 +- Lightning.Projects.ProjectUser.RolesEnum.html | 2 +- Lightning.Projects.ProjectUser.html | 2 +- Lightning.Projects.Provisioner.html | 2 +- Lightning.Projects.html | 76 +++---- Lightning.Release.html | 2 +- Lightning.Repo.html | 2 +- Lightning.RunSearchForm.html | 2 +- Lightning.Runtime.ChildProcess.html | 2 +- Lightning.Runtime.Handler.html | 2 +- Lightning.Runtime.LogAgent.StringBuffer.html | 2 +- Lightning.Runtime.LogAgent.html | 8 +- Lightning.Runtime.Result.html | 2 +- Lightning.Runtime.RunSpec.html | 2 +- Lightning.SafetyString.html | 2 +- Lightning.Scrubber.html | 10 +- Lightning.SetupUtils.html | 2 +- Lightning.TaskWorker.html | 4 +- Lightning.Validators.html | 8 +- Lightning.Vault.html | 2 +- Lightning.VersionControl.GithubClient.html | 196 ++++++++++-------- Lightning.VersionControl.GithubToken.html | 14 +- Lightning.VersionControl.ProjectRepo.html | 2 +- Lightning.VersionControl.html | 2 +- Lightning.WorkOrder.html | 2 +- Lightning.WorkOrderService.html | 10 +- Lightning.Workflows.Edge.html | 2 +- Lightning.Workflows.Graph.html | 2 +- Lightning.Workflows.Workflow.html | 2 +- Lightning.Workflows.html | 44 ++-- Lightning.Workorders.SearchParams.html | 2 +- Lightning.epub | Bin 375826 -> 375880 bytes Lightning.html | 2 +- LightningWeb.API.Helpers.html | 2 +- LightningWeb.API.JobController.html | 2 +- LightningWeb.API.ProjectController.html | 2 +- LightningWeb.API.ProvisioningController.html | 2 +- LightningWeb.API.RunController.html | 2 +- LightningWeb.AuditLive.Index.html | 2 +- ...ngWeb.AuthProvidersLive.FormComponent.html | 2 +- LightningWeb.AuthProvidersLive.Index.html | 2 +- LightningWeb.BackupCodesController.html | 2 +- LightningWeb.BackupCodesLive.Index.html | 2 +- LightningWeb.ChangesetJSON.html | 2 +- LightningWeb.ChangesetView.html | 2 +- LightningWeb.Components.Modal.html | 2 +- LightningWeb.CredentialLive.Edit.html | 2 +- ...tningWeb.CredentialLive.FormComponent.html | 2 +- ....CredentialLive.GoogleSheetsComponent.html | 2 +- LightningWeb.CredentialLive.Index.html | 2 +- ...redentialLive.JsonSchemaBodyComponent.html | 2 +- ...ngWeb.CredentialLive.RawBodyComponent.html | 2 +- LightningWeb.CredentialLive.TypePicker.html | 2 +- LightningWeb.DataclipLive.Edit.html | 2 +- LightningWeb.DataclipLive.FormComponent.html | 2 +- LightningWeb.DataclipLive.Index.html | 2 +- LightningWeb.DownloadsController.html | 2 +- LightningWeb.Endpoint.html | 2 +- LightningWeb.ErrorView.html | 2 +- LightningWeb.FallbackController.html | 2 +- LightningWeb.FirstSetupLive.Superuser.html | 2 +- LightningWeb.FormHelpers.html | 2 +- LightningWeb.Gettext.html | 10 +- LightningWeb.HealthCheck.html | 2 +- LightningWeb.Hooks.html | 2 +- LightningWeb.InitAssigns.html | 2 +- LightningWeb.JobLive.AdaptorPicker.html | 2 +- LightningWeb.JobLive.CredentialPicker.html | 2 +- LightningWeb.JobLive.CronSetupComponent.html | 2 +- LightningWeb.JobLive.JobBuilder.html | 2 +- ...tningWeb.JobLive.JobBuilderComponents.html | 2 +- ...ve.ManualRunComponent.ManualWorkorder.html | 2 +- LightningWeb.JobLive.ManualRunComponent.html | 2 +- LightningWeb.LiveHelpers.html | 2 +- LightningWeb.ModalPortal.html | 2 +- LightningWeb.OauthCredentialHelper.html | 10 +- LightningWeb.OidcController.html | 2 +- LightningWeb.PageView.html | 2 +- LightningWeb.Pagination.html | 12 +- LightningWeb.Plugs.FirstSetup.html | 2 +- LightningWeb.ProfileLive.Edit.html | 2 +- LightningWeb.ProfileLive.FormComponent.html | 2 +- LightningWeb.ProfileLive.MfaComponent.html | 2 +- LightningWeb.ProjectLive.FormComponent.html | 2 +- LightningWeb.ProjectLive.Index.html | 2 +- LightningWeb.ProjectLive.MFARequired.html | 2 +- LightningWeb.ProjectLive.Settings.html | 10 +- LightningWeb.ReAuthenticateLive.New.html | 2 +- LightningWeb.RouteHelpers.html | 2 +- LightningWeb.Router.html | 2 +- LightningWeb.RunLive.Index.html | 2 +- LightningWeb.RunLive.RerunJobComponent.html | 2 +- LightningWeb.RunLive.RunViewerLive.html | 2 +- LightningWeb.RunLive.Show.html | 2 +- LightningWeb.RunLive.WorkOrderComponent.html | 2 +- LightningWeb.Telemetry.html | 2 +- LightningWeb.TokensLive.Index.html | 2 +- LightningWeb.UserAuth.html | 2 +- LightningWeb.UserConfirmationController.html | 2 +- LightningWeb.UserLive.Edit.html | 2 +- LightningWeb.UserLive.FormComponent.html | 2 +- LightningWeb.UserLive.Index.html | 2 +- LightningWeb.UserRegistrationController.html | 2 +- LightningWeb.UserResetPasswordController.html | 2 +- LightningWeb.UserSessionController.html | 2 +- LightningWeb.UserTOTPController.html | 2 +- LightningWeb.VersionControlController.html | 2 +- LightningWeb.WebhooksController.html | 2 +- LightningWeb.WorkflowLive.EditorPane.html | 2 +- LightningWeb.WorkflowLive.JobView.html | 2 +- ...ingWeb.WorkflowNewLive.WorkflowParams.html | 2 +- LightningWeb.html | 2 +- Mix.Tasks.Lightning.GenEncryptionKey.html | 2 +- Mix.Tasks.Lightning.InstallRuntime.html | 2 +- Mix.Tasks.Lightning.InstallSchemas.html | 12 +- ObanPruner.html | 2 +- Storybook.Root.html | 2 +- api-reference.html | 2 +- benchmarking.html | 2 +- changelog.html | 2 +- deployment.html | 2 +- dist/search_items-1F06327D.js | 1 - dist/search_items-F6CB3B65.js | 1 + dist/sidebar_items-0263EBFD.js | 1 - dist/sidebar_items-E3A9783E.js | 1 + provisioning.html | 2 +- readme.html | 8 +- search.html | 4 +- 190 files changed, 597 insertions(+), 567 deletions(-) delete mode 100644 dist/search_items-1F06327D.js create mode 100644 dist/search_items-F6CB3B65.js delete mode 100644 dist/sidebar_items-0263EBFD.js create mode 100644 dist/sidebar_items-E3A9783E.js diff --git a/.build b/.build index 477fc74a31..136baae988 100644 --- a/.build +++ b/.build @@ -205,8 +205,8 @@ dist/merriweather-latin-ext-300-normal-K6L27CZ5.woff2 dist/merriweather-vietnamese-300-italic-EHHNZPUO.woff2 dist/merriweather-vietnamese-300-normal-U376L4Z4.woff2 dist/remixicon-NKANDIL5.woff2 -dist/search_items-1F06327D.js -dist/sidebar_items-0263EBFD.js +dist/search_items-F6CB3B65.js +dist/sidebar_items-E3A9783E.js index.html provisioning.html readme.html diff --git a/404.html b/404.html index 6475e4c073..d135a5d820 100644 --- a/404.html +++ b/404.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Accounts.User.RolesEnum.html b/Lightning.Accounts.User.RolesEnum.html index e442058ee4..2e385c45a6 100644 --- a/Lightning.Accounts.User.RolesEnum.html +++ b/Lightning.Accounts.User.RolesEnum.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Accounts.User.html b/Lightning.Accounts.User.html index b90f8abbfb..b0db87d7be 100644 --- a/Lightning.Accounts.User.html +++ b/Lightning.Accounts.User.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Accounts.UserBackupCode.html b/Lightning.Accounts.UserBackupCode.html index b02c2ce9ef..34eff2f043 100644 --- a/Lightning.Accounts.UserBackupCode.html +++ b/Lightning.Accounts.UserBackupCode.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Accounts.UserNotifier.html b/Lightning.Accounts.UserNotifier.html index 2fe5ccc99b..b24bd793dc 100644 --- a/Lightning.Accounts.UserNotifier.html +++ b/Lightning.Accounts.UserNotifier.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Accounts.UserTOTP.html b/Lightning.Accounts.UserTOTP.html index 52f350d782..f9bf194ad6 100644 --- a/Lightning.Accounts.UserTOTP.html +++ b/Lightning.Accounts.UserTOTP.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Accounts.UserToken.html b/Lightning.Accounts.UserToken.html index 6e6c8de6a3..7024d9e8f6 100644 --- a/Lightning.Accounts.UserToken.html +++ b/Lightning.Accounts.UserToken.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Accounts.html b/Lightning.Accounts.html index 6c0789121c..a6cf70a0f0 100644 --- a/Lightning.Accounts.html +++ b/Lightning.Accounts.html @@ -13,7 +13,7 @@ - + @@ -702,10 +702,10 @@

apply_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{}}
@@ -757,8 +757,8 @@

change_scheduled_deletion(user, attrs \\ %{ Examples

-
iex> change_scheduled_deletion(user)
-%Ecto.Changeset{data: %User{}}
+
iex> change_scheduled_deletion(user)
+%Ecto.Changeset{data: %User{}}
@@ -794,8 +794,8 @@

change_superuser_registration(attrs \\ %{}) Examples

-
iex> change_superuser_registration(user)
-%Ecto.Changeset{data: %User{}}
+
iex> change_superuser_registration(user)
+%Ecto.Changeset{data: %User{}}
@@ -849,8 +849,8 @@

change_user_email(user, attrs \\ %{})

Examples -
iex> change_user_email(user)
-%Ecto.Changeset{data: %User{}}
+
iex> change_user_email(user)
+%Ecto.Changeset{data: %User{}}
@@ -880,8 +880,8 @@

change_user_password(user, attrs \\ %{}) Examples

-
iex> change_user_password(user)
-%Ecto.Changeset{data: %User{}}
+
iex> change_user_password(user)
+%Ecto.Changeset{data: %User{}}
@@ -911,8 +911,8 @@

change_user_registration(attrs \\ %{})

Examples -
iex> change_user_registration(user)
-%Ecto.Changeset{data: %User{}}
+
iex> change_user_registration(user)
+%Ecto.Changeset{data: %User{}}
@@ -1029,11 +1029,11 @@

delete_token(token)

Examples -
iex> delete_token(token)
-{:ok, %UserToken{}}
+
iex> delete_token(token)
+{:ok, %UserToken{}}
 
-iex> delete_token(token)
-{:error, %Ecto.Changeset{}}
+
iex> delete_token(token) +{:error, %Ecto.Changeset{}}
@@ -1061,11 +1061,11 @@

delete_user(user)

Examples -
iex> delete_user(user)
-{:ok, %User{}}
+
iex> delete_user(user)
+{:ok, %User{}}
 
-iex> delete_user(user)
-{:error, %Ecto.Changeset{}}
+
iex> delete_user(user) +{:error, %Ecto.Changeset{}}
@@ -1122,8 +1122,8 @@

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: ...}}
@@ -1151,11 +1151,11 @@

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(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(confirmed_user, &Routes.user_confirmation_url(conn, :edit, &1)) +{:error, :already_confirmed}
@@ -1205,8 +1205,8 @@

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: ...}}
@@ -1344,10 +1344,10 @@

get_token!(id)

Examples -
iex> get_token!(123)
-%UserToken{}
+
iex> get_token!(123)
+%UserToken{}
 
-iex> get_token!(456)
+iex> get_token!(456)
 ** (Ecto.NoResultsError)
@@ -1376,10 +1376,10 @@

get_user!(id)

Examples -
iex> get_user!(123)
-%User{}
+
iex> get_user!(123)
+%User{}
 
-iex> get_user!(456)
+iex> get_user!(456)
 ** (Ecto.NoResultsError)
@@ -1452,10 +1452,10 @@

get_user_by_email(email)

Examples -
iex> get_user_by_email("foo@example.com")
-%User{}
+
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
@@ -1484,10 +1484,10 @@

get_user_by_email_and_password(email, passw Examples

-
iex> get_user_by_email_and_password("foo@example.com", "correct_password")
-%User{}
+
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
@@ -1516,10 +1516,10 @@

get_user_by_reset_password_token(token)

Examples -
iex> get_user_by_reset_password_token("validtoken")
-%User{}
+
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
@@ -1716,8 +1716,8 @@

list_users()

Examples -
iex> list_users()
-[%User{}, ...]
+
iex> list_users()
+[%User{}, ...]
@@ -1824,11 +1824,11 @@

register_superuser(attrs)

Examples -
iex> register_superuser(%{field: value})
-{:ok, %User{}}
+
iex> register_superuser(%{field: value})
+{:ok, %User{}}
 
-iex> register_superuser(%{field: bad_value})
-{:error, %Ecto.Changeset{}}
+
iex> register_superuser(%{field: bad_value}) +{:error, %Ecto.Changeset{}}
@@ -1866,11 +1866,11 @@

register_user(attrs)

Examples -
iex> register_user(%{field: value})
-{:ok, %User{}}
+
iex> register_user(%{field: value})
+{:ok, %User{}}
 
-iex> register_user(%{field: bad_value})
-{:error, %Ecto.Changeset{}}
+
iex> register_user(%{field: bad_value}) +{:error, %Ecto.Changeset{}}
@@ -1898,11 +1898,11 @@

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: "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: "valid", password_confirmation: "not the same"}) +{:error, %Ecto.Changeset{}}
@@ -2024,11 +2024,11 @@

update_user_password(user, password, attrs) Examples

-
iex> update_user_password(user, "valid password", %{password: ...})
-{:ok, %User{}}
+
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, "invalid password", %{password: ...}) +{:error, %Ecto.Changeset{}}
diff --git a/Lightning.AdaptorRegistry.Npm.html b/Lightning.AdaptorRegistry.Npm.html index 24bcc8c438..420483cc5d 100644 --- a/Lightning.AdaptorRegistry.Npm.html +++ b/Lightning.AdaptorRegistry.Npm.html @@ -13,7 +13,7 @@ - + @@ -1659,14 +1659,14 @@

request(request)

Examples -
request = %HTTPoison.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(request)
@@ -1724,7 +1724,7 @@

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"}])
diff --git a/Lightning.AdaptorRegistry.html b/Lightning.AdaptorRegistry.html index 7cb7f87e1e..7b64bca06a 100644 --- a/Lightning.AdaptorRegistry.html +++ b/Lightning.AdaptorRegistry.html @@ -13,7 +13,7 @@ - + @@ -117,9 +117,9 @@

Registry process to query and maintain a list of adaptors available for writing jobs.

Currently it queries NPM for all modules in the @openfn organization and filters out modules that are known not to be adaptors.

Usage

# Starting the process
-AdaptorRegistry.start_link()
+AdaptorRegistry.start_link()
 # Getting a list of all adaptors
-Lightning.AdaptorRegistry.AdaptorRegistry.all()

Caching

By default the results are cached to disk, and will be reused every start.

In order to disable or configure caching pass see: start_link/1.

The process uses :continue to return before the adaptors have been queried. +Lightning.AdaptorRegistry.AdaptorRegistry.all()

Caching

By default the results are cached to disk, and will be reused every start.

In order to disable or configure caching pass see: start_link/1.

The process uses :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.

Timeouts

There is a 'general' timeout of 30s, this is used for GenServer calls like all/1 and also internally when the modules are being queried. NPM can @@ -411,10 +411,10 @@

resolve_package_name(package_name)

-

Destructures an NPM style package name into module name and version.

Example

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 }
+

Destructures an NPM style package name into module name and version.

Example

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 }
diff --git a/Lightning.AdaptorService.html b/Lightning.AdaptorService.html index 65168163d0..aff25d682e 100644 --- a/Lightning.AdaptorService.html +++ b/Lightning.AdaptorService.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Attempt.html b/Lightning.Attempt.html index 1121562966..c5b310b8cc 100644 --- a/Lightning.Attempt.html +++ b/Lightning.Attempt.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.AttemptRun.html b/Lightning.AttemptRun.html index 88218a8db2..dfebc1b128 100644 --- a/Lightning.AttemptRun.html +++ b/Lightning.AttemptRun.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.AttemptService.html b/Lightning.AttemptService.html index 3b8ec77936..35d9ae104c 100644 --- a/Lightning.AttemptService.html +++ b/Lightning.AttemptService.html @@ -13,7 +13,7 @@ - + @@ -354,11 +354,11 @@

create_attempt(work_order, job, reason)

Examples -
iex> create_attempt(%{field: value})
-{:ok, %Attempt{}}
+
iex> create_attempt(%{field: value})
+{:ok, %Attempt{}}
 
-iex> create_attempt(%{field: bad_value})
-{:error, %Ecto.Changeset{}}
+
iex> create_attempt(%{field: bad_value}) +{:error, %Ecto.Changeset{}}
diff --git a/Lightning.Auditing.Model.html b/Lightning.Auditing.Model.html index d219024a4f..3447a1db98 100644 --- a/Lightning.Auditing.Model.html +++ b/Lightning.Auditing.Model.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Auditing.html b/Lightning.Auditing.html index d2c2a42e56..fd690c97c1 100644 --- a/Lightning.Auditing.html +++ b/Lightning.Auditing.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.AuthProviders.AuthConfig.html b/Lightning.AuthProviders.AuthConfig.html index f572246f8c..b522e75b16 100644 --- a/Lightning.AuthProviders.AuthConfig.html +++ b/Lightning.AuthProviders.AuthConfig.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.AuthProviders.CacheWarmer.html b/Lightning.AuthProviders.CacheWarmer.html index 0d8c7ffb52..995c945c38 100644 --- a/Lightning.AuthProviders.CacheWarmer.html +++ b/Lightning.AuthProviders.CacheWarmer.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.AuthProviders.Google.html b/Lightning.AuthProviders.Google.html index c1348d2b45..ba7e15fa50 100644 --- a/Lightning.AuthProviders.Google.html +++ b/Lightning.AuthProviders.Google.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.AuthProviders.Handler.html b/Lightning.AuthProviders.Handler.html index 4fd101dd75..4f614f928b 100644 --- a/Lightning.AuthProviders.Handler.html +++ b/Lightning.AuthProviders.Handler.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.AuthProviders.Store.html b/Lightning.AuthProviders.Store.html index e2cdfec43d..aaea2f2d6c 100644 --- a/Lightning.AuthProviders.Store.html +++ b/Lightning.AuthProviders.Store.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.AuthProviders.WellKnown.html b/Lightning.AuthProviders.WellKnown.html index bb3beda30e..3698037919 100644 --- a/Lightning.AuthProviders.WellKnown.html +++ b/Lightning.AuthProviders.WellKnown.html @@ -13,7 +13,7 @@ - + @@ -1834,14 +1834,14 @@

request(request)

Examples -
request = %HTTPoison.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(request)
@@ -1899,7 +1899,7 @@

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"}])
diff --git a/Lightning.AuthProviders.html b/Lightning.AuthProviders.html index 0640a1e032..ab380ac0c6 100644 --- a/Lightning.AuthProviders.html +++ b/Lightning.AuthProviders.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.CLI.Result.html b/Lightning.CLI.Result.html index 2a57a7d973..5bedb72734 100644 --- a/Lightning.CLI.Result.html +++ b/Lightning.CLI.Result.html @@ -13,7 +13,7 @@ - + @@ -121,7 +121,7 @@

Logs

The OpenFn CLI returns JSON formatted log lines, which are decoded and added -to a 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

+to a 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.CLI.html b/Lightning.CLI.html index 675cdf5bb0..3ac544cdba 100644 --- a/Lightning.CLI.html +++ b/Lightning.CLI.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Credentials.Audit.html b/Lightning.Credentials.Audit.html index 3a4c45594f..7ca1ad9d99 100644 --- a/Lightning.Credentials.Audit.html +++ b/Lightning.Credentials.Audit.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Credentials.Credential.html b/Lightning.Credentials.Credential.html index 82f926379b..1e82e240cb 100644 --- a/Lightning.Credentials.Credential.html +++ b/Lightning.Credentials.Credential.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Credentials.Schema.html b/Lightning.Credentials.Schema.html index 0b1cebe56c..bb492c1526 100644 --- a/Lightning.Credentials.Schema.html +++ b/Lightning.Credentials.Schema.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Credentials.SchemaDocument.html b/Lightning.Credentials.SchemaDocument.html index 1a71d1e44b..f7d38c3a19 100644 --- a/Lightning.Credentials.SchemaDocument.html +++ b/Lightning.Credentials.SchemaDocument.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Credentials.SensitiveValues.html b/Lightning.Credentials.SensitiveValues.html index 3119b3888d..46be1b92b1 100644 --- a/Lightning.Credentials.SensitiveValues.html +++ b/Lightning.Credentials.SensitiveValues.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Credentials.html b/Lightning.Credentials.html index 85a098df72..95dbcc715f 100644 --- a/Lightning.Credentials.html +++ b/Lightning.Credentials.html @@ -13,7 +13,7 @@ - + @@ -277,8 +277,8 @@

change_credential(credential, attrs \\ %{}) Examples

-
iex> change_credential(credential)
-%Ecto.Changeset{data: %Credential{}}
+
iex> change_credential(credential)
+%Ecto.Changeset{data: %Credential{}}
@@ -308,11 +308,11 @@

create_credential(attrs \\ %{})

Examples -
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{}}
@@ -340,11 +340,11 @@

delete_credential(credential)

Examples -
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{}}
@@ -372,10 +372,10 @@

get_credential!(id)

Examples -
iex> get_credential!(123)
-%Credential{}
+
iex> get_credential!(123)
+%Credential{}
 
-iex> get_credential!(456)
+iex> get_credential!(456)
 ** (Ecto.NoResultsError)
@@ -406,11 +406,11 @@

invalid_projects_for_user(credential_id, us Examples

-
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"]
@@ -438,8 +438,8 @@

list_credentials()

Examples -
iex> list_credentials()
-[%Credential{}, ...]
+
iex> list_credentials()
+[%Credential{}, ...]
@@ -489,8 +489,8 @@

list_credentials_for_user(user_id)

Examples -
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},...]
@@ -576,11 +576,11 @@

update_credential(credential, attrs)

Examples -
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{}}
diff --git a/Lightning.Demo.html b/Lightning.Demo.html index 3a99877422..ae72a61eab 100644 --- a/Lightning.Demo.html +++ b/Lightning.Demo.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.ExportUtils.html b/Lightning.ExportUtils.html index 686efecb85..a03209e2ae 100644 --- a/Lightning.ExportUtils.html +++ b/Lightning.ExportUtils.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.FailureNotifierView.html b/Lightning.FailureNotifierView.html index 720291dc4f..6b872d0ce1 100644 --- a/Lightning.FailureNotifierView.html +++ b/Lightning.FailureNotifierView.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Helpers.html b/Lightning.Helpers.html index 82a3652e75..98b5b0376c 100644 --- a/Lightning.Helpers.html +++ b/Lightning.Helpers.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Invocation.Dataclip.html b/Lightning.Invocation.Dataclip.html index ef91a39fa6..16d52016f7 100644 --- a/Lightning.Invocation.Dataclip.html +++ b/Lightning.Invocation.Dataclip.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Invocation.LogLine.html b/Lightning.Invocation.LogLine.html index c360c8116d..db90663505 100644 --- a/Lightning.Invocation.LogLine.html +++ b/Lightning.Invocation.LogLine.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Invocation.Query.html b/Lightning.Invocation.Query.html index b6a5e4b70d..de637b7c49 100644 --- a/Lightning.Invocation.Query.html +++ b/Lightning.Invocation.Query.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Invocation.Run.html b/Lightning.Invocation.Run.html index 6ba1636bb6..c0cf89baa3 100644 --- a/Lightning.Invocation.Run.html +++ b/Lightning.Invocation.Run.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Invocation.html b/Lightning.Invocation.html index 727f131be9..10373b37a8 100644 --- a/Lightning.Invocation.html +++ b/Lightning.Invocation.html @@ -13,7 +13,7 @@ - + @@ -476,8 +476,8 @@

change_dataclip(dataclip, attrs \\ %{})

Examples -
iex> change_dataclip(dataclip)
-%Ecto.Changeset{data: %Dataclip{}}
+
iex> change_dataclip(dataclip)
+%Ecto.Changeset{data: %Dataclip{}}
@@ -507,8 +507,8 @@

change_run(run, attrs \\ %{})

Examples -
iex> change_run(run)
-%Ecto.Changeset{data: %Run{}}
+
iex> change_run(run)
+%Ecto.Changeset{data: %Run{}}
@@ -546,11 +546,11 @@

create_dataclip(attrs \\ %{})

Examples -
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{}}
@@ -602,11 +602,11 @@

create_run(attrs \\ %{})

Examples -
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{}}
@@ -634,11 +634,11 @@

delete_dataclip(dataclip)

Examples -
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{}}
@@ -666,11 +666,11 @@

delete_run(run)

Examples -
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{}}
@@ -859,14 +859,14 @@

get_dataclip(run)

Examples -
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{}
@@ -900,10 +900,10 @@

get_dataclip!(id)

Examples -
iex> get_dataclip!(123)
-%Dataclip{}
+
iex> get_dataclip!(123)
+%Dataclip{}
 
-iex> get_dataclip!(456)
+iex> get_dataclip!(456)
 ** (Ecto.NoResultsError)
@@ -982,10 +982,10 @@

get_run!(id)

Examples -
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.InvocationReason.html b/Lightning.InvocationReason.html index 2444b61b4f..1f573e94ad 100644 --- a/Lightning.InvocationReason.html +++ b/Lightning.InvocationReason.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.InvocationReasons.html b/Lightning.InvocationReasons.html index 03994770f1..5ab25ead27 100644 --- a/Lightning.InvocationReasons.html +++ b/Lightning.InvocationReasons.html @@ -13,7 +13,7 @@ - + @@ -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 011badba41..496f3b0fd0 100644 --- a/Lightning.Jobs.Job.html +++ b/Lightning.Jobs.Job.html @@ -13,7 +13,7 @@ - + @@ -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)
diff --git a/Lightning.Jobs.Query.html b/Lightning.Jobs.Query.html index c18b684223..fc8c3f17cd 100644 --- a/Lightning.Jobs.Query.html +++ b/Lightning.Jobs.Query.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Jobs.Scheduler.html b/Lightning.Jobs.Scheduler.html index ff364dd2c2..4b0111b82a 100644 --- a/Lightning.Jobs.Scheduler.html +++ b/Lightning.Jobs.Scheduler.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Jobs.Trigger.html b/Lightning.Jobs.Trigger.html index e427455317..4d56498e38 100644 --- a/Lightning.Jobs.Trigger.html +++ b/Lightning.Jobs.Trigger.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Jobs.html b/Lightning.Jobs.html index e0b04c58e9..f58ef996bd 100644 --- a/Lightning.Jobs.html +++ b/Lightning.Jobs.html @@ -13,7 +13,7 @@ - + @@ -295,8 +295,8 @@

change_job(job, attrs \\ %{})

Examples -
iex> change_job(job)
-%Ecto.Changeset{data: %Job{}}
+
iex> change_job(job)
+%Ecto.Changeset{data: %Job{}}
@@ -326,11 +326,11 @@

create_job(attrs \\ %{})

Examples -
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{}}
@@ -358,11 +358,11 @@

delete_job(job)

Examples -
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{}}
@@ -448,10 +448,10 @@

get_job!(id)

Examples -
iex> get_job!(123)
-%Job{}
+
iex> get_job!(123)
+%Job{}
 
-iex> get_job!(456)
+iex> get_job!(456)
 ** (Ecto.NoResultsError)
@@ -637,11 +637,11 @@

update_job(job, attrs)

Examples -
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.MetadataService.Error.html b/Lightning.MetadataService.Error.html index 354cb93fdd..c4fa580238 100644 --- a/Lightning.MetadataService.Error.html +++ b/Lightning.MetadataService.Error.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.MetadataService.html b/Lightning.MetadataService.html index 514416c172..b9b301bba7 100644 --- a/Lightning.MetadataService.html +++ b/Lightning.MetadataService.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Name.html b/Lightning.Name.html index 0f6b7d51ed..e097ec546a 100644 --- a/Lightning.Name.html +++ b/Lightning.Name.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.ObanManager.html b/Lightning.ObanManager.html index 27bd4b4a41..8734bb6c13 100644 --- a/Lightning.ObanManager.html +++ b/Lightning.ObanManager.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Pipeline.Runner.Handler.html b/Lightning.Pipeline.Runner.Handler.html index a134611a2b..18952ee225 100644 --- a/Lightning.Pipeline.Runner.Handler.html +++ b/Lightning.Pipeline.Runner.Handler.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Pipeline.Runner.html b/Lightning.Pipeline.Runner.html index 5ff683b1bf..a498da99f2 100644 --- a/Lightning.Pipeline.Runner.html +++ b/Lightning.Pipeline.Runner.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Pipeline.StateAssembler.html b/Lightning.Pipeline.StateAssembler.html index e3d2884f4f..2117f8e461 100644 --- a/Lightning.Pipeline.StateAssembler.html +++ b/Lightning.Pipeline.StateAssembler.html @@ -13,7 +13,7 @@ - + @@ -121,7 +121,7 @@

How state is assembled

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> }

+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> }

saved-inputs

diff --git a/Lightning.Pipeline.html b/Lightning.Pipeline.html index db058f2bca..622bf9db21 100644 --- a/Lightning.Pipeline.html +++ b/Lightning.Pipeline.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Policies.Permissions.html b/Lightning.Policies.Permissions.html index 0058e5302e..975f989cfb 100644 --- a/Lightning.Policies.Permissions.html +++ b/Lightning.Policies.Permissions.html @@ -13,7 +13,7 @@ - + @@ -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:

  • The users.ex file has all the policies for the instances wide access levels
  • The project_users.ex file has all the policies for the project wide access levels
  • The permissions.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
@@ -199,11 +199,11 @@

can(policy, action, user, params \\ [])

Examples -
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}
@@ -233,10 +233,10 @@

can?(policy, action, user, params \\ []) Examples

-
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
diff --git a/Lightning.Policies.ProjectUsers.html b/Lightning.Policies.ProjectUsers.html index 49684690c5..56ef139c55 100644 --- a/Lightning.Policies.ProjectUsers.html +++ b/Lightning.Policies.ProjectUsers.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Policies.Provisioning.html b/Lightning.Policies.Provisioning.html index 3dff53bd0e..8e453b788f 100644 --- a/Lightning.Policies.Provisioning.html +++ b/Lightning.Policies.Provisioning.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Policies.Users.html b/Lightning.Policies.Users.html index 4db16963af..c03dab82eb 100644 --- a/Lightning.Policies.Users.html +++ b/Lightning.Policies.Users.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Projects.Project.html b/Lightning.Projects.Project.html index 8fba200efa..9a8d6ef662 100644 --- a/Lightning.Projects.Project.html +++ b/Lightning.Projects.Project.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Projects.ProjectCredential.html b/Lightning.Projects.ProjectCredential.html index 4a996cfbc3..93253d536a 100644 --- a/Lightning.Projects.ProjectCredential.html +++ b/Lightning.Projects.ProjectCredential.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Projects.ProjectUser.DigestEnum.html b/Lightning.Projects.ProjectUser.DigestEnum.html index 5c33e5ef1a..33dce7610d 100644 --- a/Lightning.Projects.ProjectUser.DigestEnum.html +++ b/Lightning.Projects.ProjectUser.DigestEnum.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Projects.ProjectUser.RolesEnum.html b/Lightning.Projects.ProjectUser.RolesEnum.html index 301d331af1..b09e2e0094 100644 --- a/Lightning.Projects.ProjectUser.RolesEnum.html +++ b/Lightning.Projects.ProjectUser.RolesEnum.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Projects.ProjectUser.html b/Lightning.Projects.ProjectUser.html index afd2826012..681ff340d1 100644 --- a/Lightning.Projects.ProjectUser.html +++ b/Lightning.Projects.ProjectUser.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Projects.Provisioner.html b/Lightning.Projects.Provisioner.html index 4f15bed90e..8a6baeca58 100644 --- a/Lightning.Projects.Provisioner.html +++ b/Lightning.Projects.Provisioner.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Projects.html b/Lightning.Projects.html index 30c8a49189..e195facefd 100644 --- a/Lightning.Projects.html +++ b/Lightning.Projects.html @@ -13,7 +13,7 @@ - + @@ -540,8 +540,8 @@

change_project(project, attrs \\ %{})

Examples -
iex> change_project(project)
-%Ecto.Changeset{data: %Project{}}
+
iex> change_project(project)
+%Ecto.Changeset{data: %Project{}}
@@ -571,11 +571,11 @@

create_project(attrs \\ %{})

Examples -
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{}}
@@ -604,11 +604,11 @@

delete_project(project)

Examples -
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{}}
@@ -642,8 +642,8 @@

export_project(atom, project_id)

Examples -
iex> export_project(:yaml, project_id)
-{:ok, string}
+
iex> export_project(:yaml, project_id)
+{:ok, string}
@@ -693,10 +693,10 @@

get_project!(id)

Examples -
iex> get_project!(123)
-%Project{}
+
iex> get_project!(123)
+%Project{}
 
-iex> get_project!(456)
+iex> get_project!(456)
 ** (Ecto.NoResultsError)
@@ -791,10 +791,10 @@

get_project_user!(id)

Examples -
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.Release.html b/Lightning.Release.html index 7b965ac10a..0efc199137 100644 --- a/Lightning.Release.html +++ b/Lightning.Release.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Repo.html b/Lightning.Repo.html index f5e4746dcb..247cebc513 100644 --- a/Lightning.Repo.html +++ b/Lightning.Repo.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.RunSearchForm.html b/Lightning.RunSearchForm.html index b2a1e59cca..9ae2304b04 100644 --- a/Lightning.RunSearchForm.html +++ b/Lightning.RunSearchForm.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Runtime.ChildProcess.html b/Lightning.Runtime.ChildProcess.html index 2ae1786741..fe197172d6 100644 --- a/Lightning.Runtime.ChildProcess.html +++ b/Lightning.Runtime.ChildProcess.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Runtime.Handler.html b/Lightning.Runtime.Handler.html index 0b28bd16f0..31a8dd99da 100644 --- a/Lightning.Runtime.Handler.html +++ b/Lightning.Runtime.Handler.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Runtime.LogAgent.StringBuffer.html b/Lightning.Runtime.LogAgent.StringBuffer.html index de2ba016a4..abd6098b7c 100644 --- a/Lightning.Runtime.LogAgent.StringBuffer.html +++ b/Lightning.Runtime.LogAgent.StringBuffer.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Runtime.LogAgent.html b/Lightning.Runtime.LogAgent.html index 1eeb0e1093..eace43d283 100644 --- a/Lightning.Runtime.LogAgent.html +++ b/Lightning.Runtime.LogAgent.html @@ -13,7 +13,7 @@ - + @@ -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.Runtime.Result.html b/Lightning.Runtime.Result.html index 7f971a2e38..07950bdd60 100644 --- a/Lightning.Runtime.Result.html +++ b/Lightning.Runtime.Result.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Runtime.RunSpec.html b/Lightning.Runtime.RunSpec.html index ad839391e9..c0d653e1e5 100644 --- a/Lightning.Runtime.RunSpec.html +++ b/Lightning.Runtime.RunSpec.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.SafetyString.html b/Lightning.SafetyString.html index ef9436834d..d1b4c06093 100644 --- a/Lightning.SafetyString.html +++ b/Lightning.SafetyString.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Scrubber.html b/Lightning.Scrubber.html index 7b3c2668a7..20c4295891 100644 --- a/Lightning.Scrubber.html +++ b/Lightning.Scrubber.html @@ -13,7 +13,7 @@ - + @@ -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.SetupUtils.html b/Lightning.SetupUtils.html index e718ffbc99..07b21be5c6 100644 --- a/Lightning.SetupUtils.html +++ b/Lightning.SetupUtils.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.TaskWorker.html b/Lightning.TaskWorker.html index 65b8b7ef5a..22586e27b6 100644 --- a/Lightning.TaskWorker.html +++ b/Lightning.TaskWorker.html @@ -13,7 +13,7 @@ - + @@ -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 b3ee7f7053..0bc787ea8a 100644 --- a/Lightning.Validators.html +++ b/Lightning.Validators.html @@ -13,7 +13,7 @@ - + @@ -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.Vault.html b/Lightning.Vault.html index 5f70c1d211..c984782104 100644 --- a/Lightning.Vault.html +++ b/Lightning.Vault.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.VersionControl.GithubClient.html b/Lightning.VersionControl.GithubClient.html index e8ad9961e5..af0ab43c66 100644 --- a/Lightning.VersionControl.GithubClient.html +++ b/Lightning.VersionControl.GithubClient.html @@ -13,7 +13,7 @@ - + @@ -170,7 +170,7 @@

+ +
trace(client, url, opts) @@ -438,11 +446,11 @@

delete(client, url, opts)

-

Perform a DELETE request.

See request/1 or request/2 for options definition.

delete("/users")
-delete("/users", query: [scope: "admin"])
-delete(client, "/users")
-delete(client, "/users", query: [scope: "admin"])
-delete(client, "/users", body: %{name: "Jon"})
+

Perform a DELETE request.

See request/1 or request/2 for options definition.

delete("/users")
+delete("/users", query: [scope: "admin"])
+delete(client, "/users")
+delete(client, "/users", query: [scope: "admin"])
+delete(client, "/users", body: %{name: "Jon"})

@@ -471,11 +479,11 @@

delete!(client, url, opts)

-

Perform a DELETE request.

See request!/1 or request!/2 for options definition.

delete!("/users")
-delete!("/users", query: [scope: "admin"])
-delete!(client, "/users")
-delete!(client, "/users", query: [scope: "admin"])
-delete!(client, "/users", body: %{name: "Jon"})
+

Perform a DELETE request.

See request!/1 or request!/2 for options definition.

delete!("/users")
+delete!("/users", query: [scope: "admin"])
+delete!(client, "/users")
+delete!(client, "/users", query: [scope: "admin"])
+delete!(client, "/users", body: %{name: "Jon"})
@@ -485,9 +493,9 @@

delete!(client, url, opts)

Link to this function -

fire_repository_dispatch(installation_id, repo_name, user_name)

+

fire_repository_dispatch(installation_id, repo_name, user_email)

- + View Source @@ -525,11 +533,11 @@

get(client, url, opts)

-

Perform a GET request.

See request/1 or request/2 for options definition.

get("/users")
-get("/users", query: [scope: "admin"])
-get(client, "/users")
-get(client, "/users", query: [scope: "admin"])
-get(client, "/users", body: %{name: "Jon"})
+

Perform a GET request.

See request/1 or request/2 for options definition.

get("/users")
+get("/users", query: [scope: "admin"])
+get(client, "/users")
+get(client, "/users", query: [scope: "admin"])
+get(client, "/users", body: %{name: "Jon"})
@@ -558,11 +566,11 @@

get!(client, url, opts)

-

Perform a GET request.

See request!/1 or request!/2 for options definition.

get!("/users")
-get!("/users", query: [scope: "admin"])
-get!(client, "/users")
-get!(client, "/users", query: [scope: "admin"])
-get!(client, "/users", body: %{name: "Jon"})
+

Perform a GET request.

See request!/1 or request!/2 for options definition.

get!("/users")
+get!("/users", query: [scope: "admin"])
+get!(client, "/users")
+get!(client, "/users", query: [scope: "admin"])
+get!(client, "/users", body: %{name: "Jon"})
@@ -574,7 +582,7 @@

get!(client, url, opts)

get_repo_branches(installation_id, repo_name)

- + View Source @@ -612,11 +620,11 @@

head(client, url, opts)

-

Perform a HEAD request.

See request/1 or request/2 for options definition.

head("/users")
-head("/users", query: [scope: "admin"])
-head(client, "/users")
-head(client, "/users", query: [scope: "admin"])
-head(client, "/users", body: %{name: "Jon"})
+

Perform a HEAD request.

See request/1 or request/2 for options definition.

head("/users")
+head("/users", query: [scope: "admin"])
+head(client, "/users")
+head(client, "/users", query: [scope: "admin"])
+head(client, "/users", body: %{name: "Jon"})
@@ -645,11 +653,11 @@

head!(client, url, opts)

-

Perform a HEAD request.

See request!/1 or request!/2 for options definition.

head!("/users")
-head!("/users", query: [scope: "admin"])
-head!(client, "/users")
-head!(client, "/users", query: [scope: "admin"])
-head!(client, "/users", body: %{name: "Jon"})
+

Perform a HEAD request.

See request!/1 or request!/2 for options definition.

head!("/users")
+head!("/users", query: [scope: "admin"])
+head!(client, "/users")
+head!(client, "/users", query: [scope: "admin"])
+head!(client, "/users", body: %{name: "Jon"})
@@ -661,7 +669,7 @@

head!(client, url, opts)

installation_repos(installation_id)

- + View Source @@ -699,11 +707,11 @@

options(client, url, opts)

-

Perform a OPTIONS request.

See request/1 or request/2 for options definition.

options("/users")
-options("/users", query: [scope: "admin"])
-options(client, "/users")
-options(client, "/users", query: [scope: "admin"])
-options(client, "/users", body: %{name: "Jon"})
+

Perform a OPTIONS request.

See request/1 or request/2 for options definition.

options("/users")
+options("/users", query: [scope: "admin"])
+options(client, "/users")
+options(client, "/users", query: [scope: "admin"])
+options(client, "/users", body: %{name: "Jon"})
@@ -732,11 +740,11 @@

options!(client, url, opts)

-

Perform a OPTIONS request.

See request!/1 or request!/2 for options definition.

options!("/users")
-options!("/users", query: [scope: "admin"])
-options!(client, "/users")
-options!(client, "/users", query: [scope: "admin"])
-options!(client, "/users", body: %{name: "Jon"})
+

Perform a OPTIONS request.

See request!/1 or request!/2 for options definition.

options!("/users")
+options!("/users", query: [scope: "admin"])
+options!(client, "/users")
+options!(client, "/users", query: [scope: "admin"])
+options!(client, "/users", body: %{name: "Jon"})
@@ -765,10 +773,10 @@

patch(client, url, body, opts)

-

Perform a PATCH request.

See request/1 or request/2 for options definition.

patch("/users", %{name: "Jon"})
-patch("/users", %{name: "Jon"}, query: [scope: "admin"])
-patch(client, "/users", %{name: "Jon"})
-patch(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
+

Perform a PATCH request.

See request/1 or request/2 for options definition.

patch("/users", %{name: "Jon"})
+patch("/users", %{name: "Jon"}, query: [scope: "admin"])
+patch(client, "/users", %{name: "Jon"})
+patch(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
@@ -797,10 +805,10 @@

patch!(client, url, body, opts)

-

Perform a PATCH request.

See request!/1 or request!/2 for options definition.

patch!("/users", %{name: "Jon"})
-patch!("/users", %{name: "Jon"}, query: [scope: "admin"])
-patch!(client, "/users", %{name: "Jon"})
-patch!(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
+

Perform a PATCH request.

See request!/1 or request!/2 for options definition.

patch!("/users", %{name: "Jon"})
+patch!("/users", %{name: "Jon"}, query: [scope: "admin"])
+patch!(client, "/users", %{name: "Jon"})
+patch!(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
@@ -829,10 +837,10 @@

post(client, url, body, opts)

-

Perform a POST request.

See request/1 or request/2 for options definition.

post("/users", %{name: "Jon"})
-post("/users", %{name: "Jon"}, query: [scope: "admin"])
-post(client, "/users", %{name: "Jon"})
-post(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
+

Perform a POST request.

See request/1 or request/2 for options definition.

post("/users", %{name: "Jon"})
+post("/users", %{name: "Jon"}, query: [scope: "admin"])
+post(client, "/users", %{name: "Jon"})
+post(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
@@ -861,10 +869,10 @@

post!(client, url, body, opts)

-

Perform a POST request.

See request!/1 or request!/2 for options definition.

post!("/users", %{name: "Jon"})
-post!("/users", %{name: "Jon"}, query: [scope: "admin"])
-post!(client, "/users", %{name: "Jon"})
-post!(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
+

Perform a POST request.

See request!/1 or request!/2 for options definition.

post!("/users", %{name: "Jon"})
+post!("/users", %{name: "Jon"}, query: [scope: "admin"])
+post!(client, "/users", %{name: "Jon"})
+post!(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
@@ -893,10 +901,10 @@

put(client, url, body, opts)

-

Perform a PUT request.

See request/1 or request/2 for options definition.

put("/users", %{name: "Jon"})
-put("/users", %{name: "Jon"}, query: [scope: "admin"])
-put(client, "/users", %{name: "Jon"})
-put(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
+

Perform a PUT request.

See request/1 or request/2 for options definition.

put("/users", %{name: "Jon"})
+put("/users", %{name: "Jon"}, query: [scope: "admin"])
+put(client, "/users", %{name: "Jon"})
+put(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
@@ -925,10 +933,10 @@

put!(client, url, body, opts)

-

Perform a PUT request.

See request!/1 or request!/2 for options definition.

put!("/users", %{name: "Jon"})
-put!("/users", %{name: "Jon"}, query: [scope: "admin"])
-put!(client, "/users", %{name: "Jon"})
-put!(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
+

Perform a PUT request.

See request!/1 or request!/2 for options definition.

put!("/users", %{name: "Jon"})
+put!("/users", %{name: "Jon"}, query: [scope: "admin"])
+put!(client, "/users", %{name: "Jon"})
+put!(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
@@ -970,11 +978,11 @@

request(client \\ %Tesla.Client{}, options) Examples

-
ExampleApi.request(method: :get, url: "/users/path")
+
ExampleApi.request(method: :get, url: "/users/path")
 
 # use shortcut methods
-ExampleApi.get("/users/1")
-ExampleApi.post(client, "/users", %{name: "Jon"})
+
ExampleApi.get("/users/1") +ExampleApi.post(client, "/users", %{name: "Jon"})
@@ -1005,6 +1013,28 @@

request!(client \\ %Tesla.Client{}, options

Perform request and raise in case of error.

This is similar to request/2 behaviour from Tesla 0.x

See request/2 for list of available options.

+

+ +
+ +
+ + + Link to this function + +

send_sentry_error(msg)

+ + + + View Source + + + +
+ +
+ +
@@ -1032,11 +1062,11 @@

trace(client, url, opts)

-

Perform a TRACE request.

See request/1 or request/2 for options definition.

trace("/users")
-trace("/users", query: [scope: "admin"])
-trace(client, "/users")
-trace(client, "/users", query: [scope: "admin"])
-trace(client, "/users", body: %{name: "Jon"})
+

Perform a TRACE request.

See request/1 or request/2 for options definition.

trace("/users")
+trace("/users", query: [scope: "admin"])
+trace(client, "/users")
+trace(client, "/users", query: [scope: "admin"])
+trace(client, "/users", body: %{name: "Jon"})
@@ -1065,11 +1095,11 @@

trace!(client, url, opts)

-

Perform a TRACE request.

See request!/1 or request!/2 for options definition.

trace!("/users")
-trace!("/users", query: [scope: "admin"])
-trace!(client, "/users")
-trace!(client, "/users", query: [scope: "admin"])
-trace!(client, "/users", body: %{name: "Jon"})
+

Perform a TRACE request.

See request!/1 or request!/2 for options definition.

trace!("/users")
+trace!("/users", query: [scope: "admin"])
+trace!(client, "/users")
+trace!(client, "/users", query: [scope: "admin"])
+trace!(client, "/users", body: %{name: "Jon"})
diff --git a/Lightning.VersionControl.GithubToken.html b/Lightning.VersionControl.GithubToken.html index 1ff731a7cb..69cee02d8b 100644 --- a/Lightning.VersionControl.GithubToken.html +++ b/Lightning.VersionControl.GithubToken.html @@ -13,7 +13,7 @@ - + @@ -102,7 +102,7 @@

- + View Source @@ -203,7 +203,7 @@

build(cert, app_id)

- + View Source @@ -236,7 +236,7 @@

build(cert, app_id)

generate_and_sign(extra_claims \\ %{}, key \\ __default_signer__())

- + View Source @@ -269,7 +269,7 @@

generate_and_sign(extra_claims \\ %{}, key

generate_and_sign!(extra_claims \\ %{}, key \\ __default_signer__())

- + View Source @@ -301,7 +301,7 @@

generate_and_sign!(extra_claims \\ %{}, key

verify_and_validate(bearer_token, key \\ __default_signer__(), context \\ %{})

- + View Source @@ -334,7 +334,7 @@

verify_and_validate(bearer_token, key \\ __

verify_and_validate!(bearer_token, key \\ __default_signer__(), context \\ %{})

- + View Source diff --git a/Lightning.VersionControl.ProjectRepo.html b/Lightning.VersionControl.ProjectRepo.html index f9fb035956..40b2bd86c5 100644 --- a/Lightning.VersionControl.ProjectRepo.html +++ b/Lightning.VersionControl.ProjectRepo.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.VersionControl.html b/Lightning.VersionControl.html index ca2c3a7ef9..641a846bc2 100644 --- a/Lightning.VersionControl.html +++ b/Lightning.VersionControl.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.WorkOrder.html b/Lightning.WorkOrder.html index 911c63e544..dd20764b03 100644 --- a/Lightning.WorkOrder.html +++ b/Lightning.WorkOrder.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.WorkOrderService.html b/Lightning.WorkOrderService.html index 8991608129..9d2ca15bc5 100644 --- a/Lightning.WorkOrderService.html +++ b/Lightning.WorkOrderService.html @@ -13,7 +13,7 @@ - + @@ -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.Edge.html b/Lightning.Workflows.Edge.html index c7c7a8068d..3beb297157 100644 --- a/Lightning.Workflows.Edge.html +++ b/Lightning.Workflows.Edge.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Workflows.Graph.html b/Lightning.Workflows.Graph.html index 101261f4d8..e916118fbc 100644 --- a/Lightning.Workflows.Graph.html +++ b/Lightning.Workflows.Graph.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Workflows.Workflow.html b/Lightning.Workflows.Workflow.html index 0191a12a78..c5c19b1b1d 100644 --- a/Lightning.Workflows.Workflow.html +++ b/Lightning.Workflows.Workflow.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.Workflows.html b/Lightning.Workflows.html index 6d5654cda7..c2b6913998 100644 --- a/Lightning.Workflows.html +++ b/Lightning.Workflows.html @@ -13,7 +13,7 @@ - + @@ -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.Workorders.SearchParams.html b/Lightning.Workorders.SearchParams.html index b0e27407dc..9ce58299ab 100644 --- a/Lightning.Workorders.SearchParams.html +++ b/Lightning.Workorders.SearchParams.html @@ -13,7 +13,7 @@ - + diff --git a/Lightning.epub b/Lightning.epub index 3f97cc7d9aabf3c201938178dd038b4a9669b463..1c4c0ca5d9c6ed1a46e91a809fbe01b1c4aad4ce 100644 GIT binary patch delta 97478 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 Y=q#$iQslD~++7b{!9Vl_>n+y*0h{W#SO5S3 delta 98319 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%0DS`j- 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 SEWp5jlBe+SI($I*;r$P@fz&(z diff --git a/Lightning.html b/Lightning.html index b6bd695b59..78f23287c2 100644 --- a/Lightning.html +++ b/Lightning.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.API.Helpers.html b/LightningWeb.API.Helpers.html index cb7aeb4929..ae03b92449 100644 --- a/LightningWeb.API.Helpers.html +++ b/LightningWeb.API.Helpers.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.API.JobController.html b/LightningWeb.API.JobController.html index e9eb7e3033..84b03dea96 100644 --- a/LightningWeb.API.JobController.html +++ b/LightningWeb.API.JobController.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.API.ProjectController.html b/LightningWeb.API.ProjectController.html index a2de579be9..2b7093340f 100644 --- a/LightningWeb.API.ProjectController.html +++ b/LightningWeb.API.ProjectController.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.API.ProvisioningController.html b/LightningWeb.API.ProvisioningController.html index a73b16c4c9..dfeaefcddd 100644 --- a/LightningWeb.API.ProvisioningController.html +++ b/LightningWeb.API.ProvisioningController.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.API.RunController.html b/LightningWeb.API.RunController.html index e4fff6d90e..d4168f1454 100644 --- a/LightningWeb.API.RunController.html +++ b/LightningWeb.API.RunController.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.AuditLive.Index.html b/LightningWeb.AuditLive.Index.html index 3b07e38468..33f00727e8 100644 --- a/LightningWeb.AuditLive.Index.html +++ b/LightningWeb.AuditLive.Index.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.AuthProvidersLive.FormComponent.html b/LightningWeb.AuthProvidersLive.FormComponent.html index c9de53c5bc..5dd8f7e764 100644 --- a/LightningWeb.AuthProvidersLive.FormComponent.html +++ b/LightningWeb.AuthProvidersLive.FormComponent.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.AuthProvidersLive.Index.html b/LightningWeb.AuthProvidersLive.Index.html index 8f6f0139b7..065ddcf35e 100644 --- a/LightningWeb.AuthProvidersLive.Index.html +++ b/LightningWeb.AuthProvidersLive.Index.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.BackupCodesController.html b/LightningWeb.BackupCodesController.html index d5a9d4b4ff..fffe200764 100644 --- a/LightningWeb.BackupCodesController.html +++ b/LightningWeb.BackupCodesController.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.BackupCodesLive.Index.html b/LightningWeb.BackupCodesLive.Index.html index 2ba80735a7..ad33854e3b 100644 --- a/LightningWeb.BackupCodesLive.Index.html +++ b/LightningWeb.BackupCodesLive.Index.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.ChangesetJSON.html b/LightningWeb.ChangesetJSON.html index a45e103457..60abd12e15 100644 --- a/LightningWeb.ChangesetJSON.html +++ b/LightningWeb.ChangesetJSON.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.ChangesetView.html b/LightningWeb.ChangesetView.html index e859b9ddac..8452c622e2 100644 --- a/LightningWeb.ChangesetView.html +++ b/LightningWeb.ChangesetView.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.Components.Modal.html b/LightningWeb.Components.Modal.html index a8761bc293..613a975502 100644 --- a/LightningWeb.Components.Modal.html +++ b/LightningWeb.Components.Modal.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.CredentialLive.Edit.html b/LightningWeb.CredentialLive.Edit.html index dd0bf945ca..8e95a6a556 100644 --- a/LightningWeb.CredentialLive.Edit.html +++ b/LightningWeb.CredentialLive.Edit.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.CredentialLive.FormComponent.html b/LightningWeb.CredentialLive.FormComponent.html index 3655e8883e..18059e41ce 100644 --- a/LightningWeb.CredentialLive.FormComponent.html +++ b/LightningWeb.CredentialLive.FormComponent.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.CredentialLive.GoogleSheetsComponent.html b/LightningWeb.CredentialLive.GoogleSheetsComponent.html index 94750727a4..b5d806c9f6 100644 --- a/LightningWeb.CredentialLive.GoogleSheetsComponent.html +++ b/LightningWeb.CredentialLive.GoogleSheetsComponent.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.CredentialLive.Index.html b/LightningWeb.CredentialLive.Index.html index f8ade05579..22971e1281 100644 --- a/LightningWeb.CredentialLive.Index.html +++ b/LightningWeb.CredentialLive.Index.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.CredentialLive.JsonSchemaBodyComponent.html b/LightningWeb.CredentialLive.JsonSchemaBodyComponent.html index a1a398b5af..342e40d6d8 100644 --- a/LightningWeb.CredentialLive.JsonSchemaBodyComponent.html +++ b/LightningWeb.CredentialLive.JsonSchemaBodyComponent.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.CredentialLive.RawBodyComponent.html b/LightningWeb.CredentialLive.RawBodyComponent.html index 54e1a49aeb..b7ae299a88 100644 --- a/LightningWeb.CredentialLive.RawBodyComponent.html +++ b/LightningWeb.CredentialLive.RawBodyComponent.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.CredentialLive.TypePicker.html b/LightningWeb.CredentialLive.TypePicker.html index 97031d68cf..e88ad67a49 100644 --- a/LightningWeb.CredentialLive.TypePicker.html +++ b/LightningWeb.CredentialLive.TypePicker.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.DataclipLive.Edit.html b/LightningWeb.DataclipLive.Edit.html index b0394fb13b..db84e7f5eb 100644 --- a/LightningWeb.DataclipLive.Edit.html +++ b/LightningWeb.DataclipLive.Edit.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.DataclipLive.FormComponent.html b/LightningWeb.DataclipLive.FormComponent.html index 5ed9a5a3e6..30f2e433ce 100644 --- a/LightningWeb.DataclipLive.FormComponent.html +++ b/LightningWeb.DataclipLive.FormComponent.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.DataclipLive.Index.html b/LightningWeb.DataclipLive.Index.html index bf28c3eb77..f6f653a835 100644 --- a/LightningWeb.DataclipLive.Index.html +++ b/LightningWeb.DataclipLive.Index.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.DownloadsController.html b/LightningWeb.DownloadsController.html index c33acef4d1..9bcd02195c 100644 --- a/LightningWeb.DownloadsController.html +++ b/LightningWeb.DownloadsController.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.Endpoint.html b/LightningWeb.Endpoint.html index 6c85e3d97d..7826109957 100644 --- a/LightningWeb.Endpoint.html +++ b/LightningWeb.Endpoint.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.ErrorView.html b/LightningWeb.ErrorView.html index 123ec3018e..9f79a402a9 100644 --- a/LightningWeb.ErrorView.html +++ b/LightningWeb.ErrorView.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.FallbackController.html b/LightningWeb.FallbackController.html index 77dbac2234..eb8eb71cf2 100644 --- a/LightningWeb.FallbackController.html +++ b/LightningWeb.FallbackController.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.FirstSetupLive.Superuser.html b/LightningWeb.FirstSetupLive.Superuser.html index dbc863aa89..a0f6ecc19e 100644 --- a/LightningWeb.FirstSetupLive.Superuser.html +++ b/LightningWeb.FirstSetupLive.Superuser.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.FormHelpers.html b/LightningWeb.FormHelpers.html index 16762d046c..9b1d1aebc1 100644 --- a/LightningWeb.FormHelpers.html +++ b/LightningWeb.FormHelpers.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.Gettext.html b/LightningWeb.Gettext.html index b816a5f63e..87fe93b177 100644 --- a/LightningWeb.Gettext.html +++ b/LightningWeb.Gettext.html @@ -13,7 +13,7 @@ - + @@ -118,15 +118,15 @@

your module gains a set of macros for translations, for example:

import LightningWeb.Gettext
 
 # Simple translation
-gettext("Here is the string to translate")
+gettext("Here is the string to translate")
 
 # Plural translation
-ngettext("Here is the string to translate",
+ngettext("Here is the string to translate",
          "Here are the strings to translate",
-         3)
+         3)
 
 # Domain-based translation
-dgettext("errors", "Here is the error message to translate")

See the Gettext Docs for detailed usage.

+dgettext("errors", "Here is the error message to translate")

See the Gettext Docs for detailed usage.

diff --git a/LightningWeb.HealthCheck.html b/LightningWeb.HealthCheck.html index 4c0cbb44c3..1e3d957c24 100644 --- a/LightningWeb.HealthCheck.html +++ b/LightningWeb.HealthCheck.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.Hooks.html b/LightningWeb.Hooks.html index 174ea7712f..4797e965f3 100644 --- a/LightningWeb.Hooks.html +++ b/LightningWeb.Hooks.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.InitAssigns.html b/LightningWeb.InitAssigns.html index 6f2d9841e8..d3b0e9d50f 100644 --- a/LightningWeb.InitAssigns.html +++ b/LightningWeb.InitAssigns.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.JobLive.AdaptorPicker.html b/LightningWeb.JobLive.AdaptorPicker.html index b790c7e79b..756f336d07 100644 --- a/LightningWeb.JobLive.AdaptorPicker.html +++ b/LightningWeb.JobLive.AdaptorPicker.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.JobLive.CredentialPicker.html b/LightningWeb.JobLive.CredentialPicker.html index cca66433a8..8025f7a10f 100644 --- a/LightningWeb.JobLive.CredentialPicker.html +++ b/LightningWeb.JobLive.CredentialPicker.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.JobLive.CronSetupComponent.html b/LightningWeb.JobLive.CronSetupComponent.html index ff889f8e99..7173317957 100644 --- a/LightningWeb.JobLive.CronSetupComponent.html +++ b/LightningWeb.JobLive.CronSetupComponent.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.JobLive.JobBuilder.html b/LightningWeb.JobLive.JobBuilder.html index 20a094757c..df3d6becd4 100644 --- a/LightningWeb.JobLive.JobBuilder.html +++ b/LightningWeb.JobLive.JobBuilder.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.JobLive.JobBuilderComponents.html b/LightningWeb.JobLive.JobBuilderComponents.html index 3e1ed0f326..60c84c0809 100644 --- a/LightningWeb.JobLive.JobBuilderComponents.html +++ b/LightningWeb.JobLive.JobBuilderComponents.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.JobLive.ManualRunComponent.ManualWorkorder.html b/LightningWeb.JobLive.ManualRunComponent.ManualWorkorder.html index 70af27d47a..eae51c9641 100644 --- a/LightningWeb.JobLive.ManualRunComponent.ManualWorkorder.html +++ b/LightningWeb.JobLive.ManualRunComponent.ManualWorkorder.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.JobLive.ManualRunComponent.html b/LightningWeb.JobLive.ManualRunComponent.html index 6e57e95beb..69f1412dbd 100644 --- a/LightningWeb.JobLive.ManualRunComponent.html +++ b/LightningWeb.JobLive.ManualRunComponent.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.LiveHelpers.html b/LightningWeb.LiveHelpers.html index 15ce335ad8..073fe4406c 100644 --- a/LightningWeb.LiveHelpers.html +++ b/LightningWeb.LiveHelpers.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.ModalPortal.html b/LightningWeb.ModalPortal.html index 5225f82e02..9346d0b14c 100644 --- a/LightningWeb.ModalPortal.html +++ b/LightningWeb.ModalPortal.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.OauthCredentialHelper.html b/LightningWeb.OauthCredentialHelper.html index 5d221f8bb9..6ecba65cff 100644 --- a/LightningWeb.OauthCredentialHelper.html +++ b/LightningWeb.OauthCredentialHelper.html @@ -13,7 +13,7 @@ - + @@ -240,10 +240,10 @@

broadcast_forward(subscription_id, mod, opt

Broadcast a message specifically for forwarding a message to a component. It expects a subscription_id, the module of the component and opts being a keyword list containing an :id key of the specific component.

See: Phoenix.LiveView.send_update/3 for more info.

A corresponding LiveView (that is subscribed) is expected to have a matching -handle_info/2 that looks like this:

def handle_info({:forward, mod, opts}, socket) do
-  send_update(mod, opts)
-  {:noreply, socket}
-end
+handle_info/2 that looks like this:

def handle_info({:forward, mod, opts}, socket) do
+  send_update(mod, opts)
+  {:noreply, socket}
+end
diff --git a/LightningWeb.OidcController.html b/LightningWeb.OidcController.html index af3f148b0e..0ede0079a3 100644 --- a/LightningWeb.OidcController.html +++ b/LightningWeb.OidcController.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.PageView.html b/LightningWeb.PageView.html index a4201376e5..7155b6b276 100644 --- a/LightningWeb.PageView.html +++ b/LightningWeb.PageView.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.Pagination.html b/LightningWeb.Pagination.html index cde8c0671f..31c94cfb78 100644 --- a/LightningWeb.Pagination.html +++ b/LightningWeb.Pagination.html @@ -13,7 +13,7 @@ - + @@ -243,13 +243,13 @@

raw_pagination_links(paginator, options \\

Returns the raw data in order to generate the proper HTML for pagination links. Data is returned in a {text, page_number} format where text is intended to be the text of the link and page_number is the page it should go to. Defaults are already supplied -and they are as follows:

[distance: 5, next: :next, previous: :previous, first: true, last: true, ellipsis: :ellipsis]

distance must be a positive non-zero integer or an exception is raised. next and previous should be +and they are as follows:

[distance: 5, next: :next, previous: :previous, first: true, last: true, ellipsis: :ellipsis]

distance must be a positive non-zero integer or an exception is raised. next and previous should be strings but can be anything you want as long as it is truthy, falsey values will remove them from the output. first and last are only booleans, and they just include/remove -their respective link from output. An example of the data returned:

iex> Scrivener.HTML.raw_pagination_links(%{total_pages: 10, page_number: 5})
-[{"<<", 4}, {1, 1}, {2, 2}, {3, 3}, {4, 4}, {5, 5}, {6, 6}, {7, 7}, {8, 8}, {9, 9}, {10, 10}, {">>", 6}]
-iex> Scrivener.HTML.raw_pagination_links(%{total_pages: 20, page_number: 10}, first: ["←"], last: ["→"])
-[{"<<", 9}, {["←"], 1}, {:ellipsis, {:safe, "&hellip;"}}, {5, 5}, {6, 6},{7, 7}, {8, 8}, {9, 9}, {10, 10}, {11, 11}, {12, 12}, {13, 13}, {14, 14},{15, 15}, {:ellipsis, {:safe, "&hellip;"}}, {["→"], 20}, {">>", 11}]

Simply loop and pattern match over each item and transform it to your custom HTML.

+their respective link from output. An example of the data returned:

iex> Scrivener.HTML.raw_pagination_links(%{total_pages: 10, page_number: 5})
+[{"<<", 4}, {1, 1}, {2, 2}, {3, 3}, {4, 4}, {5, 5}, {6, 6}, {7, 7}, {8, 8}, {9, 9}, {10, 10}, {">>", 6}]
+iex> Scrivener.HTML.raw_pagination_links(%{total_pages: 20, page_number: 10}, first: ["←"], last: ["→"])
+[{"<<", 9}, {["←"], 1}, {:ellipsis, {:safe, "&hellip;"}}, {5, 5}, {6, 6},{7, 7}, {8, 8}, {9, 9}, {10, 10}, {11, 11}, {12, 12}, {13, 13}, {14, 14},{15, 15}, {:ellipsis, {:safe, "&hellip;"}}, {["→"], 20}, {">>", 11}]

Simply loop and pattern match over each item and transform it to your custom HTML.

diff --git a/LightningWeb.Plugs.FirstSetup.html b/LightningWeb.Plugs.FirstSetup.html index e87cb1b171..ee7134826e 100644 --- a/LightningWeb.Plugs.FirstSetup.html +++ b/LightningWeb.Plugs.FirstSetup.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.ProfileLive.Edit.html b/LightningWeb.ProfileLive.Edit.html index 701396a430..67a9133f62 100644 --- a/LightningWeb.ProfileLive.Edit.html +++ b/LightningWeb.ProfileLive.Edit.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.ProfileLive.FormComponent.html b/LightningWeb.ProfileLive.FormComponent.html index 09138aba6a..8e16f4d484 100644 --- a/LightningWeb.ProfileLive.FormComponent.html +++ b/LightningWeb.ProfileLive.FormComponent.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.ProfileLive.MfaComponent.html b/LightningWeb.ProfileLive.MfaComponent.html index c8220c726c..501c3c8843 100644 --- a/LightningWeb.ProfileLive.MfaComponent.html +++ b/LightningWeb.ProfileLive.MfaComponent.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.ProjectLive.FormComponent.html b/LightningWeb.ProjectLive.FormComponent.html index 3a0064c1bb..ed62e516f2 100644 --- a/LightningWeb.ProjectLive.FormComponent.html +++ b/LightningWeb.ProjectLive.FormComponent.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.ProjectLive.Index.html b/LightningWeb.ProjectLive.Index.html index 19160e4cac..fdf1f05ad3 100644 --- a/LightningWeb.ProjectLive.Index.html +++ b/LightningWeb.ProjectLive.Index.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.ProjectLive.MFARequired.html b/LightningWeb.ProjectLive.MFARequired.html index 201de44d68..d8ee2d624d 100644 --- a/LightningWeb.ProjectLive.MFARequired.html +++ b/LightningWeb.ProjectLive.MFARequired.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.ProjectLive.Settings.html b/LightningWeb.ProjectLive.Settings.html index 827a567e01..12edd29d38 100644 --- a/LightningWeb.ProjectLive.Settings.html +++ b/LightningWeb.ProjectLive.Settings.html @@ -13,7 +13,7 @@ - + @@ -196,7 +196,7 @@

digest(assigns)

- + View Source @@ -218,7 +218,7 @@

digest(assigns)

failure_alert(assigns)

- + View Source @@ -262,7 +262,7 @@

render(assigns)

role(assigns)

- + View Source @@ -284,7 +284,7 @@

role(assigns)

user(assigns)

- + View Source diff --git a/LightningWeb.ReAuthenticateLive.New.html b/LightningWeb.ReAuthenticateLive.New.html index 146d0246af..e5396bda03 100644 --- a/LightningWeb.ReAuthenticateLive.New.html +++ b/LightningWeb.ReAuthenticateLive.New.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.RouteHelpers.html b/LightningWeb.RouteHelpers.html index 30dd091ed3..40218719ac 100644 --- a/LightningWeb.RouteHelpers.html +++ b/LightningWeb.RouteHelpers.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.Router.html b/LightningWeb.Router.html index 34f96aee41..d517cea218 100644 --- a/LightningWeb.Router.html +++ b/LightningWeb.Router.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.RunLive.Index.html b/LightningWeb.RunLive.Index.html index 902c0f0cd4..881e15b21e 100644 --- a/LightningWeb.RunLive.Index.html +++ b/LightningWeb.RunLive.Index.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.RunLive.RerunJobComponent.html b/LightningWeb.RunLive.RerunJobComponent.html index 83ab3270f8..6f7fcae864 100644 --- a/LightningWeb.RunLive.RerunJobComponent.html +++ b/LightningWeb.RunLive.RerunJobComponent.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.RunLive.RunViewerLive.html b/LightningWeb.RunLive.RunViewerLive.html index c3323111f6..0d20efac6c 100644 --- a/LightningWeb.RunLive.RunViewerLive.html +++ b/LightningWeb.RunLive.RunViewerLive.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.RunLive.Show.html b/LightningWeb.RunLive.Show.html index 66b3192894..08a59a44f3 100644 --- a/LightningWeb.RunLive.Show.html +++ b/LightningWeb.RunLive.Show.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.RunLive.WorkOrderComponent.html b/LightningWeb.RunLive.WorkOrderComponent.html index fe42f884ea..72c8a4b39c 100644 --- a/LightningWeb.RunLive.WorkOrderComponent.html +++ b/LightningWeb.RunLive.WorkOrderComponent.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.Telemetry.html b/LightningWeb.Telemetry.html index aa7021a194..568bb4c54b 100644 --- a/LightningWeb.Telemetry.html +++ b/LightningWeb.Telemetry.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.TokensLive.Index.html b/LightningWeb.TokensLive.Index.html index ba62ea8ee8..14e229c152 100644 --- a/LightningWeb.TokensLive.Index.html +++ b/LightningWeb.TokensLive.Index.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.UserAuth.html b/LightningWeb.UserAuth.html index 233a957eac..c5c46e3db6 100644 --- a/LightningWeb.UserAuth.html +++ b/LightningWeb.UserAuth.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.UserConfirmationController.html b/LightningWeb.UserConfirmationController.html index 9f2948362b..a825d04e04 100644 --- a/LightningWeb.UserConfirmationController.html +++ b/LightningWeb.UserConfirmationController.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.UserLive.Edit.html b/LightningWeb.UserLive.Edit.html index 6798b90809..812cdcd866 100644 --- a/LightningWeb.UserLive.Edit.html +++ b/LightningWeb.UserLive.Edit.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.UserLive.FormComponent.html b/LightningWeb.UserLive.FormComponent.html index fe20c44a02..ab0bb85079 100644 --- a/LightningWeb.UserLive.FormComponent.html +++ b/LightningWeb.UserLive.FormComponent.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.UserLive.Index.html b/LightningWeb.UserLive.Index.html index 88adc0302c..7ac6a08cd7 100644 --- a/LightningWeb.UserLive.Index.html +++ b/LightningWeb.UserLive.Index.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.UserRegistrationController.html b/LightningWeb.UserRegistrationController.html index 6ff5a6abe0..96f01d679b 100644 --- a/LightningWeb.UserRegistrationController.html +++ b/LightningWeb.UserRegistrationController.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.UserResetPasswordController.html b/LightningWeb.UserResetPasswordController.html index c7834a1dbe..1ab99c5b9c 100644 --- a/LightningWeb.UserResetPasswordController.html +++ b/LightningWeb.UserResetPasswordController.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.UserSessionController.html b/LightningWeb.UserSessionController.html index 7dd592f7df..b502a29857 100644 --- a/LightningWeb.UserSessionController.html +++ b/LightningWeb.UserSessionController.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.UserTOTPController.html b/LightningWeb.UserTOTPController.html index 66a332ab7e..6e7aa9055c 100644 --- a/LightningWeb.UserTOTPController.html +++ b/LightningWeb.UserTOTPController.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.VersionControlController.html b/LightningWeb.VersionControlController.html index 047cf623a0..cf9b236f84 100644 --- a/LightningWeb.VersionControlController.html +++ b/LightningWeb.VersionControlController.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.WebhooksController.html b/LightningWeb.WebhooksController.html index 676c42e6c0..46fe10f8a0 100644 --- a/LightningWeb.WebhooksController.html +++ b/LightningWeb.WebhooksController.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.WorkflowLive.EditorPane.html b/LightningWeb.WorkflowLive.EditorPane.html index 9f82ede05c..e333426ea9 100644 --- a/LightningWeb.WorkflowLive.EditorPane.html +++ b/LightningWeb.WorkflowLive.EditorPane.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.WorkflowLive.JobView.html b/LightningWeb.WorkflowLive.JobView.html index cd4d24a351..0799ed4081 100644 --- a/LightningWeb.WorkflowLive.JobView.html +++ b/LightningWeb.WorkflowLive.JobView.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.WorkflowNewLive.WorkflowParams.html b/LightningWeb.WorkflowNewLive.WorkflowParams.html index 5e4771343f..a11dfcff6d 100644 --- a/LightningWeb.WorkflowNewLive.WorkflowParams.html +++ b/LightningWeb.WorkflowNewLive.WorkflowParams.html @@ -13,7 +13,7 @@ - + diff --git a/LightningWeb.html b/LightningWeb.html index e813ece1b3..684da0097e 100644 --- a/LightningWeb.html +++ b/LightningWeb.html @@ -13,7 +13,7 @@ - + diff --git a/Mix.Tasks.Lightning.GenEncryptionKey.html b/Mix.Tasks.Lightning.GenEncryptionKey.html index 41b84e5cb4..ea20b9c185 100644 --- a/Mix.Tasks.Lightning.GenEncryptionKey.html +++ b/Mix.Tasks.Lightning.GenEncryptionKey.html @@ -13,7 +13,7 @@ - + diff --git a/Mix.Tasks.Lightning.InstallRuntime.html b/Mix.Tasks.Lightning.InstallRuntime.html index 2fb434ac80..e62dc747ee 100644 --- a/Mix.Tasks.Lightning.InstallRuntime.html +++ b/Mix.Tasks.Lightning.InstallRuntime.html @@ -13,7 +13,7 @@ - + diff --git a/Mix.Tasks.Lightning.InstallSchemas.html b/Mix.Tasks.Lightning.InstallSchemas.html index b8381d089d..d752ceafe6 100644 --- a/Mix.Tasks.Lightning.InstallSchemas.html +++ b/Mix.Tasks.Lightning.InstallSchemas.html @@ -13,7 +13,7 @@ - + @@ -1797,14 +1797,14 @@

request(request)

Examples -
request = %HTTPoison.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(request)
@@ -1862,7 +1862,7 @@

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"}])
diff --git a/ObanPruner.html b/ObanPruner.html index a9eefc3b95..f0c159e594 100644 --- a/ObanPruner.html +++ b/ObanPruner.html @@ -13,7 +13,7 @@ - + diff --git a/Storybook.Root.html b/Storybook.Root.html index e81e5beed5..126fa72616 100644 --- a/Storybook.Root.html +++ b/Storybook.Root.html @@ -13,7 +13,7 @@ - + diff --git a/api-reference.html b/api-reference.html index 02cf5d8213..2c16aac126 100644 --- a/api-reference.html +++ b/api-reference.html @@ -13,7 +13,7 @@ - + diff --git a/benchmarking.html b/benchmarking.html index acea7a25c7..893980ec18 100644 --- a/benchmarking.html +++ b/benchmarking.html @@ -13,7 +13,7 @@ - + diff --git a/changelog.html b/changelog.html index 8a9751d0e0..05e103b5c6 100644 --- a/changelog.html +++ b/changelog.html @@ -13,7 +13,7 @@ - + diff --git a/deployment.html b/deployment.html index 170f77a6ee..de7557c4ed 100644 --- a/deployment.html +++ b/deployment.html @@ -13,7 +13,7 @@ - + diff --git a/dist/search_items-1F06327D.js b/dist/search_items-1F06327D.js deleted file mode 100644 index 232e4d8c24..0000000000 --- a/dist/search_items-1F06327D.js +++ /dev/null @@ -1 +0,0 @@ -searchNodes=[{"type":"module","title":"Lightning","doc":"Lightning keeps the contexts that define your domain and business logic. Contexts are also responsible for managing your data, regardless if it comes from the database, an external API or others.","ref":"Lightning.html"},{"type":"module","title":"Lightning.AdaptorRegistry","doc":"Registry process to query and maintain a list of adaptors available for writing jobs. Currently it queries NPM for all modules in the @openfn organization and filters out modules that are known not to be adaptors. Usage # Starting the process AdaptorRegistry . start_link ( ) # Getting a list of all adaptors Lightning.AdaptorRegistry.AdaptorRegistry . all ( ) Caching By default the results are cached to disk, and will be reused every start. In order to disable or configure caching pass see: start_link/1 . The process uses :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. Timeouts There is a 'general' timeout of 30s, this is used for GenServer calls like all/1 and also internally when the modules are being queried. NPM can be extremely fast to respond if the package is cached on their side, but can take a couple of seconds if not cached.","ref":"Lightning.AdaptorRegistry.html"},{"type":"function","title":"Lightning.AdaptorRegistry.all/1","doc":"Get the current in-process list of adaptors. This call will wait behind the :continue message when the process starts up, so it may take a while the first time it is called (and the list hasn't been fetched yet).","ref":"Lightning.AdaptorRegistry.html#all/1"},{"type":"function","title":"Lightning.AdaptorRegistry.child_spec/1","doc":"Returns a specification to start this module under a supervisor. See Supervisor .","ref":"Lightning.AdaptorRegistry.html#child_spec/1"},{"type":"function","title":"Lightning.AdaptorRegistry.fetch/0","doc":"Fetch a list of packages for the @openfn organisation","ref":"Lightning.AdaptorRegistry.html#fetch/0"},{"type":"function","title":"Lightning.AdaptorRegistry.latest_for/2","doc":"Get a latest version for a given module.","ref":"Lightning.AdaptorRegistry.html#latest_for/2"},{"type":"function","title":"Lightning.AdaptorRegistry.resolve_adaptor/1","doc":"","ref":"Lightning.AdaptorRegistry.html#resolve_adaptor/1"},{"type":"function","title":"Lightning.AdaptorRegistry.resolve_package_name/1","doc":"Destructures an NPM style package name into module name and version. Example 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 }","ref":"Lightning.AdaptorRegistry.html#resolve_package_name/1"},{"type":"function","title":"Lightning.AdaptorRegistry.resolve_package_name!/1","doc":"Same as resolve_package_name/1 except will throw an exception if a package name cannot be matched.","ref":"Lightning.AdaptorRegistry.html#resolve_package_name!/1"},{"type":"function","title":"Lightning.AdaptorRegistry.start_link/1","doc":"Starts the AdaptorRegistry Options :use_cache (defaults to false) - stores the last set of results on disk and uses the cached file for every subsequent start. It can either be a boolean, or a string - the latter being a file path to set where the cache file is located. :name (defaults to AdaptorRegistry) - the name of the process, useful for testing and/or running multiple versions of the registry","ref":"Lightning.AdaptorRegistry.html#start_link/1"},{"type":"function","title":"Lightning.AdaptorRegistry.versions_for/2","doc":"Get a list of versions for a given module.","ref":"Lightning.AdaptorRegistry.html#versions_for/2"},{"type":"module","title":"Lightning.AdaptorRegistry.Npm","doc":"NPM API functions","ref":"Lightning.AdaptorRegistry.Npm.html"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.delete/3","doc":"Issues a DELETE request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#delete/3"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.delete!/3","doc":"Issues a DELETE request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#delete!/3"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.get/3","doc":"Issues a GET request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#get/3"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.get!/3","doc":"Issues a GET request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#get!/3"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.head/3","doc":"Issues a HEAD request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#head/3"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.head!/3","doc":"Issues a HEAD request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#head!/3"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.options/3","doc":"Issues an OPTIONS request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#options/3"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.options!/3","doc":"Issues a OPTIONS request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#options!/3"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.package_detail/1","doc":"Retrieve all details for an NPM package","ref":"Lightning.AdaptorRegistry.Npm.html#package_detail/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.patch/4","doc":"Issues a PATCH request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#patch/4"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.patch!/4","doc":"Issues a PATCH request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#patch!/4"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.post/4","doc":"Issues a POST request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#post/4"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.post!/4","doc":"Issues a POST request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#post!/4"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_headers/1","doc":"Callback implementation for HTTPoison.Base.process_headers/1 .","ref":"Lightning.AdaptorRegistry.Npm.html#process_headers/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_request_body/1","doc":"Callback implementation for HTTPoison.Base.process_request_body/1 .","ref":"Lightning.AdaptorRegistry.Npm.html#process_request_body/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_request_headers/1","doc":"Callback implementation for HTTPoison.Base.process_request_headers/1 .","ref":"Lightning.AdaptorRegistry.Npm.html#process_request_headers/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_request_options/1","doc":"Callback implementation for HTTPoison.Base.process_request_options/1 .","ref":"Lightning.AdaptorRegistry.Npm.html#process_request_options/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_request_params/1","doc":"Callback implementation for HTTPoison.Base.process_request_params/1 .","ref":"Lightning.AdaptorRegistry.Npm.html#process_request_params/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_response/1","doc":"Callback implementation for HTTPoison.Base.process_response/1 .","ref":"Lightning.AdaptorRegistry.Npm.html#process_response/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_response_chunk/1","doc":"Callback implementation for HTTPoison.Base.process_response_chunk/1 .","ref":"Lightning.AdaptorRegistry.Npm.html#process_response_chunk/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_response_headers/1","doc":"Callback implementation for HTTPoison.Base.process_response_headers/1 .","ref":"Lightning.AdaptorRegistry.Npm.html#process_response_headers/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_response_status_code/1","doc":"Callback implementation for HTTPoison.Base.process_response_status_code/1 .","ref":"Lightning.AdaptorRegistry.Npm.html#process_response_status_code/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_status_code/1","doc":"Callback implementation for HTTPoison.Base.process_status_code/1 .","ref":"Lightning.AdaptorRegistry.Npm.html#process_status_code/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_url/1","doc":"Callback implementation for HTTPoison.Base.process_url/1 .","ref":"Lightning.AdaptorRegistry.Npm.html#process_url/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.put/4","doc":"Issues a PUT request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#put/4"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.put!/4","doc":"Issues a PUT request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#put!/4"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.request/1","doc":"Issues an HTTP request using a Request struct. This function returns {:ok, response} , {:ok, async_response} , or {:ok, maybe_redirect} if the request is successful, {:error, reason} otherwise. Redirect handling If the option :follow_redirect is given, HTTP redirects are automatically follow if the method is set to :get or :head and the response's status_code is 301 , 302 or 307 . If the method is set to :post , then the only status_code that get's automatically followed is 303 . If any other method or status_code is returned, then this function returns a returns a {:ok, %HTTPoison.MaybeRedirect{}} containing the redirect_url for you to re-request with the method set to :get . Examples request = % HTTPoison.Request { method : :post , url : "https://my.website.com" , body : "{ \\" foo \\" : 3}" , headers : [ { "Accept" , "application/json" } ] } request ( request )","ref":"Lightning.AdaptorRegistry.Npm.html#request/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.request/5","doc":"Issues an HTTP request with the given method to the given url. This function is usually used indirectly by get/3 , post/4 , put/4 , etc Args: method - HTTP method as an atom ( :get , :head , :post , :put , :delete , etc.) url - target url as a binary string or char list body - request body. See more below headers - HTTP headers as an orddict (e.g., [{"Accept", "application/json"}] ) options - Keyword list of options Body: see type HTTPoison.Request Options: see type HTTPoison.Request This function returns {:ok, response} , {:ok, async_response} , or {:ok, maybe_redirect} if the request is successful, {:error, reason} otherwise. Redirect handling If the option :follow_redirect is given, HTTP redirects are automatically follow if the method is set to :get or :head and the response's status_code is 301 , 302 or 307 . If the method is set to :post , then the only status_code that get's automatically followed is 303 . If any other method or status_code is returned, then this function returns a returns a {:ok, %HTTPoison.MaybeRedirect{}} containing the redirect_url for you to re-request with the method set to :get . Examples request ( :post , "https://my.website.com" , "{ \\" foo \\" : 3}" , [ { "Accept" , "application/json" } ] )","ref":"Lightning.AdaptorRegistry.Npm.html#request/5"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.request!/5","doc":"Issues an HTTP request with the given method to the given url, raising an exception in case of failure. request!/5 works exactly like request/5 but it returns just the response in case of a successful request, raising an exception in case the request fails.","ref":"Lightning.AdaptorRegistry.Npm.html#request!/5"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.start/0","doc":"Starts HTTPoison and its dependencies.","ref":"Lightning.AdaptorRegistry.Npm.html#start/0"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.stream_next/1","doc":"Requests the next message to be streamed for a given HTTPoison.AsyncResponse . See request!/5 for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#stream_next/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.user_packages/1","doc":"Retrieve all packages for a given user or organization. Return empty list if application cannot connect to NPM. (E.g., because it's started offline.)","ref":"Lightning.AdaptorRegistry.Npm.html#user_packages/1"},{"type":"type","title":"Lightning.AdaptorRegistry.Npm.body/0","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#t:body/0"},{"type":"type","title":"Lightning.AdaptorRegistry.Npm.headers/0","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#t:headers/0"},{"type":"type","title":"Lightning.AdaptorRegistry.Npm.method/0","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#t:method/0"},{"type":"type","title":"Lightning.AdaptorRegistry.Npm.options/0","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#t:options/0"},{"type":"type","title":"Lightning.AdaptorRegistry.Npm.params/0","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#t:params/0"},{"type":"type","title":"Lightning.AdaptorRegistry.Npm.request/0","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#t:request/0"},{"type":"type","title":"Lightning.AdaptorRegistry.Npm.url/0","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#t:url/0"},{"type":"module","title":"Lightning.AdaptorService","doc":"The Adaptor Service is use to query and install adaptors in order to run jobs. On startup, it queries the filesystem for package.json files and builds up a list of available adaptors. Configuration The service requires at least :adaptors_path , which is used to both query which adaptors are installed and when to install new adaptors. Another optional setting is: :repo , which must point at a module that will be used to do the querying and installing. Installing Adaptors Using the install/2 function an adaptor can be installed, which will also add it to the list of available adaptors. The adaptor is marked as :installing , to allow for conditional behaviour elsewhere such as delaying or rejecting processing until the adaptor becomes available. Looking up adaptors The module leans on Elixir's built-in Version module to provide version lookups. When looking up an adaptor, either a string or a tuple can be used. In the case of requesting the latest version, any one of these will return the latest version the service is aware of. @openfn/language-http @openfn/language-http@latest {"@openfn/language-http", nil} {"@openfn/language-http", "latest"} {~r/language-http/, "latest"} You can also request a specific version, or use a range specification: @openfn/language-http@1.2.3 {"@openfn/language-http", "~> 1.2.0"} {"@openfn/language-http", "< 2.0.0"} NOTE More complex npm style install strings like: ">=0.1.0 <0.2.0" are not supported. Generally the tuple style is preferred when using range specifications as the npm style strings have a simplistic regex splitter. See Version for more details on matching versions.","ref":"Lightning.AdaptorService.html"},{"type":"function","title":"Lightning.AdaptorService.build_aliased_name/1","doc":"Turns a package name and version into a string for NPM. Since multiple versions of the same package can be installed, it's important to rely on npms built-in package aliasing. E.g. @openfn/language-http@1.2.8 turns into: ` @openfn / language - http - 1.2 . 8 @npm : @openfn / language - http @ 1.2 . 8 ` Which is pretty long winded but necessary for the reason above. If using this module as a base, it's likely you would need to adaptor this to suit your particular naming strategy.","ref":"Lightning.AdaptorService.html#build_aliased_name/1"},{"type":"function","title":"Lightning.AdaptorService.child_spec/1","doc":"Returns a specification to start this module under a supervisor. See Supervisor .","ref":"Lightning.AdaptorService.html#child_spec/1"},{"type":"function","title":"Lightning.AdaptorService.find_adaptor/2","doc":"","ref":"Lightning.AdaptorService.html#find_adaptor/2"},{"type":"function","title":"Lightning.AdaptorService.get_adaptors/1","doc":"","ref":"Lightning.AdaptorService.html#get_adaptors/1"},{"type":"function","title":"Lightning.AdaptorService.install/2","doc":"","ref":"Lightning.AdaptorService.html#install/2"},{"type":"function","title":"Lightning.AdaptorService.install!/2","doc":"","ref":"Lightning.AdaptorService.html#install!/2"},{"type":"function","title":"Lightning.AdaptorService.installed?/2","doc":"","ref":"Lightning.AdaptorService.html#installed?/2"},{"type":"function","title":"Lightning.AdaptorService.resolve_package_name/1","doc":"","ref":"Lightning.AdaptorService.html#resolve_package_name/1"},{"type":"function","title":"Lightning.AdaptorService.start_link/1","doc":"","ref":"Lightning.AdaptorService.html#start_link/1"},{"type":"type","title":"Lightning.AdaptorService.package_spec/0","doc":"","ref":"Lightning.AdaptorService.html#t:package_spec/0"},{"type":"module","title":"Lightning.Attempt","doc":"Ecto model for Attempts.","ref":"Lightning.Attempt.html"},{"type":"function","title":"Lightning.Attempt.new/1","doc":"","ref":"Lightning.Attempt.html#new/1"},{"type":"type","title":"Lightning.Attempt.t/0","doc":"","ref":"Lightning.Attempt.html#t:t/0"},{"type":"module","title":"Lightning.AttemptRun","doc":"Ecto model for an Attempts Runs.","ref":"Lightning.AttemptRun.html"},{"type":"function","title":"Lightning.AttemptRun.new/1","doc":"","ref":"Lightning.AttemptRun.html#new/1"},{"type":"function","title":"Lightning.AttemptRun.new/2","doc":"","ref":"Lightning.AttemptRun.html#new/2"},{"type":"type","title":"Lightning.AttemptRun.t/0","doc":"","ref":"Lightning.AttemptRun.html#t:t/0"},{"type":"module","title":"Lightning.AttemptService","doc":"The Attempts context.","ref":"Lightning.AttemptService.html"},{"type":"function","title":"Lightning.AttemptService.append/2","doc":"Adds an Attempt to an unsaved Run When given an Attempt, it simply adds the Run to a new AttemptRun. However when given an AttemptRun, the Run (from the AttemptRun) is set as the previous Run for the new unsaved Run.","ref":"Lightning.AttemptService.html#append/2"},{"type":"function","title":"Lightning.AttemptService.build_attempt/2","doc":"","ref":"Lightning.AttemptService.html#build_attempt/2"},{"type":"function","title":"Lightning.AttemptService.calculate_runs/3","doc":"","ref":"Lightning.AttemptService.html#calculate_runs/3"},{"type":"function","title":"Lightning.AttemptService.create_attempt/3","doc":"Create an attempt Examples iex> create_attempt ( %{ field : value } ) { :ok , % Attempt { } } iex> create_attempt ( %{ field : bad_value } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.AttemptService.html#create_attempt/3"},{"type":"function","title":"Lightning.AttemptService.get_for_rerun/2","doc":"","ref":"Lightning.AttemptService.html#get_for_rerun/2"},{"type":"function","title":"Lightning.AttemptService.get_last_attempt_for/1","doc":"Get the latest attempt associated to a given run","ref":"Lightning.AttemptService.html#get_last_attempt_for/1"},{"type":"function","title":"Lightning.AttemptService.get_workflow_for/1","doc":"","ref":"Lightning.AttemptService.html#get_workflow_for/1"},{"type":"function","title":"Lightning.AttemptService.list_for_rerun_from_job/2","doc":"Returns a list of AttemptRun structs that should be rerun for the given list of workorder ids that are associated to the given Job","ref":"Lightning.AttemptService.html#list_for_rerun_from_job/2"},{"type":"function","title":"Lightning.AttemptService.list_for_rerun_from_start/1","doc":"Returns a list of AttemptRun structs that should be rerun for the given list of work order ids.","ref":"Lightning.AttemptService.html#list_for_rerun_from_start/1"},{"type":"function","title":"Lightning.AttemptService.retry/3","doc":"Creates a new Attempt starting from a given run. All upstream/prior Runs that were performed on that attempt are associated with the new Attempt, where as the specified run is used to create a new one and is added to the Attempt. Any runs downstream from the Run given are ignored.","ref":"Lightning.AttemptService.html#retry/3"},{"type":"function","title":"Lightning.AttemptService.retry_many/2","doc":"Creates new Attempts for each pair of corresponding AttemptRun and InvocationReason.","ref":"Lightning.AttemptService.html#retry_many/2"},{"type":"module","title":"Lightning.Auditing","doc":"Context for working with Audit records.","ref":"Lightning.Auditing.html"},{"type":"function","title":"Lightning.Auditing.list_all/1","doc":"","ref":"Lightning.Auditing.html#list_all/1"},{"type":"module","title":"Lightning.Auditing.Model","doc":"Macro module to add common model behaviour to a given Ecto model","ref":"Lightning.Auditing.Model.html"},{"type":"function","title":"Lightning.Auditing.Model.event/5","doc":"Creates a schema changeset for the event identified by row_id and caused by actor_id . The given metadata can be either nil , Ecto.Changeset , struct or map. It returns :no_changes in case of an Ecto.Changeset metadata that changed nothing or an Ecto.Changeset with the event ready to be inserted.","ref":"Lightning.Auditing.Model.html#event/5"},{"type":"function","title":"Lightning.Auditing.Model.save/2","doc":"Saves the event to the Repo . In case of nothing changes, do nothing. It returns {:ok, :no_changes} if nothing changed, {:ok, struct} if the log has been successfully saved or {:error, changeset} in case of error.","ref":"Lightning.Auditing.Model.html#save/2"},{"type":"module","title":"Lightning.AuthProviders","doc":"Context module for dealing with external Auth Providers.","ref":"Lightning.AuthProviders.html"},{"type":"function","title":"Lightning.AuthProviders.build_handler/2","doc":"","ref":"Lightning.AuthProviders.html#build_handler/2"},{"type":"function","title":"Lightning.AuthProviders.create/1","doc":"","ref":"Lightning.AuthProviders.html#create/1"},{"type":"function","title":"Lightning.AuthProviders.create_handler/1","doc":"","ref":"Lightning.AuthProviders.html#create_handler/1"},{"type":"function","title":"Lightning.AuthProviders.delete!/1","doc":"","ref":"Lightning.AuthProviders.html#delete!/1"},{"type":"function","title":"Lightning.AuthProviders.get_authorize_url/1","doc":"Retrieve the authorization url for a given handler or handler name.","ref":"Lightning.AuthProviders.html#get_authorize_url/1"},{"type":"function","title":"Lightning.AuthProviders.get_existing/0","doc":"","ref":"Lightning.AuthProviders.html#get_existing/0"},{"type":"function","title":"Lightning.AuthProviders.get_existing/1","doc":"","ref":"Lightning.AuthProviders.html#get_existing/1"},{"type":"function","title":"Lightning.AuthProviders.get_handler/1","doc":"","ref":"Lightning.AuthProviders.html#get_handler/1"},{"type":"function","title":"Lightning.AuthProviders.get_handlers/0","doc":"","ref":"Lightning.AuthProviders.html#get_handlers/0"},{"type":"function","title":"Lightning.AuthProviders.new/0","doc":"","ref":"Lightning.AuthProviders.html#new/0"},{"type":"function","title":"Lightning.AuthProviders.remove_handler/1","doc":"","ref":"Lightning.AuthProviders.html#remove_handler/1"},{"type":"function","title":"Lightning.AuthProviders.update/2","doc":"","ref":"Lightning.AuthProviders.html#update/2"},{"type":"module","title":"Lightning.AuthProviders.AuthConfig","doc":"AuthProvider model","ref":"Lightning.AuthProviders.AuthConfig.html"},{"type":"type","title":"Lightning.AuthProviders.AuthConfig.t/0","doc":"","ref":"Lightning.AuthProviders.AuthConfig.html#t:t/0"},{"type":"module","title":"Lightning.AuthProviders.CacheWarmer","doc":"Dummy warmer which caches database rows every 30s.","ref":"Lightning.AuthProviders.CacheWarmer.html"},{"type":"function","title":"Lightning.AuthProviders.CacheWarmer.child_spec/1","doc":"Returns a specification to start this module under a supervisor. See Supervisor .","ref":"Lightning.AuthProviders.CacheWarmer.html#child_spec/1"},{"type":"function","title":"Lightning.AuthProviders.CacheWarmer.execute/1","doc":"Executes this cache warmer with a connection.","ref":"Lightning.AuthProviders.CacheWarmer.html#execute/1"},{"type":"function","title":"Lightning.AuthProviders.CacheWarmer.interval/0","doc":"Returns the interval for this warmer.","ref":"Lightning.AuthProviders.CacheWarmer.html#interval/0"},{"type":"module","title":"Lightning.AuthProviders.Google","doc":"","ref":"Lightning.AuthProviders.Google.html"},{"type":"function","title":"Lightning.AuthProviders.Google.authorize_url/2","doc":"","ref":"Lightning.AuthProviders.Google.html#authorize_url/2"},{"type":"function","title":"Lightning.AuthProviders.Google.build_client/1","doc":"Builds a new client","ref":"Lightning.AuthProviders.Google.html#build_client/1"},{"type":"function","title":"Lightning.AuthProviders.Google.get_config/0","doc":"","ref":"Lightning.AuthProviders.Google.html#get_config/0"},{"type":"function","title":"Lightning.AuthProviders.Google.get_token/2","doc":"","ref":"Lightning.AuthProviders.Google.html#get_token/2"},{"type":"function","title":"Lightning.AuthProviders.Google.get_userinfo/2","doc":"","ref":"Lightning.AuthProviders.Google.html#get_userinfo/2"},{"type":"function","title":"Lightning.AuthProviders.Google.get_wellknown/0","doc":"","ref":"Lightning.AuthProviders.Google.html#get_wellknown/0"},{"type":"function","title":"Lightning.AuthProviders.Google.get_wellknown!/0","doc":"","ref":"Lightning.AuthProviders.Google.html#get_wellknown!/0"},{"type":"function","title":"Lightning.AuthProviders.Google.refresh_token/2","doc":"","ref":"Lightning.AuthProviders.Google.html#refresh_token/2"},{"type":"module","title":"Lightning.AuthProviders.Handler","doc":"Module which wraps Oauth configuration and a WellKnown document into a convenient struct that can be used to authenticate users against any OIDC compliant provider.","ref":"Lightning.AuthProviders.Handler.html"},{"type":"function","title":"Lightning.AuthProviders.Handler.authorize_url/1","doc":"","ref":"Lightning.AuthProviders.Handler.html#authorize_url/1"},{"type":"function","title":"Lightning.AuthProviders.Handler.from_model/1","doc":"Returns a Handler from a given AuthConfig","ref":"Lightning.AuthProviders.Handler.html#from_model/1"},{"type":"function","title":"Lightning.AuthProviders.Handler.get_token/2","doc":"","ref":"Lightning.AuthProviders.Handler.html#get_token/2"},{"type":"function","title":"Lightning.AuthProviders.Handler.get_userinfo/2","doc":"","ref":"Lightning.AuthProviders.Handler.html#get_userinfo/2"},{"type":"function","title":"Lightning.AuthProviders.Handler.new/2","doc":"Create a new Provider struct, expects a name and opts: :client_id - The providers issued id :client_secret - Secret for the client :redirect_uri - The URI for redirecting after authentication, usually the callback url in the router. :wellknown - A AuthProviders.WellKnown struct with the providers .well-known/openid-configuration .","ref":"Lightning.AuthProviders.Handler.html#new/2"},{"type":"type","title":"Lightning.AuthProviders.Handler.opts/0","doc":"","ref":"Lightning.AuthProviders.Handler.html#t:opts/0"},{"type":"type","title":"Lightning.AuthProviders.Handler.t/0","doc":"","ref":"Lightning.AuthProviders.Handler.html#t:t/0"},{"type":"module","title":"Lightning.AuthProviders.Store","doc":"Store module for caching Handlers. Since Handlers often have to fetch their .well-known files when being initialized we cache these in order to avoid repeatedly making HTTP requests to a providers API.","ref":"Lightning.AuthProviders.Store.html"},{"type":"function","title":"Lightning.AuthProviders.Store.get_handler/2","doc":"","ref":"Lightning.AuthProviders.Store.html#get_handler/2"},{"type":"function","title":"Lightning.AuthProviders.Store.get_handlers/0","doc":"","ref":"Lightning.AuthProviders.Store.html#get_handlers/0"},{"type":"function","title":"Lightning.AuthProviders.Store.put_handler/2","doc":"","ref":"Lightning.AuthProviders.Store.html#put_handler/2"},{"type":"function","title":"Lightning.AuthProviders.Store.remove_handler/1","doc":"","ref":"Lightning.AuthProviders.Store.html#remove_handler/1"},{"type":"type","title":"Lightning.AuthProviders.Store.finder/0","doc":"","ref":"Lightning.AuthProviders.Store.html#t:finder/0"},{"type":"module","title":"Lightning.AuthProviders.WellKnown","doc":"A datastructure to fetch and hold information about a given OIDC/OAuth provider","ref":"Lightning.AuthProviders.WellKnown.html"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.delete/3","doc":"Issues a DELETE request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#delete/3"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.delete!/3","doc":"Issues a DELETE request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#delete!/3"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.fetch/1","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#fetch/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.fetch!/1","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#fetch!/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.get/3","doc":"Issues a GET request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#get/3"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.get!/3","doc":"Issues a GET request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#get!/3"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.head/3","doc":"Issues a HEAD request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#head/3"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.head!/3","doc":"Issues a HEAD request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#head!/3"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.new/1","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#new/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.options/3","doc":"Issues an OPTIONS request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#options/3"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.options!/3","doc":"Issues a OPTIONS request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#options!/3"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.patch/4","doc":"Issues a PATCH request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#patch/4"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.patch!/4","doc":"Issues a PATCH request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#patch!/4"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.post/4","doc":"Issues a POST request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#post/4"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.post!/4","doc":"Issues a POST request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#post!/4"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_headers/1","doc":"Callback implementation for HTTPoison.Base.process_headers/1 .","ref":"Lightning.AuthProviders.WellKnown.html#process_headers/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_request_body/1","doc":"Callback implementation for HTTPoison.Base.process_request_body/1 .","ref":"Lightning.AuthProviders.WellKnown.html#process_request_body/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_request_headers/1","doc":"Callback implementation for HTTPoison.Base.process_request_headers/1 .","ref":"Lightning.AuthProviders.WellKnown.html#process_request_headers/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_request_options/1","doc":"Callback implementation for HTTPoison.Base.process_request_options/1 .","ref":"Lightning.AuthProviders.WellKnown.html#process_request_options/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_request_params/1","doc":"Callback implementation for HTTPoison.Base.process_request_params/1 .","ref":"Lightning.AuthProviders.WellKnown.html#process_request_params/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_request_url/1","doc":"Callback implementation for HTTPoison.Base.process_request_url/1 .","ref":"Lightning.AuthProviders.WellKnown.html#process_request_url/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_response/1","doc":"Callback implementation for HTTPoison.Base.process_response/1 .","ref":"Lightning.AuthProviders.WellKnown.html#process_response/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_response_body/1","doc":"Callback implementation for HTTPoison.Base.process_response_body/1 .","ref":"Lightning.AuthProviders.WellKnown.html#process_response_body/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_response_chunk/1","doc":"Callback implementation for HTTPoison.Base.process_response_chunk/1 .","ref":"Lightning.AuthProviders.WellKnown.html#process_response_chunk/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_response_headers/1","doc":"Callback implementation for HTTPoison.Base.process_response_headers/1 .","ref":"Lightning.AuthProviders.WellKnown.html#process_response_headers/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_response_status_code/1","doc":"Callback implementation for HTTPoison.Base.process_response_status_code/1 .","ref":"Lightning.AuthProviders.WellKnown.html#process_response_status_code/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_status_code/1","doc":"Callback implementation for HTTPoison.Base.process_status_code/1 .","ref":"Lightning.AuthProviders.WellKnown.html#process_status_code/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_url/1","doc":"Callback implementation for HTTPoison.Base.process_url/1 .","ref":"Lightning.AuthProviders.WellKnown.html#process_url/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.put/4","doc":"Issues a PUT request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#put/4"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.put!/4","doc":"Issues a PUT request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#put!/4"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.request/1","doc":"Issues an HTTP request using a Request struct. This function returns {:ok, response} , {:ok, async_response} , or {:ok, maybe_redirect} if the request is successful, {:error, reason} otherwise. Redirect handling If the option :follow_redirect is given, HTTP redirects are automatically follow if the method is set to :get or :head and the response's status_code is 301 , 302 or 307 . If the method is set to :post , then the only status_code that get's automatically followed is 303 . If any other method or status_code is returned, then this function returns a returns a {:ok, %HTTPoison.MaybeRedirect{}} containing the redirect_url for you to re-request with the method set to :get . Examples request = % HTTPoison.Request { method : :post , url : "https://my.website.com" , body : "{ \\" foo \\" : 3}" , headers : [ { "Accept" , "application/json" } ] } request ( request )","ref":"Lightning.AuthProviders.WellKnown.html#request/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.request/5","doc":"Issues an HTTP request with the given method to the given url. This function is usually used indirectly by get/3 , post/4 , put/4 , etc Args: method - HTTP method as an atom ( :get , :head , :post , :put , :delete , etc.) url - target url as a binary string or char list body - request body. See more below headers - HTTP headers as an orddict (e.g., [{"Accept", "application/json"}] ) options - Keyword list of options Body: see type HTTPoison.Request Options: see type HTTPoison.Request This function returns {:ok, response} , {:ok, async_response} , or {:ok, maybe_redirect} if the request is successful, {:error, reason} otherwise. Redirect handling If the option :follow_redirect is given, HTTP redirects are automatically follow if the method is set to :get or :head and the response's status_code is 301 , 302 or 307 . If the method is set to :post , then the only status_code that get's automatically followed is 303 . If any other method or status_code is returned, then this function returns a returns a {:ok, %HTTPoison.MaybeRedirect{}} containing the redirect_url for you to re-request with the method set to :get . Examples request ( :post , "https://my.website.com" , "{ \\" foo \\" : 3}" , [ { "Accept" , "application/json" } ] )","ref":"Lightning.AuthProviders.WellKnown.html#request/5"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.request!/5","doc":"Issues an HTTP request with the given method to the given url, raising an exception in case of failure. request!/5 works exactly like request/5 but it returns just the response in case of a successful request, raising an exception in case the request fails.","ref":"Lightning.AuthProviders.WellKnown.html#request!/5"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.start/0","doc":"Starts HTTPoison and its dependencies.","ref":"Lightning.AuthProviders.WellKnown.html#start/0"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.stream_next/1","doc":"Requests the next message to be streamed for a given HTTPoison.AsyncResponse . See request!/5 for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#stream_next/1"},{"type":"type","title":"Lightning.AuthProviders.WellKnown.body/0","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#t:body/0"},{"type":"type","title":"Lightning.AuthProviders.WellKnown.headers/0","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#t:headers/0"},{"type":"type","title":"Lightning.AuthProviders.WellKnown.method/0","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#t:method/0"},{"type":"type","title":"Lightning.AuthProviders.WellKnown.options/0","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#t:options/0"},{"type":"type","title":"Lightning.AuthProviders.WellKnown.params/0","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#t:params/0"},{"type":"type","title":"Lightning.AuthProviders.WellKnown.request/0","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#t:request/0"},{"type":"type","title":"Lightning.AuthProviders.WellKnown.t/0","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#t:t/0"},{"type":"type","title":"Lightning.AuthProviders.WellKnown.url/0","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#t:url/0"},{"type":"module","title":"Lightning.CLI","doc":"Module providing facilities to make calls to the OpenFn CLI. See @openfn/cli","ref":"Lightning.CLI.html"},{"type":"function","title":"Lightning.CLI.execute/1","doc":"Execute a command in a child process and parse the results.","ref":"Lightning.CLI.html#execute/1"},{"type":"function","title":"Lightning.CLI.metadata/2","doc":"Retrieve metadata for a given adaptor and configuration.","ref":"Lightning.CLI.html#metadata/2"},{"type":"module","title":"Lightning.CLI.Result","doc":"Struct that wraps the output of an OpenFn CLI call. Containing the keys: start_time end_time status logs Logs The OpenFn CLI returns JSON formatted log lines, which are decoded and added to a 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","ref":"Lightning.CLI.Result.html"},{"type":"function","title":"Lightning.CLI.Result.get_messages/1","doc":"Returns message type log lines from a Result .","ref":"Lightning.CLI.Result.html#get_messages/1"},{"type":"function","title":"Lightning.CLI.Result.new/1","doc":"","ref":"Lightning.CLI.Result.html#new/1"},{"type":"function","title":"Lightning.CLI.Result.parse/2","doc":"","ref":"Lightning.CLI.Result.html#parse/2"},{"type":"type","title":"Lightning.CLI.Result.t/0","doc":"","ref":"Lightning.CLI.Result.html#t:t/0"},{"type":"module","title":"Lightning.Demo","doc":"Demo encapsulates logic for setting up a demonstration site.","ref":"Lightning.Demo.html"},{"type":"function","title":"Lightning.Demo.reset_demo/0","doc":"Deletes everything in the database including the superuser and creates a set of publicly available users for a demo site via a command that can be run on Kubernetes-deployed systems.","ref":"Lightning.Demo.html#reset_demo/0"},{"type":"module","title":"Lightning.ExportUtils","doc":"Module that expose a function generating a complete and valid yaml string from a project and its workflows.","ref":"Lightning.ExportUtils.html"},{"type":"function","title":"Lightning.ExportUtils.build_yaml_tree/2","doc":"","ref":"Lightning.ExportUtils.html#build_yaml_tree/2"},{"type":"function","title":"Lightning.ExportUtils.generate_new_yaml/1","doc":"","ref":"Lightning.ExportUtils.html#generate_new_yaml/1"},{"type":"module","title":"Lightning.FailureNotifierView","doc":"","ref":"Lightning.FailureNotifierView.html"},{"type":"function","title":"Lightning.FailureNotifierView.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"Lightning.FailureNotifierView.html#__resource__/0"},{"type":"function","title":"Lightning.FailureNotifierView.failure_alert.html/1","doc":"","ref":"Lightning.FailureNotifierView.html#failure_alert.html/1"},{"type":"function","title":"Lightning.FailureNotifierView.render/2","doc":"Renders the given template locally.","ref":"Lightning.FailureNotifierView.html#render/2"},{"type":"function","title":"Lightning.FailureNotifierView.template_not_found/2","doc":"Callback invoked when no template is found. By default it raises but can be customized to render a particular template.","ref":"Lightning.FailureNotifierView.html#template_not_found/2"},{"type":"module","title":"Lightning.Helpers","doc":"Common functions for the context","ref":"Lightning.Helpers.html"},{"type":"function","title":"Lightning.Helpers.coerce_json_field/2","doc":"Changes a given maps field from a json string to a map. If it cannot be converted, it leaves the original value","ref":"Lightning.Helpers.html#coerce_json_field/2"},{"type":"function","title":"Lightning.Helpers.indefinite_article/1","doc":"","ref":"Lightning.Helpers.html#indefinite_article/1"},{"type":"function","title":"Lightning.Helpers.json_safe/1","doc":"Recursively ensures a given map is safe to convert to JSON, where all keys are strings and all values are json safe (primitive values).","ref":"Lightning.Helpers.html#json_safe/1"},{"type":"function","title":"Lightning.Helpers.ms_to_human/1","doc":"Converts milliseconds (integer) to a human duration, such as "1 minute" or "45 years, 6 months, 5 days, 21 hours, 12 minutes, 34 seconds" using Timex.Format.Duration.Formatters.Humanized.format() .","ref":"Lightning.Helpers.html#ms_to_human/1"},{"type":"module","title":"Lightning.MetadataService","doc":"Retrieves metadata for a given credential and adaptor using the OpenFn CLI.","ref":"Lightning.MetadataService.html"},{"type":"function","title":"Lightning.MetadataService.fetch/2","doc":"Retrieve metadata for a given adaptor and credential. The adaptor must be an npm specification.","ref":"Lightning.MetadataService.html#fetch/2"},{"type":"module","title":"Lightning.Name","doc":"Generates a random names.","ref":"Lightning.Name.html"},{"type":"function","title":"Lightning.Name.generate/1","doc":"","ref":"Lightning.Name.html#generate/1"},{"type":"module","title":"Lightning.ObanManager","doc":"The Oban Manager","ref":"Lightning.ObanManager.html"},{"type":"function","title":"Lightning.ObanManager.handle_event/4","doc":"","ref":"Lightning.ObanManager.html#handle_event/4"},{"type":"module","title":"Lightning.Policies.Permissions","doc":"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: The users.ex file has all the policies for the instances wide access levels The project_users.ex file has all the policies for the project wide access levels The permissions.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 ) if can_edit_job do # allow user to edit the job else # quick user out end","ref":"Lightning.Policies.Permissions.html"},{"type":"function","title":"Lightning.Policies.Permissions.can/4","doc":"checks if user has the permissions to apply action using some policy module Returns :ok if user can apply action and {:error, :unauthorized} otherwise Examples iex> can ( Lightning.Policies.Users , :create_workflow , user , project ) :ok iex> can ( Lightning.Policies.Users , :create_project , user , %{ } ) { :error , :unauthorized }","ref":"Lightning.Policies.Permissions.html#can/4"},{"type":"function","title":"Lightning.Policies.Permissions.can?/4","doc":"same as can/4 but returns true if user can apply action and false otherwise Examples iex> can ( Lightning.Policies.Users , :create_workflow , user , project ) true iex> can ( Lightning.Policies.Users , :create_project , user , %{ } ) false","ref":"Lightning.Policies.Permissions.html#can?/4"},{"type":"module","title":"Lightning.Policies.ProjectUsers","doc":"The Bodyguard Policy module for projects members roles.","ref":"Lightning.Policies.ProjectUsers.html"},{"type":"function","title":"Lightning.Policies.ProjectUsers.authorize/3","doc":"authorize/3 takes an action, a user, and a project. It checks the user's role for this project and returns true if the user can perform the action in that project and false if they cannot. Note that permissions are grouped by action, rather than by user role. We deny by default, so if a user's role is not added to the allow roles list for a particular action they are denied.","ref":"Lightning.Policies.ProjectUsers.html#authorize/3"},{"type":"type","title":"Lightning.Policies.ProjectUsers.actions/0","doc":"","ref":"Lightning.Policies.ProjectUsers.html#t:actions/0"},{"type":"module","title":"Lightning.Policies.Provisioning","doc":"The Bodyguard Policy module for users roles.","ref":"Lightning.Policies.Provisioning.html"},{"type":"function","title":"Lightning.Policies.Provisioning.authorize/3","doc":"authorize/3 takes an action, a user, and a project. It checks the user's role for this project and returns true if the user can perform the action and false if they cannot. Note that permissions are grouped by action. We deny by default, so if a user's role is not added to the allow roles list for a particular action they are denied. Only a superuser can provision a new project. Owners and admins can update existing projects.","ref":"Lightning.Policies.Provisioning.html#authorize/3"},{"type":"type","title":"Lightning.Policies.Provisioning.actions/0","doc":"","ref":"Lightning.Policies.Provisioning.html#t:actions/0"},{"type":"module","title":"Lightning.Policies.Users","doc":"The Bodyguard Policy module for users roles.","ref":"Lightning.Policies.Users.html"},{"type":"function","title":"Lightning.Policies.Users.authorize/3","doc":"authorize/3 takes an action, a user, and a project. It checks the user's role for this project and returns true if the user can perform the action and false if they cannot. Note that permissions are grouped by action. We deny by default, so if a user's role is not added to the allow roles list for a particular action they are denied.","ref":"Lightning.Policies.Users.html#authorize/3"},{"type":"type","title":"Lightning.Policies.Users.actions/0","doc":"","ref":"Lightning.Policies.Users.html#t:actions/0"},{"type":"module","title":"Lightning.Release","doc":"Used for executing DB release tasks when run in production without Mix installed.","ref":"Lightning.Release.html"},{"type":"function","title":"Lightning.Release.create_db/0","doc":"","ref":"Lightning.Release.html#create_db/0"},{"type":"function","title":"Lightning.Release.load_app/0","doc":"","ref":"Lightning.Release.html#load_app/0"},{"type":"function","title":"Lightning.Release.migrate/0","doc":"","ref":"Lightning.Release.html#migrate/0"},{"type":"function","title":"Lightning.Release.rollback/2","doc":"","ref":"Lightning.Release.html#rollback/2"},{"type":"module","title":"Lightning.Repo","doc":"","ref":"Lightning.Repo.html"},{"type":"function","title":"Lightning.Repo.aggregate/3","doc":"Callback implementation for Ecto.Repo.aggregate/3 .","ref":"Lightning.Repo.html#aggregate/3"},{"type":"function","title":"Lightning.Repo.aggregate/4","doc":"Callback implementation for Ecto.Repo.aggregate/4 .","ref":"Lightning.Repo.html#aggregate/4"},{"type":"function","title":"Lightning.Repo.all/2","doc":"Callback implementation for Ecto.Repo.all/2 .","ref":"Lightning.Repo.html#all/2"},{"type":"function","title":"Lightning.Repo.checked_out?/0","doc":"Callback implementation for Ecto.Repo.checked_out?/0 .","ref":"Lightning.Repo.html#checked_out?/0"},{"type":"function","title":"Lightning.Repo.checkout/2","doc":"Callback implementation for Ecto.Repo.checkout/2 .","ref":"Lightning.Repo.html#checkout/2"},{"type":"function","title":"Lightning.Repo.child_spec/1","doc":"","ref":"Lightning.Repo.html#child_spec/1"},{"type":"function","title":"Lightning.Repo.config/0","doc":"Callback implementation for Ecto.Repo.config/0 .","ref":"Lightning.Repo.html#config/0"},{"type":"function","title":"Lightning.Repo.default_options/1","doc":"Callback implementation for Ecto.Repo.default_options/1 .","ref":"Lightning.Repo.html#default_options/1"},{"type":"function","title":"Lightning.Repo.delete/2","doc":"Callback implementation for Ecto.Repo.delete/2 .","ref":"Lightning.Repo.html#delete/2"},{"type":"function","title":"Lightning.Repo.delete!/2","doc":"Callback implementation for Ecto.Repo.delete!/2 .","ref":"Lightning.Repo.html#delete!/2"},{"type":"function","title":"Lightning.Repo.delete_all/2","doc":"Callback implementation for Ecto.Repo.delete_all/2 .","ref":"Lightning.Repo.html#delete_all/2"},{"type":"function","title":"Lightning.Repo.disconnect_all/2","doc":"A convenience function for SQL-based repositories that forces all connections in the pool to disconnect within the given interval. See Ecto.Adapters.SQL.disconnect_all/3 for more information.","ref":"Lightning.Repo.html#disconnect_all/2"},{"type":"function","title":"Lightning.Repo.exists?/2","doc":"Callback implementation for Ecto.Repo.exists?/2 .","ref":"Lightning.Repo.html#exists?/2"},{"type":"function","title":"Lightning.Repo.explain/3","doc":"A convenience function for SQL-based repositories that executes an EXPLAIN statement or similar depending on the adapter to obtain statistics for the given query. See Ecto.Adapters.SQL.explain/4 for more information.","ref":"Lightning.Repo.html#explain/3"},{"type":"function","title":"Lightning.Repo.get/3","doc":"Callback implementation for Ecto.Repo.get/3 .","ref":"Lightning.Repo.html#get/3"},{"type":"function","title":"Lightning.Repo.get!/3","doc":"Callback implementation for Ecto.Repo.get!/3 .","ref":"Lightning.Repo.html#get!/3"},{"type":"function","title":"Lightning.Repo.get_by/3","doc":"Callback implementation for Ecto.Repo.get_by/3 .","ref":"Lightning.Repo.html#get_by/3"},{"type":"function","title":"Lightning.Repo.get_by!/3","doc":"Callback implementation for Ecto.Repo.get_by!/3 .","ref":"Lightning.Repo.html#get_by!/3"},{"type":"function","title":"Lightning.Repo.get_dynamic_repo/0","doc":"Callback implementation for Ecto.Repo.get_dynamic_repo/0 .","ref":"Lightning.Repo.html#get_dynamic_repo/0"},{"type":"function","title":"Lightning.Repo.in_transaction?/0","doc":"Callback implementation for Ecto.Repo.in_transaction?/0 .","ref":"Lightning.Repo.html#in_transaction?/0"},{"type":"function","title":"Lightning.Repo.insert/2","doc":"Callback implementation for Ecto.Repo.insert/2 .","ref":"Lightning.Repo.html#insert/2"},{"type":"function","title":"Lightning.Repo.insert!/2","doc":"Callback implementation for Ecto.Repo.insert!/2 .","ref":"Lightning.Repo.html#insert!/2"},{"type":"function","title":"Lightning.Repo.insert_all/3","doc":"Callback implementation for Ecto.Repo.insert_all/3 .","ref":"Lightning.Repo.html#insert_all/3"},{"type":"function","title":"Lightning.Repo.insert_or_update/2","doc":"Callback implementation for Ecto.Repo.insert_or_update/2 .","ref":"Lightning.Repo.html#insert_or_update/2"},{"type":"function","title":"Lightning.Repo.insert_or_update!/2","doc":"Callback implementation for Ecto.Repo.insert_or_update!/2 .","ref":"Lightning.Repo.html#insert_or_update!/2"},{"type":"function","title":"Lightning.Repo.load/2","doc":"Callback implementation for Ecto.Repo.load/2 .","ref":"Lightning.Repo.html#load/2"},{"type":"function","title":"Lightning.Repo.one/2","doc":"Callback implementation for Ecto.Repo.one/2 .","ref":"Lightning.Repo.html#one/2"},{"type":"function","title":"Lightning.Repo.one!/2","doc":"Callback implementation for Ecto.Repo.one!/2 .","ref":"Lightning.Repo.html#one!/2"},{"type":"function","title":"Lightning.Repo.paginate/2","doc":"","ref":"Lightning.Repo.html#paginate/2"},{"type":"function","title":"Lightning.Repo.preload/3","doc":"Callback implementation for Ecto.Repo.preload/3 .","ref":"Lightning.Repo.html#preload/3"},{"type":"function","title":"Lightning.Repo.prepare_query/3","doc":"Callback implementation for Ecto.Repo.prepare_query/3 .","ref":"Lightning.Repo.html#prepare_query/3"},{"type":"function","title":"Lightning.Repo.put_dynamic_repo/1","doc":"Callback implementation for Ecto.Repo.put_dynamic_repo/1 .","ref":"Lightning.Repo.html#put_dynamic_repo/1"},{"type":"function","title":"Lightning.Repo.query/3","doc":"A convenience function for SQL-based repositories that executes the given query. See Ecto.Adapters.SQL.query/4 for more information.","ref":"Lightning.Repo.html#query/3"},{"type":"function","title":"Lightning.Repo.query!/3","doc":"A convenience function for SQL-based repositories that executes the given query. See Ecto.Adapters.SQL.query!/4 for more information.","ref":"Lightning.Repo.html#query!/3"},{"type":"function","title":"Lightning.Repo.query_many/3","doc":"A convenience function for SQL-based repositories that executes the given multi-result query. See Ecto.Adapters.SQL.query_many/4 for more information.","ref":"Lightning.Repo.html#query_many/3"},{"type":"function","title":"Lightning.Repo.query_many!/3","doc":"A convenience function for SQL-based repositories that executes the given multi-result query. See Ecto.Adapters.SQL.query_many!/4 for more information.","ref":"Lightning.Repo.html#query_many!/3"},{"type":"function","title":"Lightning.Repo.reload/2","doc":"Callback implementation for Ecto.Repo.reload/2 .","ref":"Lightning.Repo.html#reload/2"},{"type":"function","title":"Lightning.Repo.reload!/2","doc":"Callback implementation for Ecto.Repo.reload!/2 .","ref":"Lightning.Repo.html#reload!/2"},{"type":"function","title":"Lightning.Repo.rollback/1","doc":"Callback implementation for Ecto.Repo.rollback/1 .","ref":"Lightning.Repo.html#rollback/1"},{"type":"function","title":"Lightning.Repo.scrivener_defaults/0","doc":"","ref":"Lightning.Repo.html#scrivener_defaults/0"},{"type":"function","title":"Lightning.Repo.start_link/1","doc":"Callback implementation for Ecto.Repo.start_link/1 .","ref":"Lightning.Repo.html#start_link/1"},{"type":"function","title":"Lightning.Repo.stop/1","doc":"Callback implementation for Ecto.Repo.stop/1 .","ref":"Lightning.Repo.html#stop/1"},{"type":"function","title":"Lightning.Repo.stream/2","doc":"Callback implementation for Ecto.Repo.stream/2 .","ref":"Lightning.Repo.html#stream/2"},{"type":"function","title":"Lightning.Repo.to_sql/2","doc":"A convenience function for SQL-based repositories that translates the given query to SQL. See Ecto.Adapters.SQL.to_sql/3 for more information.","ref":"Lightning.Repo.html#to_sql/2"},{"type":"function","title":"Lightning.Repo.transaction/2","doc":"Callback implementation for Ecto.Repo.transaction/2 .","ref":"Lightning.Repo.html#transaction/2"},{"type":"function","title":"Lightning.Repo.update/2","doc":"Callback implementation for Ecto.Repo.update/2 .","ref":"Lightning.Repo.html#update/2"},{"type":"function","title":"Lightning.Repo.update!/2","doc":"Callback implementation for Ecto.Repo.update!/2 .","ref":"Lightning.Repo.html#update!/2"},{"type":"function","title":"Lightning.Repo.update_all/3","doc":"Callback implementation for Ecto.Repo.update_all/3 .","ref":"Lightning.Repo.html#update_all/3"},{"type":"module","title":"Lightning.RunSearchForm","doc":"Run filtering search form.","ref":"Lightning.RunSearchForm.html"},{"type":"module","title":"Lightning.SafetyString","doc":"Utilities for securely encoding serializable structs, lists and strings into URL-safe strings. In order to pass the state around in a URL, in a manner that protects secrets from leaking - and allows us to avoid persistance we take a set of parameters and: Encode into a URI query string gzip it to save characters encrypt the string base64 encode it for URI encoding safety","ref":"Lightning.SafetyString.html"},{"type":"function","title":"Lightning.SafetyString.decode/1","doc":"","ref":"Lightning.SafetyString.html#decode/1"},{"type":"function","title":"Lightning.SafetyString.encode/1","doc":"","ref":"Lightning.SafetyString.html#encode/1"},{"type":"module","title":"Lightning.Scrubber","doc":"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.","ref":"Lightning.Scrubber.html"},{"type":"function","title":"Lightning.Scrubber.child_spec/1","doc":"Returns a specification to start this module under a supervisor. See Supervisor .","ref":"Lightning.Scrubber.html#child_spec/1"},{"type":"function","title":"Lightning.Scrubber.encode_samples/1","doc":"Prepare a list of sensitive samples (strings) into a potentially bigger list composed of variations a sample may appear.","ref":"Lightning.Scrubber.html#encode_samples/1"},{"type":"function","title":"Lightning.Scrubber.samples/1","doc":"","ref":"Lightning.Scrubber.html#samples/1"},{"type":"function","title":"Lightning.Scrubber.scrub/2","doc":"","ref":"Lightning.Scrubber.html#scrub/2"},{"type":"function","title":"Lightning.Scrubber.start_link/1","doc":"","ref":"Lightning.Scrubber.html#start_link/1"},{"type":"module","title":"Lightning.SetupUtils","doc":"SetupUtils encapsulates logic for setting up initial data for various sites.","ref":"Lightning.SetupUtils.html"},{"type":"function","title":"Lightning.SetupUtils.add_and_update_runs/3","doc":"","ref":"Lightning.SetupUtils.html#add_and_update_runs/3"},{"type":"function","title":"Lightning.SetupUtils.create_dhis2_project/1","doc":"","ref":"Lightning.SetupUtils.html#create_dhis2_project/1"},{"type":"function","title":"Lightning.SetupUtils.create_openhie_project/1","doc":"","ref":"Lightning.SetupUtils.html#create_openhie_project/1"},{"type":"function","title":"Lightning.SetupUtils.create_starter_project/2","doc":"","ref":"Lightning.SetupUtils.html#create_starter_project/2"},{"type":"function","title":"Lightning.SetupUtils.setup_demo/1","doc":"Creates initial data and returns the created records.","ref":"Lightning.SetupUtils.html#setup_demo/1"},{"type":"function","title":"Lightning.SetupUtils.tear_down/1","doc":"","ref":"Lightning.SetupUtils.html#tear_down/1"},{"type":"module","title":"Lightning.TaskWorker","doc":"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.","ref":"Lightning.TaskWorker.html"},{"type":"function","title":"Lightning.TaskWorker.child_spec/1","doc":"Returns a specification to start this module under a supervisor. See Supervisor .","ref":"Lightning.TaskWorker.html#child_spec/1"},{"type":"function","title":"Lightning.TaskWorker.get_status/1","doc":"","ref":"Lightning.TaskWorker.html#get_status/1"},{"type":"function","title":"Lightning.TaskWorker.start_link/1","doc":"","ref":"Lightning.TaskWorker.html#start_link/1"},{"type":"function","title":"Lightning.TaskWorker.start_task/2","doc":"","ref":"Lightning.TaskWorker.html#start_task/2"},{"type":"module","title":"Lightning.Validators","doc":"Extra validators for Ecto.Changeset.","ref":"Lightning.Validators.html"},{"type":"function","title":"Lightning.Validators.validate_exclusive/3","doc":"Validate that only one of the fields is set at a time. Example: changeset |> validate_exclusive ( [ :source_job_id , :source_trigger_id ] , "source_job_id and source_trigger_id are mutually exclusive" )","ref":"Lightning.Validators.html#validate_exclusive/3"},{"type":"function","title":"Lightning.Validators.validate_one_required/3","doc":"Validate that at least one of the fields is set.","ref":"Lightning.Validators.html#validate_one_required/3"},{"type":"module","title":"Lightning.Vault","doc":"Module for handling the encryption and decryption of database fields.","ref":"Lightning.Vault.html"},{"type":"function","title":"Lightning.Vault.child_spec/1","doc":"Returns a specification to start this module under a supervisor. See Supervisor .","ref":"Lightning.Vault.html#child_spec/1"},{"type":"function","title":"Lightning.Vault.start_link/1","doc":"","ref":"Lightning.Vault.html#start_link/1"},{"type":"module","title":"Lightning.VersionControl","doc":"Boundary module for handling Version control activities for project, jobs workflows etc Use this module to create, modify and delete connections as well as running any associated sync jobs","ref":"Lightning.VersionControl.html"},{"type":"function","title":"Lightning.VersionControl.add_github_installation_id/2","doc":"","ref":"Lightning.VersionControl.html#add_github_installation_id/2"},{"type":"function","title":"Lightning.VersionControl.add_github_repo_and_branch/3","doc":"","ref":"Lightning.VersionControl.html#add_github_repo_and_branch/3"},{"type":"function","title":"Lightning.VersionControl.create_github_connection/1","doc":"Creates a connection between a project and a github repo","ref":"Lightning.VersionControl.html#create_github_connection/1"},{"type":"function","title":"Lightning.VersionControl.fetch_installation_repos/1","doc":"","ref":"Lightning.VersionControl.html#fetch_installation_repos/1"},{"type":"function","title":"Lightning.VersionControl.fetch_repo_branches/2","doc":"","ref":"Lightning.VersionControl.html#fetch_repo_branches/2"},{"type":"function","title":"Lightning.VersionControl.get_repo_connection/1","doc":"","ref":"Lightning.VersionControl.html#get_repo_connection/1"},{"type":"function","title":"Lightning.VersionControl.github_enabled?/0","doc":"","ref":"Lightning.VersionControl.html#github_enabled?/0"},{"type":"function","title":"Lightning.VersionControl.remove_github_connection/1","doc":"Deletes a github connection used when re installing","ref":"Lightning.VersionControl.html#remove_github_connection/1"},{"type":"function","title":"Lightning.VersionControl.run_sync/2","doc":"","ref":"Lightning.VersionControl.html#run_sync/2"},{"type":"module","title":"Lightning.VersionControl.GithubClient","doc":"Tesla github http client we use this to make any network requests to github from Lightning","ref":"Lightning.VersionControl.GithubClient.html"},{"type":"function","title":"Lightning.VersionControl.GithubClient.delete/3","doc":"Perform a DELETE request. See request/1 or request/2 for options definition. delete ( "/users" ) delete ( "/users" , query : [ scope : "admin" ] ) delete ( client , "/users" ) delete ( client , "/users" , query : [ scope : "admin" ] ) delete ( client , "/users" , body : %{ name : "Jon" } )","ref":"Lightning.VersionControl.GithubClient.html#delete/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.delete!/3","doc":"Perform a DELETE request. See request!/1 or request!/2 for options definition. delete! ( "/users" ) delete! ( "/users" , query : [ scope : "admin" ] ) delete! ( client , "/users" ) delete! ( client , "/users" , query : [ scope : "admin" ] ) delete! ( client , "/users" , body : %{ name : "Jon" } )","ref":"Lightning.VersionControl.GithubClient.html#delete!/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.fire_repository_dispatch/3","doc":"","ref":"Lightning.VersionControl.GithubClient.html#fire_repository_dispatch/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.get/3","doc":"Perform a GET request. See request/1 or request/2 for options definition. get ( "/users" ) get ( "/users" , query : [ scope : "admin" ] ) get ( client , "/users" ) get ( client , "/users" , query : [ scope : "admin" ] ) get ( client , "/users" , body : %{ name : "Jon" } )","ref":"Lightning.VersionControl.GithubClient.html#get/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.get!/3","doc":"Perform a GET request. See request!/1 or request!/2 for options definition. get! ( "/users" ) get! ( "/users" , query : [ scope : "admin" ] ) get! ( client , "/users" ) get! ( client , "/users" , query : [ scope : "admin" ] ) get! ( client , "/users" , body : %{ name : "Jon" } )","ref":"Lightning.VersionControl.GithubClient.html#get!/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.get_repo_branches/2","doc":"","ref":"Lightning.VersionControl.GithubClient.html#get_repo_branches/2"},{"type":"function","title":"Lightning.VersionControl.GithubClient.head/3","doc":"Perform a HEAD request. See request/1 or request/2 for options definition. head ( "/users" ) head ( "/users" , query : [ scope : "admin" ] ) head ( client , "/users" ) head ( client , "/users" , query : [ scope : "admin" ] ) head ( client , "/users" , body : %{ name : "Jon" } )","ref":"Lightning.VersionControl.GithubClient.html#head/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.head!/3","doc":"Perform a HEAD request. See request!/1 or request!/2 for options definition. head! ( "/users" ) head! ( "/users" , query : [ scope : "admin" ] ) head! ( client , "/users" ) head! ( client , "/users" , query : [ scope : "admin" ] ) head! ( client , "/users" , body : %{ name : "Jon" } )","ref":"Lightning.VersionControl.GithubClient.html#head!/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.installation_repos/1","doc":"","ref":"Lightning.VersionControl.GithubClient.html#installation_repos/1"},{"type":"function","title":"Lightning.VersionControl.GithubClient.options/3","doc":"Perform a OPTIONS request. See request/1 or request/2 for options definition. options ( "/users" ) options ( "/users" , query : [ scope : "admin" ] ) options ( client , "/users" ) options ( client , "/users" , query : [ scope : "admin" ] ) options ( client , "/users" , body : %{ name : "Jon" } )","ref":"Lightning.VersionControl.GithubClient.html#options/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.options!/3","doc":"Perform a OPTIONS request. See request!/1 or request!/2 for options definition. options! ( "/users" ) options! ( "/users" , query : [ scope : "admin" ] ) options! ( client , "/users" ) options! ( client , "/users" , query : [ scope : "admin" ] ) options! ( client , "/users" , body : %{ name : "Jon" } )","ref":"Lightning.VersionControl.GithubClient.html#options!/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.patch/4","doc":"Perform a PATCH request. See request/1 or request/2 for options definition. patch ( "/users" , %{ name : "Jon" } ) patch ( "/users" , %{ name : "Jon" } , query : [ scope : "admin" ] ) patch ( client , "/users" , %{ name : "Jon" } ) patch ( client , "/users" , %{ name : "Jon" } , query : [ scope : "admin" ] )","ref":"Lightning.VersionControl.GithubClient.html#patch/4"},{"type":"function","title":"Lightning.VersionControl.GithubClient.patch!/4","doc":"Perform a PATCH request. See request!/1 or request!/2 for options definition. patch! ( "/users" , %{ name : "Jon" } ) patch! ( "/users" , %{ name : "Jon" } , query : [ scope : "admin" ] ) patch! ( client , "/users" , %{ name : "Jon" } ) patch! ( client , "/users" , %{ name : "Jon" } , query : [ scope : "admin" ] )","ref":"Lightning.VersionControl.GithubClient.html#patch!/4"},{"type":"function","title":"Lightning.VersionControl.GithubClient.post/4","doc":"Perform a POST request. See request/1 or request/2 for options definition. post ( "/users" , %{ name : "Jon" } ) post ( "/users" , %{ name : "Jon" } , query : [ scope : "admin" ] ) post ( client , "/users" , %{ name : "Jon" } ) post ( client , "/users" , %{ name : "Jon" } , query : [ scope : "admin" ] )","ref":"Lightning.VersionControl.GithubClient.html#post/4"},{"type":"function","title":"Lightning.VersionControl.GithubClient.post!/4","doc":"Perform a POST request. See request!/1 or request!/2 for options definition. post! ( "/users" , %{ name : "Jon" } ) post! ( "/users" , %{ name : "Jon" } , query : [ scope : "admin" ] ) post! ( client , "/users" , %{ name : "Jon" } ) post! ( client , "/users" , %{ name : "Jon" } , query : [ scope : "admin" ] )","ref":"Lightning.VersionControl.GithubClient.html#post!/4"},{"type":"function","title":"Lightning.VersionControl.GithubClient.put/4","doc":"Perform a PUT request. See request/1 or request/2 for options definition. put ( "/users" , %{ name : "Jon" } ) put ( "/users" , %{ name : "Jon" } , query : [ scope : "admin" ] ) put ( client , "/users" , %{ name : "Jon" } ) put ( client , "/users" , %{ name : "Jon" } , query : [ scope : "admin" ] )","ref":"Lightning.VersionControl.GithubClient.html#put/4"},{"type":"function","title":"Lightning.VersionControl.GithubClient.put!/4","doc":"Perform a PUT request. See request!/1 or request!/2 for options definition. put! ( "/users" , %{ name : "Jon" } ) put! ( "/users" , %{ name : "Jon" } , query : [ scope : "admin" ] ) put! ( client , "/users" , %{ name : "Jon" } ) put! ( client , "/users" , %{ name : "Jon" } , query : [ scope : "admin" ] )","ref":"Lightning.VersionControl.GithubClient.html#put!/4"},{"type":"function","title":"Lightning.VersionControl.GithubClient.request/2","doc":"Perform a request. Options :method - the request method, one of [ :head , :get , :delete , :trace , :options , :post , :put , :patch ] :url - either full url e.g. " http://example.com/some/path" or just "/some/path" if using Tesla.Middleware.BaseUrl :query - a keyword list of query params, e.g. [page: 1, per_page: 100] :headers - a keyworld list of headers, e.g. [{"content-type", "text/plain"}] :body - depends on used middleware: by default it can be a binary if using e.g. JSON encoding middleware it can be a nested map if adapter supports it it can be a Stream with any of the above :opts - custom, per-request middleware or adapter options Examples ExampleApi . request ( method : :get , url : "/users/path" ) # use shortcut methods ExampleApi . get ( "/users/1" ) ExampleApi . post ( client , "/users" , %{ name : "Jon" } )","ref":"Lightning.VersionControl.GithubClient.html#request/2"},{"type":"function","title":"Lightning.VersionControl.GithubClient.request!/2","doc":"Perform request and raise in case of error. This is similar to request/2 behaviour from Tesla 0.x See request/2 for list of available options.","ref":"Lightning.VersionControl.GithubClient.html#request!/2"},{"type":"function","title":"Lightning.VersionControl.GithubClient.trace/3","doc":"Perform a TRACE request. See request/1 or request/2 for options definition. trace ( "/users" ) trace ( "/users" , query : [ scope : "admin" ] ) trace ( client , "/users" ) trace ( client , "/users" , query : [ scope : "admin" ] ) trace ( client , "/users" , body : %{ name : "Jon" } )","ref":"Lightning.VersionControl.GithubClient.html#trace/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.trace!/3","doc":"Perform a TRACE request. See request!/1 or request!/2 for options definition. trace! ( "/users" ) trace! ( "/users" , query : [ scope : "admin" ] ) trace! ( client , "/users" ) trace! ( client , "/users" , query : [ scope : "admin" ] ) trace! ( client , "/users" , body : %{ name : "Jon" } )","ref":"Lightning.VersionControl.GithubClient.html#trace!/3"},{"type":"type","title":"Lightning.VersionControl.GithubClient.option/0","doc":"Options that may be passed to a request function. See request/2 for detailed descriptions.","ref":"Lightning.VersionControl.GithubClient.html#t:option/0"},{"type":"module","title":"Lightning.VersionControl.GithubToken","doc":"A module that uses Joken to handle building and signing application tokens for communicating with github See: https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/generating-a-json-web-token-jwt-for-a-github-app#about-json-web-tokens-jwts","ref":"Lightning.VersionControl.GithubToken.html"},{"type":"function","title":"Lightning.VersionControl.GithubToken.build/2","doc":"","ref":"Lightning.VersionControl.GithubToken.html#build/2"},{"type":"function","title":"Lightning.VersionControl.GithubToken.generate_and_sign/2","doc":"Combines generate_claims/1 and encode_and_sign/2","ref":"Lightning.VersionControl.GithubToken.html#generate_and_sign/2"},{"type":"function","title":"Lightning.VersionControl.GithubToken.generate_and_sign!/2","doc":"Same as generate_and_sign/2 but raises if error","ref":"Lightning.VersionControl.GithubToken.html#generate_and_sign!/2"},{"type":"function","title":"Lightning.VersionControl.GithubToken.verify_and_validate/3","doc":"Combines verify/2 and validate/2","ref":"Lightning.VersionControl.GithubToken.html#verify_and_validate/3"},{"type":"function","title":"Lightning.VersionControl.GithubToken.verify_and_validate!/3","doc":"Same as verify_and_validate/2 but raises if error","ref":"Lightning.VersionControl.GithubToken.html#verify_and_validate!/3"},{"type":"module","title":"Lightning.VersionControl.ProjectRepo","doc":"Ecto model for project repo connections","ref":"Lightning.VersionControl.ProjectRepo.html"},{"type":"function","title":"Lightning.VersionControl.ProjectRepo.changeset/2","doc":"","ref":"Lightning.VersionControl.ProjectRepo.html#changeset/2"},{"type":"type","title":"Lightning.VersionControl.ProjectRepo.t/0","doc":"","ref":"Lightning.VersionControl.ProjectRepo.html#t:t/0"},{"type":"module","title":"Lightning.WorkOrder","doc":"Ecto model for Workorders.","ref":"Lightning.WorkOrder.html"},{"type":"function","title":"Lightning.WorkOrder.new/0","doc":"","ref":"Lightning.WorkOrder.html#new/0"},{"type":"type","title":"Lightning.WorkOrder.t/0","doc":"","ref":"Lightning.WorkOrder.html#t:t/0"},{"type":"module","title":"Lightning.WorkOrderService","doc":"The WorkOrderService.","ref":"Lightning.WorkOrderService.html"},{"type":"function","title":"Lightning.WorkOrderService.attempt_updated/1","doc":"","ref":"Lightning.WorkOrderService.html#attempt_updated/1"},{"type":"function","title":"Lightning.WorkOrderService.build/2","doc":"","ref":"Lightning.WorkOrderService.html#build/2"},{"type":"function","title":"Lightning.WorkOrderService.create_manual_workorder/3","doc":"","ref":"Lightning.WorkOrderService.html#create_manual_workorder/3"},{"type":"function","title":"Lightning.WorkOrderService.create_webhook_workorder/2","doc":"","ref":"Lightning.WorkOrderService.html#create_webhook_workorder/2"},{"type":"function","title":"Lightning.WorkOrderService.create_work_order/1","doc":"Creates a work_order. Examples iex> create_work_order ( %{ field : value } ) { :ok , % WorkOrder { } } iex> create_work_order ( %{ field : bad_value } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.WorkOrderService.html#create_work_order/1"},{"type":"function","title":"Lightning.WorkOrderService.multi_for/3","doc":"","ref":"Lightning.WorkOrderService.html#multi_for/3"},{"type":"function","title":"Lightning.WorkOrderService.multi_for_manual/3","doc":"","ref":"Lightning.WorkOrderService.html#multi_for_manual/3"},{"type":"function","title":"Lightning.WorkOrderService.retry_attempt_run/2","doc":"","ref":"Lightning.WorkOrderService.html#retry_attempt_run/2"},{"type":"function","title":"Lightning.WorkOrderService.retry_attempt_runs/2","doc":"","ref":"Lightning.WorkOrderService.html#retry_attempt_runs/2"},{"type":"function","title":"Lightning.WorkOrderService.subscribe/1","doc":"","ref":"Lightning.WorkOrderService.html#subscribe/1"},{"type":"module","title":"Lightning.Workflows","doc":"The Workflows context.","ref":"Lightning.Workflows.html"},{"type":"function","title":"Lightning.Workflows.build_trigger/1","doc":"Builds a Trigger","ref":"Lightning.Workflows.html#build_trigger/1"},{"type":"function","title":"Lightning.Workflows.change_workflow/2","doc":"Returns an %Ecto.Changeset{} for tracking workflow changes. Examples iex> change_workflow ( workflow ) % Ecto.Changeset { data : % Workflow { } }","ref":"Lightning.Workflows.html#change_workflow/2"},{"type":"function","title":"Lightning.Workflows.create_edge/1","doc":"Creates an edge","ref":"Lightning.Workflows.html#create_edge/1"},{"type":"function","title":"Lightning.Workflows.create_workflow/1","doc":"Creates a workflow. Examples iex> create_workflow ( %{ field : value } ) { :ok , % Workflow { } } iex> create_workflow ( %{ field : bad_value } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Workflows.html#create_workflow/1"},{"type":"function","title":"Lightning.Workflows.delete_workflow/1","doc":"Deletes a workflow. Examples iex> delete_workflow ( workflow ) { :ok , % Workflow { } } iex> delete_workflow ( workflow ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Workflows.html#delete_workflow/1"},{"type":"function","title":"Lightning.Workflows.get_edge_by_webhook/1","doc":"Gets a Single Edge by it's webhook trigger.","ref":"Lightning.Workflows.html#get_edge_by_webhook/1"},{"type":"function","title":"Lightning.Workflows.get_edges_for_cron_execution/1","doc":"Returns a list of edges with jobs to execute, given a current timestamp in Unix. This is used by the scheduler, which calls this function once every minute.","ref":"Lightning.Workflows.html#get_edges_for_cron_execution/1"},{"type":"function","title":"Lightning.Workflows.get_workflow/1","doc":"","ref":"Lightning.Workflows.html#get_workflow/1"},{"type":"function","title":"Lightning.Workflows.get_workflow!/1","doc":"Gets a single workflow. Raises Ecto.NoResultsError if the Workflow does not exist. Examples iex> get_workflow! ( 123 ) % Workflow { } iex> get_workflow! ( 456 ) ** (Ecto.NoResultsError)","ref":"Lightning.Workflows.html#get_workflow!/1"},{"type":"function","title":"Lightning.Workflows.get_workflows_for/1","doc":"Retrieves a list of Workflows with their jobs and triggers preloaded.","ref":"Lightning.Workflows.html#get_workflows_for/1"},{"type":"function","title":"Lightning.Workflows.get_workflows_for_query/1","doc":"","ref":"Lightning.Workflows.html#get_workflows_for_query/1"},{"type":"function","title":"Lightning.Workflows.list_workflows/0","doc":"Returns the list of workflows. Examples iex> list_workflows ( ) [ % Workflow { } , ... ]","ref":"Lightning.Workflows.html#list_workflows/0"},{"type":"function","title":"Lightning.Workflows.mark_for_deletion/2","doc":"Returns an %Ecto.Changeset{} for changing the workflow request_deletion. Examples iex> change_request_deletion ( workflow ) % Ecto.Changeset { data : % Workflow { } }","ref":"Lightning.Workflows.html#mark_for_deletion/2"},{"type":"function","title":"Lightning.Workflows.to_project_space/1","doc":"","ref":"Lightning.Workflows.html#to_project_space/1"},{"type":"function","title":"Lightning.Workflows.update_trigger/2","doc":"Updates a trigger","ref":"Lightning.Workflows.html#update_trigger/2"},{"type":"function","title":"Lightning.Workflows.update_workflow/2","doc":"Updates a workflow. Examples iex> update_workflow ( workflow , %{ field : new_value } ) { :ok , % Workflow { } } iex> update_workflow ( workflow , %{ field : bad_value } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Workflows.html#update_workflow/2"},{"type":"module","title":"Lightning.Workflows.Edge","doc":"Ecto model for Workflow Edges. A Workflow Edge represents a connection between two jobs (or a trigger and a job) in a workflow. The source of the edge is either a job or a trigger. The target of the edge is always a job.","ref":"Lightning.Workflows.Edge.html"},{"type":"function","title":"Lightning.Workflows.Edge.changeset/2","doc":"","ref":"Lightning.Workflows.Edge.html#changeset/2"},{"type":"function","title":"Lightning.Workflows.Edge.new/1","doc":"","ref":"Lightning.Workflows.Edge.html#new/1"},{"type":"function","title":"Lightning.Workflows.Edge.validate/1","doc":"","ref":"Lightning.Workflows.Edge.html#validate/1"},{"type":"type","title":"Lightning.Workflows.Edge.edge_condition/0","doc":"","ref":"Lightning.Workflows.Edge.html#t:edge_condition/0"},{"type":"type","title":"Lightning.Workflows.Edge.t/0","doc":"","ref":"Lightning.Workflows.Edge.html#t:t/0"},{"type":"module","title":"Lightning.Workflows.Graph","doc":"Utility to construct and manipulate a graph/plan made out of Jobs","ref":"Lightning.Workflows.Graph.html"},{"type":"function","title":"Lightning.Workflows.Graph.new/1","doc":"","ref":"Lightning.Workflows.Graph.html#new/1"},{"type":"function","title":"Lightning.Workflows.Graph.remove/2","doc":"","ref":"Lightning.Workflows.Graph.html#remove/2"},{"type":"function","title":"Lightning.Workflows.Graph.vertices/1","doc":"","ref":"Lightning.Workflows.Graph.html#vertices/1"},{"type":"type","title":"Lightning.Workflows.Graph.t/0","doc":"","ref":"Lightning.Workflows.Graph.html#t:t/0"},{"type":"type","title":"Lightning.Workflows.Graph.vertex/0","doc":"","ref":"Lightning.Workflows.Graph.html#t:vertex/0"},{"type":"module","title":"Lightning.Workflows.Workflow","doc":"Ecto model for Workflows. A Workflow contains the fields for defining a workflow. name A plain text identifier","ref":"Lightning.Workflows.Workflow.html"},{"type":"function","title":"Lightning.Workflows.Workflow.request_deletion_changeset/2","doc":"","ref":"Lightning.Workflows.Workflow.html#request_deletion_changeset/2"},{"type":"function","title":"Lightning.Workflows.Workflow.validate/1","doc":"","ref":"Lightning.Workflows.Workflow.html#validate/1"},{"type":"type","title":"Lightning.Workflows.Workflow.t/0","doc":"","ref":"Lightning.Workflows.Workflow.html#t:t/0"},{"type":"module","title":"Lightning.Workorders.SearchParams","doc":"This module is used to parse search parameters for workorders and provide a query to the database.","ref":"Lightning.Workorders.SearchParams.html"},{"type":"function","title":"Lightning.Workorders.SearchParams.new/1","doc":"","ref":"Lightning.Workorders.SearchParams.html#new/1"},{"type":"function","title":"Lightning.Workorders.SearchParams.to_uri_params/1","doc":"","ref":"Lightning.Workorders.SearchParams.html#to_uri_params/1"},{"type":"type","title":"Lightning.Workorders.SearchParams.t/0","doc":"","ref":"Lightning.Workorders.SearchParams.html#t:t/0"},{"type":"module","title":"LightningWeb","doc":"The entrypoint for defining your web interface, such as controllers, views, channels and so on. This can be used in your application as: use LightningWeb , :controller use LightningWeb , :view The definitions below will be executed for every view, controller, etc, so keep them short and clean, focused on imports, uses and aliases. Do NOT define functions inside the quoted expressions below. Instead, define any helper function in modules and import those modules here.","ref":"LightningWeb.html"},{"type":"macro","title":"LightningWeb.__using__/1","doc":"When used, dispatch to the appropriate controller/view/etc.","ref":"LightningWeb.html#__using__/1"},{"type":"function","title":"LightningWeb.channel/0","doc":"","ref":"LightningWeb.html#channel/0"},{"type":"function","title":"LightningWeb.component/0","doc":"","ref":"LightningWeb.html#component/0"},{"type":"function","title":"LightningWeb.controller/0","doc":"","ref":"LightningWeb.html#controller/0"},{"type":"function","title":"LightningWeb.html/0","doc":"","ref":"LightningWeb.html#html/0"},{"type":"function","title":"LightningWeb.live_component/0","doc":"","ref":"LightningWeb.html#live_component/0"},{"type":"function","title":"LightningWeb.live_view/1","doc":"","ref":"LightningWeb.html#live_view/1"},{"type":"function","title":"LightningWeb.router/0","doc":"","ref":"LightningWeb.html#router/0"},{"type":"function","title":"LightningWeb.static_paths/0","doc":"","ref":"LightningWeb.html#static_paths/0"},{"type":"function","title":"LightningWeb.verified_routes/0","doc":"","ref":"LightningWeb.html#verified_routes/0"},{"type":"function","title":"LightningWeb.view/0","doc":"","ref":"LightningWeb.html#view/0"},{"type":"module","title":"LightningWeb.API.Helpers","doc":"Helpers for the API views","ref":"LightningWeb.API.Helpers.html"},{"type":"function","title":"LightningWeb.API.Helpers.pagination_link/3","doc":"","ref":"LightningWeb.API.Helpers.html#pagination_link/3"},{"type":"function","title":"LightningWeb.API.Helpers.pagination_links/2","doc":"","ref":"LightningWeb.API.Helpers.html#pagination_links/2"},{"type":"function","title":"LightningWeb.API.Helpers.url_for/2","doc":"","ref":"LightningWeb.API.Helpers.html#url_for/2"},{"type":"module","title":"LightningWeb.API.JobController","doc":"","ref":"LightningWeb.API.JobController.html"},{"type":"function","title":"LightningWeb.API.JobController.index/2","doc":"","ref":"LightningWeb.API.JobController.html#index/2"},{"type":"function","title":"LightningWeb.API.JobController.show/2","doc":"","ref":"LightningWeb.API.JobController.html#show/2"},{"type":"module","title":"LightningWeb.API.ProjectController","doc":"","ref":"LightningWeb.API.ProjectController.html"},{"type":"function","title":"LightningWeb.API.ProjectController.index/2","doc":"","ref":"LightningWeb.API.ProjectController.html#index/2"},{"type":"function","title":"LightningWeb.API.ProjectController.show/2","doc":"","ref":"LightningWeb.API.ProjectController.html#show/2"},{"type":"module","title":"LightningWeb.API.ProvisioningController","doc":"","ref":"LightningWeb.API.ProvisioningController.html"},{"type":"function","title":"LightningWeb.API.ProvisioningController.create/2","doc":"Creates or updates a project based on a JSON payload that may or may not contain UUIDs for existing resources.","ref":"LightningWeb.API.ProvisioningController.html#create/2"},{"type":"function","title":"LightningWeb.API.ProvisioningController.show/2","doc":"Returns a project "state.json", complete with UUIDs to enable idempotent project deployments and updates to existing projects via the CLI.","ref":"LightningWeb.API.ProvisioningController.html#show/2"},{"type":"function","title":"LightningWeb.API.ProvisioningController.show_yaml/2","doc":"Returns a description of the project as yaml. Same as the export project to yaml button (see Downloads Controller) but made for the API.","ref":"LightningWeb.API.ProvisioningController.html#show_yaml/2"},{"type":"module","title":"LightningWeb.API.RunController","doc":"","ref":"LightningWeb.API.RunController.html"},{"type":"function","title":"LightningWeb.API.RunController.index/2","doc":"","ref":"LightningWeb.API.RunController.html#index/2"},{"type":"function","title":"LightningWeb.API.RunController.show/2","doc":"","ref":"LightningWeb.API.RunController.html#show/2"},{"type":"module","title":"LightningWeb.AuditLive.Index","doc":"LiveView for listing Audit events","ref":"LightningWeb.AuditLive.Index.html"},{"type":"function","title":"LightningWeb.AuditLive.Index.diff/1","doc":"","ref":"LightningWeb.AuditLive.Index.html#diff/1"},{"type":"function","title":"LightningWeb.AuditLive.Index.render/1","doc":"Callback implementation for Phoenix.LiveView.render/1 .","ref":"LightningWeb.AuditLive.Index.html#render/1"},{"type":"module","title":"LightningWeb.AuthProvidersLive.FormComponent","doc":"Form Component for working with a single Job A Job's adaptor field is a combination of the module name and the version. It's formatted as an NPM style string. The form allows the user to select a module by name and then it's version, while the version dropdown itself references adaptor directly. Meaning the adaptor_name dropdown and assigns value is not persisted.","ref":"LightningWeb.AuthProvidersLive.FormComponent.html"},{"type":"module","title":"LightningWeb.AuthProvidersLive.Index","doc":"LiveView for listing and managing Projects","ref":"LightningWeb.AuthProvidersLive.Index.html"},{"type":"module","title":"LightningWeb.BackupCodesController","doc":"","ref":"LightningWeb.BackupCodesController.html"},{"type":"function","title":"LightningWeb.BackupCodesController.print/2","doc":"","ref":"LightningWeb.BackupCodesController.html#print/2"},{"type":"module","title":"LightningWeb.BackupCodesLive.Index","doc":"LiveView for user backup codes.","ref":"LightningWeb.BackupCodesLive.Index.html"},{"type":"function","title":"LightningWeb.BackupCodesLive.Index.render/1","doc":"Callback implementation for Phoenix.LiveView.render/1 .","ref":"LightningWeb.BackupCodesLive.Index.html#render/1"},{"type":"module","title":"LightningWeb.ChangesetJSON","doc":"Renders changesets as JSON.","ref":"LightningWeb.ChangesetJSON.html"},{"type":"function","title":"LightningWeb.ChangesetJSON.error/1","doc":"","ref":"LightningWeb.ChangesetJSON.html#error/1"},{"type":"module","title":"LightningWeb.ChangesetView","doc":"","ref":"LightningWeb.ChangesetView.html"},{"type":"function","title":"LightningWeb.ChangesetView.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"LightningWeb.ChangesetView.html#__resource__/0"},{"type":"function","title":"LightningWeb.ChangesetView.render/2","doc":"Renders the given template locally.","ref":"LightningWeb.ChangesetView.html#render/2"},{"type":"function","title":"LightningWeb.ChangesetView.template_not_found/2","doc":"Callback invoked when no template is found. By default it raises but can be customized to render a particular template.","ref":"LightningWeb.ChangesetView.html#template_not_found/2"},{"type":"function","title":"LightningWeb.ChangesetView.translate_errors/1","doc":"Traverses and translates changeset errors. See Ecto.Changeset.traverse_errors/2 and LightningWeb.ErrorHelpers.translate_error/1 for more details.","ref":"LightningWeb.ChangesetView.html#translate_errors/1"},{"type":"module","title":"LightningWeb.Components.Modal","doc":"A modal component that can be used to display a modal on the page. This currently isn't used anywhere but should be used in the future to replace the existing modal implementations.","ref":"LightningWeb.Components.Modal.html"},{"type":"module","title":"LightningWeb.CredentialLive.Edit","doc":"LiveView for editing a single Credential, which inturn uses LightningWeb.CredentialLive.FormComponent for common functionality.","ref":"LightningWeb.CredentialLive.Edit.html"},{"type":"function","title":"LightningWeb.CredentialLive.Edit.handle_info/2","doc":"A generic handler for forwarding updates from PubSub","ref":"LightningWeb.CredentialLive.Edit.html#handle_info/2"},{"type":"module","title":"LightningWeb.CredentialLive.FormComponent","doc":"Form Component for working with a single Credential","ref":"LightningWeb.CredentialLive.FormComponent.html"},{"type":"function","title":"LightningWeb.CredentialLive.FormComponent.credential_transfer/1","doc":"Attributes users ( :list ) (required) form ( :map ) (required)","ref":"LightningWeb.CredentialLive.FormComponent.html#credential_transfer/1"},{"type":"function","title":"LightningWeb.CredentialLive.FormComponent.form_component/1","doc":"Switcher components for different types of credentials. Attributes type ( :string ) (required) form ( :map ) (required) update_body ( :any ) Slots inner_block","ref":"LightningWeb.CredentialLive.FormComponent.html#form_component/1"},{"type":"function","title":"LightningWeb.CredentialLive.FormComponent.project_credentials/1","doc":"Attributes form ( :map ) (required) projects ( :list ) (required) selected ( :map ) (required) phx_target ( :any ) - Defaults to nil .","ref":"LightningWeb.CredentialLive.FormComponent.html#project_credentials/1"},{"type":"module","title":"LightningWeb.CredentialLive.GoogleSheetsComponent","doc":"Form component to setup a Google Sheets component. This component has several moving parts: Subscribes to a PubSub topic specially link to the component id See: LightningWeb.OauthCredentialHelper . Uses the Lightning.Google module to set up an OAuth client for generating urls, exchanging the code and requesting a new access_token . The flow for creating a new token is: Generate an authorization link which contains: The authorization url from the Google client with the applications callback_url A state string that is an encrypted set of data with the components module and id in it Once the user authorizes the client the callback is requested with a code The LightningWeb.OidcController decodes the state returned to it and does a 'broadcast_forward' which is simply a message expected to be received by a LiveView and applied to Phoenix.LiveView.send_update/3 . The component receives the code and requests a token. Any changes to the token (Credential body) are still handled by the parent component and so a update_body function is passed in to send params changes back up to update the form.","ref":"LightningWeb.CredentialLive.GoogleSheetsComponent.html"},{"type":"function","title":"LightningWeb.CredentialLive.GoogleSheetsComponent.authorize_button/1","doc":"","ref":"LightningWeb.CredentialLive.GoogleSheetsComponent.html#authorize_button/1"},{"type":"function","title":"LightningWeb.CredentialLive.GoogleSheetsComponent.disabled_authorize_button/1","doc":"","ref":"LightningWeb.CredentialLive.GoogleSheetsComponent.html#disabled_authorize_button/1"},{"type":"function","title":"LightningWeb.CredentialLive.GoogleSheetsComponent.error_block/1","doc":"","ref":"LightningWeb.CredentialLive.GoogleSheetsComponent.html#error_block/1"},{"type":"function","title":"LightningWeb.CredentialLive.GoogleSheetsComponent.fieldset/1","doc":"Attributes form ( :map ) (required) update_body ( :any ) (required) Slots inner_block","ref":"LightningWeb.CredentialLive.GoogleSheetsComponent.html#fieldset/1"},{"type":"function","title":"LightningWeb.CredentialLive.GoogleSheetsComponent.userinfo/1","doc":"","ref":"LightningWeb.CredentialLive.GoogleSheetsComponent.html#userinfo/1"},{"type":"module","title":"LightningWeb.CredentialLive.Index","doc":"LiveView for listing and managing credentials","ref":"LightningWeb.CredentialLive.Index.html"},{"type":"function","title":"LightningWeb.CredentialLive.Index.render/1","doc":"Callback implementation for Phoenix.LiveView.render/1 .","ref":"LightningWeb.CredentialLive.Index.html#render/1"},{"type":"module","title":"LightningWeb.CredentialLive.JsonSchemaBodyComponent","doc":"","ref":"LightningWeb.CredentialLive.JsonSchemaBodyComponent.html"},{"type":"function","title":"LightningWeb.CredentialLive.JsonSchemaBodyComponent.fieldset/1","doc":"Attributes form ( :map ) (required) Slots inner_block","ref":"LightningWeb.CredentialLive.JsonSchemaBodyComponent.html#fieldset/1"},{"type":"function","title":"LightningWeb.CredentialLive.JsonSchemaBodyComponent.schema_input/1","doc":"Attributes form ( :map ) (required) schema ( :map ) (required) field ( :any ) (required)","ref":"LightningWeb.CredentialLive.JsonSchemaBodyComponent.html#schema_input/1"},{"type":"module","title":"LightningWeb.CredentialLive.RawBodyComponent","doc":"","ref":"LightningWeb.CredentialLive.RawBodyComponent.html"},{"type":"function","title":"LightningWeb.CredentialLive.RawBodyComponent.fieldset/1","doc":"Attributes form ( :map ) (required) Slots inner_block","ref":"LightningWeb.CredentialLive.RawBodyComponent.html#fieldset/1"},{"type":"module","title":"LightningWeb.CredentialLive.TypePicker","doc":"","ref":"LightningWeb.CredentialLive.TypePicker.html"},{"type":"module","title":"LightningWeb.DataclipLive.Edit","doc":"LiveView for editing a single dataclip.","ref":"LightningWeb.DataclipLive.Edit.html"},{"type":"function","title":"LightningWeb.DataclipLive.Edit.render/1","doc":"Callback implementation for Phoenix.LiveView.render/1 .","ref":"LightningWeb.DataclipLive.Edit.html#render/1"},{"type":"module","title":"LightningWeb.DataclipLive.FormComponent","doc":"Form Component for working with a single dataclip","ref":"LightningWeb.DataclipLive.FormComponent.html"},{"type":"function","title":"LightningWeb.DataclipLive.FormComponent.render/1","doc":"Callback implementation for Phoenix.LiveComponent.render/1 .","ref":"LightningWeb.DataclipLive.FormComponent.html#render/1"},{"type":"module","title":"LightningWeb.DataclipLive.Index","doc":"LiveView for listing and working with a list of Dataclips","ref":"LightningWeb.DataclipLive.Index.html"},{"type":"function","title":"LightningWeb.DataclipLive.Index.render/1","doc":"Callback implementation for Phoenix.LiveView.render/1 .","ref":"LightningWeb.DataclipLive.Index.html#render/1"},{"type":"module","title":"LightningWeb.DownloadsController","doc":"","ref":"LightningWeb.DownloadsController.html"},{"type":"function","title":"LightningWeb.DownloadsController.download_project_yaml/2","doc":"","ref":"LightningWeb.DownloadsController.html#download_project_yaml/2"},{"type":"module","title":"LightningWeb.Endpoint","doc":"","ref":"LightningWeb.Endpoint.html"},{"type":"function","title":"LightningWeb.Endpoint.broadcast/3","doc":"Callback implementation for Phoenix.Endpoint.broadcast/3 .","ref":"LightningWeb.Endpoint.html#broadcast/3"},{"type":"function","title":"LightningWeb.Endpoint.broadcast!/3","doc":"Callback implementation for Phoenix.Endpoint.broadcast!/3 .","ref":"LightningWeb.Endpoint.html#broadcast!/3"},{"type":"function","title":"LightningWeb.Endpoint.broadcast_from/4","doc":"Callback implementation for Phoenix.Endpoint.broadcast_from/4 .","ref":"LightningWeb.Endpoint.html#broadcast_from/4"},{"type":"function","title":"LightningWeb.Endpoint.broadcast_from!/4","doc":"Callback implementation for Phoenix.Endpoint.broadcast_from!/4 .","ref":"LightningWeb.Endpoint.html#broadcast_from!/4"},{"type":"function","title":"LightningWeb.Endpoint.call/2","doc":"Callback implementation for Plug.call/2 .","ref":"LightningWeb.Endpoint.html#call/2"},{"type":"function","title":"LightningWeb.Endpoint.child_spec/1","doc":"Returns the child specification to start the endpoint under a supervision tree.","ref":"LightningWeb.Endpoint.html#child_spec/1"},{"type":"function","title":"LightningWeb.Endpoint.config/2","doc":"Returns the endpoint configuration for key Returns default if the key does not exist.","ref":"LightningWeb.Endpoint.html#config/2"},{"type":"function","title":"LightningWeb.Endpoint.config_change/2","doc":"Reloads the configuration given the application environment changes.","ref":"LightningWeb.Endpoint.html#config_change/2"},{"type":"function","title":"LightningWeb.Endpoint.host/0","doc":"Returns the host for the given endpoint.","ref":"LightningWeb.Endpoint.html#host/0"},{"type":"function","title":"LightningWeb.Endpoint.init/1","doc":"Callback implementation for Plug.init/1 .","ref":"LightningWeb.Endpoint.html#init/1"},{"type":"function","title":"LightningWeb.Endpoint.local_broadcast/3","doc":"Callback implementation for Phoenix.Endpoint.local_broadcast/3 .","ref":"LightningWeb.Endpoint.html#local_broadcast/3"},{"type":"function","title":"LightningWeb.Endpoint.local_broadcast_from/4","doc":"Callback implementation for Phoenix.Endpoint.local_broadcast_from/4 .","ref":"LightningWeb.Endpoint.html#local_broadcast_from/4"},{"type":"function","title":"LightningWeb.Endpoint.path/1","doc":"Generates the path information when routing to this endpoint.","ref":"LightningWeb.Endpoint.html#path/1"},{"type":"function","title":"LightningWeb.Endpoint.script_name/0","doc":"Generates the script name.","ref":"LightningWeb.Endpoint.html#script_name/0"},{"type":"function","title":"LightningWeb.Endpoint.start_link/1","doc":"Starts the endpoint supervision tree. All other options are merged into the endpoint configuration.","ref":"LightningWeb.Endpoint.html#start_link/1"},{"type":"function","title":"LightningWeb.Endpoint.static_integrity/1","doc":"Generates a base64-encoded cryptographic hash (sha512) to a static file in priv/static . Meant to be used for Subresource Integrity with CDNs.","ref":"LightningWeb.Endpoint.html#static_integrity/1"},{"type":"function","title":"LightningWeb.Endpoint.static_lookup/1","doc":"Returns a two item tuple with the first item being the static_path and the second item being the static_integrity .","ref":"LightningWeb.Endpoint.html#static_lookup/1"},{"type":"function","title":"LightningWeb.Endpoint.static_path/1","doc":"Generates a route to a static file in priv/static .","ref":"LightningWeb.Endpoint.html#static_path/1"},{"type":"function","title":"LightningWeb.Endpoint.static_url/0","doc":"Generates the static URL without any path information. It uses the configuration under :static_url to generate such. It falls back to :url if :static_url is not set.","ref":"LightningWeb.Endpoint.html#static_url/0"},{"type":"function","title":"LightningWeb.Endpoint.struct_url/0","doc":"Generates the endpoint base URL but as a URI struct. It uses the configuration under :url to generate such. Useful for manipulating the URL data and passing it to URL helpers.","ref":"LightningWeb.Endpoint.html#struct_url/0"},{"type":"function","title":"LightningWeb.Endpoint.subscribe/2","doc":"Callback implementation for Phoenix.Endpoint.subscribe/2 .","ref":"LightningWeb.Endpoint.html#subscribe/2"},{"type":"function","title":"LightningWeb.Endpoint.unsubscribe/1","doc":"Callback implementation for Phoenix.Endpoint.unsubscribe/1 .","ref":"LightningWeb.Endpoint.html#unsubscribe/1"},{"type":"function","title":"LightningWeb.Endpoint.url/0","doc":"Generates the endpoint base URL without any path information. It uses the configuration under :url to generate such.","ref":"LightningWeb.Endpoint.html#url/0"},{"type":"module","title":"LightningWeb.ErrorView","doc":"","ref":"LightningWeb.ErrorView.html"},{"type":"function","title":"LightningWeb.ErrorView.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"LightningWeb.ErrorView.html#__resource__/0"},{"type":"function","title":"LightningWeb.ErrorView.render/2","doc":"Renders the given template locally.","ref":"LightningWeb.ErrorView.html#render/2"},{"type":"function","title":"LightningWeb.ErrorView.template_not_found/2","doc":"Callback invoked when no template is found. By default it raises but can be customized to render a particular template.","ref":"LightningWeb.ErrorView.html#template_not_found/2"},{"type":"module","title":"LightningWeb.FallbackController","doc":"Translates controller action results into valid Plug.Conn responses. See Phoenix.Controller.action_fallback/1 for more details.","ref":"LightningWeb.FallbackController.html"},{"type":"module","title":"LightningWeb.FirstSetupLive.Superuser","doc":"Superuser setup liveview Allows the creation on the first user in the system. It has only one action: :show","ref":"LightningWeb.FirstSetupLive.Superuser.html"},{"type":"function","title":"LightningWeb.FirstSetupLive.Superuser.render/1","doc":"Callback implementation for Phoenix.LiveView.render/1 .","ref":"LightningWeb.FirstSetupLive.Superuser.html#render/1"},{"type":"module","title":"LightningWeb.FormHelpers","doc":"Conveniences for building forms.","ref":"LightningWeb.FormHelpers.html"},{"type":"module","title":"LightningWeb.Gettext","doc":"A module providing Internationalization with a gettext-based API. By using Gettext , your module gains a set of macros for translations, for example: import LightningWeb.Gettext # Simple translation gettext ( "Here is the string to translate" ) # Plural translation ngettext ( "Here is the string to translate" , "Here are the strings to translate" , 3 ) # Domain-based translation dgettext ( "errors" , "Here is the error message to translate" ) See the Gettext Docs for detailed usage.","ref":"LightningWeb.Gettext.html"},{"type":"macro","title":"LightningWeb.Gettext.dgettext/3","doc":"Callback implementation for Gettext.Backend.dgettext/3 .","ref":"LightningWeb.Gettext.html#dgettext/3"},{"type":"macro","title":"LightningWeb.Gettext.dgettext_noop/2","doc":"Callback implementation for Gettext.Backend.dgettext_noop/2 .","ref":"LightningWeb.Gettext.html#dgettext_noop/2"},{"type":"macro","title":"LightningWeb.Gettext.dngettext/5","doc":"Callback implementation for Gettext.Backend.dngettext/5 .","ref":"LightningWeb.Gettext.html#dngettext/5"},{"type":"macro","title":"LightningWeb.Gettext.dngettext_noop/3","doc":"Callback implementation for Gettext.Backend.dngettext_noop/3 .","ref":"LightningWeb.Gettext.html#dngettext_noop/3"},{"type":"macro","title":"LightningWeb.Gettext.dpgettext/4","doc":"Callback implementation for Gettext.Backend.dpgettext/4 .","ref":"LightningWeb.Gettext.html#dpgettext/4"},{"type":"macro","title":"LightningWeb.Gettext.dpgettext_noop/3","doc":"","ref":"LightningWeb.Gettext.html#dpgettext_noop/3"},{"type":"macro","title":"LightningWeb.Gettext.dpngettext/6","doc":"Callback implementation for Gettext.Backend.dpngettext/6 .","ref":"LightningWeb.Gettext.html#dpngettext/6"},{"type":"macro","title":"LightningWeb.Gettext.dpngettext_noop/4","doc":"","ref":"LightningWeb.Gettext.html#dpngettext_noop/4"},{"type":"macro","title":"LightningWeb.Gettext.gettext/2","doc":"Callback implementation for Gettext.Backend.gettext/2 .","ref":"LightningWeb.Gettext.html#gettext/2"},{"type":"macro","title":"LightningWeb.Gettext.gettext_comment/1","doc":"Callback implementation for Gettext.Backend.gettext_comment/1 .","ref":"LightningWeb.Gettext.html#gettext_comment/1"},{"type":"macro","title":"LightningWeb.Gettext.gettext_noop/1","doc":"Callback implementation for Gettext.Backend.gettext_noop/1 .","ref":"LightningWeb.Gettext.html#gettext_noop/1"},{"type":"function","title":"LightningWeb.Gettext.handle_missing_bindings/2","doc":"Callback implementation for Gettext.Backend.handle_missing_bindings/2 .","ref":"LightningWeb.Gettext.html#handle_missing_bindings/2"},{"type":"function","title":"LightningWeb.Gettext.handle_missing_plural_translation/7","doc":"Callback implementation for Gettext.Backend.handle_missing_plural_translation/7 .","ref":"LightningWeb.Gettext.html#handle_missing_plural_translation/7"},{"type":"function","title":"LightningWeb.Gettext.handle_missing_translation/5","doc":"Callback implementation for Gettext.Backend.handle_missing_translation/5 .","ref":"LightningWeb.Gettext.html#handle_missing_translation/5"},{"type":"function","title":"LightningWeb.Gettext.lgettext/5","doc":"","ref":"LightningWeb.Gettext.html#lgettext/5"},{"type":"function","title":"LightningWeb.Gettext.lngettext/7","doc":"","ref":"LightningWeb.Gettext.html#lngettext/7"},{"type":"macro","title":"LightningWeb.Gettext.ngettext/4","doc":"Callback implementation for Gettext.Backend.ngettext/4 .","ref":"LightningWeb.Gettext.html#ngettext/4"},{"type":"macro","title":"LightningWeb.Gettext.ngettext_noop/2","doc":"Callback implementation for Gettext.Backend.ngettext_noop/2 .","ref":"LightningWeb.Gettext.html#ngettext_noop/2"},{"type":"macro","title":"LightningWeb.Gettext.pgettext/3","doc":"Callback implementation for Gettext.Backend.pgettext/3 .","ref":"LightningWeb.Gettext.html#pgettext/3"},{"type":"macro","title":"LightningWeb.Gettext.pgettext_noop/2","doc":"","ref":"LightningWeb.Gettext.html#pgettext_noop/2"},{"type":"macro","title":"LightningWeb.Gettext.pngettext/5","doc":"Callback implementation for Gettext.Backend.pngettext/5 .","ref":"LightningWeb.Gettext.html#pngettext/5"},{"type":"macro","title":"LightningWeb.Gettext.pngettext_noop/3","doc":"","ref":"LightningWeb.Gettext.html#pngettext_noop/3"},{"type":"module","title":"LightningWeb.HealthCheck","doc":"","ref":"LightningWeb.HealthCheck.html"},{"type":"function","title":"LightningWeb.HealthCheck.call/2","doc":"Callback implementation for Plug.call/2 .","ref":"LightningWeb.HealthCheck.html#call/2"},{"type":"function","title":"LightningWeb.HealthCheck.init/1","doc":"Callback implementation for Plug.init/1 .","ref":"LightningWeb.HealthCheck.html#init/1"},{"type":"module","title":"LightningWeb.Hooks","doc":"LiveView Hooks","ref":"LightningWeb.Hooks.html"},{"type":"function","title":"LightningWeb.Hooks.on_mount/4","doc":"Finds and assigns a project to the socket, if a user doesn't have access they are redirected and shown a 'No Access' screen via a :nav flash message. There is a fallthru function, when there is no project_id in the params - this is for liveviews that may or may not have a project_id depending on usage - like DashboardLive .","ref":"LightningWeb.Hooks.html#on_mount/4"},{"type":"module","title":"LightningWeb.InitAssigns","doc":"Ensures common assigns are applied to all LiveViews attaching this hook.","ref":"LightningWeb.InitAssigns.html"},{"type":"function","title":"LightningWeb.InitAssigns.on_mount/4","doc":"","ref":"LightningWeb.InitAssigns.html#on_mount/4"},{"type":"module","title":"LightningWeb.JobLive.AdaptorPicker","doc":"Component allowing selecting an adaptor and it's version","ref":"LightningWeb.JobLive.AdaptorPicker.html"},{"type":"function","title":"LightningWeb.JobLive.AdaptorPicker.display_name_for_adaptor/1","doc":"Converts standard adaptor names into "label","value" lists and returns non-standard names as merely "value"; both can be passed directly into a select option list.","ref":"LightningWeb.JobLive.AdaptorPicker.html#display_name_for_adaptor/1"},{"type":"function","title":"LightningWeb.JobLive.AdaptorPicker.get_adaptor_version_options/1","doc":"","ref":"LightningWeb.JobLive.AdaptorPicker.html#get_adaptor_version_options/1"},{"type":"function","title":"LightningWeb.JobLive.AdaptorPicker.render/1","doc":"Attributes form ( :map ) (required) on_change ( :any ) - Defaults to nil . disabled ( :boolean ) - Defaults to false .","ref":"LightningWeb.JobLive.AdaptorPicker.html#render/1"},{"type":"module","title":"LightningWeb.JobLive.CredentialPicker","doc":"Component allowing selecting a credential or creating a new one via a modal.","ref":"LightningWeb.JobLive.CredentialPicker.html"},{"type":"function","title":"LightningWeb.JobLive.CredentialPicker.render/1","doc":"Attributes form ( :map ) (required) disabled ( :boolean ) - Defaults to false . credentials ( :list ) (required) on_change ( :any ) - Defaults to nil .","ref":"LightningWeb.JobLive.CredentialPicker.html#render/1"},{"type":"module","title":"LightningWeb.JobLive.CronSetupComponent","doc":"A live component for managing cron setup in a form. The CronSetupComponent provides an interactive form for configuring cron settings. It includes fields for specifying the frequency, minute, hour, weekday, monthday, and cron expression. Usage Include the CronSetupComponent in your live view or template. Pass the necessary assigns to the component, such as form , on_change , and disabled . Handle the cron_expression_change event to capture changes in the form inputs. Use the updated cron_expression in your application logic.","ref":"LightningWeb.JobLive.CronSetupComponent.html"},{"type":"function","title":"LightningWeb.JobLive.CronSetupComponent.build_cron_expression/2","doc":"","ref":"LightningWeb.JobLive.CronSetupComponent.html#build_cron_expression/2"},{"type":"function","title":"LightningWeb.JobLive.CronSetupComponent.frequency_field/1","doc":"","ref":"LightningWeb.JobLive.CronSetupComponent.html#frequency_field/1"},{"type":"function","title":"LightningWeb.JobLive.CronSetupComponent.get_cron_data/1","doc":"","ref":"LightningWeb.JobLive.CronSetupComponent.html#get_cron_data/1"},{"type":"function","title":"LightningWeb.JobLive.CronSetupComponent.hour_field/1","doc":"","ref":"LightningWeb.JobLive.CronSetupComponent.html#hour_field/1"},{"type":"function","title":"LightningWeb.JobLive.CronSetupComponent.minute_field/1","doc":"","ref":"LightningWeb.JobLive.CronSetupComponent.html#minute_field/1"},{"type":"function","title":"LightningWeb.JobLive.CronSetupComponent.monthday_field/1","doc":"","ref":"LightningWeb.JobLive.CronSetupComponent.html#monthday_field/1"},{"type":"function","title":"LightningWeb.JobLive.CronSetupComponent.render/1","doc":"Attributes id ( :string ) (required) form ( :map ) (required) on_change ( :any ) (required) disabled ( :boolean ) (required)","ref":"LightningWeb.JobLive.CronSetupComponent.html#render/1"},{"type":"function","title":"LightningWeb.JobLive.CronSetupComponent.time_field/1","doc":"","ref":"LightningWeb.JobLive.CronSetupComponent.html#time_field/1"},{"type":"function","title":"LightningWeb.JobLive.CronSetupComponent.weekday_field/1","doc":"","ref":"LightningWeb.JobLive.CronSetupComponent.html#weekday_field/1"},{"type":"module","title":"LightningWeb.JobLive.JobBuilder","doc":"Job Builder Panel","ref":"LightningWeb.JobLive.JobBuilder.html"},{"type":"function","title":"LightningWeb.JobLive.JobBuilder.delete_title/2","doc":"","ref":"LightningWeb.JobLive.JobBuilder.html#delete_title/2"},{"type":"function","title":"LightningWeb.JobLive.JobBuilder.follow_run/2","doc":"","ref":"LightningWeb.JobLive.JobBuilder.html#follow_run/2"},{"type":"function","title":"LightningWeb.JobLive.JobBuilder.render/1","doc":"Attributes return_to ( :string ) (required) params ( :map ) - Defaults to %{} . can_edit_job ( :boolean ) (required) can_run_job ( :boolean ) (required)","ref":"LightningWeb.JobLive.JobBuilder.html#render/1"},{"type":"function","title":"LightningWeb.JobLive.JobBuilder.send_adaptor/2","doc":"","ref":"LightningWeb.JobLive.JobBuilder.html#send_adaptor/2"},{"type":"function","title":"LightningWeb.JobLive.JobBuilder.send_credential/2","doc":"","ref":"LightningWeb.JobLive.JobBuilder.html#send_credential/2"},{"type":"function","title":"LightningWeb.JobLive.JobBuilder.update_cron_expression/2","doc":"","ref":"LightningWeb.JobLive.JobBuilder.html#update_cron_expression/2"},{"type":"module","title":"LightningWeb.JobLive.JobBuilderComponents","doc":"","ref":"LightningWeb.JobLive.JobBuilderComponents.html"},{"type":"function","title":"LightningWeb.JobLive.JobBuilderComponents.job_editor_component/1","doc":"Attributes adaptor ( :string ) (required) disabled ( :boolean ) - Defaults to false . source ( :string ) (required) change_event ( :string ) - Defaults to "job_body_changed" . Global attributes are accepted.","ref":"LightningWeb.JobLive.JobBuilderComponents.html#job_editor_component/1"},{"type":"function","title":"LightningWeb.JobLive.JobBuilderComponents.trigger_picker/1","doc":"Attributes form ( :map ) (required) upstream_jobs ( :list ) (required) on_cron_change ( :any ) (required) disabled ( :boolean ) - Defaults to true .","ref":"LightningWeb.JobLive.JobBuilderComponents.html#trigger_picker/1"},{"type":"function","title":"LightningWeb.JobLive.JobBuilderComponents.when_invalid/1","doc":"Attributes changeset ( :map ) (required) field ( :atom ) (required) Slots inner_block (required)","ref":"LightningWeb.JobLive.JobBuilderComponents.html#when_invalid/1"},{"type":"module","title":"LightningWeb.JobLive.ManualRunComponent","doc":"","ref":"LightningWeb.JobLive.ManualRunComponent.html"},{"type":"function","title":"LightningWeb.JobLive.ManualRunComponent.render/1","doc":"Attributes job ( :map ) (required) on_run ( :any ) (required) user ( :map ) (required) selected_dataclip_id ( :string ) (required)","ref":"LightningWeb.JobLive.ManualRunComponent.html#render/1"},{"type":"module","title":"LightningWeb.JobLive.ManualRunComponent.ManualWorkorder","doc":"","ref":"LightningWeb.JobLive.ManualRunComponent.ManualWorkorder.html"},{"type":"function","title":"LightningWeb.JobLive.ManualRunComponent.ManualWorkorder.changeset/2","doc":"","ref":"LightningWeb.JobLive.ManualRunComponent.ManualWorkorder.html#changeset/2"},{"type":"module","title":"LightningWeb.LiveHelpers","doc":"General purpose LiveView helper functions","ref":"LightningWeb.LiveHelpers.html"},{"type":"function","title":"LightningWeb.LiveHelpers.display_short_uuid/1","doc":"","ref":"LightningWeb.LiveHelpers.html#display_short_uuid/1"},{"type":"function","title":"LightningWeb.LiveHelpers.fade_in/1","doc":"","ref":"LightningWeb.LiveHelpers.html#fade_in/1"},{"type":"function","title":"LightningWeb.LiveHelpers.fade_out/1","doc":"","ref":"LightningWeb.LiveHelpers.html#fade_out/1"},{"type":"function","title":"LightningWeb.LiveHelpers.live_error_block/1","doc":"","ref":"LightningWeb.LiveHelpers.html#live_error_block/1"},{"type":"function","title":"LightningWeb.LiveHelpers.live_info_block/1","doc":"","ref":"LightningWeb.LiveHelpers.html#live_info_block/1"},{"type":"function","title":"LightningWeb.LiveHelpers.live_nav_block/1","doc":"","ref":"LightningWeb.LiveHelpers.html#live_nav_block/1"},{"type":"module","title":"LightningWeb.ModalPortal","doc":"Component for rendering content inside layout without full DOM patch.","ref":"LightningWeb.ModalPortal.html"},{"type":"function","title":"LightningWeb.ModalPortal.close_modal/0","doc":"","ref":"LightningWeb.ModalPortal.html#close_modal/0"},{"type":"function","title":"LightningWeb.ModalPortal.handle_event/3","doc":"Callback implementation for Phoenix.LiveComponent.handle_event/3 .","ref":"LightningWeb.ModalPortal.html#handle_event/3"},{"type":"function","title":"LightningWeb.ModalPortal.on_hide/2","doc":"","ref":"LightningWeb.ModalPortal.html#on_hide/2"},{"type":"function","title":"LightningWeb.ModalPortal.on_show/2","doc":"","ref":"LightningWeb.ModalPortal.html#on_show/2"},{"type":"function","title":"LightningWeb.ModalPortal.open_modal/2","doc":"","ref":"LightningWeb.ModalPortal.html#open_modal/2"},{"type":"function","title":"LightningWeb.ModalPortal.render/1","doc":"Callback implementation for Phoenix.LiveComponent.render/1 .","ref":"LightningWeb.ModalPortal.html#render/1"},{"type":"function","title":"LightningWeb.ModalPortal.update/2","doc":"Callback implementation for Phoenix.LiveComponent.update/2 .","ref":"LightningWeb.ModalPortal.html#update/2"},{"type":"module","title":"LightningWeb.OauthCredentialHelper","doc":"A set of helper functions to encodes state and coordinate OAuth callbacks back to a LiveView component.","ref":"LightningWeb.OauthCredentialHelper.html"},{"type":"function","title":"LightningWeb.OauthCredentialHelper.broadcast/2","doc":"","ref":"LightningWeb.OauthCredentialHelper.html#broadcast/2"},{"type":"function","title":"LightningWeb.OauthCredentialHelper.broadcast_forward/3","doc":"Broadcast a message specifically for forwarding a message to a component. It expects a subscription_id , the module of the component and opts being a keyword list containing an :id key of the specific component. See: Phoenix.LiveView.send_update/3 for more info. A corresponding LiveView (that is subscribed) is expected to have a matching handle_info/2 that looks like this: def handle_info ( { :forward , mod , opts } , socket ) do send_update ( mod , opts ) { :noreply , socket } end","ref":"LightningWeb.OauthCredentialHelper.html#broadcast_forward/3"},{"type":"function","title":"LightningWeb.OauthCredentialHelper.build_state/3","doc":"Encode and encrypt the callback data which will be sent so a provider as the state key in the request. The values are: subscription_id The same ID used to subscribe. The component module The LiveView component that is going to receive update The component id The ID of the component","ref":"LightningWeb.OauthCredentialHelper.html#build_state/3"},{"type":"function","title":"LightningWeb.OauthCredentialHelper.decode_state/1","doc":"","ref":"LightningWeb.OauthCredentialHelper.html#decode_state/1"},{"type":"function","title":"LightningWeb.OauthCredentialHelper.subscribe/1","doc":"Subscribe to the oauth_credential topic. It expects the a unique ID for the topic, usually the LiveView's socket.id .","ref":"LightningWeb.OauthCredentialHelper.html#subscribe/1"},{"type":"module","title":"LightningWeb.OidcController","doc":"","ref":"LightningWeb.OidcController.html"},{"type":"function","title":"LightningWeb.OidcController.new/2","doc":"Once the user has completed the authorization flow from above, they are returned here, and the authorization code is used to log them in.","ref":"LightningWeb.OidcController.html#new/2"},{"type":"function","title":"LightningWeb.OidcController.show/2","doc":"Given a known provider, redirect them to the authorize url on the provider","ref":"LightningWeb.OidcController.html#show/2"},{"type":"module","title":"LightningWeb.PageView","doc":"","ref":"LightningWeb.PageView.html"},{"type":"function","title":"LightningWeb.PageView.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"LightningWeb.PageView.html#__resource__/0"},{"type":"function","title":"LightningWeb.PageView.render/2","doc":"Renders the given template locally.","ref":"LightningWeb.PageView.html#render/2"},{"type":"function","title":"LightningWeb.PageView.template_not_found/2","doc":"Callback invoked when no template is found. By default it raises but can be customized to render a particular template.","ref":"LightningWeb.PageView.html#template_not_found/2"},{"type":"module","title":"LightningWeb.Pagination","doc":"Pagination Components This has been extracted and adapted from scrivener_html . See: https://github.com/mgwidmann/scrivener_html","ref":"LightningWeb.Pagination.html"},{"type":"function","title":"LightningWeb.Pagination.page_link/1","doc":"","ref":"LightningWeb.Pagination.html#page_link/1"},{"type":"function","title":"LightningWeb.Pagination.pagination_bar/1","doc":"","ref":"LightningWeb.Pagination.html#pagination_bar/1"},{"type":"function","title":"LightningWeb.Pagination.raw_pagination_links/2","doc":"Returns the raw data in order to generate the proper HTML for pagination links. Data is returned in a {text, page_number} format where text is intended to be the text of the link and page_number is the page it should go to. Defaults are already supplied and they are as follows: [ distance : 5 , next : :next , previous : :previous , first : true , last : true , ellipsis : :ellipsis ] distance must be a positive non-zero integer or an exception is raised. next and previous should be strings but can be anything you want as long as it is truthy, falsey values will remove them from the output. first and last are only booleans, and they just include/remove their respective link from output. An example of the data returned: iex> Scrivener.HTML . raw_pagination_links ( %{ total_pages : 10 , page_number : 5 } ) [ { "<<" , 4 } , { 1 , 1 } , { 2 , 2 } , { 3 , 3 } , { 4 , 4 } , { 5 , 5 } , { 6 , 6 } , { 7 , 7 } , { 8 , 8 } , { 9 , 9 } , { 10 , 10 } , { ">>" , 6 } ] iex> Scrivener.HTML . raw_pagination_links ( %{ total_pages : 20 , page_number : 10 } , first : [ "←" ] , last : [ "→" ] ) [ { "<<" , 9 } , { [ "←" ] , 1 } , { :ellipsis , { :safe , "&hellip;" } } , { 5 , 5 } , { 6 , 6 } , { 7 , 7 } , { 8 , 8 } , { 9 , 9 } , { 10 , 10 } , { 11 , 11 } , { 12 , 12 } , { 13 , 13 } , { 14 , 14 } , { 15 , 15 } , { :ellipsis , { :safe , "&hellip;" } } , { [ "→" ] , 20 } , { ">>" , 11 } ] Simply loop and pattern match over each item and transform it to your custom HTML.","ref":"LightningWeb.Pagination.html#raw_pagination_links/2"},{"type":"module","title":"LightningWeb.Plugs.FirstSetup","doc":"Plug to redirect HTTP requests to /first_setup if there are no superusers in the system yet.","ref":"LightningWeb.Plugs.FirstSetup.html"},{"type":"module","title":"LightningWeb.ProfileLive.Edit","doc":"LiveView for user profile page.","ref":"LightningWeb.ProfileLive.Edit.html"},{"type":"function","title":"LightningWeb.ProfileLive.Edit.render/1","doc":"Callback implementation for Phoenix.LiveView.render/1 .","ref":"LightningWeb.ProfileLive.Edit.html#render/1"},{"type":"module","title":"LightningWeb.ProfileLive.FormComponent","doc":"Form component update profile email and password","ref":"LightningWeb.ProfileLive.FormComponent.html"},{"type":"function","title":"LightningWeb.ProfileLive.FormComponent.render/1","doc":"Callback implementation for Phoenix.LiveComponent.render/1 .","ref":"LightningWeb.ProfileLive.FormComponent.html#render/1"},{"type":"module","title":"LightningWeb.ProfileLive.MfaComponent","doc":"Component to enable MFA on a User's account","ref":"LightningWeb.ProfileLive.MfaComponent.html"},{"type":"function","title":"LightningWeb.ProfileLive.MfaComponent.render/1","doc":"Callback implementation for Phoenix.LiveComponent.render/1 .","ref":"LightningWeb.ProfileLive.MfaComponent.html#render/1"},{"type":"module","title":"LightningWeb.ProjectLive.FormComponent","doc":"Form Component for working with a single Job A Job's adaptor field is a combination of the module name and the version. It's formatted as an NPM style string. The form allows the user to select a module by name and then it's version, while the version dropdown itself references adaptor directly. Meaning the adaptor_name dropdown and assigns value is not persisted.","ref":"LightningWeb.ProjectLive.FormComponent.html"},{"type":"function","title":"LightningWeb.ProjectLive.FormComponent.render/1","doc":"Callback implementation for Phoenix.LiveComponent.render/1 .","ref":"LightningWeb.ProjectLive.FormComponent.html#render/1"},{"type":"module","title":"LightningWeb.ProjectLive.Index","doc":"LiveView for listing and managing Projects","ref":"LightningWeb.ProjectLive.Index.html"},{"type":"function","title":"LightningWeb.ProjectLive.Index.delete_action/1","doc":"","ref":"LightningWeb.ProjectLive.Index.html#delete_action/1"},{"type":"function","title":"LightningWeb.ProjectLive.Index.render/1","doc":"Callback implementation for Phoenix.LiveView.render/1 .","ref":"LightningWeb.ProjectLive.Index.html#render/1"},{"type":"module","title":"LightningWeb.ProjectLive.MFARequired","doc":"Liveview for project access denied error messages","ref":"LightningWeb.ProjectLive.MFARequired.html"},{"type":"function","title":"LightningWeb.ProjectLive.MFARequired.on_mount/4","doc":"","ref":"LightningWeb.ProjectLive.MFARequired.html#on_mount/4"},{"type":"function","title":"LightningWeb.ProjectLive.MFARequired.render/1","doc":"Callback implementation for Phoenix.LiveView.render/1 .","ref":"LightningWeb.ProjectLive.MFARequired.html#render/1"},{"type":"module","title":"LightningWeb.ProjectLive.Settings","doc":"Index Liveview for Runs","ref":"LightningWeb.ProjectLive.Settings.html"},{"type":"function","title":"LightningWeb.ProjectLive.Settings.digest/1","doc":"","ref":"LightningWeb.ProjectLive.Settings.html#digest/1"},{"type":"function","title":"LightningWeb.ProjectLive.Settings.failure_alert/1","doc":"","ref":"LightningWeb.ProjectLive.Settings.html#failure_alert/1"},{"type":"function","title":"LightningWeb.ProjectLive.Settings.render/1","doc":"Callback implementation for Phoenix.LiveView.render/1 .","ref":"LightningWeb.ProjectLive.Settings.html#render/1"},{"type":"function","title":"LightningWeb.ProjectLive.Settings.role/1","doc":"","ref":"LightningWeb.ProjectLive.Settings.html#role/1"},{"type":"function","title":"LightningWeb.ProjectLive.Settings.user/1","doc":"","ref":"LightningWeb.ProjectLive.Settings.html#user/1"},{"type":"module","title":"LightningWeb.ReAuthenticateLive.New","doc":"LiveView for re-authentication page.","ref":"LightningWeb.ReAuthenticateLive.New.html"},{"type":"function","title":"LightningWeb.ReAuthenticateLive.New.render/1","doc":"Callback implementation for Phoenix.LiveView.render/1 .","ref":"LightningWeb.ReAuthenticateLive.New.html#render/1"},{"type":"module","title":"LightningWeb.RouteHelpers","doc":"Convenience functions for generating paths.","ref":"LightningWeb.RouteHelpers.html"},{"type":"function","title":"LightningWeb.RouteHelpers.oidc_callback_url/0","doc":"","ref":"LightningWeb.RouteHelpers.html#oidc_callback_url/0"},{"type":"function","title":"LightningWeb.RouteHelpers.show_run_url/2","doc":"","ref":"LightningWeb.RouteHelpers.html#show_run_url/2"},{"type":"module","title":"LightningWeb.Router","doc":"","ref":"LightningWeb.Router.html"},{"type":"function","title":"LightningWeb.Router.api/2","doc":"","ref":"LightningWeb.Router.html#api/2"},{"type":"function","title":"LightningWeb.Router.browser/2","doc":"","ref":"LightningWeb.Router.html#browser/2"},{"type":"function","title":"LightningWeb.Router.call/2","doc":"Callback invoked by Plug on every request.","ref":"LightningWeb.Router.html#call/2"},{"type":"function","title":"LightningWeb.Router.init/1","doc":"Callback required by Plug that initializes the router for serving web requests.","ref":"LightningWeb.Router.html#init/1"},{"type":"function","title":"LightningWeb.Router.storybook_assets/2","doc":"","ref":"LightningWeb.Router.html#storybook_assets/2"},{"type":"function","title":"LightningWeb.Router.storybook_browser/2","doc":"","ref":"LightningWeb.Router.html#storybook_browser/2"},{"type":"module","title":"LightningWeb.RunLive.Index","doc":"Index Liveview for Runs","ref":"LightningWeb.RunLive.Index.html"},{"type":"function","title":"LightningWeb.RunLive.Index.checked/2","doc":"","ref":"LightningWeb.RunLive.Index.html#checked/2"},{"type":"function","title":"LightningWeb.RunLive.Index.render/1","doc":"Callback implementation for Phoenix.LiveView.render/1 .","ref":"LightningWeb.RunLive.Index.html#render/1"},{"type":"module","title":"LightningWeb.RunLive.RerunJobComponent","doc":"Rerun job component","ref":"LightningWeb.RunLive.RerunJobComponent.html"},{"type":"function","title":"LightningWeb.RunLive.RerunJobComponent.handle_event/3","doc":"Callback implementation for Phoenix.LiveComponent.handle_event/3 .","ref":"LightningWeb.RunLive.RerunJobComponent.html#handle_event/3"},{"type":"function","title":"LightningWeb.RunLive.RerunJobComponent.render/1","doc":"Callback implementation for Phoenix.LiveComponent.render/1 .","ref":"LightningWeb.RunLive.RerunJobComponent.html#render/1"},{"type":"function","title":"LightningWeb.RunLive.RerunJobComponent.update/2","doc":"Callback implementation for Phoenix.LiveComponent.update/2 .","ref":"LightningWeb.RunLive.RerunJobComponent.html#update/2"},{"type":"module","title":"LightningWeb.RunLive.RunViewerLive","doc":"","ref":"LightningWeb.RunLive.RunViewerLive.html"},{"type":"function","title":"LightningWeb.RunLive.RunViewerLive.handle_info/2","doc":"Reload the run when any update messages arrive.","ref":"LightningWeb.RunLive.RunViewerLive.html#handle_info/2"},{"type":"module","title":"LightningWeb.RunLive.Show","doc":"Show page for individual runs.","ref":"LightningWeb.RunLive.Show.html"},{"type":"function","title":"LightningWeb.RunLive.Show.apply_action/3","doc":"","ref":"LightningWeb.RunLive.Show.html#apply_action/3"},{"type":"module","title":"LightningWeb.RunLive.WorkOrderComponent","doc":"Workorder component","ref":"LightningWeb.RunLive.WorkOrderComponent.html"},{"type":"function","title":"LightningWeb.RunLive.WorkOrderComponent.render/1","doc":"Attributes show_details ( :boolean ) - Defaults to false . entry_selected ( :boolean ) - Defaults to false .","ref":"LightningWeb.RunLive.WorkOrderComponent.html#render/1"},{"type":"module","title":"LightningWeb.Telemetry","doc":"Assorted metrics to collect during runtime. See https://hexdocs.pm/phoenix/telemetry.html","ref":"LightningWeb.Telemetry.html"},{"type":"function","title":"LightningWeb.Telemetry.child_spec/1","doc":"Returns a specification to start this module under a supervisor. See Supervisor .","ref":"LightningWeb.Telemetry.html#child_spec/1"},{"type":"function","title":"LightningWeb.Telemetry.metrics/0","doc":"","ref":"LightningWeb.Telemetry.html#metrics/0"},{"type":"function","title":"LightningWeb.Telemetry.start_link/1","doc":"","ref":"LightningWeb.Telemetry.html#start_link/1"},{"type":"module","title":"LightningWeb.TokensLive.Index","doc":"LiveView for listing and managing tokens","ref":"LightningWeb.TokensLive.Index.html"},{"type":"function","title":"LightningWeb.TokensLive.Index.render/1","doc":"Callback implementation for Phoenix.LiveView.render/1 .","ref":"LightningWeb.TokensLive.Index.html#render/1"},{"type":"module","title":"LightningWeb.UserAuth","doc":"The UserAuth controller.","ref":"LightningWeb.UserAuth.html"},{"type":"function","title":"LightningWeb.UserAuth.authenticate_bearer/2","doc":"","ref":"LightningWeb.UserAuth.html#authenticate_bearer/2"},{"type":"function","title":"LightningWeb.UserAuth.fetch_current_user/2","doc":"Authenticates the user by looking into the session and remember me token.","ref":"LightningWeb.UserAuth.html#fetch_current_user/2"},{"type":"function","title":"LightningWeb.UserAuth.log_in_user/2","doc":"Logs the user in by creating a new session token.","ref":"LightningWeb.UserAuth.html#log_in_user/2"},{"type":"function","title":"LightningWeb.UserAuth.log_out_user/1","doc":"Logs the user out. It clears all session data for safety. See renew_session.","ref":"LightningWeb.UserAuth.html#log_out_user/1"},{"type":"function","title":"LightningWeb.UserAuth.mark_totp_pending/1","doc":"","ref":"LightningWeb.UserAuth.html#mark_totp_pending/1"},{"type":"function","title":"LightningWeb.UserAuth.new_session/2","doc":"Assigns the token to a new session. It renews the session ID and clears the whole session to avoid fixation attacks. See the renew_session function to customize this behaviour. It also sets a :live_socket_id key in the session, so LiveView sessions are identified and automatically disconnected on log out. The line can be safely removed if you are not using LiveView.","ref":"LightningWeb.UserAuth.html#new_session/2"},{"type":"function","title":"LightningWeb.UserAuth.on_mount/4","doc":"Used for LiveView routes that require the user to be re-authenticated.","ref":"LightningWeb.UserAuth.html#on_mount/4"},{"type":"function","title":"LightningWeb.UserAuth.reauth_sudo_mode/2","doc":"Re-Authenticates the user by using the sudo token","ref":"LightningWeb.UserAuth.html#reauth_sudo_mode/2"},{"type":"function","title":"LightningWeb.UserAuth.redirect_if_user_is_authenticated/2","doc":"Used for routes that require the user to not be authenticated.","ref":"LightningWeb.UserAuth.html#redirect_if_user_is_authenticated/2"},{"type":"function","title":"LightningWeb.UserAuth.redirect_with_return_to/2","doc":"Returns to or redirects to the dashboard and potentially set remember_me token.","ref":"LightningWeb.UserAuth.html#redirect_with_return_to/2"},{"type":"function","title":"LightningWeb.UserAuth.require_authenticated_user/2","doc":"Used for routes that require the user to be authenticated. If you want to enforce the user email is confirmed before they use the application at all, here would be a good place.","ref":"LightningWeb.UserAuth.html#require_authenticated_user/2"},{"type":"function","title":"LightningWeb.UserAuth.require_sudo_user/2","doc":"Used for routes that require the user to be re-authenticated.","ref":"LightningWeb.UserAuth.html#require_sudo_user/2"},{"type":"function","title":"LightningWeb.UserAuth.totp_pending?/1","doc":"","ref":"LightningWeb.UserAuth.html#totp_pending?/1"},{"type":"function","title":"LightningWeb.UserAuth.totp_validated/1","doc":"","ref":"LightningWeb.UserAuth.html#totp_validated/1"},{"type":"module","title":"LightningWeb.UserConfirmationController","doc":"","ref":"LightningWeb.UserConfirmationController.html"},{"type":"function","title":"LightningWeb.UserConfirmationController.confirm_email/2","doc":"","ref":"LightningWeb.UserConfirmationController.html#confirm_email/2"},{"type":"function","title":"LightningWeb.UserConfirmationController.create/2","doc":"","ref":"LightningWeb.UserConfirmationController.html#create/2"},{"type":"function","title":"LightningWeb.UserConfirmationController.edit/2","doc":"","ref":"LightningWeb.UserConfirmationController.html#edit/2"},{"type":"function","title":"LightningWeb.UserConfirmationController.new/2","doc":"","ref":"LightningWeb.UserConfirmationController.html#new/2"},{"type":"function","title":"LightningWeb.UserConfirmationController.update/2","doc":"","ref":"LightningWeb.UserConfirmationController.html#update/2"},{"type":"module","title":"LightningWeb.UserLive.Edit","doc":"LiveView for editing a single job, which inturn uses LightningWeb.JobLive.BigFormComponent for common functionality.","ref":"LightningWeb.UserLive.Edit.html"},{"type":"function","title":"LightningWeb.UserLive.Edit.render/1","doc":"Callback implementation for Phoenix.LiveView.render/1 .","ref":"LightningWeb.UserLive.Edit.html#render/1"},{"type":"module","title":"LightningWeb.UserLive.FormComponent","doc":"Form component for creating and editing users","ref":"LightningWeb.UserLive.FormComponent.html"},{"type":"function","title":"LightningWeb.UserLive.FormComponent.render/1","doc":"Callback implementation for Phoenix.LiveComponent.render/1 .","ref":"LightningWeb.UserLive.FormComponent.html#render/1"},{"type":"module","title":"LightningWeb.UserLive.Index","doc":"Index page for listing users","ref":"LightningWeb.UserLive.Index.html"},{"type":"function","title":"LightningWeb.UserLive.Index.delete_action/1","doc":"","ref":"LightningWeb.UserLive.Index.html#delete_action/1"},{"type":"function","title":"LightningWeb.UserLive.Index.render/1","doc":"Callback implementation for Phoenix.LiveView.render/1 .","ref":"LightningWeb.UserLive.Index.html#render/1"},{"type":"module","title":"LightningWeb.UserRegistrationController","doc":"","ref":"LightningWeb.UserRegistrationController.html"},{"type":"function","title":"LightningWeb.UserRegistrationController.create/2","doc":"","ref":"LightningWeb.UserRegistrationController.html#create/2"},{"type":"function","title":"LightningWeb.UserRegistrationController.new/2","doc":"","ref":"LightningWeb.UserRegistrationController.html#new/2"},{"type":"module","title":"LightningWeb.UserResetPasswordController","doc":"","ref":"LightningWeb.UserResetPasswordController.html"},{"type":"function","title":"LightningWeb.UserResetPasswordController.create/2","doc":"","ref":"LightningWeb.UserResetPasswordController.html#create/2"},{"type":"function","title":"LightningWeb.UserResetPasswordController.edit/2","doc":"","ref":"LightningWeb.UserResetPasswordController.html#edit/2"},{"type":"function","title":"LightningWeb.UserResetPasswordController.new/2","doc":"","ref":"LightningWeb.UserResetPasswordController.html#new/2"},{"type":"function","title":"LightningWeb.UserResetPasswordController.update/2","doc":"","ref":"LightningWeb.UserResetPasswordController.html#update/2"},{"type":"module","title":"LightningWeb.UserSessionController","doc":"","ref":"LightningWeb.UserSessionController.html"},{"type":"function","title":"LightningWeb.UserSessionController.auth_handler_url/0","doc":"","ref":"LightningWeb.UserSessionController.html#auth_handler_url/0"},{"type":"function","title":"LightningWeb.UserSessionController.create/2","doc":"","ref":"LightningWeb.UserSessionController.html#create/2"},{"type":"function","title":"LightningWeb.UserSessionController.delete/2","doc":"","ref":"LightningWeb.UserSessionController.html#delete/2"},{"type":"function","title":"LightningWeb.UserSessionController.exchange_token/2","doc":"","ref":"LightningWeb.UserSessionController.html#exchange_token/2"},{"type":"function","title":"LightningWeb.UserSessionController.new/2","doc":"","ref":"LightningWeb.UserSessionController.html#new/2"},{"type":"module","title":"LightningWeb.UserTOTPController","doc":"","ref":"LightningWeb.UserTOTPController.html"},{"type":"function","title":"LightningWeb.UserTOTPController.create/2","doc":"","ref":"LightningWeb.UserTOTPController.html#create/2"},{"type":"function","title":"LightningWeb.UserTOTPController.new/2","doc":"","ref":"LightningWeb.UserTOTPController.html#new/2"},{"type":"module","title":"LightningWeb.VersionControlController","doc":"","ref":"LightningWeb.VersionControlController.html"},{"type":"function","title":"LightningWeb.VersionControlController.index/2","doc":"","ref":"LightningWeb.VersionControlController.html#index/2"},{"type":"module","title":"LightningWeb.WebhooksController","doc":"","ref":"LightningWeb.WebhooksController.html"},{"type":"function","title":"LightningWeb.WebhooksController.create/2","doc":"","ref":"LightningWeb.WebhooksController.html#create/2"},{"type":"module","title":"LightningWeb.WorkflowLive.EditorPane","doc":"","ref":"LightningWeb.WorkflowLive.EditorPane.html"},{"type":"function","title":"LightningWeb.WorkflowLive.EditorPane.render/1","doc":"Attributes id ( :string ) (required) disabled ( :boolean ) - Defaults to false . class ( :string ) - Defaults to "" . on_change ( :any ) (required) adaptor ( :string ) (required) source ( :string ) (required) job_id ( :string ) (required)","ref":"LightningWeb.WorkflowLive.EditorPane.html#render/1"},{"type":"module","title":"LightningWeb.WorkflowLive.JobView","doc":"","ref":"LightningWeb.WorkflowLive.JobView.html"},{"type":"function","title":"LightningWeb.WorkflowLive.JobView.container/1","doc":"Attributes id ( :string ) (required) Slots top column - Accepts attributes: class ( :string ) - Extra CSS classes for the column. bottom","ref":"LightningWeb.WorkflowLive.JobView.html#container/1"},{"type":"function","title":"LightningWeb.WorkflowLive.JobView.input_pane/1","doc":"Attributes job ( :map ) (required) user ( :map ) (required) project ( :map ) (required) on_run ( :any ) (required) - Callback to run a job manually. can_run_job ( :boolean ) - Defaults to true .","ref":"LightningWeb.WorkflowLive.JobView.html#input_pane/1"},{"type":"function","title":"LightningWeb.WorkflowLive.JobView.job_edit_view/1","doc":"Attributes job ( :map ) (required) form ( :map ) (required) - A form built from a job. current_user ( :map ) (required) project ( :map ) (required) close_url ( :any ) (required) socket ( :any ) (required) on_run ( :any ) (required) - Callback to run a job manually. follow_run_id ( :any ) - Defaults to nil . Slots footer","ref":"LightningWeb.WorkflowLive.JobView.html#job_edit_view/1"},{"type":"module","title":"LightningWeb.WorkflowNewLive.WorkflowParams","doc":"Various function for reconciling changes to a workflow params map. The front end editor uses JSON patches to represent changes to the workflow.","ref":"LightningWeb.WorkflowNewLive.WorkflowParams.html"},{"type":"function","title":"LightningWeb.WorkflowNewLive.WorkflowParams.apply_form_params/2","doc":"Produce a new set of params by applying the given form params to the current params.","ref":"LightningWeb.WorkflowNewLive.WorkflowParams.html#apply_form_params/2"},{"type":"function","title":"LightningWeb.WorkflowNewLive.WorkflowParams.apply_patches/2","doc":"Produce a new set of params by applying the given patches to the current parms","ref":"LightningWeb.WorkflowNewLive.WorkflowParams.html#apply_patches/2"},{"type":"function","title":"LightningWeb.WorkflowNewLive.WorkflowParams.to_map/1","doc":"Convert a changeset to a serializable map of workflow params, suitable for sending to the front end editor. It uses Lightning.Helpers.json_safe/1 to ensure that the map is safe to serialize to JSON. This is necessary because the underlying model may contain atom values.","ref":"LightningWeb.WorkflowNewLive.WorkflowParams.html#to_map/1"},{"type":"function","title":"LightningWeb.WorkflowNewLive.WorkflowParams.to_patches/2","doc":"Produce a set of patches that represent the difference between the initial params and the target params. This usually is used to produce a set of patches that represent the changes introduced by a changeset.","ref":"LightningWeb.WorkflowNewLive.WorkflowParams.html#to_patches/2"},{"type":"task","title":"Mix.Tasks.Lightning.GenEncryptionKey","doc":"Helper to generate a unique encryption key for Vault","ref":"Mix.Tasks.Lightning.GenEncryptionKey.html"},{"type":"task","title":"Mix.Tasks.Lightning.InstallRuntime","doc":"Installs the following NodeJS packages: core language-common","ref":"Mix.Tasks.Lightning.InstallRuntime.html"},{"type":"function","title":"Mix.Tasks.Lightning.InstallRuntime.packages/0","doc":"","ref":"Mix.Tasks.Lightning.InstallRuntime.html#packages/0"},{"type":"function","title":"Mix.Tasks.Lightning.InstallRuntime.run/1","doc":"Callback implementation for Mix.Task.run/1 .","ref":"Mix.Tasks.Lightning.InstallRuntime.html#run/1"},{"type":"task","title":"Mix.Tasks.Lightning.InstallSchemas","doc":"Install the credential json schemas Use --exclude language-package1, language-package2 to exclude specific packages","ref":"Mix.Tasks.Lightning.InstallSchemas.html"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.delete/3","doc":"Issues a DELETE request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#delete/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.delete!/3","doc":"Issues a DELETE request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#delete!/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.fetch_schemas/2","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#fetch_schemas/2"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.get/3","doc":"Issues a GET request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#get/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.get!/3","doc":"Issues a GET request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#get!/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.head/3","doc":"Issues a HEAD request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#head/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.head!/3","doc":"Issues a HEAD request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#head!/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.options/3","doc":"Issues an OPTIONS request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#options/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.options!/3","doc":"Issues a OPTIONS request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#options!/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.parse_excluded/1","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#parse_excluded/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.patch/4","doc":"Issues a PATCH request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#patch/4"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.patch!/4","doc":"Issues a PATCH request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#patch!/4"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.persist_schema/2","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#persist_schema/2"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.post/4","doc":"Issues a POST request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#post/4"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.post!/4","doc":"Issues a POST request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#post!/4"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_headers/1","doc":"Callback implementation for HTTPoison.Base.process_headers/1 .","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_headers/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_request_body/1","doc":"Callback implementation for HTTPoison.Base.process_request_body/1 .","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_request_body/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_request_headers/1","doc":"Callback implementation for HTTPoison.Base.process_request_headers/1 .","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_request_headers/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_request_options/1","doc":"Callback implementation for HTTPoison.Base.process_request_options/1 .","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_request_options/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_request_params/1","doc":"Callback implementation for HTTPoison.Base.process_request_params/1 .","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_request_params/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_request_url/1","doc":"Callback implementation for HTTPoison.Base.process_request_url/1 .","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_request_url/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_response/1","doc":"Callback implementation for HTTPoison.Base.process_response/1 .","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_response/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_response_body/1","doc":"Callback implementation for HTTPoison.Base.process_response_body/1 .","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_response_body/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_response_chunk/1","doc":"Callback implementation for HTTPoison.Base.process_response_chunk/1 .","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_response_chunk/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_response_headers/1","doc":"Callback implementation for HTTPoison.Base.process_response_headers/1 .","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_response_headers/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_response_status_code/1","doc":"Callback implementation for HTTPoison.Base.process_response_status_code/1 .","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_response_status_code/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_status_code/1","doc":"Callback implementation for HTTPoison.Base.process_status_code/1 .","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_status_code/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_url/1","doc":"Callback implementation for HTTPoison.Base.process_url/1 .","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_url/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.put/4","doc":"Issues a PUT request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#put/4"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.put!/4","doc":"Issues a PUT request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#put!/4"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.request/1","doc":"Issues an HTTP request using a Request struct. This function returns {:ok, response} , {:ok, async_response} , or {:ok, maybe_redirect} if the request is successful, {:error, reason} otherwise. Redirect handling If the option :follow_redirect is given, HTTP redirects are automatically follow if the method is set to :get or :head and the response's status_code is 301 , 302 or 307 . If the method is set to :post , then the only status_code that get's automatically followed is 303 . If any other method or status_code is returned, then this function returns a returns a {:ok, %HTTPoison.MaybeRedirect{}} containing the redirect_url for you to re-request with the method set to :get . Examples request = % HTTPoison.Request { method : :post , url : "https://my.website.com" , body : "{ \\" foo \\" : 3}" , headers : [ { "Accept" , "application/json" } ] } request ( request )","ref":"Mix.Tasks.Lightning.InstallSchemas.html#request/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.request/5","doc":"Issues an HTTP request with the given method to the given url. This function is usually used indirectly by get/3 , post/4 , put/4 , etc Args: method - HTTP method as an atom ( :get , :head , :post , :put , :delete , etc.) url - target url as a binary string or char list body - request body. See more below headers - HTTP headers as an orddict (e.g., [{"Accept", "application/json"}] ) options - Keyword list of options Body: see type HTTPoison.Request Options: see type HTTPoison.Request This function returns {:ok, response} , {:ok, async_response} , or {:ok, maybe_redirect} if the request is successful, {:error, reason} otherwise. Redirect handling If the option :follow_redirect is given, HTTP redirects are automatically follow if the method is set to :get or :head and the response's status_code is 301 , 302 or 307 . If the method is set to :post , then the only status_code that get's automatically followed is 303 . If any other method or status_code is returned, then this function returns a returns a {:ok, %HTTPoison.MaybeRedirect{}} containing the redirect_url for you to re-request with the method set to :get . Examples request ( :post , "https://my.website.com" , "{ \\" foo \\" : 3}" , [ { "Accept" , "application/json" } ] )","ref":"Mix.Tasks.Lightning.InstallSchemas.html#request/5"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.request!/5","doc":"Issues an HTTP request with the given method to the given url, raising an exception in case of failure. request!/5 works exactly like request/5 but it returns just the response in case of a successful request, raising an exception in case the request fails.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#request!/5"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.run/1","doc":"Callback implementation for Mix.Task.run/1 .","ref":"Mix.Tasks.Lightning.InstallSchemas.html#run/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.start/0","doc":"Starts HTTPoison and its dependencies.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#start/0"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.stream_next/1","doc":"Requests the next message to be streamed for a given HTTPoison.AsyncResponse . See request!/5 for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#stream_next/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.write_schema/3","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#write_schema/3"},{"type":"type","title":"Mix.Tasks.Lightning.InstallSchemas.body/0","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#t:body/0"},{"type":"type","title":"Mix.Tasks.Lightning.InstallSchemas.headers/0","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#t:headers/0"},{"type":"type","title":"Mix.Tasks.Lightning.InstallSchemas.method/0","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#t:method/0"},{"type":"type","title":"Mix.Tasks.Lightning.InstallSchemas.options/0","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#t:options/0"},{"type":"type","title":"Mix.Tasks.Lightning.InstallSchemas.params/0","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#t:params/0"},{"type":"type","title":"Mix.Tasks.Lightning.InstallSchemas.request/0","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#t:request/0"},{"type":"type","title":"Mix.Tasks.Lightning.InstallSchemas.url/0","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#t:url/0"},{"type":"module","title":"ObanPruner","doc":"The Oban Pruner removes completed Oban jobs. It leaves everything else for manual inspection.","ref":"ObanPruner.html"},{"type":"function","title":"ObanPruner.perform/1","doc":"Deletes completed Oban jobs, leaving discarded for manual inspection.","ref":"ObanPruner.html#perform/1"},{"type":"module","title":"Storybook.Root","doc":"","ref":"Storybook.Root.html"},{"type":"module","title":"Lightning.Accounts","doc":"The Accounts context.","ref":"Lightning.Accounts.html"},{"type":"function","title":"Lightning.Accounts.apply_user_email/3","doc":"Emulates that the email will change without actually changing it in the database. Examples iex> apply_user_email ( user , "valid password" , %{ email : ... } ) { :ok , % User { } } role : :superuser iex> apply_user_email ( user , "invalid password" , %{ email : ... } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Accounts.html#apply_user_email/3"},{"type":"function","title":"Lightning.Accounts.cancel_scheduled_deletion/1","doc":"","ref":"Lightning.Accounts.html#cancel_scheduled_deletion/1"},{"type":"function","title":"Lightning.Accounts.change_scheduled_deletion/2","doc":"Returns an %Ecto.Changeset{} for changing the user scheduled_deletion. Examples iex> change_scheduled_deletion ( user ) % Ecto.Changeset { data : % User { } }","ref":"Lightning.Accounts.html#change_scheduled_deletion/2"},{"type":"function","title":"Lightning.Accounts.change_superuser_registration/1","doc":"Returns an %Ecto.Changeset{} for tracking superuser changes. Examples iex> change_superuser_registration ( user ) % Ecto.Changeset { data : % User { } }","ref":"Lightning.Accounts.html#change_superuser_registration/1"},{"type":"function","title":"Lightning.Accounts.change_user_details/2","doc":"","ref":"Lightning.Accounts.html#change_user_details/2"},{"type":"function","title":"Lightning.Accounts.change_user_email/2","doc":"Returns an %Ecto.Changeset{} for changing the user email. Examples iex> change_user_email ( user ) % Ecto.Changeset { data : % User { } }","ref":"Lightning.Accounts.html#change_user_email/2"},{"type":"function","title":"Lightning.Accounts.change_user_password/2","doc":"Returns an %Ecto.Changeset{} for changing the user password. Examples iex> change_user_password ( user ) % Ecto.Changeset { data : % User { } }","ref":"Lightning.Accounts.html#change_user_password/2"},{"type":"function","title":"Lightning.Accounts.change_user_registration/1","doc":"Returns an %Ecto.Changeset{} for tracking user changes. Examples iex> change_user_registration ( user ) % Ecto.Changeset { data : % User { } }","ref":"Lightning.Accounts.html#change_user_registration/1"},{"type":"function","title":"Lightning.Accounts.confirm_user/1","doc":"Confirms a user by the given token. If the token matches, the user account is marked as confirmed and the token is deleted.","ref":"Lightning.Accounts.html#confirm_user/1"},{"type":"function","title":"Lightning.Accounts.delete_auth_token/1","doc":"Deletes the signed token with the given context.","ref":"Lightning.Accounts.html#delete_auth_token/1"},{"type":"function","title":"Lightning.Accounts.delete_session_token/1","doc":"Deletes the signed token with the given context.","ref":"Lightning.Accounts.html#delete_session_token/1"},{"type":"function","title":"Lightning.Accounts.delete_sudo_session_token/1","doc":"Deletes the signed token with the given context.","ref":"Lightning.Accounts.html#delete_sudo_session_token/1"},{"type":"function","title":"Lightning.Accounts.delete_token/1","doc":"Deletes a token. Examples iex> delete_token ( token ) { :ok , % UserToken { } } iex> delete_token ( token ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Accounts.html#delete_token/1"},{"type":"function","title":"Lightning.Accounts.delete_user/1","doc":"Deletes a user. Examples iex> delete_user ( user ) { :ok , % User { } } iex> delete_user ( user ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Accounts.html#delete_user/1"},{"type":"function","title":"Lightning.Accounts.delete_user_totp/1","doc":"Deletes the given user's TOTP","ref":"Lightning.Accounts.html#delete_user_totp/1"},{"type":"function","title":"Lightning.Accounts.deliver_update_email_instructions/3","doc":"Delivers the update email instructions to the given user. Examples iex> deliver_update_email_instructions ( user , current_email , & Routes . user_update_email_url ( conn , :edit , &1 ) ) { :ok , %{ to : ... , body : ... } }","ref":"Lightning.Accounts.html#deliver_update_email_instructions/3"},{"type":"function","title":"Lightning.Accounts.deliver_user_confirmation_instructions/2","doc":"Delivers the confirmation email instructions to the given 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 }","ref":"Lightning.Accounts.html#deliver_user_confirmation_instructions/2"},{"type":"function","title":"Lightning.Accounts.deliver_user_confirmation_instructions/3","doc":"","ref":"Lightning.Accounts.html#deliver_user_confirmation_instructions/3"},{"type":"function","title":"Lightning.Accounts.deliver_user_reset_password_instructions/2","doc":"Delivers the reset password email to the given user. Examples iex> deliver_user_reset_password_instructions ( user , & Routes . user_reset_password_url ( conn , :edit , &1 ) ) { :ok , %{ to : ... , body : ... } }","ref":"Lightning.Accounts.html#deliver_user_reset_password_instructions/2"},{"type":"function","title":"Lightning.Accounts.exchange_auth_token/1","doc":"Exchanges an auth token for a session token. The auth token is removed from the database if successful.","ref":"Lightning.Accounts.html#exchange_auth_token/1"},{"type":"function","title":"Lightning.Accounts.generate_api_token/1","doc":"Generates an API token for a user.","ref":"Lightning.Accounts.html#generate_api_token/1"},{"type":"function","title":"Lightning.Accounts.generate_auth_token/1","doc":"Generates an auth token.","ref":"Lightning.Accounts.html#generate_auth_token/1"},{"type":"function","title":"Lightning.Accounts.generate_sudo_session_token/1","doc":"Generates a 2FA session token.","ref":"Lightning.Accounts.html#generate_sudo_session_token/1"},{"type":"function","title":"Lightning.Accounts.generate_user_session_token/1","doc":"Generates a session token.","ref":"Lightning.Accounts.html#generate_user_session_token/1"},{"type":"function","title":"Lightning.Accounts.get_token!/1","doc":"Gets a single token. Raises Ecto.NoResultsError if the UserToken does not exist. Examples iex> get_token! ( 123 ) % UserToken { } iex> get_token! ( 456 ) ** (Ecto.NoResultsError)","ref":"Lightning.Accounts.html#get_token!/1"},{"type":"function","title":"Lightning.Accounts.get_user!/1","doc":"Gets a single user. Raises Ecto.NoResultsError if the User does not exist. Examples iex> get_user! ( 123 ) % User { } iex> get_user! ( 456 ) ** (Ecto.NoResultsError)","ref":"Lightning.Accounts.html#get_user!/1"},{"type":"function","title":"Lightning.Accounts.get_user_by_api_token/1","doc":"Gets the user with the given signed token.","ref":"Lightning.Accounts.html#get_user_by_api_token/1"},{"type":"function","title":"Lightning.Accounts.get_user_by_auth_token/1","doc":"Gets the user with the given signed token.","ref":"Lightning.Accounts.html#get_user_by_auth_token/1"},{"type":"function","title":"Lightning.Accounts.get_user_by_email/1","doc":"Gets a user by email. Examples iex> get_user_by_email ( "foo@example.com" ) % User { } iex> get_user_by_email ( "unknown@example.com" ) nil","ref":"Lightning.Accounts.html#get_user_by_email/1"},{"type":"function","title":"Lightning.Accounts.get_user_by_email_and_password/2","doc":"Gets a user by email and password. Examples 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" ) nil","ref":"Lightning.Accounts.html#get_user_by_email_and_password/2"},{"type":"function","title":"Lightning.Accounts.get_user_by_reset_password_token/1","doc":"Gets the user by reset password token. Examples iex> get_user_by_reset_password_token ( "validtoken" ) % User { } iex> get_user_by_reset_password_token ( "invalidtoken" ) nil","ref":"Lightning.Accounts.html#get_user_by_reset_password_token/1"},{"type":"function","title":"Lightning.Accounts.get_user_by_session_token/1","doc":"Gets the user with the given signed token.","ref":"Lightning.Accounts.html#get_user_by_session_token/1"},{"type":"function","title":"Lightning.Accounts.get_user_totp/1","doc":"Gets a single UserTOTP if any exists.","ref":"Lightning.Accounts.html#get_user_totp/1"},{"type":"function","title":"Lightning.Accounts.get_users_to_alert_for_project/1","doc":"Gets all users to alert of workflow failure for a project","ref":"Lightning.Accounts.html#get_users_to_alert_for_project/1"},{"type":"function","title":"Lightning.Accounts.has_activity_in_projects?/1","doc":"","ref":"Lightning.Accounts.html#has_activity_in_projects?/1"},{"type":"function","title":"Lightning.Accounts.has_one_superuser?/0","doc":"Used to determine if there is at least one Superuser in the system. This triggers the setup page on fresh installs.","ref":"Lightning.Accounts.html#has_one_superuser?/0"},{"type":"function","title":"Lightning.Accounts.list_api_tokens/1","doc":"Lists all user tokens","ref":"Lightning.Accounts.html#list_api_tokens/1"},{"type":"function","title":"Lightning.Accounts.list_user_backup_codes/1","doc":"Lists the user backup codes","ref":"Lightning.Accounts.html#list_user_backup_codes/1"},{"type":"function","title":"Lightning.Accounts.list_users/0","doc":"Returns the list of users. Examples iex> list_users ( ) [ % User { } , ... ]","ref":"Lightning.Accounts.html#list_users/0"},{"type":"function","title":"Lightning.Accounts.perform/1","doc":"Perform, when called with %{"type" => "purge_deleted"} will find users that are ready for permanent deletion and purge them.","ref":"Lightning.Accounts.html#perform/1"},{"type":"function","title":"Lightning.Accounts.purge_user/1","doc":"","ref":"Lightning.Accounts.html#purge_user/1"},{"type":"function","title":"Lightning.Accounts.regenerate_user_backup_codes/1","doc":"Regenerates the user backup codes","ref":"Lightning.Accounts.html#regenerate_user_backup_codes/1"},{"type":"function","title":"Lightning.Accounts.register_superuser/1","doc":"Registers a superuser. Examples iex> register_superuser ( %{ field : value } ) { :ok , % User { } } iex> register_superuser ( %{ field : bad_value } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Accounts.html#register_superuser/1"},{"type":"function","title":"Lightning.Accounts.register_user/1","doc":"Registers a user. Examples iex> register_user ( %{ field : value } ) { :ok , % User { } } iex> register_user ( %{ field : bad_value } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Accounts.html#register_user/1"},{"type":"function","title":"Lightning.Accounts.reset_user_password/2","doc":"Resets the user password. 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 { } }","ref":"Lightning.Accounts.html#reset_user_password/2"},{"type":"function","title":"Lightning.Accounts.schedule_user_deletion/2","doc":"Given a user and a confirmation email, this function sets a scheduled deletion date based on the PURGE_DELETED_AFTER_DAYS environment variable. If no ENV is set, this date defaults to NOW but the automatic user purge cronjob will never run. (Note that subsequent logins will be blocked for users pending deletion.)","ref":"Lightning.Accounts.html#schedule_user_deletion/2"},{"type":"function","title":"Lightning.Accounts.sudo_session_token_valid?/2","doc":"Checks if the given sudo token for the user is valid","ref":"Lightning.Accounts.html#sudo_session_token_valid?/2"},{"type":"function","title":"Lightning.Accounts.update_user_details/2","doc":"","ref":"Lightning.Accounts.html#update_user_details/2"},{"type":"function","title":"Lightning.Accounts.update_user_email/2","doc":"Updates the user email using the given token. If the token matches, the user email is updated and the token is deleted. The confirmed_at date is also updated to the current time.","ref":"Lightning.Accounts.html#update_user_email/2"},{"type":"function","title":"Lightning.Accounts.update_user_password/3","doc":"Updates the user password. Examples iex> update_user_password ( user , "valid password" , %{ password : ... } ) { :ok , % User { } } iex> update_user_password ( user , "invalid password" , %{ password : ... } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Accounts.html#update_user_password/3"},{"type":"function","title":"Lightning.Accounts.upsert_user_totp/2","doc":"Updates or Inserts the user's TOTP","ref":"Lightning.Accounts.html#upsert_user_totp/2"},{"type":"function","title":"Lightning.Accounts.valid_user_backup_code?/2","doc":"Validates if the given Backup code is valid.","ref":"Lightning.Accounts.html#valid_user_backup_code?/2"},{"type":"function","title":"Lightning.Accounts.valid_user_totp?/2","doc":"Validates if the given TOTP code is valid.","ref":"Lightning.Accounts.html#valid_user_totp?/2"},{"type":"function","title":"Lightning.Accounts.validate_change_user_email/2","doc":"","ref":"Lightning.Accounts.html#validate_change_user_email/2"},{"type":"module","title":"Lightning.Accounts.User","doc":"The User model.","ref":"Lightning.Accounts.User.html"},{"type":"function","title":"Lightning.Accounts.User.confirm_changeset/1","doc":"Confirms the account by setting confirmed_at .","ref":"Lightning.Accounts.User.html#confirm_changeset/1"},{"type":"function","title":"Lightning.Accounts.User.details_changeset/2","doc":"A user changeset for user details: email first_name last_name role","ref":"Lightning.Accounts.User.html#details_changeset/2"},{"type":"function","title":"Lightning.Accounts.User.email_changeset/2","doc":"A user changeset for changing the email. It requires the email to change otherwise an error is added.","ref":"Lightning.Accounts.User.html#email_changeset/2"},{"type":"function","title":"Lightning.Accounts.User.password_changeset/3","doc":"A user changeset for changing the password. Options :hash_password - Hashes the password so it can be stored securely in the database and ensures the password field is cleared to prevent leaks in the logs. If password hashing is not needed and clearing the password field is not desired (like when using this changeset for validations on a LiveView form), this option can be set to false . Defaults to true .","ref":"Lightning.Accounts.User.html#password_changeset/3"},{"type":"function","title":"Lightning.Accounts.User.scheduled_deletion_changeset/2","doc":"A user changeset for changing the scheduled_deletion property.","ref":"Lightning.Accounts.User.html#scheduled_deletion_changeset/2"},{"type":"function","title":"Lightning.Accounts.User.superuser_registration_changeset/2","doc":"A superuser changeset for registration. It is important to validate the length of both email and password. Otherwise databases may truncate the email without warnings, which could lead to unpredictable or insecure behaviour. Long passwords may also be very expensive to hash for certain algorithms. Options :hash_password - Hashes the password so it can be stored securely in the database and ensures the password field is cleared to prevent leaks in the logs. If password hashing is not needed and clearing the password field is not desired (like when using this changeset for validations on a LiveView form), this option can be set to false . Defaults to true .","ref":"Lightning.Accounts.User.html#superuser_registration_changeset/2"},{"type":"function","title":"Lightning.Accounts.User.user_registration_changeset/2","doc":"A user changeset for registration. It is important to validate the length of both email and password. Otherwise databases may truncate the email without warnings, which could lead to unpredictable or insecure behaviour. Long passwords may also be very expensive to hash for certain algorithms. Options :hash_password - Hashes the password so it can be stored securely in the database and ensures the password field is cleared to prevent leaks in the logs. If password hashing is not needed and clearing the password field is not desired (like when using this changeset for validations on a LiveView form), this option can be set to false . Defaults to true .","ref":"Lightning.Accounts.User.html#user_registration_changeset/2"},{"type":"function","title":"Lightning.Accounts.User.valid_password?/2","doc":"Verifies the password. If there is no user or the user doesn't have a password, we call Bcrypt.no_user_verify/0 to avoid timing attacks.","ref":"Lightning.Accounts.User.html#valid_password?/2"},{"type":"function","title":"Lightning.Accounts.User.validate_current_password/2","doc":"Validates the current password otherwise adds an error to the changeset.","ref":"Lightning.Accounts.User.html#validate_current_password/2"},{"type":"type","title":"Lightning.Accounts.User.t/0","doc":"","ref":"Lightning.Accounts.User.html#t:t/0"},{"type":"module","title":"Lightning.Accounts.User.RolesEnum","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.cast/1","doc":"Callback implementation for Ecto.Type.cast/1 .","ref":"Lightning.Accounts.User.RolesEnum.html#cast/1"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.create_type/0","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html#create_type/0"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.drop_type/0","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html#drop_type/0"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.dump/1","doc":"Callback implementation for Ecto.Type.dump/1 .","ref":"Lightning.Accounts.User.RolesEnum.html#dump/1"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.embed_as/1","doc":"Callback implementation for Ecto.Type.embed_as/1 .","ref":"Lightning.Accounts.User.RolesEnum.html#embed_as/1"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.equal?/2","doc":"Callback implementation for Ecto.Type.equal?/2 .","ref":"Lightning.Accounts.User.RolesEnum.html#equal?/2"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.load/1","doc":"Callback implementation for Ecto.Type.load/1 .","ref":"Lightning.Accounts.User.RolesEnum.html#load/1"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.schema/0","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html#schema/0"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.schemaless_type/0","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html#schemaless_type/0"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.type/0","doc":"Callback implementation for Ecto.Type.type/0 .","ref":"Lightning.Accounts.User.RolesEnum.html#type/0"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.valid_value?/1","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html#valid_value?/1"},{"type":"type","title":"Lightning.Accounts.User.RolesEnum.t/0","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html#t:t/0"},{"type":"module","title":"Lightning.Accounts.UserBackupCode","doc":"User backup codes schema","ref":"Lightning.Accounts.UserBackupCode.html"},{"type":"function","title":"Lightning.Accounts.UserBackupCode.changeset/2","doc":"","ref":"Lightning.Accounts.UserBackupCode.html#changeset/2"},{"type":"function","title":"Lightning.Accounts.UserBackupCode.generate_backup_code/0","doc":"","ref":"Lightning.Accounts.UserBackupCode.html#generate_backup_code/0"},{"type":"type","title":"Lightning.Accounts.UserBackupCode.t/0","doc":"","ref":"Lightning.Accounts.UserBackupCode.html#t:t/0"},{"type":"module","title":"Lightning.Accounts.UserNotifier","doc":"The UserNotifier module.","ref":"Lightning.Accounts.UserNotifier.html"},{"type":"function","title":"Lightning.Accounts.UserNotifier.build_digest_url/3","doc":"","ref":"Lightning.Accounts.UserNotifier.html#build_digest_url/3"},{"type":"function","title":"Lightning.Accounts.UserNotifier.deliver_confirmation_instructions/2","doc":"Deliver instructions to confirm account.","ref":"Lightning.Accounts.UserNotifier.html#deliver_confirmation_instructions/2"},{"type":"function","title":"Lightning.Accounts.UserNotifier.deliver_confirmation_instructions/3","doc":"Deliver instructions to confirm account.","ref":"Lightning.Accounts.UserNotifier.html#deliver_confirmation_instructions/3"},{"type":"function","title":"Lightning.Accounts.UserNotifier.deliver_project_addition_notification/2","doc":"Deliver email to notify user of his addition of a project.","ref":"Lightning.Accounts.UserNotifier.html#deliver_project_addition_notification/2"},{"type":"function","title":"Lightning.Accounts.UserNotifier.deliver_project_digest/2","doc":"Deliver a project digest of daily/weekly or monthly activity to a user.","ref":"Lightning.Accounts.UserNotifier.html#deliver_project_digest/2"},{"type":"function","title":"Lightning.Accounts.UserNotifier.deliver_reset_password_instructions/2","doc":"Deliver instructions to reset a user password.","ref":"Lightning.Accounts.UserNotifier.html#deliver_reset_password_instructions/2"},{"type":"function","title":"Lightning.Accounts.UserNotifier.deliver_update_email_instructions/2","doc":"Deliver instructions to update a user email.","ref":"Lightning.Accounts.UserNotifier.html#deliver_update_email_instructions/2"},{"type":"function","title":"Lightning.Accounts.UserNotifier.deliver_update_email_warning/2","doc":"Deliver warning to update a user email.","ref":"Lightning.Accounts.UserNotifier.html#deliver_update_email_warning/2"},{"type":"function","title":"Lightning.Accounts.UserNotifier.notify_project_deletion/2","doc":"","ref":"Lightning.Accounts.UserNotifier.html#notify_project_deletion/2"},{"type":"function","title":"Lightning.Accounts.UserNotifier.send_deletion_notification_email/1","doc":"Deliver an email to notify the user about their account being deleted","ref":"Lightning.Accounts.UserNotifier.html#send_deletion_notification_email/1"},{"type":"module","title":"Lightning.Accounts.UserTOTP","doc":"User Time based OTPs schema","ref":"Lightning.Accounts.UserTOTP.html"},{"type":"function","title":"Lightning.Accounts.UserTOTP.changeset/2","doc":"","ref":"Lightning.Accounts.UserTOTP.html#changeset/2"},{"type":"function","title":"Lightning.Accounts.UserTOTP.valid_totp?/2","doc":"","ref":"Lightning.Accounts.UserTOTP.html#valid_totp?/2"},{"type":"type","title":"Lightning.Accounts.UserTOTP.t/0","doc":"","ref":"Lightning.Accounts.UserTOTP.html#t:t/0"},{"type":"module","title":"Lightning.Accounts.UserToken","doc":"The UserToken model. The reason why we store session tokens in the database, even though Phoenix already provides a session cookie, is because Phoenix' default session cookies are not persisted, they are simply signed and potentially encrypted. This means they are valid indefinitely, unless you change the signing/encryption salt. Therefore, storing them allows individual user sessions to be expired. The token system can also be extended to store additional data, such as the device used for logging in. You could then use this information to display all valid sessions and devices in the UI and allow users to explicitly expire any session they deem invalid.","ref":"Lightning.Accounts.UserToken.html"},{"type":"function","title":"Lightning.Accounts.UserToken.build_email_token/3","doc":"Builds a token and its hash to be delivered to the user's email. The non-hashed token is sent to the user email while the hashed part is stored in the database. The original token cannot be reconstructed, which means anyone with read-only access to the database cannot directly use the token in the application to gain access. Furthermore, if the user changes their email in the system, the tokens sent to the previous email are no longer valid. Users can easily adapt the existing code to provide other types of delivery methods, for example, by phone numbers.","ref":"Lightning.Accounts.UserToken.html#build_email_token/3"},{"type":"function","title":"Lightning.Accounts.UserToken.build_token/2","doc":"Generates a token that will be stored in a signed place, such as session or cookie. As they are signed, those tokens do not need to be hashed.","ref":"Lightning.Accounts.UserToken.html#build_token/2"},{"type":"function","title":"Lightning.Accounts.UserToken.changeset/2","doc":"","ref":"Lightning.Accounts.UserToken.html#changeset/2"},{"type":"function","title":"Lightning.Accounts.UserToken.generate_and_sign/2","doc":"Combines generate_claims/1 and encode_and_sign/2","ref":"Lightning.Accounts.UserToken.html#generate_and_sign/2"},{"type":"function","title":"Lightning.Accounts.UserToken.generate_and_sign!/2","doc":"Same as generate_and_sign/2 but raises if error","ref":"Lightning.Accounts.UserToken.html#generate_and_sign!/2"},{"type":"function","title":"Lightning.Accounts.UserToken.last_used_changeset/1","doc":"Update when the api token was last used by setting last_used_at .","ref":"Lightning.Accounts.UserToken.html#last_used_changeset/1"},{"type":"function","title":"Lightning.Accounts.UserToken.token_and_context_query/2","doc":"Returns the token struct for the given token value and context.","ref":"Lightning.Accounts.UserToken.html#token_and_context_query/2"},{"type":"function","title":"Lightning.Accounts.UserToken.user_and_contexts_query/2","doc":"Gets all tokens for the given user for the given contexts.","ref":"Lightning.Accounts.UserToken.html#user_and_contexts_query/2"},{"type":"function","title":"Lightning.Accounts.UserToken.verify_and_validate/3","doc":"Combines verify/2 and validate/2","ref":"Lightning.Accounts.UserToken.html#verify_and_validate/3"},{"type":"function","title":"Lightning.Accounts.UserToken.verify_and_validate!/3","doc":"Same as verify_and_validate/2 but raises if error","ref":"Lightning.Accounts.UserToken.html#verify_and_validate!/3"},{"type":"function","title":"Lightning.Accounts.UserToken.verify_change_email_token_query/2","doc":"Checks if the token is valid and returns its underlying lookup query. The query returns the user found by the token, if any. This is used to validate requests to change the user email. It is different from verify_email_token_query/2 precisely because verify_email_token_query/2 validates the email has not changed, which is the starting point by this function. The given token is valid if it matches its hashed counterpart in the database and if it has not expired (after @change_email_validity_in_days). The context must always start with "change:".","ref":"Lightning.Accounts.UserToken.html#verify_change_email_token_query/2"},{"type":"function","title":"Lightning.Accounts.UserToken.verify_email_token_query/2","doc":"Checks if the token is valid and returns its underlying lookup query. The query returns the user found by the token, if any. The given token is valid if it matches its hashed counterpart in the database and the user email has not changed. This function also checks if the token is being used within a certain period, depending on the context. The default contexts supported by this function are either "confirm", for account confirmation emails, and "reset_password", for resetting the password. For verifying requests to change the email, see verify_change_email_token_query/2 .","ref":"Lightning.Accounts.UserToken.html#verify_email_token_query/2"},{"type":"function","title":"Lightning.Accounts.UserToken.verify_token_query/2","doc":"Checks if the token is valid and returns its underlying lookup query. The query returns the user found by the token, if any. The token is valid if it matches the value in the database and it has not expired (after @auth_validity_in_seconds or @session_validity_in_days).","ref":"Lightning.Accounts.UserToken.html#verify_token_query/2"},{"type":"module","title":"Lightning.Credentials","doc":"The Credentials context.","ref":"Lightning.Credentials.html"},{"type":"function","title":"Lightning.Credentials.change_credential/2","doc":"Returns an %Ecto.Changeset{} for tracking credential changes. Examples iex> change_credential ( credential ) % Ecto.Changeset { data : % Credential { } }","ref":"Lightning.Credentials.html#change_credential/2"},{"type":"function","title":"Lightning.Credentials.create_credential/1","doc":"Creates a credential. Examples iex> create_credential ( %{ field : value } ) { :ok , % Credential { } } iex> create_credential ( %{ field : bad_value } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Credentials.html#create_credential/1"},{"type":"function","title":"Lightning.Credentials.delete_credential/1","doc":"Deletes a credential. Examples iex> delete_credential ( credential ) { :ok , % Credential { } } iex> delete_credential ( credential ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Credentials.html#delete_credential/1"},{"type":"function","title":"Lightning.Credentials.get_credential!/1","doc":"Gets a single credential. Raises Ecto.NoResultsError if the Credential does not exist. Examples iex> get_credential! ( 123 ) % Credential { } iex> get_credential! ( 456 ) ** (Ecto.NoResultsError)","ref":"Lightning.Credentials.html#get_credential!/1"},{"type":"function","title":"Lightning.Credentials.invalid_projects_for_user/2","doc":"Given a credential and a user, returns a list of invalid projects—i.e., those that the credential is shared with but that the user does not have access to. This is used to generate a validation error when a credential cannot be transferred. Examples 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" ]","ref":"Lightning.Credentials.html#invalid_projects_for_user/2"},{"type":"function","title":"Lightning.Credentials.list_credentials/0","doc":"Returns the list of credentials. Examples iex> list_credentials ( ) [ % Credential { } , ... ]","ref":"Lightning.Credentials.html#list_credentials/0"},{"type":"function","title":"Lightning.Credentials.list_credentials/1","doc":"","ref":"Lightning.Credentials.html#list_credentials/1"},{"type":"function","title":"Lightning.Credentials.list_credentials_for_user/1","doc":"Returns the list of credentials for a given user. Examples iex> list_credentials_for_user ( 123 ) [ % Credential { user_id : 123 } , % Credential { user_id : 123 } , ... ]","ref":"Lightning.Credentials.html#list_credentials_for_user/1"},{"type":"function","title":"Lightning.Credentials.maybe_refresh_token/1","doc":"","ref":"Lightning.Credentials.html#maybe_refresh_token/1"},{"type":"function","title":"Lightning.Credentials.sensitive_values_for/1","doc":"","ref":"Lightning.Credentials.html#sensitive_values_for/1"},{"type":"function","title":"Lightning.Credentials.update_credential/2","doc":"Updates a credential. Examples iex> update_credential ( credential , %{ field : new_value } ) { :ok , % Credential { } } iex> update_credential ( credential , %{ field : bad_value } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Credentials.html#update_credential/2"},{"type":"module","title":"Lightning.Credentials.Audit","doc":"Model for storing changes to Credentials","ref":"Lightning.Credentials.Audit.html"},{"type":"function","title":"Lightning.Credentials.Audit.event/4","doc":"","ref":"Lightning.Credentials.Audit.html#event/4"},{"type":"function","title":"Lightning.Credentials.Audit.save/1","doc":"","ref":"Lightning.Credentials.Audit.html#save/1"},{"type":"module","title":"Lightning.Credentials.Credential","doc":"The Credential model.","ref":"Lightning.Credentials.Credential.html"},{"type":"type","title":"Lightning.Credentials.Credential.t/0","doc":"","ref":"Lightning.Credentials.Credential.html#t:t/0"},{"type":"module","title":"Lightning.Credentials.Schema","doc":"Structure that can parse JsonSchemas (using ExJsonSchema ) and validate changesets for a given schema.","ref":"Lightning.Credentials.Schema.html"},{"type":"function","title":"Lightning.Credentials.Schema.new/2","doc":"","ref":"Lightning.Credentials.Schema.html#new/2"},{"type":"function","title":"Lightning.Credentials.Schema.properties/2","doc":"","ref":"Lightning.Credentials.Schema.html#properties/2"},{"type":"function","title":"Lightning.Credentials.Schema.required?/2","doc":"","ref":"Lightning.Credentials.Schema.html#required?/2"},{"type":"function","title":"Lightning.Credentials.Schema.validate/2","doc":"","ref":"Lightning.Credentials.Schema.html#validate/2"},{"type":"type","title":"Lightning.Credentials.Schema.t/0","doc":"","ref":"Lightning.Credentials.Schema.html#t:t/0"},{"type":"module","title":"Lightning.Credentials.SchemaDocument","doc":"Provides facilities to dynamically create and validate a changeset for a given Schema","ref":"Lightning.Credentials.SchemaDocument.html"},{"type":"function","title":"Lightning.Credentials.SchemaDocument.changeset/3","doc":"","ref":"Lightning.Credentials.SchemaDocument.html#changeset/3"},{"type":"module","title":"Lightning.Credentials.SensitiveValues","doc":"Functions to pull out sensitive values inside a credential. These values are used to scrub logs for leaked secrets.","ref":"Lightning.Credentials.SensitiveValues.html"},{"type":"function","title":"Lightning.Credentials.SensitiveValues.flatten_map/1","doc":"Keys that are not considered sensitive","ref":"Lightning.Credentials.SensitiveValues.html#flatten_map/1"},{"type":"function","title":"Lightning.Credentials.SensitiveValues.secret_values/1","doc":"Given a map, find all values allowed (via @safe_keys ) and return them as a list.","ref":"Lightning.Credentials.SensitiveValues.html#secret_values/1"},{"type":"type","title":"Lightning.Credentials.SensitiveValues.pairs/0","doc":"","ref":"Lightning.Credentials.SensitiveValues.html#t:pairs/0"},{"type":"type","title":"Lightning.Credentials.SensitiveValues.raw_pairs/0","doc":"","ref":"Lightning.Credentials.SensitiveValues.html#t:raw_pairs/0"},{"type":"module","title":"Lightning.Invocation","doc":"The Invocation context.","ref":"Lightning.Invocation.html"},{"type":"function","title":"Lightning.Invocation.change_dataclip/2","doc":"Returns an %Ecto.Changeset{} for tracking dataclip changes. Examples iex> change_dataclip ( dataclip ) % Ecto.Changeset { data : % Dataclip { } }","ref":"Lightning.Invocation.html#change_dataclip/2"},{"type":"function","title":"Lightning.Invocation.change_run/2","doc":"Returns an %Ecto.Changeset{} for tracking run changes. Examples iex> change_run ( run ) % Ecto.Changeset { data : % Run { } }","ref":"Lightning.Invocation.html#change_run/2"},{"type":"function","title":"Lightning.Invocation.create_dataclip/1","doc":"Creates a dataclip. Examples iex> create_dataclip ( %{ field : value } ) { :ok , % Dataclip { } } iex> create_dataclip ( %{ field : bad_value } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Invocation.html#create_dataclip/1"},{"type":"function","title":"Lightning.Invocation.create_log_line/2","doc":"","ref":"Lightning.Invocation.html#create_log_line/2"},{"type":"function","title":"Lightning.Invocation.create_run/1","doc":"Creates a run. Examples iex> create_run ( %{ field : value } ) { :ok , % Run { } } iex> create_run ( %{ field : bad_value } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Invocation.html#create_run/1"},{"type":"function","title":"Lightning.Invocation.delete_dataclip/1","doc":"Deletes a dataclip. Examples iex> delete_dataclip ( dataclip ) { :ok , % Dataclip { } } iex> delete_dataclip ( dataclip ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Invocation.html#delete_dataclip/1"},{"type":"function","title":"Lightning.Invocation.delete_run/1","doc":"Deletes a run. Examples iex> delete_run ( run ) { :ok , % Run { } } iex> delete_run ( run ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Invocation.html#delete_run/1"},{"type":"function","title":"Lightning.Invocation.filter_run_body_and_logs_where/2","doc":"","ref":"Lightning.Invocation.html#filter_run_body_and_logs_where/2"},{"type":"function","title":"Lightning.Invocation.filter_run_finished_after_where/1","doc":"","ref":"Lightning.Invocation.html#filter_run_finished_after_where/1"},{"type":"function","title":"Lightning.Invocation.filter_run_finished_before_where/1","doc":"","ref":"Lightning.Invocation.html#filter_run_finished_before_where/1"},{"type":"function","title":"Lightning.Invocation.filter_run_status_where/1","doc":"","ref":"Lightning.Invocation.html#filter_run_status_where/1"},{"type":"function","title":"Lightning.Invocation.filter_workflow_where/1","doc":"","ref":"Lightning.Invocation.html#filter_workflow_where/1"},{"type":"function","title":"Lightning.Invocation.filter_workorder_insert_after_where/1","doc":"","ref":"Lightning.Invocation.html#filter_workorder_insert_after_where/1"},{"type":"function","title":"Lightning.Invocation.filter_workorder_insert_before_where/1","doc":"","ref":"Lightning.Invocation.html#filter_workorder_insert_before_where/1"},{"type":"function","title":"Lightning.Invocation.get_dataclip/1","doc":"Gets a single dataclip given one of: a Dataclip uuid a Run model Returns nil if the Dataclip does not exist. Examples iex> get_dataclip ( "27b73932-16c7-4a72-86a3-85d805ccff98" ) % Dataclip { } iex> get_dataclip ( "27b73932-16c7-4a72-86a3-85d805ccff98" ) nil iex> get_dataclip ( % Run { id : "a uuid" } ) % Dataclip { }","ref":"Lightning.Invocation.html#get_dataclip/1"},{"type":"function","title":"Lightning.Invocation.get_dataclip!/1","doc":"Gets a single dataclip. Raises Ecto.NoResultsError if the Dataclip does not exist. Examples iex> get_dataclip! ( 123 ) % Dataclip { } iex> get_dataclip! ( 456 ) ** (Ecto.NoResultsError)","ref":"Lightning.Invocation.html#get_dataclip!/1"},{"type":"function","title":"Lightning.Invocation.get_dataclip_query/1","doc":"Query for retrieving the dataclip that a runs starting dataclip.","ref":"Lightning.Invocation.html#get_dataclip_query/1"},{"type":"function","title":"Lightning.Invocation.get_result_dataclip_query/1","doc":"Query for retrieving the dataclip that was the result of a successful run.","ref":"Lightning.Invocation.html#get_result_dataclip_query/1"},{"type":"function","title":"Lightning.Invocation.get_run!/1","doc":"Gets a single run. Raises Ecto.NoResultsError if the Run does not exist. Examples iex> get_run! ( 123 ) % Run { } iex> get_run! ( 456 ) ** (Ecto.NoResultsError)","ref":"Lightning.Invocation.html#get_run!/1"},{"type":"function","title":"Lightning.Invocation.get_run_with_job!/1","doc":"Fetches a run and preloads the job via the run's event.","ref":"Lightning.Invocation.html#get_run_with_job!/1"},{"type":"function","title":"Lightning.Invocation.get_workorders_by_ids/1","doc":"","ref":"Lightning.Invocation.html#get_workorders_by_ids/1"},{"type":"function","title":"Lightning.Invocation.list_dataclips/0","doc":"Returns the list of dataclips. Examples iex> list_dataclips ( ) [ % Dataclip { } , ... ]","ref":"Lightning.Invocation.html#list_dataclips/0"},{"type":"function","title":"Lightning.Invocation.list_dataclips/1","doc":"","ref":"Lightning.Invocation.html#list_dataclips/1"},{"type":"function","title":"Lightning.Invocation.list_dataclips_for_job/1","doc":"","ref":"Lightning.Invocation.html#list_dataclips_for_job/1"},{"type":"function","title":"Lightning.Invocation.list_dataclips_query/1","doc":"","ref":"Lightning.Invocation.html#list_dataclips_query/1"},{"type":"function","title":"Lightning.Invocation.list_runs/0","doc":"Returns the list of runs. Examples iex> list_runs ( ) [ % Run { } , ... ]","ref":"Lightning.Invocation.html#list_runs/0"},{"type":"function","title":"Lightning.Invocation.list_runs_for_project/2","doc":"","ref":"Lightning.Invocation.html#list_runs_for_project/2"},{"type":"function","title":"Lightning.Invocation.list_runs_for_project_query/1","doc":"","ref":"Lightning.Invocation.html#list_runs_for_project_query/1"},{"type":"function","title":"Lightning.Invocation.list_work_orders_for_project_query/2","doc":"","ref":"Lightning.Invocation.html#list_work_orders_for_project_query/2"},{"type":"function","title":"Lightning.Invocation.search_workorders/1","doc":"","ref":"Lightning.Invocation.html#search_workorders/1"},{"type":"function","title":"Lightning.Invocation.search_workorders/3","doc":"","ref":"Lightning.Invocation.html#search_workorders/3"},{"type":"function","title":"Lightning.Invocation.update_dataclip/2","doc":"Updates a dataclip. Examples iex> update_dataclip ( dataclip , %{ field : new_value } ) { :ok , % Dataclip { } } iex> update_dataclip ( dataclip , %{ field : bad_value } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Invocation.html#update_dataclip/2"},{"type":"function","title":"Lightning.Invocation.update_run/2","doc":"Updates a run. Examples iex> update_run ( run , %{ field : new_value } ) { :ok , % Run { } } iex> update_run ( run , %{ field : bad_value } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Invocation.html#update_run/2"},{"type":"function","title":"Lightning.Invocation.with_attempts/1","doc":"","ref":"Lightning.Invocation.html#with_attempts/1"},{"type":"module","title":"Lightning.Invocation.Dataclip","doc":"Ecto model for Dataclips. Dataclips represent some data that arrived in the system, and records both the data and the source of the data. Types :http_request The data arrived via a webhook. :global Was created manually, and is intended to be used multiple times. When repetitive static data is needed to be maintained, instead of hard-coding into a Job - a more convenient solution is to create a :global Dataclip and access it inside the Job. :run_result The final state of a successful run. :saved_input An arbitrary input, created by a user. (Only configuration will be overwritten.)","ref":"Lightning.Invocation.Dataclip.html"},{"type":"function","title":"Lightning.Invocation.Dataclip.get_types/0","doc":"","ref":"Lightning.Invocation.Dataclip.html#get_types/0"},{"type":"function","title":"Lightning.Invocation.Dataclip.new/1","doc":"","ref":"Lightning.Invocation.Dataclip.html#new/1"},{"type":"function","title":"Lightning.Invocation.Dataclip.validate_by_type/1","doc":"Append validations based on the type of the Dataclip. :run_result must have an associated Run model.","ref":"Lightning.Invocation.Dataclip.html#validate_by_type/1"},{"type":"type","title":"Lightning.Invocation.Dataclip.source_type/0","doc":"","ref":"Lightning.Invocation.Dataclip.html#t:source_type/0"},{"type":"type","title":"Lightning.Invocation.Dataclip.t/0","doc":"","ref":"Lightning.Invocation.Dataclip.html#t:t/0"},{"type":"module","title":"Lightning.Invocation.LogLine","doc":"Ecto model for run logs.","ref":"Lightning.Invocation.LogLine.html"},{"type":"function","title":"Lightning.Invocation.LogLine.validate/1","doc":"","ref":"Lightning.Invocation.LogLine.html#validate/1"},{"type":"type","title":"Lightning.Invocation.LogLine.t/0","doc":"","ref":"Lightning.Invocation.LogLine.html#t:t/0"},{"type":"module","title":"Lightning.Invocation.Query","doc":"Query functions for working with Runs and Dataclips","ref":"Lightning.Invocation.Query.html"},{"type":"function","title":"Lightning.Invocation.Query.last_run_for_job/1","doc":"The last run for a job","ref":"Lightning.Invocation.Query.html#last_run_for_job/1"},{"type":"function","title":"Lightning.Invocation.Query.last_successful_run_for_job/1","doc":"The last run for a job for a particular exit code, used in scheduler","ref":"Lightning.Invocation.Query.html#last_successful_run_for_job/1"},{"type":"function","title":"Lightning.Invocation.Query.runs_for/1","doc":"Runs for a specific user","ref":"Lightning.Invocation.Query.html#runs_for/1"},{"type":"function","title":"Lightning.Invocation.Query.runs_with_code/2","doc":"The last run for a job for a particular exit code, used in scheduler","ref":"Lightning.Invocation.Query.html#runs_with_code/2"},{"type":"module","title":"Lightning.Invocation.Run","doc":"Ecto model for Runs. A run represents the work initiated for a Job with an input dataclip. Once completed (successfully) it will have an output_dataclip associated with it as well.","ref":"Lightning.Invocation.Run.html"},{"type":"function","title":"Lightning.Invocation.Run.new/1","doc":"","ref":"Lightning.Invocation.Run.html#new/1"},{"type":"function","title":"Lightning.Invocation.Run.new_from/1","doc":"Creates a new Run changeset, but copies over certain fields. This is used to create new runs for retrys.","ref":"Lightning.Invocation.Run.html#new_from/1"},{"type":"type","title":"Lightning.Invocation.Run.t/0","doc":"","ref":"Lightning.Invocation.Run.html#t:t/0"},{"type":"module","title":"Lightning.InvocationReason","doc":"Ecto model for InvocationReasons.","ref":"Lightning.InvocationReason.html"},{"type":"function","title":"Lightning.InvocationReason.new/1","doc":"","ref":"Lightning.InvocationReason.html#new/1"},{"type":"function","title":"Lightning.InvocationReason.validate_by_trigger_type/1","doc":"","ref":"Lightning.InvocationReason.html#validate_by_trigger_type/1"},{"type":"type","title":"Lightning.InvocationReason.source_type/0","doc":"","ref":"Lightning.InvocationReason.html#t:source_type/0"},{"type":"type","title":"Lightning.InvocationReason.t/0","doc":"","ref":"Lightning.InvocationReason.html#t:t/0"},{"type":"module","title":"Lightning.InvocationReasons","doc":"The InvocationReasons context.","ref":"Lightning.InvocationReasons.html"},{"type":"function","title":"Lightning.InvocationReasons.build/2","doc":"","ref":"Lightning.InvocationReasons.html#build/2"},{"type":"function","title":"Lightning.InvocationReasons.create_reason/1","doc":"Creates a reason. Examples iex> create_reason ( %{ field : value } ) { :ok , % InvocationReason { } } iex> create_reason ( %{ field : bad_value } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.InvocationReasons.html#create_reason/1"},{"type":"type","title":"Lightning.InvocationReasons.reason_type/0","doc":"","ref":"Lightning.InvocationReasons.html#t:reason_type/0"},{"type":"module","title":"Lightning.Pipeline","doc":"Service class to coordinate the running of jobs, and their downstream jobs.","ref":"Lightning.Pipeline.html"},{"type":"function","title":"Lightning.Pipeline.assemble_logs_for_run/1","doc":"Return all logs for a run as a string of text, separated by new line breaks","ref":"Lightning.Pipeline.html#assemble_logs_for_run/1"},{"type":"function","title":"Lightning.Pipeline.logs_for_run/1","doc":"Return all logs for a run as a list","ref":"Lightning.Pipeline.html#logs_for_run/1"},{"type":"function","title":"Lightning.Pipeline.process/1","doc":"","ref":"Lightning.Pipeline.html#process/1"},{"type":"module","title":"Lightning.Pipeline.Runner","doc":"Job running entrypoint","ref":"Lightning.Pipeline.Runner.html"},{"type":"function","title":"Lightning.Pipeline.Runner.create_dataclip_from_result/2","doc":"Creates a dataclip linked to the run that just finished. If either the file doesn't exist or there is a JSON decoding error, it logs and returns an error tuple.","ref":"Lightning.Pipeline.Runner.html#create_dataclip_from_result/2"},{"type":"function","title":"Lightning.Pipeline.Runner.find_or_install_adaptor/1","doc":"Make sure an adaptor matching the name is available. If it is available, return it's Engine.Adaptor struct - if not then install it.","ref":"Lightning.Pipeline.Runner.html#find_or_install_adaptor/1"},{"type":"function","title":"Lightning.Pipeline.Runner.scrub_result/1","doc":"Scrubs values from all keys in configuration, will be replaced by extensions to scrubber.ex, which is currently only used for logs.","ref":"Lightning.Pipeline.Runner.html#scrub_result/1"},{"type":"function","title":"Lightning.Pipeline.Runner.start/2","doc":"Execute a Run. Given a valid run: Persist the Dataclip and the Job's body to disk Create a blank output file on disk Build up a %Lightning.Runtime.Runspec{} with the paths, and adaptor module name And start it via Handler.start/2 . The callbacks implemented on Handler ( c:Handler.on_start/1 and c:Handler.on_finish/2 ) update the run when a Run is started and when it's finished, attaching the exit_code and log when they are available.","ref":"Lightning.Pipeline.Runner.html#start/2"},{"type":"module","title":"Lightning.Pipeline.Runner.Handler","doc":"Custom handler callbacks for Lightnings use of Engine to execute runs.","ref":"Lightning.Pipeline.Runner.Handler.html"},{"type":"function","title":"Lightning.Pipeline.Runner.Handler.on_start/1","doc":"The on_start handler updates the run, setting the started_at time and stamping the run with the ID of the credential that was used, if any, to facilitate easier auditing.","ref":"Lightning.Pipeline.Runner.Handler.html#on_start/1"},{"type":"function","title":"Lightning.Pipeline.Runner.Handler.stop/1","doc":"","ref":"Lightning.Pipeline.Runner.Handler.html#stop/1"},{"type":"type","title":"Lightning.Pipeline.Runner.Handler.handler_opts/0","doc":"","ref":"Lightning.Pipeline.Runner.Handler.html#t:handler_opts/0"},{"type":"module","title":"Lightning.Pipeline.StateAssembler","doc":"Facilities for building the state for a Run How state is assembled 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 > } Saved inputs Saved custom inputs will only have state.configuration changed, everything else will remain as displayed. Flow Jobs When a Job is triggered by a previous Jobs success or failure these are the rules for constructing that Jobs state: For jobs that trigger on it's upstream jobs failure, the event will have the previous runs input dataclip as its input dataclip. The state will also have the log of the previous run attached on the error key. For Jobs triggered by a previous success, the run will have the previous runs output dataclip as its input dataclip. :run_result dataclips are expected to already have a data key, and are merged into the root.","ref":"Lightning.Pipeline.StateAssembler.html"},{"type":"function","title":"Lightning.Pipeline.StateAssembler.assemble/1","doc":"Assemble state for use in a Run.","ref":"Lightning.Pipeline.StateAssembler.html#assemble/1"},{"type":"module","title":"Lightning.Jobs","doc":"The Jobs context.","ref":"Lightning.Jobs.html"},{"type":"function","title":"Lightning.Jobs.change_job/2","doc":"Returns an %Ecto.Changeset{} for tracking job changes. Examples iex> change_job ( job ) % Ecto.Changeset { data : % Job { } }","ref":"Lightning.Jobs.html#change_job/2"},{"type":"function","title":"Lightning.Jobs.create_job/1","doc":"Creates a job. Examples iex> create_job ( %{ field : value } ) { :ok , % Job { } } iex> create_job ( %{ field : bad_value } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Jobs.html#create_job/1"},{"type":"function","title":"Lightning.Jobs.delete_job/1","doc":"Deletes a job. Examples iex> delete_job ( job ) { :ok , % Job { } } iex> delete_job ( job ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Jobs.html#delete_job/1"},{"type":"function","title":"Lightning.Jobs.get_downstream_jobs_for/2","doc":"Returns the list of downstream jobs for a given job, optionally matching a specific trigger type. When downstream_jobs_for is called without a trigger that means its between jobs when it called with a trigger that means we are starting from outside the pipeline","ref":"Lightning.Jobs.html#get_downstream_jobs_for/2"},{"type":"function","title":"Lightning.Jobs.get_job/1","doc":"","ref":"Lightning.Jobs.html#get_job/1"},{"type":"function","title":"Lightning.Jobs.get_job!/1","doc":"Gets a single job. Raises Ecto.NoResultsError if the Job does not exist. Examples iex> get_job! ( 123 ) % Job { } iex> get_job! ( 456 ) ** (Ecto.NoResultsError)","ref":"Lightning.Jobs.html#get_job!/1"},{"type":"function","title":"Lightning.Jobs.get_upstream_jobs_for/1","doc":"Returns the list of jobs excluding the one given.","ref":"Lightning.Jobs.html#get_upstream_jobs_for/1"},{"type":"function","title":"Lightning.Jobs.jobs_for_project/1","doc":"","ref":"Lightning.Jobs.html#jobs_for_project/1"},{"type":"function","title":"Lightning.Jobs.jobs_for_project_query/1","doc":"","ref":"Lightning.Jobs.html#jobs_for_project_query/1"},{"type":"function","title":"Lightning.Jobs.list_active_cron_jobs/0","doc":"","ref":"Lightning.Jobs.html#list_active_cron_jobs/0"},{"type":"function","title":"Lightning.Jobs.list_jobs/0","doc":"Returns the list of jobs.","ref":"Lightning.Jobs.html#list_jobs/0"},{"type":"function","title":"Lightning.Jobs.list_jobs_for_workflow/1","doc":"","ref":"Lightning.Jobs.html#list_jobs_for_workflow/1"},{"type":"function","title":"Lightning.Jobs.update_job/2","doc":"Updates a job. Examples iex> update_job ( job , %{ field : new_value } ) { :ok , % Job { } } iex> update_job ( job , %{ field : bad_value } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Jobs.html#update_job/2"},{"type":"module","title":"Lightning.Jobs.Job","doc":"Ecto model for Jobs. A Job contains the fields for defining a job. body The expression/javascript code name A plain text identifier adaptor An NPM style string that contains both the module name and it's version. E.g. @openfn/language-http@v1.2.3 or @openfn/language-foo@latest . While the version suffix isn't enforced here as it's not strictly necessary in this context, the front end will ensure a version is stated ( @latest being the default).","ref":"Lightning.Jobs.Job.html"},{"type":"function","title":"Lightning.Jobs.Job.new/1","doc":"","ref":"Lightning.Jobs.Job.html#new/1"},{"type":"function","title":"Lightning.Jobs.Job.put_project_credential/2","doc":"","ref":"Lightning.Jobs.Job.html#put_project_credential/2"},{"type":"function","title":"Lightning.Jobs.Job.put_workflow/2","doc":"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 ] ) job = % Job { } |> Ecto.Changeset . change ( ) |> Job . put_workflow ( workflow ) |> Job . changeset ( attrs )","ref":"Lightning.Jobs.Job.html#put_workflow/2"},{"type":"function","title":"Lightning.Jobs.Job.validate/1","doc":"","ref":"Lightning.Jobs.Job.html#validate/1"},{"type":"type","title":"Lightning.Jobs.Job.t/0","doc":"","ref":"Lightning.Jobs.Job.html#t:t/0"},{"type":"module","title":"Lightning.Jobs.Query","doc":"Query module for finding Jobs.","ref":"Lightning.Jobs.Query.html"},{"type":"function","title":"Lightning.Jobs.Query.enabled_cron_jobs_by_edge/0","doc":"Returns active jobs with their cron triggers for use in the cron scheduling service.","ref":"Lightning.Jobs.Query.html#enabled_cron_jobs_by_edge/0"},{"type":"function","title":"Lightning.Jobs.Query.jobs_for/1","doc":"Returns all jobs accessible to a user, via their projects or all jobs in a given project.","ref":"Lightning.Jobs.Query.html#jobs_for/1"},{"type":"module","title":"Lightning.Jobs.Scheduler","doc":"The Scheduler is responsible for finding jobs that are ready to run based on their cron schedule, and then running them.","ref":"Lightning.Jobs.Scheduler.html"},{"type":"function","title":"Lightning.Jobs.Scheduler.enqueue_cronjobs/0","doc":"Find and start any cronjobs that are scheduled to run for a given time (defaults to the current time).","ref":"Lightning.Jobs.Scheduler.html#enqueue_cronjobs/0"},{"type":"function","title":"Lightning.Jobs.Scheduler.enqueue_cronjobs/1","doc":"","ref":"Lightning.Jobs.Scheduler.html#enqueue_cronjobs/1"},{"type":"module","title":"Lightning.Jobs.Trigger","doc":"Ecto model for Triggers. Triggers represent the criteria in which a Job might be invoked. Types Webhook (default) A webhook trigger allows a Job to invoked (via Lightning.Invocation ) when it's endpoint is called.","ref":"Lightning.Jobs.Trigger.html"},{"type":"function","title":"Lightning.Jobs.Trigger.new/1","doc":"","ref":"Lightning.Jobs.Trigger.html#new/1"},{"type":"function","title":"Lightning.Jobs.Trigger.validate/1","doc":"","ref":"Lightning.Jobs.Trigger.html#validate/1"},{"type":"type","title":"Lightning.Jobs.Trigger.t/0","doc":"","ref":"Lightning.Jobs.Trigger.html#t:t/0"},{"type":"type","title":"Lightning.Jobs.Trigger.trigger_type/0","doc":"","ref":"Lightning.Jobs.Trigger.html#t:trigger_type/0"},{"type":"module","title":"Lightning.Projects","doc":"The Projects context.","ref":"Lightning.Projects.html"},{"type":"function","title":"Lightning.Projects.cancel_scheduled_deletion/1","doc":"","ref":"Lightning.Projects.html#cancel_scheduled_deletion/1"},{"type":"function","title":"Lightning.Projects.change_project/2","doc":"Returns an %Ecto.Changeset{} for tracking project changes. Examples iex> change_project ( project ) % Ecto.Changeset { data : % Project { } }","ref":"Lightning.Projects.html#change_project/2"},{"type":"function","title":"Lightning.Projects.create_project/1","doc":"Creates a project. Examples iex> create_project ( %{ field : value } ) { :ok , % Project { } } iex> create_project ( %{ field : bad_value } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Projects.html#create_project/1"},{"type":"function","title":"Lightning.Projects.delete_project/1","doc":"Deletes a project and its related data, including workflows, work orders, runs, jobs, attempts, triggers, project users, project credentials, and dataclips Examples iex> delete_project ( project ) { :ok , % Project { } } iex> delete_project ( project ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Projects.html#delete_project/1"},{"type":"function","title":"Lightning.Projects.export_project/2","doc":"Exports a project as yaml. Examples iex> export_project ( :yaml , project_id ) { :ok , string }","ref":"Lightning.Projects.html#export_project/2"},{"type":"function","title":"Lightning.Projects.get_project/1","doc":"","ref":"Lightning.Projects.html#get_project/1"},{"type":"function","title":"Lightning.Projects.get_project!/1","doc":"Gets a single project. Raises Ecto.NoResultsError if the Project does not exist. Examples iex> get_project! ( 123 ) % Project { } iex> get_project! ( 456 ) ** (Ecto.NoResultsError)","ref":"Lightning.Projects.html#get_project!/1"},{"type":"function","title":"Lightning.Projects.get_project_credential/2","doc":"","ref":"Lightning.Projects.html#get_project_credential/2"},{"type":"function","title":"Lightning.Projects.get_project_user/1","doc":"","ref":"Lightning.Projects.html#get_project_user/1"},{"type":"function","title":"Lightning.Projects.get_project_user/2","doc":"","ref":"Lightning.Projects.html#get_project_user/2"},{"type":"function","title":"Lightning.Projects.get_project_user!/1","doc":"Gets a single project_user. Raises Ecto.NoResultsError if the ProjectUser does not exist. Examples iex> get_project_user! ( 123 ) % ProjectUser { } iex> get_project_user! ( 456 ) ** (Ecto.NoResultsError)","ref":"Lightning.Projects.html#get_project_user!/1"},{"type":"function","title":"Lightning.Projects.get_project_user_role/2","doc":"Returns the role of a user in a project. Possible roles are :admin, :viewer, :editor, and :owner Examples iex> get_project_user_role ( user , project ) :admin iex> get_project_user_role ( user , project ) :viewer iex> get_project_user_role ( user , project ) :editor iex> get_project_user_role ( user , project ) :owner","ref":"Lightning.Projects.html#get_project_user_role/2"},{"type":"function","title":"Lightning.Projects.get_project_with_users!/1","doc":"Gets a single project with it's members via project_users . Raises Ecto.NoResultsError if the Project does not exist. Examples iex> get_project! ( 123 ) % Project { } iex> get_project! ( 456 ) ** (Ecto.NoResultsError)","ref":"Lightning.Projects.html#get_project_with_users!/1"},{"type":"function","title":"Lightning.Projects.get_projects_for_user/1","doc":"","ref":"Lightning.Projects.html#get_projects_for_user/1"},{"type":"function","title":"Lightning.Projects.is_member_of?/2","doc":"","ref":"Lightning.Projects.html#is_member_of?/2"},{"type":"function","title":"Lightning.Projects.list_project_credentials/1","doc":"","ref":"Lightning.Projects.html#list_project_credentials/1"},{"type":"function","title":"Lightning.Projects.list_projects/0","doc":"Returns the list of projects. Examples iex> list_projects ( ) [ % Project { } , ... ]","ref":"Lightning.Projects.html#list_projects/0"},{"type":"function","title":"Lightning.Projects.perform/1","doc":"Perform, when called with %{"type" => "purge_deleted"} will find projects that are ready for permanent deletion and purge them.","ref":"Lightning.Projects.html#perform/1"},{"type":"function","title":"Lightning.Projects.project_attempt_run_query/1","doc":"","ref":"Lightning.Projects.html#project_attempt_run_query/1"},{"type":"function","title":"Lightning.Projects.project_attempts_query/1","doc":"","ref":"Lightning.Projects.html#project_attempts_query/1"},{"type":"function","title":"Lightning.Projects.project_credentials_query/1","doc":"","ref":"Lightning.Projects.html#project_credentials_query/1"},{"type":"function","title":"Lightning.Projects.project_dataclip_invocation_reason/1","doc":"","ref":"Lightning.Projects.html#project_dataclip_invocation_reason/1"},{"type":"function","title":"Lightning.Projects.project_dataclips_query/1","doc":"","ref":"Lightning.Projects.html#project_dataclips_query/1"},{"type":"function","title":"Lightning.Projects.project_jobs_query/1","doc":"","ref":"Lightning.Projects.html#project_jobs_query/1"},{"type":"function","title":"Lightning.Projects.project_run_invocation_reasons/1","doc":"","ref":"Lightning.Projects.html#project_run_invocation_reasons/1"},{"type":"function","title":"Lightning.Projects.project_runs_query/1","doc":"","ref":"Lightning.Projects.html#project_runs_query/1"},{"type":"function","title":"Lightning.Projects.project_trigger_invocation_reason/1","doc":"","ref":"Lightning.Projects.html#project_trigger_invocation_reason/1"},{"type":"function","title":"Lightning.Projects.project_triggers_query/1","doc":"","ref":"Lightning.Projects.html#project_triggers_query/1"},{"type":"function","title":"Lightning.Projects.project_user_role_query/2","doc":"","ref":"Lightning.Projects.html#project_user_role_query/2"},{"type":"function","title":"Lightning.Projects.project_users_query/1","doc":"","ref":"Lightning.Projects.html#project_users_query/1"},{"type":"function","title":"Lightning.Projects.project_workflows_query/1","doc":"","ref":"Lightning.Projects.html#project_workflows_query/1"},{"type":"function","title":"Lightning.Projects.project_workorders_query/1","doc":"","ref":"Lightning.Projects.html#project_workorders_query/1"},{"type":"function","title":"Lightning.Projects.projects_for_user_query/1","doc":"","ref":"Lightning.Projects.html#projects_for_user_query/1"},{"type":"function","title":"Lightning.Projects.schedule_project_deletion/1","doc":"Given a project, this function sets a scheduled deletion date based on the PURGE_DELETED_AFTER_DAYS environment variable. If no ENV is set, this date defaults to NOW but the automatic project purge cronjob will never run. (Note that subsequent logins will be blocked for projects pending deletion.)","ref":"Lightning.Projects.html#schedule_project_deletion/1"},{"type":"function","title":"Lightning.Projects.select_first_project_for_user/1","doc":"","ref":"Lightning.Projects.html#select_first_project_for_user/1"},{"type":"function","title":"Lightning.Projects.update_project/2","doc":"Updates a project. Examples iex> update_project ( project , %{ field : new_value } ) { :ok , % Project { } } iex> update_project ( project , %{ field : bad_value } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Projects.html#update_project/2"},{"type":"function","title":"Lightning.Projects.update_project_user/2","doc":"Updates a project user. Examples iex> update_project_user ( project_user , %{ field : new_value } ) { :ok , % ProjectUser { } } iex> update_project_user ( projectUser , %{ field : bad_value } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Projects.html#update_project_user/2"},{"type":"function","title":"Lightning.Projects.url_safe_project_name/1","doc":"","ref":"Lightning.Projects.html#url_safe_project_name/1"},{"type":"function","title":"Lightning.Projects.validate_for_deletion/2","doc":"Returns an %Ecto.Changeset{} for changing the project scheduled_deletion. Examples iex> validate_for_deletion ( project ) % Ecto.Changeset { data : % Project { } }","ref":"Lightning.Projects.html#validate_for_deletion/2"},{"type":"module","title":"Lightning.Projects.Project","doc":"Project model","ref":"Lightning.Projects.Project.html"},{"type":"function","title":"Lightning.Projects.Project.deletion_changeset/2","doc":"Changeset to validate a project deletion request, the user must enter the projects name to confirm.","ref":"Lightning.Projects.Project.html#deletion_changeset/2"},{"type":"function","title":"Lightning.Projects.Project.validate/1","doc":"","ref":"Lightning.Projects.Project.html#validate/1"},{"type":"type","title":"Lightning.Projects.Project.t/0","doc":"","ref":"Lightning.Projects.Project.html#t:t/0"},{"type":"module","title":"Lightning.Projects.ProjectCredential","doc":"Join table to assign credentials to a project","ref":"Lightning.Projects.ProjectCredential.html"},{"type":"type","title":"Lightning.Projects.ProjectCredential.t/0","doc":"","ref":"Lightning.Projects.ProjectCredential.html#t:t/0"},{"type":"module","title":"Lightning.Projects.ProjectUser","doc":"Join table to assign users to a project","ref":"Lightning.Projects.ProjectUser.html"},{"type":"type","title":"Lightning.Projects.ProjectUser.t/0","doc":"","ref":"Lightning.Projects.ProjectUser.html#t:t/0"},{"type":"module","title":"Lightning.Projects.ProjectUser.DigestEnum","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.cast/1","doc":"Callback implementation for Ecto.Type.cast/1 .","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#cast/1"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.create_type/0","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#create_type/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.drop_type/0","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#drop_type/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.dump/1","doc":"Callback implementation for Ecto.Type.dump/1 .","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#dump/1"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.embed_as/1","doc":"Callback implementation for Ecto.Type.embed_as/1 .","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#embed_as/1"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.equal?/2","doc":"Callback implementation for Ecto.Type.equal?/2 .","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#equal?/2"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.load/1","doc":"Callback implementation for Ecto.Type.load/1 .","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#load/1"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.schema/0","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#schema/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.schemaless_type/0","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#schemaless_type/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.type/0","doc":"Callback implementation for Ecto.Type.type/0 .","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#type/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.valid_value?/1","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#valid_value?/1"},{"type":"type","title":"Lightning.Projects.ProjectUser.DigestEnum.t/0","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#t:t/0"},{"type":"module","title":"Lightning.Projects.ProjectUser.RolesEnum","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.cast/1","doc":"Callback implementation for Ecto.Type.cast/1 .","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#cast/1"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.create_type/0","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#create_type/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.drop_type/0","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#drop_type/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.dump/1","doc":"Callback implementation for Ecto.Type.dump/1 .","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#dump/1"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.embed_as/1","doc":"Callback implementation for Ecto.Type.embed_as/1 .","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#embed_as/1"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.equal?/2","doc":"Callback implementation for Ecto.Type.equal?/2 .","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#equal?/2"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.load/1","doc":"Callback implementation for Ecto.Type.load/1 .","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#load/1"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.schema/0","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#schema/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.schemaless_type/0","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#schemaless_type/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.type/0","doc":"Callback implementation for Ecto.Type.type/0 .","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#type/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.valid_value?/1","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#valid_value?/1"},{"type":"type","title":"Lightning.Projects.ProjectUser.RolesEnum.t/0","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#t:t/0"},{"type":"module","title":"Lightning.Projects.Provisioner","doc":"Provides functions for importing projects. This module is used by the provisioning HTTP API. When providing a project to import, all records must have an id field. It's up to the caller to ensure that the id is unique and generated ahead of time in the case of new records.","ref":"Lightning.Projects.Provisioner.html"},{"type":"function","title":"Lightning.Projects.Provisioner.import_document/3","doc":"Import a project.","ref":"Lightning.Projects.Provisioner.html#import_document/3"},{"type":"function","title":"Lightning.Projects.Provisioner.load_project/1","doc":"Load a project by ID, including all workflows and their associated jobs, triggers and edges. Returns nil if the project does not exist.","ref":"Lightning.Projects.Provisioner.html#load_project/1"},{"type":"function","title":"Lightning.Projects.Provisioner.parse_document/2","doc":"","ref":"Lightning.Projects.Provisioner.html#parse_document/2"},{"type":"function","title":"Lightning.Projects.Provisioner.validate_extraneous_params/1","doc":"Validate that there are no extraneous parameters in the changeset. For all params in the changeset, ensure that the param is in the list of known fields in the schema.","ref":"Lightning.Projects.Provisioner.html#validate_extraneous_params/1"},{"type":"module","title":"Lightning.Runtime.ChildProcess","doc":"Provides an interface between a RunSpec and the shell. Internally it calls node , and more specifically the OpenFn core CLI.","ref":"Lightning.Runtime.ChildProcess.html"},{"type":"function","title":"Lightning.Runtime.ChildProcess.build_command/1","doc":"Builds up a string for shell execution based on the RunSpec","ref":"Lightning.Runtime.ChildProcess.html#build_command/1"},{"type":"function","title":"Lightning.Runtime.ChildProcess.build_env/2","doc":"","ref":"Lightning.Runtime.ChildProcess.html#build_env/2"},{"type":"function","title":"Lightning.Runtime.ChildProcess.run/2","doc":"","ref":"Lightning.Runtime.ChildProcess.html#run/2"},{"type":"behaviour","title":"Lightning.Runtime.Handler","doc":"A strategy for executing things via ChildProcess. This module handles the dirty bits, setting up processes and coordinating results (and logs) as they arrive. Since it is a macro, see Lightning.Pipeline.Runner.Handler for a usage example.","ref":"Lightning.Runtime.Handler.html"},{"type":"function","title":"Lightning.Runtime.Handler.env/2","doc":"","ref":"Lightning.Runtime.Handler.html#env/2"},{"type":"callback","title":"Lightning.Runtime.Handler.env/2","doc":"","ref":"Lightning.Runtime.Handler.html#c:env/2"},{"type":"callback","title":"Lightning.Runtime.Handler.log_callback/3","doc":"","ref":"Lightning.Runtime.Handler.html#c:log_callback/3"},{"type":"function","title":"Lightning.Runtime.Handler.on_finish/2","doc":"","ref":"Lightning.Runtime.Handler.html#on_finish/2"},{"type":"callback","title":"Lightning.Runtime.Handler.on_finish/2","doc":"","ref":"Lightning.Runtime.Handler.html#c:on_finish/2"},{"type":"function","title":"Lightning.Runtime.Handler.on_log_emit/2","doc":"","ref":"Lightning.Runtime.Handler.html#on_log_emit/2"},{"type":"callback","title":"Lightning.Runtime.Handler.on_log_emit/2","doc":"","ref":"Lightning.Runtime.Handler.html#c:on_log_emit/2"},{"type":"function","title":"Lightning.Runtime.Handler.on_start/1","doc":"","ref":"Lightning.Runtime.Handler.html#on_start/1"},{"type":"callback","title":"Lightning.Runtime.Handler.on_start/1","doc":"Called with context, if any - when the Run has been started.","ref":"Lightning.Runtime.Handler.html#c:on_start/1"},{"type":"callback","title":"Lightning.Runtime.Handler.start/2","doc":"The entrypoint for executing a run.","ref":"Lightning.Runtime.Handler.html#c:start/2"},{"type":"type","title":"Lightning.Runtime.Handler.t/0","doc":"","ref":"Lightning.Runtime.Handler.html#t:t/0"},{"type":"module","title":"Lightning.Runtime.LogAgent","doc":"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" } )","ref":"Lightning.Runtime.LogAgent.html"},{"type":"function","title":"Lightning.Runtime.LogAgent.buffer/1","doc":"","ref":"Lightning.Runtime.LogAgent.html#buffer/1"},{"type":"function","title":"Lightning.Runtime.LogAgent.child_spec/1","doc":"Returns a specification to start this module under a supervisor. See Supervisor .","ref":"Lightning.Runtime.LogAgent.html#child_spec/1"},{"type":"function","title":"Lightning.Runtime.LogAgent.process_chunk/2","doc":"","ref":"Lightning.Runtime.LogAgent.html#process_chunk/2"},{"type":"function","title":"Lightning.Runtime.LogAgent.start_link/1","doc":"","ref":"Lightning.Runtime.LogAgent.html#start_link/1"},{"type":"type","title":"Lightning.Runtime.LogAgent.logline/0","doc":"","ref":"Lightning.Runtime.LogAgent.html#t:logline/0"},{"type":"module","title":"Lightning.Runtime.LogAgent.StringBuffer","doc":"Internal datastructure to hold and process new bytes for a list of characters. By checking the if the buffer is a complete grapheme, emitting the buffer once valid and returning nil otherwise. In the case of emojis and other language character sets, a character (in UTF-8) can be between 1-4 bytes - when streaming logs for example it's quite easy to receive less than the whole character which can result in crashes or corrupt text.","ref":"Lightning.Runtime.LogAgent.StringBuffer.html"},{"type":"function","title":"Lightning.Runtime.LogAgent.StringBuffer.buffer/1","doc":"","ref":"Lightning.Runtime.LogAgent.StringBuffer.html#buffer/1"},{"type":"function","title":"Lightning.Runtime.LogAgent.StringBuffer.new/0","doc":"","ref":"Lightning.Runtime.LogAgent.StringBuffer.html#new/0"},{"type":"function","title":"Lightning.Runtime.LogAgent.StringBuffer.process_chunk/2","doc":"","ref":"Lightning.Runtime.LogAgent.StringBuffer.html#process_chunk/2"},{"type":"function","title":"Lightning.Runtime.LogAgent.StringBuffer.reduce_chunk/2","doc":"","ref":"Lightning.Runtime.LogAgent.StringBuffer.html#reduce_chunk/2"},{"type":"type","title":"Lightning.Runtime.LogAgent.StringBuffer.t/0","doc":"","ref":"Lightning.Runtime.LogAgent.StringBuffer.html#t:t/0"},{"type":"module","title":"Lightning.Runtime.Result","doc":"Data structure used to represent the result of a Run executed by Lightning.Runtime.ChildProcess .","ref":"Lightning.Runtime.Result.html"},{"type":"function","title":"Lightning.Runtime.Result.new/1","doc":"","ref":"Lightning.Runtime.Result.html#new/1"},{"type":"type","title":"Lightning.Runtime.Result.t/0","doc":"","ref":"Lightning.Runtime.Result.html#t:t/0"},{"type":"module","title":"Lightning.Runtime.RunSpec","doc":"A struct containing all the parameters required to execute a Job.","ref":"Lightning.Runtime.RunSpec.html"},{"type":"function","title":"Lightning.Runtime.RunSpec.new/1","doc":"","ref":"Lightning.Runtime.RunSpec.html#new/1"},{"type":"type","title":"Lightning.Runtime.RunSpec.t/0","doc":"","ref":"Lightning.Runtime.RunSpec.html#t:t/0"},{"type":"exception","title":"Lightning.MetadataService.Error","doc":"","ref":"Lightning.MetadataService.Error.html"},{"type":"function","title":"Lightning.MetadataService.Error.message/1","doc":"Callback implementation for Exception.message/1 .","ref":"Lightning.MetadataService.Error.html#message/1"},{"type":"function","title":"Lightning.MetadataService.Error.new/1","doc":"","ref":"Lightning.MetadataService.Error.html#new/1"},{"type":"type","title":"Lightning.MetadataService.Error.t/0","doc":"","ref":"Lightning.MetadataService.Error.html#t:t/0"},{"type":"extras","title":"Lightning","doc":"OpenFn/Lightning is a fully open source, workflow automation platform that's used to automate critical business processes and integrate information systems. From last-mile services to national-level reporting, it boosts efficiency & effectiveness while enabling secure, stable, scalable interoperability at all levels. Read more about Lightning on OpenFn/Docs . Lightning is the latest "v2" of OpenFn, the Digital Public Good for workflow automation . Use Lightning to visually build, execute and manage workflows. The latest version of the OpenFn technology - first launched in 2014, now tried and tested by NGOs in over 40 countries Fully open source (no premium features or community edition, you get the same product whether using SaaS or self-hosted) Recognised as a Digital Public Good by the DPGA and a Global Good for Health by Digital Square","ref":"readme.html"},{"type":"extras","title":"Lightning - Contents","doc":"Demo Sign up for the BETA Features Getting started Run Lightning via Docker Deploy Lightning on Docker or Kubernetes Run Lightning on your local machine (contributors) Troubleshooting Contribute Project Configuration Quickstart Generate the documentation Security and standards Server specs for self-hosting Questions or feedback?","ref":"readme.html#contents"},{"type":"extras","title":"Lightning - Demo","doc":"Watch a quick demo here: https://www.youtube.com/watch?v=BNaxlHAWb5I Explore our demo app* with username: demo@openfn.org , password: welcome123 , or read through the features section to view screenshots of the app. *Note that the demo app refreshes daily, so do not configure workflows you want to save.","ref":"readme.html#demo"},{"type":"extras","title":"Lightning - Register for a Beta account","doc":"Register for a Beta account at app.openfn.org and go through the quick-start guide to get familiar with the app.","ref":"readme.html#register-for-a-beta-account"},{"type":"extras","title":"Lightning - Features","doc":"Build Plan and build workflows using Lightning's visual interface to quickly define when, where and what you want your automation to do. Use our CLI to quickly build, edit and deploy projects from the comfort of your own code editor. Monitor Monitor all workflow activity in one place. Filter and search runs to identify issues that need addressing and follow how a specific request has been processed Configure alerts to be notified on run failures Receive a project digest for a daily/weekly/monthly summary of your project activity Manage Manage users and access by project Roles and permissions Authorization is a central part of Lightning. As such, users are given different roles which determine what level of access they have for resources in the application. For more details about roles and permissions in Lightning, please refer to our documentation . Roadmap View our public roadmap here .","ref":"readme.html#features"},{"type":"extras","title":"Lightning - Getting Started","doc":"If you only want to RUN Lightning on your own server, we recommend using Docker. If you want to DEPLOY Lightning, we recommend Docker builds and Kubernetes. If you want to CONTRIBUTE to the project, we recommend running Lightning on your local machine .","ref":"readme.html#getting-started"},{"type":"extras","title":"Lightning - Run via Docker","doc":"Install the latest version of Docker Clone this repo using git Copy the .env.example file to .env Run docker compose run --rm web mix ecto.migrate By default the application will be running at localhost:4000 . You can then rebuild and run with docker compose build and docker compose up . See "Problems with Docker" for additional troubleshooting help. Note that you can also create your own docker-compose.yml file, configuring a postgres database and using a pre-built image from Dockerhub.","ref":"readme.html#run-via-docker"},{"type":"extras","title":"Lightning - Deploy on external infrastructure","doc":"See Deployment for more detailed information.","ref":"readme.html#deploy-on-external-infrastructure"},{"type":"extras","title":"Lightning - Run Lightning locally","doc":"Clone the repo and optionally set ENVs git clone git@github.com:OpenFn/Lightning.git # or from YOUR fork! cd Lightning cp .env.example .env # and adjust as necessary! Take note of database names and ports in particular—they've got to match across your Postgres setup and your ENVs. You can run lightning without any ENVs assuming a vanilla postgres setup (see below), but you may want to make adjustments. Database Setup If you're already using Postgres locally, create a new database called lightning_dev , for example. If you'd rather use Docker to set up a Postgres DB, create a new volume and image: docker volume create lightning-postgres-data docker create \\ --name lightning-postgres \\ --mount source=lightning-postgres-data,target=/var/lib/postgresql/data \\ --publish 5432:5432 \\ -e POSTGRES_PASSWORD=postgres \\ postgres:15.3-alpine docker start lightning-postgres Elixir & Ecto Setup We use asdf to configure our local environments. Included in the repo is a .tool-versions file that is read by asdf in order to dynamically make the specified versions of Elixir and Erlang available. You'll need asdf plugins for Erlang , NodeJs Elixir and k6 . asdf install # Install language versions mix local.hex mix deps.get mix local.rebar --force mix ecto.create # Create a development database in Postgres mix ecto.migrate [[ $(uname -m) == 'arm64' ]] && mix compile.rambo # Force compile rambo if on M1 mix lightning.install_runtime mix lightning.install_schemas npm install --prefix assets Run the app Lightning is a web app. To run it in interactive Elixir mode, start the development server by running with your environment variables by running: iex -S mix phx.server or if you have set up custom environment variables, run: env $(cat .env | grep -v "#" | xargs ) iex -S mix phx.server Once the server has started, head to localhost:4000 in your browser. Run the tests Before the first time running the tests, you need a test database setup. MIX_ENV=test mix ecto.create And then after that run the tests using: MIX_ENV=test mix test We also have test.watch installed which can be used to rerun the tests on file changes.","ref":"readme.html#run-lightning-locally"},{"type":"extras","title":"Lightning - Benchmarking","doc":"We are using k6 to benchmark Lightning. Under benchmarking folder you can find a script for benchmarking Webhook Workflows. See Benchmarking for more detailed information.","ref":"readme.html#benchmarking"},{"type":"extras","title":"Lightning - Troubleshooting","doc":"Trouble with environment variables For troubleshooting custom environment variable configuration it's important to know how an Elixir app loads and modifies configuration. The order is as follows: Stuff in config.exs is loaded. That is then modified (think: overwritten ) by stuff your ENV-specific config: dev.exs , prod.exs or test.exs . That is then modified by runtime.exs which is where you are allowed to use System.env() Finally init/2 (if present in a child application) gets called (which takes the config which has been set in steps 1-3) when that child application is started during the parent app startup defined in application.ex . Problems with Postgres If you're having connecting issues with Postgres, check the database section of your .env to ensure the DB url is correctly set for your environment — note that composing a DB url out of other, earlier declared variables, does not work while using xargs . Problems with Debian If you're getting this error on debian == > earmark_parser Compiling 1 file ( . yrl ) / usr / lib / erlang / lib / parsetools - 2.3 . 1 / include / yeccpre . hrl : no such file or directory could not compile dependency :earmark_parser , "mix compile" failed . You can recompile this dependency with "mix deps.compile earmark_parser" , update it with "mix deps.update earmark_parser" or clean it with "mix deps.clean earmark_parser" You need to install erlang development environment sudo apt install erlang-dev refer to this issue Problems with Docker Versions The build may not work on old versions of Docker and Docker compose. It has been tested against: Docker version 20.10 . 17 , build 100 c701 Docker Compose version v2 . 6.0 Problems with rambo When running mix compile.rambo on Apple Silicon (an Apple M1/M2, macarm , aarch64-apple-darwin ) and encountering the following error: ** (RuntimeError) Rambo does not ship with binaries for your environment. aarch64 - apple - darwin22 . 3.0 detected Install the Rust compiler so a binary can be prepared for you . lib / mix / tasks / compile . rambo . ex : 89 : Mix.Tasks.Compile.Rambo . compile! / 0 lib / mix / tasks / compile . rambo . ex : 51 : Mix.Tasks.Compile.Rambo . run / 1 ( mix 1.14 . 2 ) lib / mix / task . ex : 421 : anonymous fn / 3 in Mix.Task . run_task / 4 ( mix 1.14 . 2 ) lib / mix / cli . ex : 84 : Mix.CLI . run_task / 2 You can resolve this error by installing the Rust compiler using Homebrew. Run the following command in your terminal: brew install rust If you have already compiled Rambo explicitly via mix compile.rambo , and you are still seeing the following error: sh : / path_to_directory / Lightning / _build / dev / lib / rambo / priv / rambo : No such file or directory sh : line 0 : exec : / path_to_directory / Lightning / _build / dev / lib / rambo / priv / rambo : cannot execute : No such file or directory You can try renaming deps/rambo/priv/rambo-mac to deps/rambo/priv/rambo . If neither of the approaches above work, please raise an issue. Starting from scratch If you're actively working with docker, you start experiencing issues, and you would like to start from scratch you can clean up everything and start over like this: # To remove any ignored files and reset your .env to it's example git clean -fdx && cp .env.example .env # You can skip the line below if you want to keep your database docker compose down --rmi all --volumes docker compose build --no-cache web && \\ docker compose create --force-recreate docker compose run --rm web mix ecto.migrate docker compose up","ref":"readme.html#troubleshooting"},{"type":"extras","title":"Lightning - Project Configuration Quickstart","doc":"For help getting started with your OpenFn/Lightning Project and Workflows configuration, check out the Lightning Quickstart Guidance on OpenFn/Docs.","ref":"readme.html#project-configuration-quickstart"},{"type":"extras","title":"Lightning - Contribute to this project","doc":"First, thanks for being here! You're contributing to a digital public good that will always be free and open source and aimed at serving innovative NGOs, governments, and social impact organizations the world over! You rock. ❤️ FYI, Lightning is built in Elixir , harnessing the Phoenix Framework . Currently, the only unbundled dependency is a PostgreSQL database. If you'd like to contribute to this projects, follow the steps below: Assign yourself to an issue Read through the existing issues , assign yourself to the issue you have chosen. Leave a comment on the issue to let us know you'll be working on it, and if you have any questions of clarifications that would help you get started ask them there - we will get back to you as soon as possible. If there isn't already an issue for the feature you would like to contribute, please start a discussion in our community forum . Open a pull request Clone the Lightning repository, then fork it . Run through setting up your environment and make your changes. Make sure you have written your tests and updated /CHANGELOG.md (in the 'Unreleased' section, add a short description of the changes you are making, along with a link to your issue). Open a draft pull request by clicking "Contribute > Open Pull Request" from your forked repository. Fill out the pull request template (this will be added automatically for you), then make sure to self-review your code and go through the 'Review checklist'. Don't worry about the QA checkbox, our product manager Amber will tick that once she has reviewed your PR. You can leave any notes for the reviewer in a comment. Once you're ready to submit a pull request, you can mark your draft PR as 'Ready for review' and assign @stuartc or @taylordowns2000.","ref":"readme.html#contribute-to-this-project"},{"type":"extras","title":"Lightning - Generating Documentation","doc":"You can generate the HTML and EPUB documentation locally using: mix docs and opening doc/index.html in your browser.","ref":"readme.html#generating-documentation"},{"type":"extras","title":"Lightning - Security and Standards","doc":"We use a host of common Elixir static analysis tools to help us avoid common pitfalls and make sure we keep everything clean and consistent. In addition to our test suite, you can run the following commands: mix format --check-formatted Code formatting checker, run again without the --check-formatted flag to have your code automatically changed. mix dialyzer Static analysis for type mismatches and other common warnings. See dialyxir . mix credo Static analysis for consistency, and coding standards. See Credo . mix sobelow Check for commonly known security exploits. See Sobelow . MIX_ENV=test mix coveralls Test coverage reporter. This command also runs the test suite, and can be used in place of mix test when checking everything before pushing your code. See excoveralls . For convenience there is a verify mix task that runs all of the above and defaults the MIX_ENV to test . For more guidance on security best practices for workflow automation implementations, check out OpenFn Docs: docs.openfn.org/documentation/getting-started/security","ref":"readme.html#security-and-standards"},{"type":"extras","title":"Lightning - Server Specs for Self-Hosting","doc":"For recommend server specifications for self-hosting of Lightning, check out this Community topic: community.openfn.org/t/specs-for-self-hosting-lightning/292","ref":"readme.html#server-specs-for-self-hosting"},{"type":"extras","title":"Lightning - Support","doc":"If you have any questions, feedback, or issues, please: Post on the OpenFn Community at community.openfn.org Open an issue directly on this Github Repo: github.com/OpenFn/Lightning/issues","ref":"readme.html#support"},{"type":"extras","title":"Deployment","doc":"","ref":"deployment.html"},{"type":"extras","title":"Deployment - Encryption","doc":"Lightning enforces encryption at rest for Credentials, for which an encryption key must be provided when running in production. The key is expected to be a randomized set of bytes, 32 long; and Base64 encoded when setting the environment variable. There is a mix task that can generate keys in the correct shape for use as an environment variable: mix lightning.gen_encryption_key 0bJ9w+hn4ebQrsCaWXuA9JY49fP9kbHmywGd5K7k+/s= Copy your key (NOT THIS ONE) and set it as PRIMARY_ENCRYPTION_KEY in your environment.","ref":"deployment.html#encryption"},{"type":"extras","title":"Deployment - Environment Variables","doc":"Note that for secure deployments, it's recommended to use a combination of secrets and configMaps to generate secure environment variables. ADAPTORS_PATH - where you store your locally installed adaptors DISABLE_DB_SSL - in production the use of an SSL conntection to Postgres is required by default, setting this to "true" allows unencrypted connections to the database. This is strongly discouraged in real production environment. K8S_HEADLESS_SERVICE - this environment variable is automatically set if you're running on GKE and it is used to establish an Erlang node cluster. Note that if you're not using Kubernetes, the "gossip" strategy is used for establish clusters. LISTEN_ADDRESS " - the address the web server should bind to, defaults to 127.0.0.1 to block access from other machines. LOG_LEVEL - how noisy you want the logs to be (e.g. debug , info ) MAX_RUN_DURATION - the maximum time (in milliseconds) that jobs are allowed to run (keep this below your termination_grace_period if using kubernetes) MIX_ENV - your mix env, likely prod for deployment NODE_ENV - node env, likely production for deployment ORIGINS - the allowed origins for web traffic to the backend PORT - the port your Phoenix app runs on PRIMARY_ENCRYPTION_KEY - a base64 encoded 32 character long string. See Encryption . SCHEMAS_PATH - path to the credential schemas that provide forms for different adaptors SECRET_KEY_BASE - a secret key used as a base to generate secrets for encrypting and signing data. SENTRY_DSN - if using Sentry for error monitoring, your DSN URL_HOST - the host, used for writing urls (e.g., demo.openfn.org ) URL_PORT - the port, usually 443 for production URL_SCHEME - the scheme for writing urls, (e.g., https ) Google Using your Google Cloud account, provision a new OAuth 2.0 Client with the 'Web application' type. Set the callback url to: https://<ENDPOINT DOMAIN>/authenticate/callback . Replacing ENDPOINT DOMAIN with the host name of your instance. Once the client has been created, get/download the OAuth client JSON and set the following environment variables: GOOGLE_CLIENT_ID - Which is client_id from the client details. GOOGLE_CLIENT_SECRET - client_secret from the client details.","ref":"deployment.html#environment-variables"},{"type":"extras","title":"Benchmarking","doc":"Execute the following steps to run a benchmark on Lightning: Make sure you have k6 installed locally. If you're using asdf you can run asdf install in the project root. Spin up your Lightning local instance Run the demo setup script: mix run --no-start priv/repo/demo.exs The webhookURL is already set to default to the webhook created in the demo data In another terminal (do not stop the Lightning server) run the benchmarking/script.js file using the following command k6 run benchmarking/script.js If the script exits succesfully, this means the app met the defined performance thresholds. To collect the benchmarking data in a CSV file, run the previous command with the --out filename option. k6 run --out csv=test_results.csv benchmarking/script.js See results output for other available output formats.","ref":"benchmarking.html"},{"type":"extras","title":"Provisioning","doc":"Lightning offers the ability to configure projects via the HTTP API. By providing a JSON document with the desired configuration, the project can be configured to your liking.","ref":"provisioning.html"},{"type":"extras","title":"Provisioning - Using the API","doc":"The API is available at /api/provision , and expects an application/json Content-Type. Authentication The API requires a valid auth token to be provided in the Authorization header. Example Request curl -X POST \\ -d @project.json \\ -H "Authorization: Bearer $TOKEN" \\ -H "Content-Type: application/json" \\ $ENDPOINT/api/provision","ref":"provisioning.html#using-the-api"},{"type":"extras","title":"Provisioning - Document Structure","doc":"The provisioning document is a JSON document with the project at the root. All entities must have an id field, which is a UUIDv4 string. In the case of new entities, this must be generated by the client. The API is idempotent, and the distinction between creating and updating is determined by the presence of the id field. { "id": "<<project-id>>", "name": "<<project-name>>", "workflows": [ { "id": "<<workflow-id>>", "name": "<<workflow-name>>", "jobs": [ { "id": "<<job-id>>", "name": "<<job-name>>", "body": "<<job-body>>", "adaptor": "<<adaptor-name>>", "enabled": true } // ... more jobs ], "triggers": [ { "id": "<<trigger-id>>", "name": "<<trigger-name>>", "type": "webhook" } // ... more triggers ], "edges": [ { "id": "<<edge-id>>", "source_trigger_id": "<<trigger-id>>", "target_job_id": "<<job-id>>" } // ... more edges ] } // ... more workflows ] }","ref":"provisioning.html#document-structure"},{"type":"extras","title":"Provisioning - API Behaviour","doc":"The API expects all existing entities to be provided in the provisioning document. If the document provided is out of date (e.g. a new job was added on the server), a new reference document should be fetched and the changes applied to it. Deleting Entities Entities can be deleted by setting the disabled key to true . Example: { "id": "<<project-id>>", "workflows": [ { "id": "<<workflow-id>>", "jobs": [ { "id": "<<job-id>>", "delete": true // <== delete this job } ] } ] }","ref":"provisioning.html#api-behaviour"},{"type":"extras","title":"Provisioning - Relationship with Projects as Code","doc":"The Projects as Code spec is a superset of the provisioning API. Projects as Code allows for the user to specify a key for each entity, which makes it easier to manage the project in the future. For example: name: my-project workflows: workflow-one: jobs: job-one: body: | console.log("Hello World"); adaptor: '@openfn/language-common' enabled: true triggers: trigger-one: type: webhook edges: - source_trigger: trigger-one target_job: job-one The above YAML document illustrates the use of keys being used to identify entities. Allowing the user to provision the same project to multiple environments. The API is unaware of 'keys', and expects IDs to be provided by the client. In order to convert the above YAML document to a provisioning document, the CLI uses a local state file (if available) to map the keys to UUIDs. Using the example above a state file might look like this: { "id": "f6ba9a8c-b687-473a-908e-e250686f1eed", "workflows": { "workflow-one": { "id": "f206aa85-4fce-492e-94eb-ffd32c75d178", "jobs": {}, "triggers": {} } } } The state file shows that the project and workflow already exist, but the job, trigger and edge do not. In order to create these new entities, IDs will be applied them. On a successful application of the provisioning document, the state file will be updated to reflect the new IDs and entities. { "id": "f6ba9a8c-b687-473a-908e-e250686f1eed", "workflows": { "workflow-one": { "id": "f206aa85-4fce-492e-94eb-ffd32c75d178", "jobs": { "job-one": { "id": "18ed71de-caf8-4822-aefc-5b19351f4016" } }, "triggers": { "trigger-one": { "id": "e0b9f357-9cf9-4206-9924-4d5674aad830" } }, "edges": [ { "id": "c239d994-6662-4637-90f8-0293c924b461", "source_trigger_id": "e0b9f357-9cf9-4206-9924-4d5674aad830", "target_job_id": "18ed71de-caf8-4822-aefc-5b19351f4016" } ] } } }","ref":"provisioning.html#relationship-with-projects-as-code"},{"type":"extras","title":"Changelog","doc":"All notable changes to this project will be documented in this file. The format is based on Keep a Changelog , and this project adheres to Semantic Versioning .","ref":"changelog.html"},{"type":"extras","title":"Changelog - [Unreleased]","doc":"Added Introduces Github sync feature, users can now setup our github app on their instance and sync projects using our latest portability spec #970 Support Backup Codes for Multi-Factor Authentication 937 Log a warning in the console when the Editor/docs component is given latest #958 Changed Fixed","ref":"changelog.html#unreleased"},{"type":"extras","title":"Changelog - [v0.7.3] - 2023-08-15","doc":"Added Changed Version control in project settings is now named Export your project #1015 Fixed Tooltip for credential select in Job Edit form is cut off #972 Dataclip type and state assembly notice for creating new dataclip dropped during refactor #975","ref":"changelog.html#v0-7-3-2023-08-15"},{"type":"extras","title":"Changelog - [v0.7.2] - 2023-08-10","doc":"Added Changed NodeJs security patch 1009 Fixed","ref":"changelog.html#v0-7-2-2023-08-10"},{"type":"extras","title":"Changelog - [v0.7.1] - 2023-08-04","doc":"Added Changed Fixed Fixed flickery icons on new workflow job creation.","ref":"changelog.html#v0-7-1-2023-08-04"},{"type":"extras","title":"Changelog - [v0.7.0] - 2023-08-04","doc":"Added Project owners can require MFA for their users 892 Changed Moved to Elixir 1.15 and Erlang 26.0.2 to sort our an annoying ElixirLS issue that was slowing down our engineers. Update Debian base to use bookworm (Debian 12) for our Docker images Change new credential modal to take up less space on the screen #931 Placeholder nodes are now purely handled client-side Fixed Fix issue creating a new credential from the Job editor where the new credential was not being set on the job. #951 Fix issue where checking a credential type radio button shows as unchecked on first click. #976 Return the pre-filled workflow names #971 Fix version reporting and external reset_demo() call via Application.spec() #1010 Fixed issue where entering a placeholder name through the form would result an in unsaveable workflow #1001 Ensure the DownloadController checks for authentication and authorisation.","ref":"changelog.html#v0-7-0-2023-08-04"},{"type":"extras","title":"Changelog - [v0.7.0-pre5] - 2023-07-28","doc":"Added Changed Unless otherwise specified, only show workorders with activity in last 14 days #968 Fixed","ref":"changelog.html#v0-7-0-pre5-2023-07-28"},{"type":"extras","title":"Changelog - [v0.7.0-pre4] - 2023-07-27","doc":"Added Changed Don't add cast fragments if the search_term is nil #968 Fixed","ref":"changelog.html#v0-7-0-pre4-2023-07-27"},{"type":"extras","title":"Changelog - [v0.7.0-pre3] - 2023-07-26","doc":"Added Changed Fixed Fixed an issue with newly created edges that prevented downstream jobs 977","ref":"changelog.html#v0-7-0-pre3-2023-07-26"},{"type":"extras","title":"Changelog - [v0.7.0-pre2] - 2023-07-26","doc":"Note that this is a pre-release with a couple of known bugs that are tracked in the Nodes and Edges epic . Added Added ability for a user to enable MFA on their account; using 2FA apps like Authy, Google Authenticator etc #890 Write/run sql script to convert triggers #875 Export projects as .yaml via UI #249 Changed In v0.7.0 we change the underlying workflow building and execution infrastructure to align with a standard "nodes and edges" design for directed acyclic graphs (DAGs). Make sure to run the migrations! 793 Fixed Propagate url pushState/changes to Workflow Diagram selection #944 Fix issue when deleting nodes from the workflow editor #830 Fix issue when clicking a trigger on a new/unsaved workflow #954","ref":"changelog.html#v0-7-0-pre2-2023-07-26"},{"type":"extras","title":"Changelog - [0.6.7] - 2023-07-13","doc":"Added Add feature to bulk rerun work orders from a specific step in their workflow; e.g., "rerun these 50 work orders, starting each at step 4." #906 Changed Fixed Oban exception: "value too long" when log lines are longer than 255 chars #929","ref":"changelog.html#0-6-7-2023-07-13"},{"type":"extras","title":"Changelog - [0.6.6] - 2023-06-30","doc":"Added Add public API token to the demo site setup script Check and renew OAuth credentials when running a job #646 Fixed Remove google sheets from adaptors list until supporting oauth flow #792 Remove duplicate google sheets adaptor display on credential type picklist #663 Fix demo setup script for calling from outside the app on Kubernetes deployments #917","ref":"changelog.html#0-6-6-2023-06-30"},{"type":"extras","title":"Changelog - [0.6.5] - 2023-06-22","doc":"Added Ability to rerun workorders from start by selecting one of more of them from the History page and clicking the "Rerun" button. #659 Fixed Example runs for demo incorrect #856","ref":"changelog.html#0-6-5-2023-06-22"},{"type":"extras","title":"Changelog - [0.6.3] - 2023-06-15","doc":"Fixed Prevent saving null log lines to the database, fix issue with run display #866","ref":"changelog.html#0-6-3-2023-06-15"},{"type":"extras","title":"Changelog - [0.6.2] - 2023-06-09","doc":"Fixed Fixed viewer permissions for delete workflow Fixed bug with workflow cards #859","ref":"changelog.html#0-6-2-2023-06-09"},{"type":"extras","title":"Changelog - [0.6.1] - 2023-06-08","doc":"Fixed Fixed bug with run logs #864 Correctly stagger demo runs to maintain order #856 Remove Timex use from SetupUtils in favor of DateTime to fix issue when calling it in escript.","ref":"changelog.html#0-6-1-2023-06-08"},{"type":"extras","title":"Changelog - [0.6.0]- 2023-04-12","doc":"Added Create sample runs when generating sample workflow #821 Added a provisioning api for creating and updating projects and their workflows See: PROVISIONING.md #641 Add ability for a superuser to schedule deletion, cancel deletion, and delete projects #757 Add ability for a project owner to schedule deletion, cancel deletion, and delete projects #746 Changed Ability to store run log lines as rows in a separate table #514 Fixed Incorrect project digest queries #768 ] Fix issue when purging deleted users #747 Generate a random name for Workflows when creating one via the UI. #828 Handle error when deleting a job with runs. #814","ref":"changelog.html#0-6-0-2023-04-12"},{"type":"extras","title":"Changelog - [0.5.2]","doc":"Added Add workflow_edges table in preparation for new workflow editor implementation #794 Stamped credential_id on run directly for easier auditing of the history interface. Admins can now see which credential was used to run a run. #800 Better errors when using magic functions: "no magic yet" and "check credential" #812 Changed The delete-project function now delete all associated activities #759 Fixed","ref":"changelog.html#0-5-2"},{"type":"extras","title":"Changelog - [0.5.1] - 2023-04-12","doc":"Added Added ability to create and revoke personal API tokens #147 Add last-used at to API tokens #722 Improved "save" for job builder; users can now press Ctrl + S or ⌘ + S to save new or updated jobs job panel will not close. (Click elsewhere in the canvas or click the "Close" button to close.) #568 Add filtered search params to the history page URL #660 Changed The secret scrubber now ignores booleans 690 Fixed The secret scrubber now properly handles integer secrets from credentials 690 Updated describe-package dependency, fixing sparkles in adaptor-docs 657 Clicks on the workflow canvas were not lining up with the nodes users clicked on; they are now 733 Job panel behaves better when collapsed 774","ref":"changelog.html#0-5-1-2023-04-12"},{"type":"extras","title":"Changelog - [0.5.0] - 2023-04-03","doc":"Added Magic functions that fetch real metadata from connected systems via credentials and suggest completions in the job builder (e.g., pressing control-space when setting the orgUnit attribute for a DHIS2 create operation will pull the actual list of orgUnits with human readable labels and fill in their orgUnit codes upon enter.) 670 A "metadata explorer" to browse actual system metadata for connected instances. 658 Resizable job builder panel for the main canvas/workflow view. 681 Changed Display timezone for cron schedule—it is always UTC. #716 Instance administrators can now configure the interval between when a project owner or user requests deletion and when these records are purged from the database. It defaults to 7, but by providing a PURGE_DELETED_AFTER_DAYS environment variable the grace period can be altered. Note that setting this variable to 0 will make automatic purging never occur but will still make "deleted" projects and users unavailable. This has been requested by certain organizations that must retain audit logs in a Lightning instance. 758 Fixed Locked CLI version to @openfn/cli@0.0.35 . #761","ref":"changelog.html#0-5-0-2023-04-03"},{"type":"extras","title":"Changelog - [0.4.8] - 2023-03-29","doc":"Added Added a test harness for monitoring critical parts of the app using Telemetry #654 Changed Set log level to info for runs. Most of the debug logging is useful for the CLI, but not for Lightning. In the future the log level will be configurable at instance > project > job level by the superuser and any project admin . Renamed license file so that automagic github icon is less confusing Fixed Broken links in failure alert email #732 Registration Submission on app.openfn.org shows internal server error in browser #686 Run the correct runtime install mix task in Dockerfile-dev #541 Users not disabled when scheduled for deletion #719","ref":"changelog.html#0-4-8-2023-03-29"},{"type":"extras","title":"Changelog - [0.4.6] - 2023-03-23","doc":"Added Implement roles and permissions across entire app #645 Fix webhook URL ( https://<<HOST_URL>>/i/cae544ab-03dc-4ccc-a09c-fb4edb255d7a ) for the OpenHIE demo workflow 448 Phoenix Storybook for improved component development Load test for webhook endpoint performance #645 Notify user via email when they're added to a project #306 Added notify user via email when their account is created #307 Changed Improved errors when decoding encryption keys for use with Cloak. #684 Allow users to run ANY job with a custom input. #629 Fixed Ensure JSON schema form inputs are in the same order as they are written in the schema #685","ref":"changelog.html#0-4-6-2023-03-23"},{"type":"extras","title":"Changelog - [0.4.4] - 2023-03-10","doc":"Added Users can receive a digest email reporting on a specified project. #638 #585 Changed Fixed","ref":"changelog.html#0-4-4-2023-03-10"},{"type":"extras","title":"Changelog - [0.4.3] - 2023-03-06","doc":"Added Tooltips on Job Builder panel #650 Changed Upgraded to Phoenix 1.7 (3945856) Fixed Issue with FailureAlerter configuration missing in prod mode.","ref":"changelog.html#0-4-3-2023-03-06"},{"type":"extras","title":"Changelog - [0.4.2] - 2023-02-24","doc":"Added A user can change their own email #247 Added a SCHEMAS_PATH environment variable to override the default folder location for credential schemas #604 Added the ability to configure Google Sheets credentials #536 Function to import a project #574 Changed Users cannot register if they have not selected the terms and conditions #531 Fixed Jobs panel slow for first open after restart #567","ref":"changelog.html#0-4-2-2023-02-24"},{"type":"extras","title":"Changelog - [0.4.0] - 2023-02-08","doc":"Added Added a Delete job button in Inspector Filter workflow runs by text/value in run logs or input body Drop "configuration" key from Run output dataclips after completion Ability to 'rerun' a run from the Run list Attempts and Runs update themselves in the Runs list Configure a project and workflow for a new registering user Run a job with a custom input Added plausible analytics Allow user to click on Webhook Trigger Node to copy webhook URL on workflow diagram Allow any user to delete a credential that they own Create any credential through a form except for OAuth Refit all diagram nodes on browser and container resize Enable distributed Erlang, allowing any number of redundant Lightning nodes to communicate with each other. Users can set up realtime alerts for a project Changed Better code-assist and intelliense in the Job Editor Updated @openfn/workflow-diagram to 0.4.0 Make plus button part of job nodes in Workflow Diagram Updated @openfn/adaptor-docs to 0.0.5 Updated @openfn/describe-package to 0.0.10 Create an follow a manual Run from the Job Inspector View all workflows in a project on the workflows index page Move @openfn/workflow-diagram into the application, the NPM module is now deprecated. Remove workflow name from first node Move the used parts of @openfn/engine into the application. [BREAKING CHANGE] Ported mix openfn.install.runtime into application, use mix lightning.install_runtime . [BREAKING CHANGE] Introduced @openfn/cli as the new runtime for Jobs Rename a workflow through the page heading Hide the dataclips tab for beta Make adaptor default to common@latest Remove jobs list page Better error handling in the docs panel Disable credential ownership transfer in dev and prod environments Add project settings page Change Workorder filters to apply to the aggregate state of the workorder and not the run directly Enable jobs by default Set log level to info Add Beta checkbox to register page User roles and permissions Fixed Don't consider disabled jobs when calculating subsequent runs Fixed overflow on Job Editor Tooltips Fixed auto-scroll when adding a new snippet in the Job Editor Fixed common operation typings in Job Editor","ref":"changelog.html#0-4-0-2023-02-08"},{"type":"extras","title":"Changelog - [0.3.1] - 2022-11-22","doc":"Fixed Fixed bug that attempted to execute HTML scripts in dataclips Fixed bug that prevented workorders from displaying in the order of their last run, descending. Remove alerts after set timeout or close","ref":"changelog.html#0-3-1-2022-11-22"},{"type":"extras","title":"Changelog - [0.3.0] - 2022-11-21","doc":"Added Add seed data for demo site Create adaptor credentials through a form Configure cron expressions through a form View runs grouped by workorders and attempts Run an existing Job with any dataclip uuid from the Job form Changed Redirect users to projects list page when they click on Admin Settings menu Move job, project, input and output Dataclips to Run table Reverse the relationship between Jobs and Triggers. Triggers now can exist on their own; setting the stage for branching and merging workflows Updated Elixir and frontend dependencies [BREAKING CHANGE] Pipeline now uses WorkOrders, previous data is not compatible. Runs, Dataclips and Attempts now all correctly use usec resolution timestamps. Upgraded LiveView to 0.18.0 Upgraded Elixir to 1.14.1 and OTP 25 Workflow Job editor now behaves like a panel Split JobLive.InspectorFormComponent into different plug-able subcomponents Ensure new jobs with cron triggers receive a default frequency Webhooks are now referenced by the trigger id instead of job id. Filter runs by status Filter runs by workflow Filter runs by date View a job run from the runs history View latest matching inputs to run a job with","ref":"changelog.html#0-3-0-2022-11-21"},{"type":"extras","title":"Changelog - [0.2.0] - 2022-09-12","doc":"Changed [BREAKING CHANGE] Add Workflow model, Jobs now belong to a Workflow This is a breaking change to the schema. Use Node.js 18, soon to be in LTS. Visualize success/fail triggers in workflow diagram. Move WorkflowDiagram related actions from DashboardLive into WorkflowLive Move WorkflowDiagram component into liveview, so that we can subscribe to channels (i.e. updating of the diagram when someone changes something). Integrate @openfn/workflow-diagram@0.0.8 and use the new Store interface for updating it. Remove component_mounted event from WorkflowDiagram hook, using a MutationObserver and a Base64 encoded JSON payload. Fixed an issue where the compiler component would try and load a 'nothing adaptor', added a condition to check an adaptor is actually selected. Removed previous Workflow CTE queries, replaced by the introduction of the Workflow model, see ( https://github.com/OpenFn/Lightning/blob/53da6883483e7d8d078783f348da327d1dd72d20/lib/lightning/workflows.ex#L111-L119 ).","ref":"changelog.html#0-2-0-2022-09-12"},{"type":"extras","title":"Changelog - [0.1.13] - 2022-08-29","doc":"Added Allow administrators to configure OIDC providers for authentication (note that this is just for authenticating, not yet for creating new accounts via OIDC) Add Monaco editor to the step/job panel Allow users to delete their own accounts. Schedule their user and credentials data for deletion when they do. Allow superusers to delete a user account. Schedule the user's credentials and user data for deletion when they do. If a user is scheduled for deletion, disable their account and prevent them from logging in. The 'User profile' and 'Credentials' page now have a sidebar menu Changed Project users now have one of the following roles: viewer, editor, admin, owner Users only have the following roles: user, superuser","ref":"changelog.html#0-1-13-2022-08-29"},{"type":"extras","title":"Changelog - [0.1.12] - 2022-08-15","doc":"Added Transfer credential ownership to another user. Create credentials via a form interface* Show "projects with access" in credentials list view. Show job in runs list and run view. Added roles and permissions to workflows and history page #645 *The form is defined by a JSON schema provided by an adaptor, in most cases: e.g., language-dhis2 provides a single schema which defines the required attributes for state.configuration , while language-common provides multiple credential schemas like "oauth" or "basic auth" which define attributes for state.configuration and which might be used by lots of different jobs.) Fixed User menu (top right) appears on top of all other components. User profile screen integrated with the rest of the liveview app.","ref":"changelog.html#0-1-12-2022-08-15"},{"type":"extras","title":"Changelog - [0.1.11] - 2022-08-05","doc":"Fixed Fixed logging in Runner when :debug log level used; note that this caused crashes in Oban","ref":"changelog.html#0-1-11-2022-08-05"},{"type":"extras","title":"Changelog - [0.1.10] - 2022-08-05","doc":"Added Credential auditing Build/version information display for easier debugging Fixed Fixed a bug that enqueued cron-triggered jobs even when they were disabled","ref":"changelog.html#0-1-10-2022-08-05"},{"type":"extras","title":"Changelog - [0.1.9] - 2022-07-27","doc":"Added Navigate to user profile or credentials page and log out through the user icon dropdown Create and edit dataclips Add a production tag to credentials View a dropdown of operations and their description for the language-common v2.0.0-rc2 adaptor (this pattern to be rolled out across adaptors) Changed Navigate between projects through a project picker on the navbar Fixed Run Lightning with docker Security Sensitive credential values are scrubbed from run logs All credentials are encrypted at REST","ref":"changelog.html#0-1-9-2022-07-27"},{"type":"extras","title":"Changelog - [0.1.7] - 2022-06-24","doc":"Added Run a job with a cron trigger Queue jobs via Oban/Postgres Edit jobs via the workflow canvas","ref":"changelog.html#0-1-7-2022-06-24"},{"type":"extras","title":"Changelog - [0.1.6] - 2022-06-07","doc":"Added Register, log in and log out of an account Allow superusers and admin users to create projects Allow admin users to create or disable a user’s account Allow superusers for local deployments to create users and give them access to project spaces Create and edit a job with a webhook, flow/fail or cron trigger Create and edit credentials for a job Copy a job's webhook URL View all workflows in a project visually Deploy lightning locally with Docker Enable a job to automatically process incoming requests Run a job with a webhook or flow/fail trigger View job runs along with their logs, exit code, start and end time View data clips that have initiated job runs (http requests for webhooks, run results) Changed - Removed -","ref":"changelog.html#0-1-6-2022-06-07"}] \ No newline at end of file diff --git a/dist/search_items-F6CB3B65.js b/dist/search_items-F6CB3B65.js new file mode 100644 index 0000000000..961cadf496 --- /dev/null +++ b/dist/search_items-F6CB3B65.js @@ -0,0 +1 @@ +searchNodes=[{"type":"module","title":"Lightning","doc":"Lightning keeps the contexts that define your domain and business logic. Contexts are also responsible for managing your data, regardless if it comes from the database, an external API or others.","ref":"Lightning.html"},{"type":"module","title":"Lightning.AdaptorRegistry","doc":"Registry process to query and maintain a list of adaptors available for writing jobs. Currently it queries NPM for all modules in the @openfn organization and filters out modules that are known not to be adaptors. Usage # Starting the process AdaptorRegistry . start_link ( ) # Getting a list of all adaptors Lightning.AdaptorRegistry.AdaptorRegistry . all ( ) Caching By default the results are cached to disk, and will be reused every start. In order to disable or configure caching pass see: start_link/1 . The process uses :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. Timeouts There is a 'general' timeout of 30s, this is used for GenServer calls like all/1 and also internally when the modules are being queried. NPM can be extremely fast to respond if the package is cached on their side, but can take a couple of seconds if not cached.","ref":"Lightning.AdaptorRegistry.html"},{"type":"function","title":"Lightning.AdaptorRegistry.all/1","doc":"Get the current in-process list of adaptors. This call will wait behind the :continue message when the process starts up, so it may take a while the first time it is called (and the list hasn't been fetched yet).","ref":"Lightning.AdaptorRegistry.html#all/1"},{"type":"function","title":"Lightning.AdaptorRegistry.child_spec/1","doc":"Returns a specification to start this module under a supervisor. See Supervisor .","ref":"Lightning.AdaptorRegistry.html#child_spec/1"},{"type":"function","title":"Lightning.AdaptorRegistry.fetch/0","doc":"Fetch a list of packages for the @openfn organisation","ref":"Lightning.AdaptorRegistry.html#fetch/0"},{"type":"function","title":"Lightning.AdaptorRegistry.latest_for/2","doc":"Get a latest version for a given module.","ref":"Lightning.AdaptorRegistry.html#latest_for/2"},{"type":"function","title":"Lightning.AdaptorRegistry.resolve_adaptor/1","doc":"","ref":"Lightning.AdaptorRegistry.html#resolve_adaptor/1"},{"type":"function","title":"Lightning.AdaptorRegistry.resolve_package_name/1","doc":"Destructures an NPM style package name into module name and version. Example 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 }","ref":"Lightning.AdaptorRegistry.html#resolve_package_name/1"},{"type":"function","title":"Lightning.AdaptorRegistry.resolve_package_name!/1","doc":"Same as resolve_package_name/1 except will throw an exception if a package name cannot be matched.","ref":"Lightning.AdaptorRegistry.html#resolve_package_name!/1"},{"type":"function","title":"Lightning.AdaptorRegistry.start_link/1","doc":"Starts the AdaptorRegistry Options :use_cache (defaults to false) - stores the last set of results on disk and uses the cached file for every subsequent start. It can either be a boolean, or a string - the latter being a file path to set where the cache file is located. :name (defaults to AdaptorRegistry) - the name of the process, useful for testing and/or running multiple versions of the registry","ref":"Lightning.AdaptorRegistry.html#start_link/1"},{"type":"function","title":"Lightning.AdaptorRegistry.versions_for/2","doc":"Get a list of versions for a given module.","ref":"Lightning.AdaptorRegistry.html#versions_for/2"},{"type":"module","title":"Lightning.AdaptorRegistry.Npm","doc":"NPM API functions","ref":"Lightning.AdaptorRegistry.Npm.html"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.delete/3","doc":"Issues a DELETE request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#delete/3"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.delete!/3","doc":"Issues a DELETE request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#delete!/3"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.get/3","doc":"Issues a GET request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#get/3"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.get!/3","doc":"Issues a GET request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#get!/3"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.head/3","doc":"Issues a HEAD request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#head/3"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.head!/3","doc":"Issues a HEAD request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#head!/3"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.options/3","doc":"Issues an OPTIONS request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#options/3"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.options!/3","doc":"Issues a OPTIONS request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#options!/3"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.package_detail/1","doc":"Retrieve all details for an NPM package","ref":"Lightning.AdaptorRegistry.Npm.html#package_detail/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.patch/4","doc":"Issues a PATCH request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#patch/4"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.patch!/4","doc":"Issues a PATCH request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#patch!/4"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.post/4","doc":"Issues a POST request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#post/4"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.post!/4","doc":"Issues a POST request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#post!/4"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_headers/1","doc":"Callback implementation for HTTPoison.Base.process_headers/1 .","ref":"Lightning.AdaptorRegistry.Npm.html#process_headers/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_request_body/1","doc":"Callback implementation for HTTPoison.Base.process_request_body/1 .","ref":"Lightning.AdaptorRegistry.Npm.html#process_request_body/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_request_headers/1","doc":"Callback implementation for HTTPoison.Base.process_request_headers/1 .","ref":"Lightning.AdaptorRegistry.Npm.html#process_request_headers/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_request_options/1","doc":"Callback implementation for HTTPoison.Base.process_request_options/1 .","ref":"Lightning.AdaptorRegistry.Npm.html#process_request_options/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_request_params/1","doc":"Callback implementation for HTTPoison.Base.process_request_params/1 .","ref":"Lightning.AdaptorRegistry.Npm.html#process_request_params/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_response/1","doc":"Callback implementation for HTTPoison.Base.process_response/1 .","ref":"Lightning.AdaptorRegistry.Npm.html#process_response/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_response_chunk/1","doc":"Callback implementation for HTTPoison.Base.process_response_chunk/1 .","ref":"Lightning.AdaptorRegistry.Npm.html#process_response_chunk/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_response_headers/1","doc":"Callback implementation for HTTPoison.Base.process_response_headers/1 .","ref":"Lightning.AdaptorRegistry.Npm.html#process_response_headers/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_response_status_code/1","doc":"Callback implementation for HTTPoison.Base.process_response_status_code/1 .","ref":"Lightning.AdaptorRegistry.Npm.html#process_response_status_code/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_status_code/1","doc":"Callback implementation for HTTPoison.Base.process_status_code/1 .","ref":"Lightning.AdaptorRegistry.Npm.html#process_status_code/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_url/1","doc":"Callback implementation for HTTPoison.Base.process_url/1 .","ref":"Lightning.AdaptorRegistry.Npm.html#process_url/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.put/4","doc":"Issues a PUT request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#put/4"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.put!/4","doc":"Issues a PUT request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#put!/4"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.request/1","doc":"Issues an HTTP request using a Request struct. This function returns {:ok, response} , {:ok, async_response} , or {:ok, maybe_redirect} if the request is successful, {:error, reason} otherwise. Redirect handling If the option :follow_redirect is given, HTTP redirects are automatically follow if the method is set to :get or :head and the response's status_code is 301 , 302 or 307 . If the method is set to :post , then the only status_code that get's automatically followed is 303 . If any other method or status_code is returned, then this function returns a returns a {:ok, %HTTPoison.MaybeRedirect{}} containing the redirect_url for you to re-request with the method set to :get . Examples request = % HTTPoison.Request { method : :post , url : "https://my.website.com" , body : "{ \\" foo \\" : 3}" , headers : [ { "Accept" , "application/json" } ] } request ( request )","ref":"Lightning.AdaptorRegistry.Npm.html#request/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.request/5","doc":"Issues an HTTP request with the given method to the given url. This function is usually used indirectly by get/3 , post/4 , put/4 , etc Args: method - HTTP method as an atom ( :get , :head , :post , :put , :delete , etc.) url - target url as a binary string or char list body - request body. See more below headers - HTTP headers as an orddict (e.g., [{"Accept", "application/json"}] ) options - Keyword list of options Body: see type HTTPoison.Request Options: see type HTTPoison.Request This function returns {:ok, response} , {:ok, async_response} , or {:ok, maybe_redirect} if the request is successful, {:error, reason} otherwise. Redirect handling If the option :follow_redirect is given, HTTP redirects are automatically follow if the method is set to :get or :head and the response's status_code is 301 , 302 or 307 . If the method is set to :post , then the only status_code that get's automatically followed is 303 . If any other method or status_code is returned, then this function returns a returns a {:ok, %HTTPoison.MaybeRedirect{}} containing the redirect_url for you to re-request with the method set to :get . Examples request ( :post , "https://my.website.com" , "{ \\" foo \\" : 3}" , [ { "Accept" , "application/json" } ] )","ref":"Lightning.AdaptorRegistry.Npm.html#request/5"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.request!/5","doc":"Issues an HTTP request with the given method to the given url, raising an exception in case of failure. request!/5 works exactly like request/5 but it returns just the response in case of a successful request, raising an exception in case the request fails.","ref":"Lightning.AdaptorRegistry.Npm.html#request!/5"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.start/0","doc":"Starts HTTPoison and its dependencies.","ref":"Lightning.AdaptorRegistry.Npm.html#start/0"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.stream_next/1","doc":"Requests the next message to be streamed for a given HTTPoison.AsyncResponse . See request!/5 for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#stream_next/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.user_packages/1","doc":"Retrieve all packages for a given user or organization. Return empty list if application cannot connect to NPM. (E.g., because it's started offline.)","ref":"Lightning.AdaptorRegistry.Npm.html#user_packages/1"},{"type":"type","title":"Lightning.AdaptorRegistry.Npm.body/0","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#t:body/0"},{"type":"type","title":"Lightning.AdaptorRegistry.Npm.headers/0","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#t:headers/0"},{"type":"type","title":"Lightning.AdaptorRegistry.Npm.method/0","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#t:method/0"},{"type":"type","title":"Lightning.AdaptorRegistry.Npm.options/0","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#t:options/0"},{"type":"type","title":"Lightning.AdaptorRegistry.Npm.params/0","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#t:params/0"},{"type":"type","title":"Lightning.AdaptorRegistry.Npm.request/0","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#t:request/0"},{"type":"type","title":"Lightning.AdaptorRegistry.Npm.url/0","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#t:url/0"},{"type":"module","title":"Lightning.AdaptorService","doc":"The Adaptor Service is use to query and install adaptors in order to run jobs. On startup, it queries the filesystem for package.json files and builds up a list of available adaptors. Configuration The service requires at least :adaptors_path , which is used to both query which adaptors are installed and when to install new adaptors. Another optional setting is: :repo , which must point at a module that will be used to do the querying and installing. Installing Adaptors Using the install/2 function an adaptor can be installed, which will also add it to the list of available adaptors. The adaptor is marked as :installing , to allow for conditional behaviour elsewhere such as delaying or rejecting processing until the adaptor becomes available. Looking up adaptors The module leans on Elixir's built-in Version module to provide version lookups. When looking up an adaptor, either a string or a tuple can be used. In the case of requesting the latest version, any one of these will return the latest version the service is aware of. @openfn/language-http @openfn/language-http@latest {"@openfn/language-http", nil} {"@openfn/language-http", "latest"} {~r/language-http/, "latest"} You can also request a specific version, or use a range specification: @openfn/language-http@1.2.3 {"@openfn/language-http", "~> 1.2.0"} {"@openfn/language-http", "< 2.0.0"} NOTE More complex npm style install strings like: ">=0.1.0 <0.2.0" are not supported. Generally the tuple style is preferred when using range specifications as the npm style strings have a simplistic regex splitter. See Version for more details on matching versions.","ref":"Lightning.AdaptorService.html"},{"type":"function","title":"Lightning.AdaptorService.build_aliased_name/1","doc":"Turns a package name and version into a string for NPM. Since multiple versions of the same package can be installed, it's important to rely on npms built-in package aliasing. E.g. @openfn/language-http@1.2.8 turns into: ` @openfn / language - http - 1.2 . 8 @npm : @openfn / language - http @ 1.2 . 8 ` Which is pretty long winded but necessary for the reason above. If using this module as a base, it's likely you would need to adaptor this to suit your particular naming strategy.","ref":"Lightning.AdaptorService.html#build_aliased_name/1"},{"type":"function","title":"Lightning.AdaptorService.child_spec/1","doc":"Returns a specification to start this module under a supervisor. See Supervisor .","ref":"Lightning.AdaptorService.html#child_spec/1"},{"type":"function","title":"Lightning.AdaptorService.find_adaptor/2","doc":"","ref":"Lightning.AdaptorService.html#find_adaptor/2"},{"type":"function","title":"Lightning.AdaptorService.get_adaptors/1","doc":"","ref":"Lightning.AdaptorService.html#get_adaptors/1"},{"type":"function","title":"Lightning.AdaptorService.install/2","doc":"","ref":"Lightning.AdaptorService.html#install/2"},{"type":"function","title":"Lightning.AdaptorService.install!/2","doc":"","ref":"Lightning.AdaptorService.html#install!/2"},{"type":"function","title":"Lightning.AdaptorService.installed?/2","doc":"","ref":"Lightning.AdaptorService.html#installed?/2"},{"type":"function","title":"Lightning.AdaptorService.resolve_package_name/1","doc":"","ref":"Lightning.AdaptorService.html#resolve_package_name/1"},{"type":"function","title":"Lightning.AdaptorService.start_link/1","doc":"","ref":"Lightning.AdaptorService.html#start_link/1"},{"type":"type","title":"Lightning.AdaptorService.package_spec/0","doc":"","ref":"Lightning.AdaptorService.html#t:package_spec/0"},{"type":"module","title":"Lightning.Attempt","doc":"Ecto model for Attempts.","ref":"Lightning.Attempt.html"},{"type":"function","title":"Lightning.Attempt.new/1","doc":"","ref":"Lightning.Attempt.html#new/1"},{"type":"type","title":"Lightning.Attempt.t/0","doc":"","ref":"Lightning.Attempt.html#t:t/0"},{"type":"module","title":"Lightning.AttemptRun","doc":"Ecto model for an Attempts Runs.","ref":"Lightning.AttemptRun.html"},{"type":"function","title":"Lightning.AttemptRun.new/1","doc":"","ref":"Lightning.AttemptRun.html#new/1"},{"type":"function","title":"Lightning.AttemptRun.new/2","doc":"","ref":"Lightning.AttemptRun.html#new/2"},{"type":"type","title":"Lightning.AttemptRun.t/0","doc":"","ref":"Lightning.AttemptRun.html#t:t/0"},{"type":"module","title":"Lightning.AttemptService","doc":"The Attempts context.","ref":"Lightning.AttemptService.html"},{"type":"function","title":"Lightning.AttemptService.append/2","doc":"Adds an Attempt to an unsaved Run When given an Attempt, it simply adds the Run to a new AttemptRun. However when given an AttemptRun, the Run (from the AttemptRun) is set as the previous Run for the new unsaved Run.","ref":"Lightning.AttemptService.html#append/2"},{"type":"function","title":"Lightning.AttemptService.build_attempt/2","doc":"","ref":"Lightning.AttemptService.html#build_attempt/2"},{"type":"function","title":"Lightning.AttemptService.calculate_runs/3","doc":"","ref":"Lightning.AttemptService.html#calculate_runs/3"},{"type":"function","title":"Lightning.AttemptService.create_attempt/3","doc":"Create an attempt Examples iex> create_attempt ( %{ field : value } ) { :ok , % Attempt { } } iex> create_attempt ( %{ field : bad_value } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.AttemptService.html#create_attempt/3"},{"type":"function","title":"Lightning.AttemptService.get_for_rerun/2","doc":"","ref":"Lightning.AttemptService.html#get_for_rerun/2"},{"type":"function","title":"Lightning.AttemptService.get_last_attempt_for/1","doc":"Get the latest attempt associated to a given run","ref":"Lightning.AttemptService.html#get_last_attempt_for/1"},{"type":"function","title":"Lightning.AttemptService.get_workflow_for/1","doc":"","ref":"Lightning.AttemptService.html#get_workflow_for/1"},{"type":"function","title":"Lightning.AttemptService.list_for_rerun_from_job/2","doc":"Returns a list of AttemptRun structs that should be rerun for the given list of workorder ids that are associated to the given Job","ref":"Lightning.AttemptService.html#list_for_rerun_from_job/2"},{"type":"function","title":"Lightning.AttemptService.list_for_rerun_from_start/1","doc":"Returns a list of AttemptRun structs that should be rerun for the given list of work order ids.","ref":"Lightning.AttemptService.html#list_for_rerun_from_start/1"},{"type":"function","title":"Lightning.AttemptService.retry/3","doc":"Creates a new Attempt starting from a given run. All upstream/prior Runs that were performed on that attempt are associated with the new Attempt, where as the specified run is used to create a new one and is added to the Attempt. Any runs downstream from the Run given are ignored.","ref":"Lightning.AttemptService.html#retry/3"},{"type":"function","title":"Lightning.AttemptService.retry_many/2","doc":"Creates new Attempts for each pair of corresponding AttemptRun and InvocationReason.","ref":"Lightning.AttemptService.html#retry_many/2"},{"type":"module","title":"Lightning.Auditing","doc":"Context for working with Audit records.","ref":"Lightning.Auditing.html"},{"type":"function","title":"Lightning.Auditing.list_all/1","doc":"","ref":"Lightning.Auditing.html#list_all/1"},{"type":"module","title":"Lightning.Auditing.Model","doc":"Macro module to add common model behaviour to a given Ecto model","ref":"Lightning.Auditing.Model.html"},{"type":"function","title":"Lightning.Auditing.Model.event/5","doc":"Creates a schema changeset for the event identified by row_id and caused by actor_id . The given metadata can be either nil , Ecto.Changeset , struct or map. It returns :no_changes in case of an Ecto.Changeset metadata that changed nothing or an Ecto.Changeset with the event ready to be inserted.","ref":"Lightning.Auditing.Model.html#event/5"},{"type":"function","title":"Lightning.Auditing.Model.save/2","doc":"Saves the event to the Repo . In case of nothing changes, do nothing. It returns {:ok, :no_changes} if nothing changed, {:ok, struct} if the log has been successfully saved or {:error, changeset} in case of error.","ref":"Lightning.Auditing.Model.html#save/2"},{"type":"module","title":"Lightning.AuthProviders","doc":"Context module for dealing with external Auth Providers.","ref":"Lightning.AuthProviders.html"},{"type":"function","title":"Lightning.AuthProviders.build_handler/2","doc":"","ref":"Lightning.AuthProviders.html#build_handler/2"},{"type":"function","title":"Lightning.AuthProviders.create/1","doc":"","ref":"Lightning.AuthProviders.html#create/1"},{"type":"function","title":"Lightning.AuthProviders.create_handler/1","doc":"","ref":"Lightning.AuthProviders.html#create_handler/1"},{"type":"function","title":"Lightning.AuthProviders.delete!/1","doc":"","ref":"Lightning.AuthProviders.html#delete!/1"},{"type":"function","title":"Lightning.AuthProviders.get_authorize_url/1","doc":"Retrieve the authorization url for a given handler or handler name.","ref":"Lightning.AuthProviders.html#get_authorize_url/1"},{"type":"function","title":"Lightning.AuthProviders.get_existing/0","doc":"","ref":"Lightning.AuthProviders.html#get_existing/0"},{"type":"function","title":"Lightning.AuthProviders.get_existing/1","doc":"","ref":"Lightning.AuthProviders.html#get_existing/1"},{"type":"function","title":"Lightning.AuthProviders.get_handler/1","doc":"","ref":"Lightning.AuthProviders.html#get_handler/1"},{"type":"function","title":"Lightning.AuthProviders.get_handlers/0","doc":"","ref":"Lightning.AuthProviders.html#get_handlers/0"},{"type":"function","title":"Lightning.AuthProviders.new/0","doc":"","ref":"Lightning.AuthProviders.html#new/0"},{"type":"function","title":"Lightning.AuthProviders.remove_handler/1","doc":"","ref":"Lightning.AuthProviders.html#remove_handler/1"},{"type":"function","title":"Lightning.AuthProviders.update/2","doc":"","ref":"Lightning.AuthProviders.html#update/2"},{"type":"module","title":"Lightning.AuthProviders.AuthConfig","doc":"AuthProvider model","ref":"Lightning.AuthProviders.AuthConfig.html"},{"type":"type","title":"Lightning.AuthProviders.AuthConfig.t/0","doc":"","ref":"Lightning.AuthProviders.AuthConfig.html#t:t/0"},{"type":"module","title":"Lightning.AuthProviders.CacheWarmer","doc":"Dummy warmer which caches database rows every 30s.","ref":"Lightning.AuthProviders.CacheWarmer.html"},{"type":"function","title":"Lightning.AuthProviders.CacheWarmer.child_spec/1","doc":"Returns a specification to start this module under a supervisor. See Supervisor .","ref":"Lightning.AuthProviders.CacheWarmer.html#child_spec/1"},{"type":"function","title":"Lightning.AuthProviders.CacheWarmer.execute/1","doc":"Executes this cache warmer with a connection.","ref":"Lightning.AuthProviders.CacheWarmer.html#execute/1"},{"type":"function","title":"Lightning.AuthProviders.CacheWarmer.interval/0","doc":"Returns the interval for this warmer.","ref":"Lightning.AuthProviders.CacheWarmer.html#interval/0"},{"type":"module","title":"Lightning.AuthProviders.Google","doc":"","ref":"Lightning.AuthProviders.Google.html"},{"type":"function","title":"Lightning.AuthProviders.Google.authorize_url/2","doc":"","ref":"Lightning.AuthProviders.Google.html#authorize_url/2"},{"type":"function","title":"Lightning.AuthProviders.Google.build_client/1","doc":"Builds a new client","ref":"Lightning.AuthProviders.Google.html#build_client/1"},{"type":"function","title":"Lightning.AuthProviders.Google.get_config/0","doc":"","ref":"Lightning.AuthProviders.Google.html#get_config/0"},{"type":"function","title":"Lightning.AuthProviders.Google.get_token/2","doc":"","ref":"Lightning.AuthProviders.Google.html#get_token/2"},{"type":"function","title":"Lightning.AuthProviders.Google.get_userinfo/2","doc":"","ref":"Lightning.AuthProviders.Google.html#get_userinfo/2"},{"type":"function","title":"Lightning.AuthProviders.Google.get_wellknown/0","doc":"","ref":"Lightning.AuthProviders.Google.html#get_wellknown/0"},{"type":"function","title":"Lightning.AuthProviders.Google.get_wellknown!/0","doc":"","ref":"Lightning.AuthProviders.Google.html#get_wellknown!/0"},{"type":"function","title":"Lightning.AuthProviders.Google.refresh_token/2","doc":"","ref":"Lightning.AuthProviders.Google.html#refresh_token/2"},{"type":"module","title":"Lightning.AuthProviders.Handler","doc":"Module which wraps Oauth configuration and a WellKnown document into a convenient struct that can be used to authenticate users against any OIDC compliant provider.","ref":"Lightning.AuthProviders.Handler.html"},{"type":"function","title":"Lightning.AuthProviders.Handler.authorize_url/1","doc":"","ref":"Lightning.AuthProviders.Handler.html#authorize_url/1"},{"type":"function","title":"Lightning.AuthProviders.Handler.from_model/1","doc":"Returns a Handler from a given AuthConfig","ref":"Lightning.AuthProviders.Handler.html#from_model/1"},{"type":"function","title":"Lightning.AuthProviders.Handler.get_token/2","doc":"","ref":"Lightning.AuthProviders.Handler.html#get_token/2"},{"type":"function","title":"Lightning.AuthProviders.Handler.get_userinfo/2","doc":"","ref":"Lightning.AuthProviders.Handler.html#get_userinfo/2"},{"type":"function","title":"Lightning.AuthProviders.Handler.new/2","doc":"Create a new Provider struct, expects a name and opts: :client_id - The providers issued id :client_secret - Secret for the client :redirect_uri - The URI for redirecting after authentication, usually the callback url in the router. :wellknown - A AuthProviders.WellKnown struct with the providers .well-known/openid-configuration .","ref":"Lightning.AuthProviders.Handler.html#new/2"},{"type":"type","title":"Lightning.AuthProviders.Handler.opts/0","doc":"","ref":"Lightning.AuthProviders.Handler.html#t:opts/0"},{"type":"type","title":"Lightning.AuthProviders.Handler.t/0","doc":"","ref":"Lightning.AuthProviders.Handler.html#t:t/0"},{"type":"module","title":"Lightning.AuthProviders.Store","doc":"Store module for caching Handlers. Since Handlers often have to fetch their .well-known files when being initialized we cache these in order to avoid repeatedly making HTTP requests to a providers API.","ref":"Lightning.AuthProviders.Store.html"},{"type":"function","title":"Lightning.AuthProviders.Store.get_handler/2","doc":"","ref":"Lightning.AuthProviders.Store.html#get_handler/2"},{"type":"function","title":"Lightning.AuthProviders.Store.get_handlers/0","doc":"","ref":"Lightning.AuthProviders.Store.html#get_handlers/0"},{"type":"function","title":"Lightning.AuthProviders.Store.put_handler/2","doc":"","ref":"Lightning.AuthProviders.Store.html#put_handler/2"},{"type":"function","title":"Lightning.AuthProviders.Store.remove_handler/1","doc":"","ref":"Lightning.AuthProviders.Store.html#remove_handler/1"},{"type":"type","title":"Lightning.AuthProviders.Store.finder/0","doc":"","ref":"Lightning.AuthProviders.Store.html#t:finder/0"},{"type":"module","title":"Lightning.AuthProviders.WellKnown","doc":"A datastructure to fetch and hold information about a given OIDC/OAuth provider","ref":"Lightning.AuthProviders.WellKnown.html"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.delete/3","doc":"Issues a DELETE request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#delete/3"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.delete!/3","doc":"Issues a DELETE request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#delete!/3"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.fetch/1","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#fetch/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.fetch!/1","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#fetch!/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.get/3","doc":"Issues a GET request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#get/3"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.get!/3","doc":"Issues a GET request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#get!/3"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.head/3","doc":"Issues a HEAD request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#head/3"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.head!/3","doc":"Issues a HEAD request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#head!/3"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.new/1","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#new/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.options/3","doc":"Issues an OPTIONS request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#options/3"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.options!/3","doc":"Issues a OPTIONS request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#options!/3"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.patch/4","doc":"Issues a PATCH request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#patch/4"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.patch!/4","doc":"Issues a PATCH request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#patch!/4"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.post/4","doc":"Issues a POST request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#post/4"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.post!/4","doc":"Issues a POST request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#post!/4"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_headers/1","doc":"Callback implementation for HTTPoison.Base.process_headers/1 .","ref":"Lightning.AuthProviders.WellKnown.html#process_headers/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_request_body/1","doc":"Callback implementation for HTTPoison.Base.process_request_body/1 .","ref":"Lightning.AuthProviders.WellKnown.html#process_request_body/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_request_headers/1","doc":"Callback implementation for HTTPoison.Base.process_request_headers/1 .","ref":"Lightning.AuthProviders.WellKnown.html#process_request_headers/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_request_options/1","doc":"Callback implementation for HTTPoison.Base.process_request_options/1 .","ref":"Lightning.AuthProviders.WellKnown.html#process_request_options/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_request_params/1","doc":"Callback implementation for HTTPoison.Base.process_request_params/1 .","ref":"Lightning.AuthProviders.WellKnown.html#process_request_params/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_request_url/1","doc":"Callback implementation for HTTPoison.Base.process_request_url/1 .","ref":"Lightning.AuthProviders.WellKnown.html#process_request_url/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_response/1","doc":"Callback implementation for HTTPoison.Base.process_response/1 .","ref":"Lightning.AuthProviders.WellKnown.html#process_response/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_response_body/1","doc":"Callback implementation for HTTPoison.Base.process_response_body/1 .","ref":"Lightning.AuthProviders.WellKnown.html#process_response_body/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_response_chunk/1","doc":"Callback implementation for HTTPoison.Base.process_response_chunk/1 .","ref":"Lightning.AuthProviders.WellKnown.html#process_response_chunk/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_response_headers/1","doc":"Callback implementation for HTTPoison.Base.process_response_headers/1 .","ref":"Lightning.AuthProviders.WellKnown.html#process_response_headers/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_response_status_code/1","doc":"Callback implementation for HTTPoison.Base.process_response_status_code/1 .","ref":"Lightning.AuthProviders.WellKnown.html#process_response_status_code/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_status_code/1","doc":"Callback implementation for HTTPoison.Base.process_status_code/1 .","ref":"Lightning.AuthProviders.WellKnown.html#process_status_code/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_url/1","doc":"Callback implementation for HTTPoison.Base.process_url/1 .","ref":"Lightning.AuthProviders.WellKnown.html#process_url/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.put/4","doc":"Issues a PUT request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#put/4"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.put!/4","doc":"Issues a PUT request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#put!/4"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.request/1","doc":"Issues an HTTP request using a Request struct. This function returns {:ok, response} , {:ok, async_response} , or {:ok, maybe_redirect} if the request is successful, {:error, reason} otherwise. Redirect handling If the option :follow_redirect is given, HTTP redirects are automatically follow if the method is set to :get or :head and the response's status_code is 301 , 302 or 307 . If the method is set to :post , then the only status_code that get's automatically followed is 303 . If any other method or status_code is returned, then this function returns a returns a {:ok, %HTTPoison.MaybeRedirect{}} containing the redirect_url for you to re-request with the method set to :get . Examples request = % HTTPoison.Request { method : :post , url : "https://my.website.com" , body : "{ \\" foo \\" : 3}" , headers : [ { "Accept" , "application/json" } ] } request ( request )","ref":"Lightning.AuthProviders.WellKnown.html#request/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.request/5","doc":"Issues an HTTP request with the given method to the given url. This function is usually used indirectly by get/3 , post/4 , put/4 , etc Args: method - HTTP method as an atom ( :get , :head , :post , :put , :delete , etc.) url - target url as a binary string or char list body - request body. See more below headers - HTTP headers as an orddict (e.g., [{"Accept", "application/json"}] ) options - Keyword list of options Body: see type HTTPoison.Request Options: see type HTTPoison.Request This function returns {:ok, response} , {:ok, async_response} , or {:ok, maybe_redirect} if the request is successful, {:error, reason} otherwise. Redirect handling If the option :follow_redirect is given, HTTP redirects are automatically follow if the method is set to :get or :head and the response's status_code is 301 , 302 or 307 . If the method is set to :post , then the only status_code that get's automatically followed is 303 . If any other method or status_code is returned, then this function returns a returns a {:ok, %HTTPoison.MaybeRedirect{}} containing the redirect_url for you to re-request with the method set to :get . Examples request ( :post , "https://my.website.com" , "{ \\" foo \\" : 3}" , [ { "Accept" , "application/json" } ] )","ref":"Lightning.AuthProviders.WellKnown.html#request/5"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.request!/5","doc":"Issues an HTTP request with the given method to the given url, raising an exception in case of failure. request!/5 works exactly like request/5 but it returns just the response in case of a successful request, raising an exception in case the request fails.","ref":"Lightning.AuthProviders.WellKnown.html#request!/5"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.start/0","doc":"Starts HTTPoison and its dependencies.","ref":"Lightning.AuthProviders.WellKnown.html#start/0"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.stream_next/1","doc":"Requests the next message to be streamed for a given HTTPoison.AsyncResponse . See request!/5 for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#stream_next/1"},{"type":"type","title":"Lightning.AuthProviders.WellKnown.body/0","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#t:body/0"},{"type":"type","title":"Lightning.AuthProviders.WellKnown.headers/0","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#t:headers/0"},{"type":"type","title":"Lightning.AuthProviders.WellKnown.method/0","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#t:method/0"},{"type":"type","title":"Lightning.AuthProviders.WellKnown.options/0","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#t:options/0"},{"type":"type","title":"Lightning.AuthProviders.WellKnown.params/0","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#t:params/0"},{"type":"type","title":"Lightning.AuthProviders.WellKnown.request/0","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#t:request/0"},{"type":"type","title":"Lightning.AuthProviders.WellKnown.t/0","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#t:t/0"},{"type":"type","title":"Lightning.AuthProviders.WellKnown.url/0","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#t:url/0"},{"type":"module","title":"Lightning.CLI","doc":"Module providing facilities to make calls to the OpenFn CLI. See @openfn/cli","ref":"Lightning.CLI.html"},{"type":"function","title":"Lightning.CLI.execute/1","doc":"Execute a command in a child process and parse the results.","ref":"Lightning.CLI.html#execute/1"},{"type":"function","title":"Lightning.CLI.metadata/2","doc":"Retrieve metadata for a given adaptor and configuration.","ref":"Lightning.CLI.html#metadata/2"},{"type":"module","title":"Lightning.CLI.Result","doc":"Struct that wraps the output of an OpenFn CLI call. Containing the keys: start_time end_time status logs Logs The OpenFn CLI returns JSON formatted log lines, which are decoded and added to a 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","ref":"Lightning.CLI.Result.html"},{"type":"function","title":"Lightning.CLI.Result.get_messages/1","doc":"Returns message type log lines from a Result .","ref":"Lightning.CLI.Result.html#get_messages/1"},{"type":"function","title":"Lightning.CLI.Result.new/1","doc":"","ref":"Lightning.CLI.Result.html#new/1"},{"type":"function","title":"Lightning.CLI.Result.parse/2","doc":"","ref":"Lightning.CLI.Result.html#parse/2"},{"type":"type","title":"Lightning.CLI.Result.t/0","doc":"","ref":"Lightning.CLI.Result.html#t:t/0"},{"type":"module","title":"Lightning.Demo","doc":"Demo encapsulates logic for setting up a demonstration site.","ref":"Lightning.Demo.html"},{"type":"function","title":"Lightning.Demo.reset_demo/0","doc":"Deletes everything in the database including the superuser and creates a set of publicly available users for a demo site via a command that can be run on Kubernetes-deployed systems.","ref":"Lightning.Demo.html#reset_demo/0"},{"type":"module","title":"Lightning.ExportUtils","doc":"Module that expose a function generating a complete and valid yaml string from a project and its workflows.","ref":"Lightning.ExportUtils.html"},{"type":"function","title":"Lightning.ExportUtils.build_yaml_tree/2","doc":"","ref":"Lightning.ExportUtils.html#build_yaml_tree/2"},{"type":"function","title":"Lightning.ExportUtils.generate_new_yaml/1","doc":"","ref":"Lightning.ExportUtils.html#generate_new_yaml/1"},{"type":"module","title":"Lightning.FailureNotifierView","doc":"","ref":"Lightning.FailureNotifierView.html"},{"type":"function","title":"Lightning.FailureNotifierView.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"Lightning.FailureNotifierView.html#__resource__/0"},{"type":"function","title":"Lightning.FailureNotifierView.failure_alert.html/1","doc":"","ref":"Lightning.FailureNotifierView.html#failure_alert.html/1"},{"type":"function","title":"Lightning.FailureNotifierView.render/2","doc":"Renders the given template locally.","ref":"Lightning.FailureNotifierView.html#render/2"},{"type":"function","title":"Lightning.FailureNotifierView.template_not_found/2","doc":"Callback invoked when no template is found. By default it raises but can be customized to render a particular template.","ref":"Lightning.FailureNotifierView.html#template_not_found/2"},{"type":"module","title":"Lightning.Helpers","doc":"Common functions for the context","ref":"Lightning.Helpers.html"},{"type":"function","title":"Lightning.Helpers.coerce_json_field/2","doc":"Changes a given maps field from a json string to a map. If it cannot be converted, it leaves the original value","ref":"Lightning.Helpers.html#coerce_json_field/2"},{"type":"function","title":"Lightning.Helpers.indefinite_article/1","doc":"","ref":"Lightning.Helpers.html#indefinite_article/1"},{"type":"function","title":"Lightning.Helpers.json_safe/1","doc":"Recursively ensures a given map is safe to convert to JSON, where all keys are strings and all values are json safe (primitive values).","ref":"Lightning.Helpers.html#json_safe/1"},{"type":"function","title":"Lightning.Helpers.ms_to_human/1","doc":"Converts milliseconds (integer) to a human duration, such as "1 minute" or "45 years, 6 months, 5 days, 21 hours, 12 minutes, 34 seconds" using Timex.Format.Duration.Formatters.Humanized.format() .","ref":"Lightning.Helpers.html#ms_to_human/1"},{"type":"module","title":"Lightning.MetadataService","doc":"Retrieves metadata for a given credential and adaptor using the OpenFn CLI.","ref":"Lightning.MetadataService.html"},{"type":"function","title":"Lightning.MetadataService.fetch/2","doc":"Retrieve metadata for a given adaptor and credential. The adaptor must be an npm specification.","ref":"Lightning.MetadataService.html#fetch/2"},{"type":"module","title":"Lightning.Name","doc":"Generates a random names.","ref":"Lightning.Name.html"},{"type":"function","title":"Lightning.Name.generate/1","doc":"","ref":"Lightning.Name.html#generate/1"},{"type":"module","title":"Lightning.ObanManager","doc":"The Oban Manager","ref":"Lightning.ObanManager.html"},{"type":"function","title":"Lightning.ObanManager.handle_event/4","doc":"","ref":"Lightning.ObanManager.html#handle_event/4"},{"type":"module","title":"Lightning.Policies.Permissions","doc":"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: The users.ex file has all the policies for the instances wide access levels The project_users.ex file has all the policies for the project wide access levels The permissions.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 ) if can_edit_job do # allow user to edit the job else # quick user out end","ref":"Lightning.Policies.Permissions.html"},{"type":"function","title":"Lightning.Policies.Permissions.can/4","doc":"checks if user has the permissions to apply action using some policy module Returns :ok if user can apply action and {:error, :unauthorized} otherwise Examples iex> can ( Lightning.Policies.Users , :create_workflow , user , project ) :ok iex> can ( Lightning.Policies.Users , :create_project , user , %{ } ) { :error , :unauthorized }","ref":"Lightning.Policies.Permissions.html#can/4"},{"type":"function","title":"Lightning.Policies.Permissions.can?/4","doc":"same as can/4 but returns true if user can apply action and false otherwise Examples iex> can ( Lightning.Policies.Users , :create_workflow , user , project ) true iex> can ( Lightning.Policies.Users , :create_project , user , %{ } ) false","ref":"Lightning.Policies.Permissions.html#can?/4"},{"type":"module","title":"Lightning.Policies.ProjectUsers","doc":"The Bodyguard Policy module for projects members roles.","ref":"Lightning.Policies.ProjectUsers.html"},{"type":"function","title":"Lightning.Policies.ProjectUsers.authorize/3","doc":"authorize/3 takes an action, a user, and a project. It checks the user's role for this project and returns true if the user can perform the action in that project and false if they cannot. Note that permissions are grouped by action, rather than by user role. We deny by default, so if a user's role is not added to the allow roles list for a particular action they are denied.","ref":"Lightning.Policies.ProjectUsers.html#authorize/3"},{"type":"type","title":"Lightning.Policies.ProjectUsers.actions/0","doc":"","ref":"Lightning.Policies.ProjectUsers.html#t:actions/0"},{"type":"module","title":"Lightning.Policies.Provisioning","doc":"The Bodyguard Policy module for users roles.","ref":"Lightning.Policies.Provisioning.html"},{"type":"function","title":"Lightning.Policies.Provisioning.authorize/3","doc":"authorize/3 takes an action, a user, and a project. It checks the user's role for this project and returns true if the user can perform the action and false if they cannot. Note that permissions are grouped by action. We deny by default, so if a user's role is not added to the allow roles list for a particular action they are denied. Only a superuser can provision a new project. Owners and admins can update existing projects.","ref":"Lightning.Policies.Provisioning.html#authorize/3"},{"type":"type","title":"Lightning.Policies.Provisioning.actions/0","doc":"","ref":"Lightning.Policies.Provisioning.html#t:actions/0"},{"type":"module","title":"Lightning.Policies.Users","doc":"The Bodyguard Policy module for users roles.","ref":"Lightning.Policies.Users.html"},{"type":"function","title":"Lightning.Policies.Users.authorize/3","doc":"authorize/3 takes an action, a user, and a project. It checks the user's role for this project and returns true if the user can perform the action and false if they cannot. Note that permissions are grouped by action. We deny by default, so if a user's role is not added to the allow roles list for a particular action they are denied.","ref":"Lightning.Policies.Users.html#authorize/3"},{"type":"type","title":"Lightning.Policies.Users.actions/0","doc":"","ref":"Lightning.Policies.Users.html#t:actions/0"},{"type":"module","title":"Lightning.Release","doc":"Used for executing DB release tasks when run in production without Mix installed.","ref":"Lightning.Release.html"},{"type":"function","title":"Lightning.Release.create_db/0","doc":"","ref":"Lightning.Release.html#create_db/0"},{"type":"function","title":"Lightning.Release.load_app/0","doc":"","ref":"Lightning.Release.html#load_app/0"},{"type":"function","title":"Lightning.Release.migrate/0","doc":"","ref":"Lightning.Release.html#migrate/0"},{"type":"function","title":"Lightning.Release.rollback/2","doc":"","ref":"Lightning.Release.html#rollback/2"},{"type":"module","title":"Lightning.Repo","doc":"","ref":"Lightning.Repo.html"},{"type":"function","title":"Lightning.Repo.aggregate/3","doc":"Callback implementation for Ecto.Repo.aggregate/3 .","ref":"Lightning.Repo.html#aggregate/3"},{"type":"function","title":"Lightning.Repo.aggregate/4","doc":"Callback implementation for Ecto.Repo.aggregate/4 .","ref":"Lightning.Repo.html#aggregate/4"},{"type":"function","title":"Lightning.Repo.all/2","doc":"Callback implementation for Ecto.Repo.all/2 .","ref":"Lightning.Repo.html#all/2"},{"type":"function","title":"Lightning.Repo.checked_out?/0","doc":"Callback implementation for Ecto.Repo.checked_out?/0 .","ref":"Lightning.Repo.html#checked_out?/0"},{"type":"function","title":"Lightning.Repo.checkout/2","doc":"Callback implementation for Ecto.Repo.checkout/2 .","ref":"Lightning.Repo.html#checkout/2"},{"type":"function","title":"Lightning.Repo.child_spec/1","doc":"","ref":"Lightning.Repo.html#child_spec/1"},{"type":"function","title":"Lightning.Repo.config/0","doc":"Callback implementation for Ecto.Repo.config/0 .","ref":"Lightning.Repo.html#config/0"},{"type":"function","title":"Lightning.Repo.default_options/1","doc":"Callback implementation for Ecto.Repo.default_options/1 .","ref":"Lightning.Repo.html#default_options/1"},{"type":"function","title":"Lightning.Repo.delete/2","doc":"Callback implementation for Ecto.Repo.delete/2 .","ref":"Lightning.Repo.html#delete/2"},{"type":"function","title":"Lightning.Repo.delete!/2","doc":"Callback implementation for Ecto.Repo.delete!/2 .","ref":"Lightning.Repo.html#delete!/2"},{"type":"function","title":"Lightning.Repo.delete_all/2","doc":"Callback implementation for Ecto.Repo.delete_all/2 .","ref":"Lightning.Repo.html#delete_all/2"},{"type":"function","title":"Lightning.Repo.disconnect_all/2","doc":"A convenience function for SQL-based repositories that forces all connections in the pool to disconnect within the given interval. See Ecto.Adapters.SQL.disconnect_all/3 for more information.","ref":"Lightning.Repo.html#disconnect_all/2"},{"type":"function","title":"Lightning.Repo.exists?/2","doc":"Callback implementation for Ecto.Repo.exists?/2 .","ref":"Lightning.Repo.html#exists?/2"},{"type":"function","title":"Lightning.Repo.explain/3","doc":"A convenience function for SQL-based repositories that executes an EXPLAIN statement or similar depending on the adapter to obtain statistics for the given query. See Ecto.Adapters.SQL.explain/4 for more information.","ref":"Lightning.Repo.html#explain/3"},{"type":"function","title":"Lightning.Repo.get/3","doc":"Callback implementation for Ecto.Repo.get/3 .","ref":"Lightning.Repo.html#get/3"},{"type":"function","title":"Lightning.Repo.get!/3","doc":"Callback implementation for Ecto.Repo.get!/3 .","ref":"Lightning.Repo.html#get!/3"},{"type":"function","title":"Lightning.Repo.get_by/3","doc":"Callback implementation for Ecto.Repo.get_by/3 .","ref":"Lightning.Repo.html#get_by/3"},{"type":"function","title":"Lightning.Repo.get_by!/3","doc":"Callback implementation for Ecto.Repo.get_by!/3 .","ref":"Lightning.Repo.html#get_by!/3"},{"type":"function","title":"Lightning.Repo.get_dynamic_repo/0","doc":"Callback implementation for Ecto.Repo.get_dynamic_repo/0 .","ref":"Lightning.Repo.html#get_dynamic_repo/0"},{"type":"function","title":"Lightning.Repo.in_transaction?/0","doc":"Callback implementation for Ecto.Repo.in_transaction?/0 .","ref":"Lightning.Repo.html#in_transaction?/0"},{"type":"function","title":"Lightning.Repo.insert/2","doc":"Callback implementation for Ecto.Repo.insert/2 .","ref":"Lightning.Repo.html#insert/2"},{"type":"function","title":"Lightning.Repo.insert!/2","doc":"Callback implementation for Ecto.Repo.insert!/2 .","ref":"Lightning.Repo.html#insert!/2"},{"type":"function","title":"Lightning.Repo.insert_all/3","doc":"Callback implementation for Ecto.Repo.insert_all/3 .","ref":"Lightning.Repo.html#insert_all/3"},{"type":"function","title":"Lightning.Repo.insert_or_update/2","doc":"Callback implementation for Ecto.Repo.insert_or_update/2 .","ref":"Lightning.Repo.html#insert_or_update/2"},{"type":"function","title":"Lightning.Repo.insert_or_update!/2","doc":"Callback implementation for Ecto.Repo.insert_or_update!/2 .","ref":"Lightning.Repo.html#insert_or_update!/2"},{"type":"function","title":"Lightning.Repo.load/2","doc":"Callback implementation for Ecto.Repo.load/2 .","ref":"Lightning.Repo.html#load/2"},{"type":"function","title":"Lightning.Repo.one/2","doc":"Callback implementation for Ecto.Repo.one/2 .","ref":"Lightning.Repo.html#one/2"},{"type":"function","title":"Lightning.Repo.one!/2","doc":"Callback implementation for Ecto.Repo.one!/2 .","ref":"Lightning.Repo.html#one!/2"},{"type":"function","title":"Lightning.Repo.paginate/2","doc":"","ref":"Lightning.Repo.html#paginate/2"},{"type":"function","title":"Lightning.Repo.preload/3","doc":"Callback implementation for Ecto.Repo.preload/3 .","ref":"Lightning.Repo.html#preload/3"},{"type":"function","title":"Lightning.Repo.prepare_query/3","doc":"Callback implementation for Ecto.Repo.prepare_query/3 .","ref":"Lightning.Repo.html#prepare_query/3"},{"type":"function","title":"Lightning.Repo.put_dynamic_repo/1","doc":"Callback implementation for Ecto.Repo.put_dynamic_repo/1 .","ref":"Lightning.Repo.html#put_dynamic_repo/1"},{"type":"function","title":"Lightning.Repo.query/3","doc":"A convenience function for SQL-based repositories that executes the given query. See Ecto.Adapters.SQL.query/4 for more information.","ref":"Lightning.Repo.html#query/3"},{"type":"function","title":"Lightning.Repo.query!/3","doc":"A convenience function for SQL-based repositories that executes the given query. See Ecto.Adapters.SQL.query!/4 for more information.","ref":"Lightning.Repo.html#query!/3"},{"type":"function","title":"Lightning.Repo.query_many/3","doc":"A convenience function for SQL-based repositories that executes the given multi-result query. See Ecto.Adapters.SQL.query_many/4 for more information.","ref":"Lightning.Repo.html#query_many/3"},{"type":"function","title":"Lightning.Repo.query_many!/3","doc":"A convenience function for SQL-based repositories that executes the given multi-result query. See Ecto.Adapters.SQL.query_many!/4 for more information.","ref":"Lightning.Repo.html#query_many!/3"},{"type":"function","title":"Lightning.Repo.reload/2","doc":"Callback implementation for Ecto.Repo.reload/2 .","ref":"Lightning.Repo.html#reload/2"},{"type":"function","title":"Lightning.Repo.reload!/2","doc":"Callback implementation for Ecto.Repo.reload!/2 .","ref":"Lightning.Repo.html#reload!/2"},{"type":"function","title":"Lightning.Repo.rollback/1","doc":"Callback implementation for Ecto.Repo.rollback/1 .","ref":"Lightning.Repo.html#rollback/1"},{"type":"function","title":"Lightning.Repo.scrivener_defaults/0","doc":"","ref":"Lightning.Repo.html#scrivener_defaults/0"},{"type":"function","title":"Lightning.Repo.start_link/1","doc":"Callback implementation for Ecto.Repo.start_link/1 .","ref":"Lightning.Repo.html#start_link/1"},{"type":"function","title":"Lightning.Repo.stop/1","doc":"Callback implementation for Ecto.Repo.stop/1 .","ref":"Lightning.Repo.html#stop/1"},{"type":"function","title":"Lightning.Repo.stream/2","doc":"Callback implementation for Ecto.Repo.stream/2 .","ref":"Lightning.Repo.html#stream/2"},{"type":"function","title":"Lightning.Repo.to_sql/2","doc":"A convenience function for SQL-based repositories that translates the given query to SQL. See Ecto.Adapters.SQL.to_sql/3 for more information.","ref":"Lightning.Repo.html#to_sql/2"},{"type":"function","title":"Lightning.Repo.transaction/2","doc":"Callback implementation for Ecto.Repo.transaction/2 .","ref":"Lightning.Repo.html#transaction/2"},{"type":"function","title":"Lightning.Repo.update/2","doc":"Callback implementation for Ecto.Repo.update/2 .","ref":"Lightning.Repo.html#update/2"},{"type":"function","title":"Lightning.Repo.update!/2","doc":"Callback implementation for Ecto.Repo.update!/2 .","ref":"Lightning.Repo.html#update!/2"},{"type":"function","title":"Lightning.Repo.update_all/3","doc":"Callback implementation for Ecto.Repo.update_all/3 .","ref":"Lightning.Repo.html#update_all/3"},{"type":"module","title":"Lightning.RunSearchForm","doc":"Run filtering search form.","ref":"Lightning.RunSearchForm.html"},{"type":"module","title":"Lightning.SafetyString","doc":"Utilities for securely encoding serializable structs, lists and strings into URL-safe strings. In order to pass the state around in a URL, in a manner that protects secrets from leaking - and allows us to avoid persistance we take a set of parameters and: Encode into a URI query string gzip it to save characters encrypt the string base64 encode it for URI encoding safety","ref":"Lightning.SafetyString.html"},{"type":"function","title":"Lightning.SafetyString.decode/1","doc":"","ref":"Lightning.SafetyString.html#decode/1"},{"type":"function","title":"Lightning.SafetyString.encode/1","doc":"","ref":"Lightning.SafetyString.html#encode/1"},{"type":"module","title":"Lightning.Scrubber","doc":"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.","ref":"Lightning.Scrubber.html"},{"type":"function","title":"Lightning.Scrubber.child_spec/1","doc":"Returns a specification to start this module under a supervisor. See Supervisor .","ref":"Lightning.Scrubber.html#child_spec/1"},{"type":"function","title":"Lightning.Scrubber.encode_samples/1","doc":"Prepare a list of sensitive samples (strings) into a potentially bigger list composed of variations a sample may appear.","ref":"Lightning.Scrubber.html#encode_samples/1"},{"type":"function","title":"Lightning.Scrubber.samples/1","doc":"","ref":"Lightning.Scrubber.html#samples/1"},{"type":"function","title":"Lightning.Scrubber.scrub/2","doc":"","ref":"Lightning.Scrubber.html#scrub/2"},{"type":"function","title":"Lightning.Scrubber.start_link/1","doc":"","ref":"Lightning.Scrubber.html#start_link/1"},{"type":"module","title":"Lightning.SetupUtils","doc":"SetupUtils encapsulates logic for setting up initial data for various sites.","ref":"Lightning.SetupUtils.html"},{"type":"function","title":"Lightning.SetupUtils.add_and_update_runs/3","doc":"","ref":"Lightning.SetupUtils.html#add_and_update_runs/3"},{"type":"function","title":"Lightning.SetupUtils.create_dhis2_project/1","doc":"","ref":"Lightning.SetupUtils.html#create_dhis2_project/1"},{"type":"function","title":"Lightning.SetupUtils.create_openhie_project/1","doc":"","ref":"Lightning.SetupUtils.html#create_openhie_project/1"},{"type":"function","title":"Lightning.SetupUtils.create_starter_project/2","doc":"","ref":"Lightning.SetupUtils.html#create_starter_project/2"},{"type":"function","title":"Lightning.SetupUtils.setup_demo/1","doc":"Creates initial data and returns the created records.","ref":"Lightning.SetupUtils.html#setup_demo/1"},{"type":"function","title":"Lightning.SetupUtils.tear_down/1","doc":"","ref":"Lightning.SetupUtils.html#tear_down/1"},{"type":"module","title":"Lightning.TaskWorker","doc":"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.","ref":"Lightning.TaskWorker.html"},{"type":"function","title":"Lightning.TaskWorker.child_spec/1","doc":"Returns a specification to start this module under a supervisor. See Supervisor .","ref":"Lightning.TaskWorker.html#child_spec/1"},{"type":"function","title":"Lightning.TaskWorker.get_status/1","doc":"","ref":"Lightning.TaskWorker.html#get_status/1"},{"type":"function","title":"Lightning.TaskWorker.start_link/1","doc":"","ref":"Lightning.TaskWorker.html#start_link/1"},{"type":"function","title":"Lightning.TaskWorker.start_task/2","doc":"","ref":"Lightning.TaskWorker.html#start_task/2"},{"type":"module","title":"Lightning.Validators","doc":"Extra validators for Ecto.Changeset.","ref":"Lightning.Validators.html"},{"type":"function","title":"Lightning.Validators.validate_exclusive/3","doc":"Validate that only one of the fields is set at a time. Example: changeset |> validate_exclusive ( [ :source_job_id , :source_trigger_id ] , "source_job_id and source_trigger_id are mutually exclusive" )","ref":"Lightning.Validators.html#validate_exclusive/3"},{"type":"function","title":"Lightning.Validators.validate_one_required/3","doc":"Validate that at least one of the fields is set.","ref":"Lightning.Validators.html#validate_one_required/3"},{"type":"module","title":"Lightning.Vault","doc":"Module for handling the encryption and decryption of database fields.","ref":"Lightning.Vault.html"},{"type":"function","title":"Lightning.Vault.child_spec/1","doc":"Returns a specification to start this module under a supervisor. See Supervisor .","ref":"Lightning.Vault.html#child_spec/1"},{"type":"function","title":"Lightning.Vault.start_link/1","doc":"","ref":"Lightning.Vault.html#start_link/1"},{"type":"module","title":"Lightning.VersionControl","doc":"Boundary module for handling Version control activities for project, jobs workflows etc Use this module to create, modify and delete connections as well as running any associated sync jobs","ref":"Lightning.VersionControl.html"},{"type":"function","title":"Lightning.VersionControl.add_github_installation_id/2","doc":"","ref":"Lightning.VersionControl.html#add_github_installation_id/2"},{"type":"function","title":"Lightning.VersionControl.add_github_repo_and_branch/3","doc":"","ref":"Lightning.VersionControl.html#add_github_repo_and_branch/3"},{"type":"function","title":"Lightning.VersionControl.create_github_connection/1","doc":"Creates a connection between a project and a github repo","ref":"Lightning.VersionControl.html#create_github_connection/1"},{"type":"function","title":"Lightning.VersionControl.fetch_installation_repos/1","doc":"","ref":"Lightning.VersionControl.html#fetch_installation_repos/1"},{"type":"function","title":"Lightning.VersionControl.fetch_repo_branches/2","doc":"","ref":"Lightning.VersionControl.html#fetch_repo_branches/2"},{"type":"function","title":"Lightning.VersionControl.get_repo_connection/1","doc":"","ref":"Lightning.VersionControl.html#get_repo_connection/1"},{"type":"function","title":"Lightning.VersionControl.github_enabled?/0","doc":"","ref":"Lightning.VersionControl.html#github_enabled?/0"},{"type":"function","title":"Lightning.VersionControl.remove_github_connection/1","doc":"Deletes a github connection used when re installing","ref":"Lightning.VersionControl.html#remove_github_connection/1"},{"type":"function","title":"Lightning.VersionControl.run_sync/2","doc":"","ref":"Lightning.VersionControl.html#run_sync/2"},{"type":"module","title":"Lightning.VersionControl.GithubClient","doc":"Tesla github http client we use this to make any network requests to github from Lightning","ref":"Lightning.VersionControl.GithubClient.html"},{"type":"function","title":"Lightning.VersionControl.GithubClient.delete/3","doc":"Perform a DELETE request. See request/1 or request/2 for options definition. delete ( "/users" ) delete ( "/users" , query : [ scope : "admin" ] ) delete ( client , "/users" ) delete ( client , "/users" , query : [ scope : "admin" ] ) delete ( client , "/users" , body : %{ name : "Jon" } )","ref":"Lightning.VersionControl.GithubClient.html#delete/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.delete!/3","doc":"Perform a DELETE request. See request!/1 or request!/2 for options definition. delete! ( "/users" ) delete! ( "/users" , query : [ scope : "admin" ] ) delete! ( client , "/users" ) delete! ( client , "/users" , query : [ scope : "admin" ] ) delete! ( client , "/users" , body : %{ name : "Jon" } )","ref":"Lightning.VersionControl.GithubClient.html#delete!/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.fire_repository_dispatch/3","doc":"","ref":"Lightning.VersionControl.GithubClient.html#fire_repository_dispatch/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.get/3","doc":"Perform a GET request. See request/1 or request/2 for options definition. get ( "/users" ) get ( "/users" , query : [ scope : "admin" ] ) get ( client , "/users" ) get ( client , "/users" , query : [ scope : "admin" ] ) get ( client , "/users" , body : %{ name : "Jon" } )","ref":"Lightning.VersionControl.GithubClient.html#get/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.get!/3","doc":"Perform a GET request. See request!/1 or request!/2 for options definition. get! ( "/users" ) get! ( "/users" , query : [ scope : "admin" ] ) get! ( client , "/users" ) get! ( client , "/users" , query : [ scope : "admin" ] ) get! ( client , "/users" , body : %{ name : "Jon" } )","ref":"Lightning.VersionControl.GithubClient.html#get!/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.get_repo_branches/2","doc":"","ref":"Lightning.VersionControl.GithubClient.html#get_repo_branches/2"},{"type":"function","title":"Lightning.VersionControl.GithubClient.head/3","doc":"Perform a HEAD request. See request/1 or request/2 for options definition. head ( "/users" ) head ( "/users" , query : [ scope : "admin" ] ) head ( client , "/users" ) head ( client , "/users" , query : [ scope : "admin" ] ) head ( client , "/users" , body : %{ name : "Jon" } )","ref":"Lightning.VersionControl.GithubClient.html#head/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.head!/3","doc":"Perform a HEAD request. See request!/1 or request!/2 for options definition. head! ( "/users" ) head! ( "/users" , query : [ scope : "admin" ] ) head! ( client , "/users" ) head! ( client , "/users" , query : [ scope : "admin" ] ) head! ( client , "/users" , body : %{ name : "Jon" } )","ref":"Lightning.VersionControl.GithubClient.html#head!/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.installation_repos/1","doc":"","ref":"Lightning.VersionControl.GithubClient.html#installation_repos/1"},{"type":"function","title":"Lightning.VersionControl.GithubClient.options/3","doc":"Perform a OPTIONS request. See request/1 or request/2 for options definition. options ( "/users" ) options ( "/users" , query : [ scope : "admin" ] ) options ( client , "/users" ) options ( client , "/users" , query : [ scope : "admin" ] ) options ( client , "/users" , body : %{ name : "Jon" } )","ref":"Lightning.VersionControl.GithubClient.html#options/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.options!/3","doc":"Perform a OPTIONS request. See request!/1 or request!/2 for options definition. options! ( "/users" ) options! ( "/users" , query : [ scope : "admin" ] ) options! ( client , "/users" ) options! ( client , "/users" , query : [ scope : "admin" ] ) options! ( client , "/users" , body : %{ name : "Jon" } )","ref":"Lightning.VersionControl.GithubClient.html#options!/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.patch/4","doc":"Perform a PATCH request. See request/1 or request/2 for options definition. patch ( "/users" , %{ name : "Jon" } ) patch ( "/users" , %{ name : "Jon" } , query : [ scope : "admin" ] ) patch ( client , "/users" , %{ name : "Jon" } ) patch ( client , "/users" , %{ name : "Jon" } , query : [ scope : "admin" ] )","ref":"Lightning.VersionControl.GithubClient.html#patch/4"},{"type":"function","title":"Lightning.VersionControl.GithubClient.patch!/4","doc":"Perform a PATCH request. See request!/1 or request!/2 for options definition. patch! ( "/users" , %{ name : "Jon" } ) patch! ( "/users" , %{ name : "Jon" } , query : [ scope : "admin" ] ) patch! ( client , "/users" , %{ name : "Jon" } ) patch! ( client , "/users" , %{ name : "Jon" } , query : [ scope : "admin" ] )","ref":"Lightning.VersionControl.GithubClient.html#patch!/4"},{"type":"function","title":"Lightning.VersionControl.GithubClient.post/4","doc":"Perform a POST request. See request/1 or request/2 for options definition. post ( "/users" , %{ name : "Jon" } ) post ( "/users" , %{ name : "Jon" } , query : [ scope : "admin" ] ) post ( client , "/users" , %{ name : "Jon" } ) post ( client , "/users" , %{ name : "Jon" } , query : [ scope : "admin" ] )","ref":"Lightning.VersionControl.GithubClient.html#post/4"},{"type":"function","title":"Lightning.VersionControl.GithubClient.post!/4","doc":"Perform a POST request. See request!/1 or request!/2 for options definition. post! ( "/users" , %{ name : "Jon" } ) post! ( "/users" , %{ name : "Jon" } , query : [ scope : "admin" ] ) post! ( client , "/users" , %{ name : "Jon" } ) post! ( client , "/users" , %{ name : "Jon" } , query : [ scope : "admin" ] )","ref":"Lightning.VersionControl.GithubClient.html#post!/4"},{"type":"function","title":"Lightning.VersionControl.GithubClient.put/4","doc":"Perform a PUT request. See request/1 or request/2 for options definition. put ( "/users" , %{ name : "Jon" } ) put ( "/users" , %{ name : "Jon" } , query : [ scope : "admin" ] ) put ( client , "/users" , %{ name : "Jon" } ) put ( client , "/users" , %{ name : "Jon" } , query : [ scope : "admin" ] )","ref":"Lightning.VersionControl.GithubClient.html#put/4"},{"type":"function","title":"Lightning.VersionControl.GithubClient.put!/4","doc":"Perform a PUT request. See request!/1 or request!/2 for options definition. put! ( "/users" , %{ name : "Jon" } ) put! ( "/users" , %{ name : "Jon" } , query : [ scope : "admin" ] ) put! ( client , "/users" , %{ name : "Jon" } ) put! ( client , "/users" , %{ name : "Jon" } , query : [ scope : "admin" ] )","ref":"Lightning.VersionControl.GithubClient.html#put!/4"},{"type":"function","title":"Lightning.VersionControl.GithubClient.request/2","doc":"Perform a request. Options :method - the request method, one of [ :head , :get , :delete , :trace , :options , :post , :put , :patch ] :url - either full url e.g. " http://example.com/some/path" or just "/some/path" if using Tesla.Middleware.BaseUrl :query - a keyword list of query params, e.g. [page: 1, per_page: 100] :headers - a keyworld list of headers, e.g. [{"content-type", "text/plain"}] :body - depends on used middleware: by default it can be a binary if using e.g. JSON encoding middleware it can be a nested map if adapter supports it it can be a Stream with any of the above :opts - custom, per-request middleware or adapter options Examples ExampleApi . request ( method : :get , url : "/users/path" ) # use shortcut methods ExampleApi . get ( "/users/1" ) ExampleApi . post ( client , "/users" , %{ name : "Jon" } )","ref":"Lightning.VersionControl.GithubClient.html#request/2"},{"type":"function","title":"Lightning.VersionControl.GithubClient.request!/2","doc":"Perform request and raise in case of error. This is similar to request/2 behaviour from Tesla 0.x See request/2 for list of available options.","ref":"Lightning.VersionControl.GithubClient.html#request!/2"},{"type":"function","title":"Lightning.VersionControl.GithubClient.send_sentry_error/1","doc":"","ref":"Lightning.VersionControl.GithubClient.html#send_sentry_error/1"},{"type":"function","title":"Lightning.VersionControl.GithubClient.trace/3","doc":"Perform a TRACE request. See request/1 or request/2 for options definition. trace ( "/users" ) trace ( "/users" , query : [ scope : "admin" ] ) trace ( client , "/users" ) trace ( client , "/users" , query : [ scope : "admin" ] ) trace ( client , "/users" , body : %{ name : "Jon" } )","ref":"Lightning.VersionControl.GithubClient.html#trace/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.trace!/3","doc":"Perform a TRACE request. See request!/1 or request!/2 for options definition. trace! ( "/users" ) trace! ( "/users" , query : [ scope : "admin" ] ) trace! ( client , "/users" ) trace! ( client , "/users" , query : [ scope : "admin" ] ) trace! ( client , "/users" , body : %{ name : "Jon" } )","ref":"Lightning.VersionControl.GithubClient.html#trace!/3"},{"type":"type","title":"Lightning.VersionControl.GithubClient.option/0","doc":"Options that may be passed to a request function. See request/2 for detailed descriptions.","ref":"Lightning.VersionControl.GithubClient.html#t:option/0"},{"type":"module","title":"Lightning.VersionControl.GithubToken","doc":"A module that uses Joken to handle building and signing application tokens for communicating with github See: https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/generating-a-json-web-token-jwt-for-a-github-app#about-json-web-tokens-jwts","ref":"Lightning.VersionControl.GithubToken.html"},{"type":"function","title":"Lightning.VersionControl.GithubToken.build/2","doc":"","ref":"Lightning.VersionControl.GithubToken.html#build/2"},{"type":"function","title":"Lightning.VersionControl.GithubToken.generate_and_sign/2","doc":"Combines generate_claims/1 and encode_and_sign/2","ref":"Lightning.VersionControl.GithubToken.html#generate_and_sign/2"},{"type":"function","title":"Lightning.VersionControl.GithubToken.generate_and_sign!/2","doc":"Same as generate_and_sign/2 but raises if error","ref":"Lightning.VersionControl.GithubToken.html#generate_and_sign!/2"},{"type":"function","title":"Lightning.VersionControl.GithubToken.verify_and_validate/3","doc":"Combines verify/2 and validate/2","ref":"Lightning.VersionControl.GithubToken.html#verify_and_validate/3"},{"type":"function","title":"Lightning.VersionControl.GithubToken.verify_and_validate!/3","doc":"Same as verify_and_validate/2 but raises if error","ref":"Lightning.VersionControl.GithubToken.html#verify_and_validate!/3"},{"type":"module","title":"Lightning.VersionControl.ProjectRepo","doc":"Ecto model for project repo connections","ref":"Lightning.VersionControl.ProjectRepo.html"},{"type":"function","title":"Lightning.VersionControl.ProjectRepo.changeset/2","doc":"","ref":"Lightning.VersionControl.ProjectRepo.html#changeset/2"},{"type":"type","title":"Lightning.VersionControl.ProjectRepo.t/0","doc":"","ref":"Lightning.VersionControl.ProjectRepo.html#t:t/0"},{"type":"module","title":"Lightning.WorkOrder","doc":"Ecto model for Workorders.","ref":"Lightning.WorkOrder.html"},{"type":"function","title":"Lightning.WorkOrder.new/0","doc":"","ref":"Lightning.WorkOrder.html#new/0"},{"type":"type","title":"Lightning.WorkOrder.t/0","doc":"","ref":"Lightning.WorkOrder.html#t:t/0"},{"type":"module","title":"Lightning.WorkOrderService","doc":"The WorkOrderService.","ref":"Lightning.WorkOrderService.html"},{"type":"function","title":"Lightning.WorkOrderService.attempt_updated/1","doc":"","ref":"Lightning.WorkOrderService.html#attempt_updated/1"},{"type":"function","title":"Lightning.WorkOrderService.build/2","doc":"","ref":"Lightning.WorkOrderService.html#build/2"},{"type":"function","title":"Lightning.WorkOrderService.create_manual_workorder/3","doc":"","ref":"Lightning.WorkOrderService.html#create_manual_workorder/3"},{"type":"function","title":"Lightning.WorkOrderService.create_webhook_workorder/2","doc":"","ref":"Lightning.WorkOrderService.html#create_webhook_workorder/2"},{"type":"function","title":"Lightning.WorkOrderService.create_work_order/1","doc":"Creates a work_order. Examples iex> create_work_order ( %{ field : value } ) { :ok , % WorkOrder { } } iex> create_work_order ( %{ field : bad_value } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.WorkOrderService.html#create_work_order/1"},{"type":"function","title":"Lightning.WorkOrderService.multi_for/3","doc":"","ref":"Lightning.WorkOrderService.html#multi_for/3"},{"type":"function","title":"Lightning.WorkOrderService.multi_for_manual/3","doc":"","ref":"Lightning.WorkOrderService.html#multi_for_manual/3"},{"type":"function","title":"Lightning.WorkOrderService.retry_attempt_run/2","doc":"","ref":"Lightning.WorkOrderService.html#retry_attempt_run/2"},{"type":"function","title":"Lightning.WorkOrderService.retry_attempt_runs/2","doc":"","ref":"Lightning.WorkOrderService.html#retry_attempt_runs/2"},{"type":"function","title":"Lightning.WorkOrderService.subscribe/1","doc":"","ref":"Lightning.WorkOrderService.html#subscribe/1"},{"type":"module","title":"Lightning.Workflows","doc":"The Workflows context.","ref":"Lightning.Workflows.html"},{"type":"function","title":"Lightning.Workflows.build_trigger/1","doc":"Builds a Trigger","ref":"Lightning.Workflows.html#build_trigger/1"},{"type":"function","title":"Lightning.Workflows.change_workflow/2","doc":"Returns an %Ecto.Changeset{} for tracking workflow changes. Examples iex> change_workflow ( workflow ) % Ecto.Changeset { data : % Workflow { } }","ref":"Lightning.Workflows.html#change_workflow/2"},{"type":"function","title":"Lightning.Workflows.create_edge/1","doc":"Creates an edge","ref":"Lightning.Workflows.html#create_edge/1"},{"type":"function","title":"Lightning.Workflows.create_workflow/1","doc":"Creates a workflow. Examples iex> create_workflow ( %{ field : value } ) { :ok , % Workflow { } } iex> create_workflow ( %{ field : bad_value } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Workflows.html#create_workflow/1"},{"type":"function","title":"Lightning.Workflows.delete_workflow/1","doc":"Deletes a workflow. Examples iex> delete_workflow ( workflow ) { :ok , % Workflow { } } iex> delete_workflow ( workflow ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Workflows.html#delete_workflow/1"},{"type":"function","title":"Lightning.Workflows.get_edge_by_webhook/1","doc":"Gets a Single Edge by it's webhook trigger.","ref":"Lightning.Workflows.html#get_edge_by_webhook/1"},{"type":"function","title":"Lightning.Workflows.get_edges_for_cron_execution/1","doc":"Returns a list of edges with jobs to execute, given a current timestamp in Unix. This is used by the scheduler, which calls this function once every minute.","ref":"Lightning.Workflows.html#get_edges_for_cron_execution/1"},{"type":"function","title":"Lightning.Workflows.get_workflow/1","doc":"","ref":"Lightning.Workflows.html#get_workflow/1"},{"type":"function","title":"Lightning.Workflows.get_workflow!/1","doc":"Gets a single workflow. Raises Ecto.NoResultsError if the Workflow does not exist. Examples iex> get_workflow! ( 123 ) % Workflow { } iex> get_workflow! ( 456 ) ** (Ecto.NoResultsError)","ref":"Lightning.Workflows.html#get_workflow!/1"},{"type":"function","title":"Lightning.Workflows.get_workflows_for/1","doc":"Retrieves a list of Workflows with their jobs and triggers preloaded.","ref":"Lightning.Workflows.html#get_workflows_for/1"},{"type":"function","title":"Lightning.Workflows.get_workflows_for_query/1","doc":"","ref":"Lightning.Workflows.html#get_workflows_for_query/1"},{"type":"function","title":"Lightning.Workflows.list_workflows/0","doc":"Returns the list of workflows. Examples iex> list_workflows ( ) [ % Workflow { } , ... ]","ref":"Lightning.Workflows.html#list_workflows/0"},{"type":"function","title":"Lightning.Workflows.mark_for_deletion/2","doc":"Returns an %Ecto.Changeset{} for changing the workflow request_deletion. Examples iex> change_request_deletion ( workflow ) % Ecto.Changeset { data : % Workflow { } }","ref":"Lightning.Workflows.html#mark_for_deletion/2"},{"type":"function","title":"Lightning.Workflows.to_project_space/1","doc":"","ref":"Lightning.Workflows.html#to_project_space/1"},{"type":"function","title":"Lightning.Workflows.update_trigger/2","doc":"Updates a trigger","ref":"Lightning.Workflows.html#update_trigger/2"},{"type":"function","title":"Lightning.Workflows.update_workflow/2","doc":"Updates a workflow. Examples iex> update_workflow ( workflow , %{ field : new_value } ) { :ok , % Workflow { } } iex> update_workflow ( workflow , %{ field : bad_value } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Workflows.html#update_workflow/2"},{"type":"module","title":"Lightning.Workflows.Edge","doc":"Ecto model for Workflow Edges. A Workflow Edge represents a connection between two jobs (or a trigger and a job) in a workflow. The source of the edge is either a job or a trigger. The target of the edge is always a job.","ref":"Lightning.Workflows.Edge.html"},{"type":"function","title":"Lightning.Workflows.Edge.changeset/2","doc":"","ref":"Lightning.Workflows.Edge.html#changeset/2"},{"type":"function","title":"Lightning.Workflows.Edge.new/1","doc":"","ref":"Lightning.Workflows.Edge.html#new/1"},{"type":"function","title":"Lightning.Workflows.Edge.validate/1","doc":"","ref":"Lightning.Workflows.Edge.html#validate/1"},{"type":"type","title":"Lightning.Workflows.Edge.edge_condition/0","doc":"","ref":"Lightning.Workflows.Edge.html#t:edge_condition/0"},{"type":"type","title":"Lightning.Workflows.Edge.t/0","doc":"","ref":"Lightning.Workflows.Edge.html#t:t/0"},{"type":"module","title":"Lightning.Workflows.Graph","doc":"Utility to construct and manipulate a graph/plan made out of Jobs","ref":"Lightning.Workflows.Graph.html"},{"type":"function","title":"Lightning.Workflows.Graph.new/1","doc":"","ref":"Lightning.Workflows.Graph.html#new/1"},{"type":"function","title":"Lightning.Workflows.Graph.remove/2","doc":"","ref":"Lightning.Workflows.Graph.html#remove/2"},{"type":"function","title":"Lightning.Workflows.Graph.vertices/1","doc":"","ref":"Lightning.Workflows.Graph.html#vertices/1"},{"type":"type","title":"Lightning.Workflows.Graph.t/0","doc":"","ref":"Lightning.Workflows.Graph.html#t:t/0"},{"type":"type","title":"Lightning.Workflows.Graph.vertex/0","doc":"","ref":"Lightning.Workflows.Graph.html#t:vertex/0"},{"type":"module","title":"Lightning.Workflows.Workflow","doc":"Ecto model for Workflows. A Workflow contains the fields for defining a workflow. name A plain text identifier","ref":"Lightning.Workflows.Workflow.html"},{"type":"function","title":"Lightning.Workflows.Workflow.request_deletion_changeset/2","doc":"","ref":"Lightning.Workflows.Workflow.html#request_deletion_changeset/2"},{"type":"function","title":"Lightning.Workflows.Workflow.validate/1","doc":"","ref":"Lightning.Workflows.Workflow.html#validate/1"},{"type":"type","title":"Lightning.Workflows.Workflow.t/0","doc":"","ref":"Lightning.Workflows.Workflow.html#t:t/0"},{"type":"module","title":"Lightning.Workorders.SearchParams","doc":"This module is used to parse search parameters for workorders and provide a query to the database.","ref":"Lightning.Workorders.SearchParams.html"},{"type":"function","title":"Lightning.Workorders.SearchParams.new/1","doc":"","ref":"Lightning.Workorders.SearchParams.html#new/1"},{"type":"function","title":"Lightning.Workorders.SearchParams.to_uri_params/1","doc":"","ref":"Lightning.Workorders.SearchParams.html#to_uri_params/1"},{"type":"type","title":"Lightning.Workorders.SearchParams.t/0","doc":"","ref":"Lightning.Workorders.SearchParams.html#t:t/0"},{"type":"module","title":"LightningWeb","doc":"The entrypoint for defining your web interface, such as controllers, views, channels and so on. This can be used in your application as: use LightningWeb , :controller use LightningWeb , :view The definitions below will be executed for every view, controller, etc, so keep them short and clean, focused on imports, uses and aliases. Do NOT define functions inside the quoted expressions below. Instead, define any helper function in modules and import those modules here.","ref":"LightningWeb.html"},{"type":"macro","title":"LightningWeb.__using__/1","doc":"When used, dispatch to the appropriate controller/view/etc.","ref":"LightningWeb.html#__using__/1"},{"type":"function","title":"LightningWeb.channel/0","doc":"","ref":"LightningWeb.html#channel/0"},{"type":"function","title":"LightningWeb.component/0","doc":"","ref":"LightningWeb.html#component/0"},{"type":"function","title":"LightningWeb.controller/0","doc":"","ref":"LightningWeb.html#controller/0"},{"type":"function","title":"LightningWeb.html/0","doc":"","ref":"LightningWeb.html#html/0"},{"type":"function","title":"LightningWeb.live_component/0","doc":"","ref":"LightningWeb.html#live_component/0"},{"type":"function","title":"LightningWeb.live_view/1","doc":"","ref":"LightningWeb.html#live_view/1"},{"type":"function","title":"LightningWeb.router/0","doc":"","ref":"LightningWeb.html#router/0"},{"type":"function","title":"LightningWeb.static_paths/0","doc":"","ref":"LightningWeb.html#static_paths/0"},{"type":"function","title":"LightningWeb.verified_routes/0","doc":"","ref":"LightningWeb.html#verified_routes/0"},{"type":"function","title":"LightningWeb.view/0","doc":"","ref":"LightningWeb.html#view/0"},{"type":"module","title":"LightningWeb.API.Helpers","doc":"Helpers for the API views","ref":"LightningWeb.API.Helpers.html"},{"type":"function","title":"LightningWeb.API.Helpers.pagination_link/3","doc":"","ref":"LightningWeb.API.Helpers.html#pagination_link/3"},{"type":"function","title":"LightningWeb.API.Helpers.pagination_links/2","doc":"","ref":"LightningWeb.API.Helpers.html#pagination_links/2"},{"type":"function","title":"LightningWeb.API.Helpers.url_for/2","doc":"","ref":"LightningWeb.API.Helpers.html#url_for/2"},{"type":"module","title":"LightningWeb.API.JobController","doc":"","ref":"LightningWeb.API.JobController.html"},{"type":"function","title":"LightningWeb.API.JobController.index/2","doc":"","ref":"LightningWeb.API.JobController.html#index/2"},{"type":"function","title":"LightningWeb.API.JobController.show/2","doc":"","ref":"LightningWeb.API.JobController.html#show/2"},{"type":"module","title":"LightningWeb.API.ProjectController","doc":"","ref":"LightningWeb.API.ProjectController.html"},{"type":"function","title":"LightningWeb.API.ProjectController.index/2","doc":"","ref":"LightningWeb.API.ProjectController.html#index/2"},{"type":"function","title":"LightningWeb.API.ProjectController.show/2","doc":"","ref":"LightningWeb.API.ProjectController.html#show/2"},{"type":"module","title":"LightningWeb.API.ProvisioningController","doc":"","ref":"LightningWeb.API.ProvisioningController.html"},{"type":"function","title":"LightningWeb.API.ProvisioningController.create/2","doc":"Creates or updates a project based on a JSON payload that may or may not contain UUIDs for existing resources.","ref":"LightningWeb.API.ProvisioningController.html#create/2"},{"type":"function","title":"LightningWeb.API.ProvisioningController.show/2","doc":"Returns a project "state.json", complete with UUIDs to enable idempotent project deployments and updates to existing projects via the CLI.","ref":"LightningWeb.API.ProvisioningController.html#show/2"},{"type":"function","title":"LightningWeb.API.ProvisioningController.show_yaml/2","doc":"Returns a description of the project as yaml. Same as the export project to yaml button (see Downloads Controller) but made for the API.","ref":"LightningWeb.API.ProvisioningController.html#show_yaml/2"},{"type":"module","title":"LightningWeb.API.RunController","doc":"","ref":"LightningWeb.API.RunController.html"},{"type":"function","title":"LightningWeb.API.RunController.index/2","doc":"","ref":"LightningWeb.API.RunController.html#index/2"},{"type":"function","title":"LightningWeb.API.RunController.show/2","doc":"","ref":"LightningWeb.API.RunController.html#show/2"},{"type":"module","title":"LightningWeb.AuditLive.Index","doc":"LiveView for listing Audit events","ref":"LightningWeb.AuditLive.Index.html"},{"type":"function","title":"LightningWeb.AuditLive.Index.diff/1","doc":"","ref":"LightningWeb.AuditLive.Index.html#diff/1"},{"type":"function","title":"LightningWeb.AuditLive.Index.render/1","doc":"Callback implementation for Phoenix.LiveView.render/1 .","ref":"LightningWeb.AuditLive.Index.html#render/1"},{"type":"module","title":"LightningWeb.AuthProvidersLive.FormComponent","doc":"Form Component for working with a single Job A Job's adaptor field is a combination of the module name and the version. It's formatted as an NPM style string. The form allows the user to select a module by name and then it's version, while the version dropdown itself references adaptor directly. Meaning the adaptor_name dropdown and assigns value is not persisted.","ref":"LightningWeb.AuthProvidersLive.FormComponent.html"},{"type":"module","title":"LightningWeb.AuthProvidersLive.Index","doc":"LiveView for listing and managing Projects","ref":"LightningWeb.AuthProvidersLive.Index.html"},{"type":"module","title":"LightningWeb.BackupCodesController","doc":"","ref":"LightningWeb.BackupCodesController.html"},{"type":"function","title":"LightningWeb.BackupCodesController.print/2","doc":"","ref":"LightningWeb.BackupCodesController.html#print/2"},{"type":"module","title":"LightningWeb.BackupCodesLive.Index","doc":"LiveView for user backup codes.","ref":"LightningWeb.BackupCodesLive.Index.html"},{"type":"function","title":"LightningWeb.BackupCodesLive.Index.render/1","doc":"Callback implementation for Phoenix.LiveView.render/1 .","ref":"LightningWeb.BackupCodesLive.Index.html#render/1"},{"type":"module","title":"LightningWeb.ChangesetJSON","doc":"Renders changesets as JSON.","ref":"LightningWeb.ChangesetJSON.html"},{"type":"function","title":"LightningWeb.ChangesetJSON.error/1","doc":"","ref":"LightningWeb.ChangesetJSON.html#error/1"},{"type":"module","title":"LightningWeb.ChangesetView","doc":"","ref":"LightningWeb.ChangesetView.html"},{"type":"function","title":"LightningWeb.ChangesetView.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"LightningWeb.ChangesetView.html#__resource__/0"},{"type":"function","title":"LightningWeb.ChangesetView.render/2","doc":"Renders the given template locally.","ref":"LightningWeb.ChangesetView.html#render/2"},{"type":"function","title":"LightningWeb.ChangesetView.template_not_found/2","doc":"Callback invoked when no template is found. By default it raises but can be customized to render a particular template.","ref":"LightningWeb.ChangesetView.html#template_not_found/2"},{"type":"function","title":"LightningWeb.ChangesetView.translate_errors/1","doc":"Traverses and translates changeset errors. See Ecto.Changeset.traverse_errors/2 and LightningWeb.ErrorHelpers.translate_error/1 for more details.","ref":"LightningWeb.ChangesetView.html#translate_errors/1"},{"type":"module","title":"LightningWeb.Components.Modal","doc":"A modal component that can be used to display a modal on the page. This currently isn't used anywhere but should be used in the future to replace the existing modal implementations.","ref":"LightningWeb.Components.Modal.html"},{"type":"module","title":"LightningWeb.CredentialLive.Edit","doc":"LiveView for editing a single Credential, which inturn uses LightningWeb.CredentialLive.FormComponent for common functionality.","ref":"LightningWeb.CredentialLive.Edit.html"},{"type":"function","title":"LightningWeb.CredentialLive.Edit.handle_info/2","doc":"A generic handler for forwarding updates from PubSub","ref":"LightningWeb.CredentialLive.Edit.html#handle_info/2"},{"type":"module","title":"LightningWeb.CredentialLive.FormComponent","doc":"Form Component for working with a single Credential","ref":"LightningWeb.CredentialLive.FormComponent.html"},{"type":"function","title":"LightningWeb.CredentialLive.FormComponent.credential_transfer/1","doc":"Attributes users ( :list ) (required) form ( :map ) (required)","ref":"LightningWeb.CredentialLive.FormComponent.html#credential_transfer/1"},{"type":"function","title":"LightningWeb.CredentialLive.FormComponent.form_component/1","doc":"Switcher components for different types of credentials. Attributes type ( :string ) (required) form ( :map ) (required) update_body ( :any ) Slots inner_block","ref":"LightningWeb.CredentialLive.FormComponent.html#form_component/1"},{"type":"function","title":"LightningWeb.CredentialLive.FormComponent.project_credentials/1","doc":"Attributes form ( :map ) (required) projects ( :list ) (required) selected ( :map ) (required) phx_target ( :any ) - Defaults to nil .","ref":"LightningWeb.CredentialLive.FormComponent.html#project_credentials/1"},{"type":"module","title":"LightningWeb.CredentialLive.GoogleSheetsComponent","doc":"Form component to setup a Google Sheets component. This component has several moving parts: Subscribes to a PubSub topic specially link to the component id See: LightningWeb.OauthCredentialHelper . Uses the Lightning.Google module to set up an OAuth client for generating urls, exchanging the code and requesting a new access_token . The flow for creating a new token is: Generate an authorization link which contains: The authorization url from the Google client with the applications callback_url A state string that is an encrypted set of data with the components module and id in it Once the user authorizes the client the callback is requested with a code The LightningWeb.OidcController decodes the state returned to it and does a 'broadcast_forward' which is simply a message expected to be received by a LiveView and applied to Phoenix.LiveView.send_update/3 . The component receives the code and requests a token. Any changes to the token (Credential body) are still handled by the parent component and so a update_body function is passed in to send params changes back up to update the form.","ref":"LightningWeb.CredentialLive.GoogleSheetsComponent.html"},{"type":"function","title":"LightningWeb.CredentialLive.GoogleSheetsComponent.authorize_button/1","doc":"","ref":"LightningWeb.CredentialLive.GoogleSheetsComponent.html#authorize_button/1"},{"type":"function","title":"LightningWeb.CredentialLive.GoogleSheetsComponent.disabled_authorize_button/1","doc":"","ref":"LightningWeb.CredentialLive.GoogleSheetsComponent.html#disabled_authorize_button/1"},{"type":"function","title":"LightningWeb.CredentialLive.GoogleSheetsComponent.error_block/1","doc":"","ref":"LightningWeb.CredentialLive.GoogleSheetsComponent.html#error_block/1"},{"type":"function","title":"LightningWeb.CredentialLive.GoogleSheetsComponent.fieldset/1","doc":"Attributes form ( :map ) (required) update_body ( :any ) (required) Slots inner_block","ref":"LightningWeb.CredentialLive.GoogleSheetsComponent.html#fieldset/1"},{"type":"function","title":"LightningWeb.CredentialLive.GoogleSheetsComponent.userinfo/1","doc":"","ref":"LightningWeb.CredentialLive.GoogleSheetsComponent.html#userinfo/1"},{"type":"module","title":"LightningWeb.CredentialLive.Index","doc":"LiveView for listing and managing credentials","ref":"LightningWeb.CredentialLive.Index.html"},{"type":"function","title":"LightningWeb.CredentialLive.Index.render/1","doc":"Callback implementation for Phoenix.LiveView.render/1 .","ref":"LightningWeb.CredentialLive.Index.html#render/1"},{"type":"module","title":"LightningWeb.CredentialLive.JsonSchemaBodyComponent","doc":"","ref":"LightningWeb.CredentialLive.JsonSchemaBodyComponent.html"},{"type":"function","title":"LightningWeb.CredentialLive.JsonSchemaBodyComponent.fieldset/1","doc":"Attributes form ( :map ) (required) Slots inner_block","ref":"LightningWeb.CredentialLive.JsonSchemaBodyComponent.html#fieldset/1"},{"type":"function","title":"LightningWeb.CredentialLive.JsonSchemaBodyComponent.schema_input/1","doc":"Attributes form ( :map ) (required) schema ( :map ) (required) field ( :any ) (required)","ref":"LightningWeb.CredentialLive.JsonSchemaBodyComponent.html#schema_input/1"},{"type":"module","title":"LightningWeb.CredentialLive.RawBodyComponent","doc":"","ref":"LightningWeb.CredentialLive.RawBodyComponent.html"},{"type":"function","title":"LightningWeb.CredentialLive.RawBodyComponent.fieldset/1","doc":"Attributes form ( :map ) (required) Slots inner_block","ref":"LightningWeb.CredentialLive.RawBodyComponent.html#fieldset/1"},{"type":"module","title":"LightningWeb.CredentialLive.TypePicker","doc":"","ref":"LightningWeb.CredentialLive.TypePicker.html"},{"type":"module","title":"LightningWeb.DataclipLive.Edit","doc":"LiveView for editing a single dataclip.","ref":"LightningWeb.DataclipLive.Edit.html"},{"type":"function","title":"LightningWeb.DataclipLive.Edit.render/1","doc":"Callback implementation for Phoenix.LiveView.render/1 .","ref":"LightningWeb.DataclipLive.Edit.html#render/1"},{"type":"module","title":"LightningWeb.DataclipLive.FormComponent","doc":"Form Component for working with a single dataclip","ref":"LightningWeb.DataclipLive.FormComponent.html"},{"type":"function","title":"LightningWeb.DataclipLive.FormComponent.render/1","doc":"Callback implementation for Phoenix.LiveComponent.render/1 .","ref":"LightningWeb.DataclipLive.FormComponent.html#render/1"},{"type":"module","title":"LightningWeb.DataclipLive.Index","doc":"LiveView for listing and working with a list of Dataclips","ref":"LightningWeb.DataclipLive.Index.html"},{"type":"function","title":"LightningWeb.DataclipLive.Index.render/1","doc":"Callback implementation for Phoenix.LiveView.render/1 .","ref":"LightningWeb.DataclipLive.Index.html#render/1"},{"type":"module","title":"LightningWeb.DownloadsController","doc":"","ref":"LightningWeb.DownloadsController.html"},{"type":"function","title":"LightningWeb.DownloadsController.download_project_yaml/2","doc":"","ref":"LightningWeb.DownloadsController.html#download_project_yaml/2"},{"type":"module","title":"LightningWeb.Endpoint","doc":"","ref":"LightningWeb.Endpoint.html"},{"type":"function","title":"LightningWeb.Endpoint.broadcast/3","doc":"Callback implementation for Phoenix.Endpoint.broadcast/3 .","ref":"LightningWeb.Endpoint.html#broadcast/3"},{"type":"function","title":"LightningWeb.Endpoint.broadcast!/3","doc":"Callback implementation for Phoenix.Endpoint.broadcast!/3 .","ref":"LightningWeb.Endpoint.html#broadcast!/3"},{"type":"function","title":"LightningWeb.Endpoint.broadcast_from/4","doc":"Callback implementation for Phoenix.Endpoint.broadcast_from/4 .","ref":"LightningWeb.Endpoint.html#broadcast_from/4"},{"type":"function","title":"LightningWeb.Endpoint.broadcast_from!/4","doc":"Callback implementation for Phoenix.Endpoint.broadcast_from!/4 .","ref":"LightningWeb.Endpoint.html#broadcast_from!/4"},{"type":"function","title":"LightningWeb.Endpoint.call/2","doc":"Callback implementation for Plug.call/2 .","ref":"LightningWeb.Endpoint.html#call/2"},{"type":"function","title":"LightningWeb.Endpoint.child_spec/1","doc":"Returns the child specification to start the endpoint under a supervision tree.","ref":"LightningWeb.Endpoint.html#child_spec/1"},{"type":"function","title":"LightningWeb.Endpoint.config/2","doc":"Returns the endpoint configuration for key Returns default if the key does not exist.","ref":"LightningWeb.Endpoint.html#config/2"},{"type":"function","title":"LightningWeb.Endpoint.config_change/2","doc":"Reloads the configuration given the application environment changes.","ref":"LightningWeb.Endpoint.html#config_change/2"},{"type":"function","title":"LightningWeb.Endpoint.host/0","doc":"Returns the host for the given endpoint.","ref":"LightningWeb.Endpoint.html#host/0"},{"type":"function","title":"LightningWeb.Endpoint.init/1","doc":"Callback implementation for Plug.init/1 .","ref":"LightningWeb.Endpoint.html#init/1"},{"type":"function","title":"LightningWeb.Endpoint.local_broadcast/3","doc":"Callback implementation for Phoenix.Endpoint.local_broadcast/3 .","ref":"LightningWeb.Endpoint.html#local_broadcast/3"},{"type":"function","title":"LightningWeb.Endpoint.local_broadcast_from/4","doc":"Callback implementation for Phoenix.Endpoint.local_broadcast_from/4 .","ref":"LightningWeb.Endpoint.html#local_broadcast_from/4"},{"type":"function","title":"LightningWeb.Endpoint.path/1","doc":"Generates the path information when routing to this endpoint.","ref":"LightningWeb.Endpoint.html#path/1"},{"type":"function","title":"LightningWeb.Endpoint.script_name/0","doc":"Generates the script name.","ref":"LightningWeb.Endpoint.html#script_name/0"},{"type":"function","title":"LightningWeb.Endpoint.start_link/1","doc":"Starts the endpoint supervision tree. All other options are merged into the endpoint configuration.","ref":"LightningWeb.Endpoint.html#start_link/1"},{"type":"function","title":"LightningWeb.Endpoint.static_integrity/1","doc":"Generates a base64-encoded cryptographic hash (sha512) to a static file in priv/static . Meant to be used for Subresource Integrity with CDNs.","ref":"LightningWeb.Endpoint.html#static_integrity/1"},{"type":"function","title":"LightningWeb.Endpoint.static_lookup/1","doc":"Returns a two item tuple with the first item being the static_path and the second item being the static_integrity .","ref":"LightningWeb.Endpoint.html#static_lookup/1"},{"type":"function","title":"LightningWeb.Endpoint.static_path/1","doc":"Generates a route to a static file in priv/static .","ref":"LightningWeb.Endpoint.html#static_path/1"},{"type":"function","title":"LightningWeb.Endpoint.static_url/0","doc":"Generates the static URL without any path information. It uses the configuration under :static_url to generate such. It falls back to :url if :static_url is not set.","ref":"LightningWeb.Endpoint.html#static_url/0"},{"type":"function","title":"LightningWeb.Endpoint.struct_url/0","doc":"Generates the endpoint base URL but as a URI struct. It uses the configuration under :url to generate such. Useful for manipulating the URL data and passing it to URL helpers.","ref":"LightningWeb.Endpoint.html#struct_url/0"},{"type":"function","title":"LightningWeb.Endpoint.subscribe/2","doc":"Callback implementation for Phoenix.Endpoint.subscribe/2 .","ref":"LightningWeb.Endpoint.html#subscribe/2"},{"type":"function","title":"LightningWeb.Endpoint.unsubscribe/1","doc":"Callback implementation for Phoenix.Endpoint.unsubscribe/1 .","ref":"LightningWeb.Endpoint.html#unsubscribe/1"},{"type":"function","title":"LightningWeb.Endpoint.url/0","doc":"Generates the endpoint base URL without any path information. It uses the configuration under :url to generate such.","ref":"LightningWeb.Endpoint.html#url/0"},{"type":"module","title":"LightningWeb.ErrorView","doc":"","ref":"LightningWeb.ErrorView.html"},{"type":"function","title":"LightningWeb.ErrorView.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"LightningWeb.ErrorView.html#__resource__/0"},{"type":"function","title":"LightningWeb.ErrorView.render/2","doc":"Renders the given template locally.","ref":"LightningWeb.ErrorView.html#render/2"},{"type":"function","title":"LightningWeb.ErrorView.template_not_found/2","doc":"Callback invoked when no template is found. By default it raises but can be customized to render a particular template.","ref":"LightningWeb.ErrorView.html#template_not_found/2"},{"type":"module","title":"LightningWeb.FallbackController","doc":"Translates controller action results into valid Plug.Conn responses. See Phoenix.Controller.action_fallback/1 for more details.","ref":"LightningWeb.FallbackController.html"},{"type":"module","title":"LightningWeb.FirstSetupLive.Superuser","doc":"Superuser setup liveview Allows the creation on the first user in the system. It has only one action: :show","ref":"LightningWeb.FirstSetupLive.Superuser.html"},{"type":"function","title":"LightningWeb.FirstSetupLive.Superuser.render/1","doc":"Callback implementation for Phoenix.LiveView.render/1 .","ref":"LightningWeb.FirstSetupLive.Superuser.html#render/1"},{"type":"module","title":"LightningWeb.FormHelpers","doc":"Conveniences for building forms.","ref":"LightningWeb.FormHelpers.html"},{"type":"module","title":"LightningWeb.Gettext","doc":"A module providing Internationalization with a gettext-based API. By using Gettext , your module gains a set of macros for translations, for example: import LightningWeb.Gettext # Simple translation gettext ( "Here is the string to translate" ) # Plural translation ngettext ( "Here is the string to translate" , "Here are the strings to translate" , 3 ) # Domain-based translation dgettext ( "errors" , "Here is the error message to translate" ) See the Gettext Docs for detailed usage.","ref":"LightningWeb.Gettext.html"},{"type":"macro","title":"LightningWeb.Gettext.dgettext/3","doc":"Callback implementation for Gettext.Backend.dgettext/3 .","ref":"LightningWeb.Gettext.html#dgettext/3"},{"type":"macro","title":"LightningWeb.Gettext.dgettext_noop/2","doc":"Callback implementation for Gettext.Backend.dgettext_noop/2 .","ref":"LightningWeb.Gettext.html#dgettext_noop/2"},{"type":"macro","title":"LightningWeb.Gettext.dngettext/5","doc":"Callback implementation for Gettext.Backend.dngettext/5 .","ref":"LightningWeb.Gettext.html#dngettext/5"},{"type":"macro","title":"LightningWeb.Gettext.dngettext_noop/3","doc":"Callback implementation for Gettext.Backend.dngettext_noop/3 .","ref":"LightningWeb.Gettext.html#dngettext_noop/3"},{"type":"macro","title":"LightningWeb.Gettext.dpgettext/4","doc":"Callback implementation for Gettext.Backend.dpgettext/4 .","ref":"LightningWeb.Gettext.html#dpgettext/4"},{"type":"macro","title":"LightningWeb.Gettext.dpgettext_noop/3","doc":"","ref":"LightningWeb.Gettext.html#dpgettext_noop/3"},{"type":"macro","title":"LightningWeb.Gettext.dpngettext/6","doc":"Callback implementation for Gettext.Backend.dpngettext/6 .","ref":"LightningWeb.Gettext.html#dpngettext/6"},{"type":"macro","title":"LightningWeb.Gettext.dpngettext_noop/4","doc":"","ref":"LightningWeb.Gettext.html#dpngettext_noop/4"},{"type":"macro","title":"LightningWeb.Gettext.gettext/2","doc":"Callback implementation for Gettext.Backend.gettext/2 .","ref":"LightningWeb.Gettext.html#gettext/2"},{"type":"macro","title":"LightningWeb.Gettext.gettext_comment/1","doc":"Callback implementation for Gettext.Backend.gettext_comment/1 .","ref":"LightningWeb.Gettext.html#gettext_comment/1"},{"type":"macro","title":"LightningWeb.Gettext.gettext_noop/1","doc":"Callback implementation for Gettext.Backend.gettext_noop/1 .","ref":"LightningWeb.Gettext.html#gettext_noop/1"},{"type":"function","title":"LightningWeb.Gettext.handle_missing_bindings/2","doc":"Callback implementation for Gettext.Backend.handle_missing_bindings/2 .","ref":"LightningWeb.Gettext.html#handle_missing_bindings/2"},{"type":"function","title":"LightningWeb.Gettext.handle_missing_plural_translation/7","doc":"Callback implementation for Gettext.Backend.handle_missing_plural_translation/7 .","ref":"LightningWeb.Gettext.html#handle_missing_plural_translation/7"},{"type":"function","title":"LightningWeb.Gettext.handle_missing_translation/5","doc":"Callback implementation for Gettext.Backend.handle_missing_translation/5 .","ref":"LightningWeb.Gettext.html#handle_missing_translation/5"},{"type":"function","title":"LightningWeb.Gettext.lgettext/5","doc":"","ref":"LightningWeb.Gettext.html#lgettext/5"},{"type":"function","title":"LightningWeb.Gettext.lngettext/7","doc":"","ref":"LightningWeb.Gettext.html#lngettext/7"},{"type":"macro","title":"LightningWeb.Gettext.ngettext/4","doc":"Callback implementation for Gettext.Backend.ngettext/4 .","ref":"LightningWeb.Gettext.html#ngettext/4"},{"type":"macro","title":"LightningWeb.Gettext.ngettext_noop/2","doc":"Callback implementation for Gettext.Backend.ngettext_noop/2 .","ref":"LightningWeb.Gettext.html#ngettext_noop/2"},{"type":"macro","title":"LightningWeb.Gettext.pgettext/3","doc":"Callback implementation for Gettext.Backend.pgettext/3 .","ref":"LightningWeb.Gettext.html#pgettext/3"},{"type":"macro","title":"LightningWeb.Gettext.pgettext_noop/2","doc":"","ref":"LightningWeb.Gettext.html#pgettext_noop/2"},{"type":"macro","title":"LightningWeb.Gettext.pngettext/5","doc":"Callback implementation for Gettext.Backend.pngettext/5 .","ref":"LightningWeb.Gettext.html#pngettext/5"},{"type":"macro","title":"LightningWeb.Gettext.pngettext_noop/3","doc":"","ref":"LightningWeb.Gettext.html#pngettext_noop/3"},{"type":"module","title":"LightningWeb.HealthCheck","doc":"","ref":"LightningWeb.HealthCheck.html"},{"type":"function","title":"LightningWeb.HealthCheck.call/2","doc":"Callback implementation for Plug.call/2 .","ref":"LightningWeb.HealthCheck.html#call/2"},{"type":"function","title":"LightningWeb.HealthCheck.init/1","doc":"Callback implementation for Plug.init/1 .","ref":"LightningWeb.HealthCheck.html#init/1"},{"type":"module","title":"LightningWeb.Hooks","doc":"LiveView Hooks","ref":"LightningWeb.Hooks.html"},{"type":"function","title":"LightningWeb.Hooks.on_mount/4","doc":"Finds and assigns a project to the socket, if a user doesn't have access they are redirected and shown a 'No Access' screen via a :nav flash message. There is a fallthru function, when there is no project_id in the params - this is for liveviews that may or may not have a project_id depending on usage - like DashboardLive .","ref":"LightningWeb.Hooks.html#on_mount/4"},{"type":"module","title":"LightningWeb.InitAssigns","doc":"Ensures common assigns are applied to all LiveViews attaching this hook.","ref":"LightningWeb.InitAssigns.html"},{"type":"function","title":"LightningWeb.InitAssigns.on_mount/4","doc":"","ref":"LightningWeb.InitAssigns.html#on_mount/4"},{"type":"module","title":"LightningWeb.JobLive.AdaptorPicker","doc":"Component allowing selecting an adaptor and it's version","ref":"LightningWeb.JobLive.AdaptorPicker.html"},{"type":"function","title":"LightningWeb.JobLive.AdaptorPicker.display_name_for_adaptor/1","doc":"Converts standard adaptor names into "label","value" lists and returns non-standard names as merely "value"; both can be passed directly into a select option list.","ref":"LightningWeb.JobLive.AdaptorPicker.html#display_name_for_adaptor/1"},{"type":"function","title":"LightningWeb.JobLive.AdaptorPicker.get_adaptor_version_options/1","doc":"","ref":"LightningWeb.JobLive.AdaptorPicker.html#get_adaptor_version_options/1"},{"type":"function","title":"LightningWeb.JobLive.AdaptorPicker.render/1","doc":"Attributes form ( :map ) (required) on_change ( :any ) - Defaults to nil . disabled ( :boolean ) - Defaults to false .","ref":"LightningWeb.JobLive.AdaptorPicker.html#render/1"},{"type":"module","title":"LightningWeb.JobLive.CredentialPicker","doc":"Component allowing selecting a credential or creating a new one via a modal.","ref":"LightningWeb.JobLive.CredentialPicker.html"},{"type":"function","title":"LightningWeb.JobLive.CredentialPicker.render/1","doc":"Attributes form ( :map ) (required) disabled ( :boolean ) - Defaults to false . credentials ( :list ) (required) on_change ( :any ) - Defaults to nil .","ref":"LightningWeb.JobLive.CredentialPicker.html#render/1"},{"type":"module","title":"LightningWeb.JobLive.CronSetupComponent","doc":"A live component for managing cron setup in a form. The CronSetupComponent provides an interactive form for configuring cron settings. It includes fields for specifying the frequency, minute, hour, weekday, monthday, and cron expression. Usage Include the CronSetupComponent in your live view or template. Pass the necessary assigns to the component, such as form , on_change , and disabled . Handle the cron_expression_change event to capture changes in the form inputs. Use the updated cron_expression in your application logic.","ref":"LightningWeb.JobLive.CronSetupComponent.html"},{"type":"function","title":"LightningWeb.JobLive.CronSetupComponent.build_cron_expression/2","doc":"","ref":"LightningWeb.JobLive.CronSetupComponent.html#build_cron_expression/2"},{"type":"function","title":"LightningWeb.JobLive.CronSetupComponent.frequency_field/1","doc":"","ref":"LightningWeb.JobLive.CronSetupComponent.html#frequency_field/1"},{"type":"function","title":"LightningWeb.JobLive.CronSetupComponent.get_cron_data/1","doc":"","ref":"LightningWeb.JobLive.CronSetupComponent.html#get_cron_data/1"},{"type":"function","title":"LightningWeb.JobLive.CronSetupComponent.hour_field/1","doc":"","ref":"LightningWeb.JobLive.CronSetupComponent.html#hour_field/1"},{"type":"function","title":"LightningWeb.JobLive.CronSetupComponent.minute_field/1","doc":"","ref":"LightningWeb.JobLive.CronSetupComponent.html#minute_field/1"},{"type":"function","title":"LightningWeb.JobLive.CronSetupComponent.monthday_field/1","doc":"","ref":"LightningWeb.JobLive.CronSetupComponent.html#monthday_field/1"},{"type":"function","title":"LightningWeb.JobLive.CronSetupComponent.render/1","doc":"Attributes id ( :string ) (required) form ( :map ) (required) on_change ( :any ) (required) disabled ( :boolean ) (required)","ref":"LightningWeb.JobLive.CronSetupComponent.html#render/1"},{"type":"function","title":"LightningWeb.JobLive.CronSetupComponent.time_field/1","doc":"","ref":"LightningWeb.JobLive.CronSetupComponent.html#time_field/1"},{"type":"function","title":"LightningWeb.JobLive.CronSetupComponent.weekday_field/1","doc":"","ref":"LightningWeb.JobLive.CronSetupComponent.html#weekday_field/1"},{"type":"module","title":"LightningWeb.JobLive.JobBuilder","doc":"Job Builder Panel","ref":"LightningWeb.JobLive.JobBuilder.html"},{"type":"function","title":"LightningWeb.JobLive.JobBuilder.delete_title/2","doc":"","ref":"LightningWeb.JobLive.JobBuilder.html#delete_title/2"},{"type":"function","title":"LightningWeb.JobLive.JobBuilder.follow_run/2","doc":"","ref":"LightningWeb.JobLive.JobBuilder.html#follow_run/2"},{"type":"function","title":"LightningWeb.JobLive.JobBuilder.render/1","doc":"Attributes return_to ( :string ) (required) params ( :map ) - Defaults to %{} . can_edit_job ( :boolean ) (required) can_run_job ( :boolean ) (required)","ref":"LightningWeb.JobLive.JobBuilder.html#render/1"},{"type":"function","title":"LightningWeb.JobLive.JobBuilder.send_adaptor/2","doc":"","ref":"LightningWeb.JobLive.JobBuilder.html#send_adaptor/2"},{"type":"function","title":"LightningWeb.JobLive.JobBuilder.send_credential/2","doc":"","ref":"LightningWeb.JobLive.JobBuilder.html#send_credential/2"},{"type":"function","title":"LightningWeb.JobLive.JobBuilder.update_cron_expression/2","doc":"","ref":"LightningWeb.JobLive.JobBuilder.html#update_cron_expression/2"},{"type":"module","title":"LightningWeb.JobLive.JobBuilderComponents","doc":"","ref":"LightningWeb.JobLive.JobBuilderComponents.html"},{"type":"function","title":"LightningWeb.JobLive.JobBuilderComponents.job_editor_component/1","doc":"Attributes adaptor ( :string ) (required) disabled ( :boolean ) - Defaults to false . source ( :string ) (required) change_event ( :string ) - Defaults to "job_body_changed" . Global attributes are accepted.","ref":"LightningWeb.JobLive.JobBuilderComponents.html#job_editor_component/1"},{"type":"function","title":"LightningWeb.JobLive.JobBuilderComponents.trigger_picker/1","doc":"Attributes form ( :map ) (required) upstream_jobs ( :list ) (required) on_cron_change ( :any ) (required) disabled ( :boolean ) - Defaults to true .","ref":"LightningWeb.JobLive.JobBuilderComponents.html#trigger_picker/1"},{"type":"function","title":"LightningWeb.JobLive.JobBuilderComponents.when_invalid/1","doc":"Attributes changeset ( :map ) (required) field ( :atom ) (required) Slots inner_block (required)","ref":"LightningWeb.JobLive.JobBuilderComponents.html#when_invalid/1"},{"type":"module","title":"LightningWeb.JobLive.ManualRunComponent","doc":"","ref":"LightningWeb.JobLive.ManualRunComponent.html"},{"type":"function","title":"LightningWeb.JobLive.ManualRunComponent.render/1","doc":"Attributes job ( :map ) (required) on_run ( :any ) (required) user ( :map ) (required) selected_dataclip_id ( :string ) (required)","ref":"LightningWeb.JobLive.ManualRunComponent.html#render/1"},{"type":"module","title":"LightningWeb.JobLive.ManualRunComponent.ManualWorkorder","doc":"","ref":"LightningWeb.JobLive.ManualRunComponent.ManualWorkorder.html"},{"type":"function","title":"LightningWeb.JobLive.ManualRunComponent.ManualWorkorder.changeset/2","doc":"","ref":"LightningWeb.JobLive.ManualRunComponent.ManualWorkorder.html#changeset/2"},{"type":"module","title":"LightningWeb.LiveHelpers","doc":"General purpose LiveView helper functions","ref":"LightningWeb.LiveHelpers.html"},{"type":"function","title":"LightningWeb.LiveHelpers.display_short_uuid/1","doc":"","ref":"LightningWeb.LiveHelpers.html#display_short_uuid/1"},{"type":"function","title":"LightningWeb.LiveHelpers.fade_in/1","doc":"","ref":"LightningWeb.LiveHelpers.html#fade_in/1"},{"type":"function","title":"LightningWeb.LiveHelpers.fade_out/1","doc":"","ref":"LightningWeb.LiveHelpers.html#fade_out/1"},{"type":"function","title":"LightningWeb.LiveHelpers.live_error_block/1","doc":"","ref":"LightningWeb.LiveHelpers.html#live_error_block/1"},{"type":"function","title":"LightningWeb.LiveHelpers.live_info_block/1","doc":"","ref":"LightningWeb.LiveHelpers.html#live_info_block/1"},{"type":"function","title":"LightningWeb.LiveHelpers.live_nav_block/1","doc":"","ref":"LightningWeb.LiveHelpers.html#live_nav_block/1"},{"type":"module","title":"LightningWeb.ModalPortal","doc":"Component for rendering content inside layout without full DOM patch.","ref":"LightningWeb.ModalPortal.html"},{"type":"function","title":"LightningWeb.ModalPortal.close_modal/0","doc":"","ref":"LightningWeb.ModalPortal.html#close_modal/0"},{"type":"function","title":"LightningWeb.ModalPortal.handle_event/3","doc":"Callback implementation for Phoenix.LiveComponent.handle_event/3 .","ref":"LightningWeb.ModalPortal.html#handle_event/3"},{"type":"function","title":"LightningWeb.ModalPortal.on_hide/2","doc":"","ref":"LightningWeb.ModalPortal.html#on_hide/2"},{"type":"function","title":"LightningWeb.ModalPortal.on_show/2","doc":"","ref":"LightningWeb.ModalPortal.html#on_show/2"},{"type":"function","title":"LightningWeb.ModalPortal.open_modal/2","doc":"","ref":"LightningWeb.ModalPortal.html#open_modal/2"},{"type":"function","title":"LightningWeb.ModalPortal.render/1","doc":"Callback implementation for Phoenix.LiveComponent.render/1 .","ref":"LightningWeb.ModalPortal.html#render/1"},{"type":"function","title":"LightningWeb.ModalPortal.update/2","doc":"Callback implementation for Phoenix.LiveComponent.update/2 .","ref":"LightningWeb.ModalPortal.html#update/2"},{"type":"module","title":"LightningWeb.OauthCredentialHelper","doc":"A set of helper functions to encodes state and coordinate OAuth callbacks back to a LiveView component.","ref":"LightningWeb.OauthCredentialHelper.html"},{"type":"function","title":"LightningWeb.OauthCredentialHelper.broadcast/2","doc":"","ref":"LightningWeb.OauthCredentialHelper.html#broadcast/2"},{"type":"function","title":"LightningWeb.OauthCredentialHelper.broadcast_forward/3","doc":"Broadcast a message specifically for forwarding a message to a component. It expects a subscription_id , the module of the component and opts being a keyword list containing an :id key of the specific component. See: Phoenix.LiveView.send_update/3 for more info. A corresponding LiveView (that is subscribed) is expected to have a matching handle_info/2 that looks like this: def handle_info ( { :forward , mod , opts } , socket ) do send_update ( mod , opts ) { :noreply , socket } end","ref":"LightningWeb.OauthCredentialHelper.html#broadcast_forward/3"},{"type":"function","title":"LightningWeb.OauthCredentialHelper.build_state/3","doc":"Encode and encrypt the callback data which will be sent so a provider as the state key in the request. The values are: subscription_id The same ID used to subscribe. The component module The LiveView component that is going to receive update The component id The ID of the component","ref":"LightningWeb.OauthCredentialHelper.html#build_state/3"},{"type":"function","title":"LightningWeb.OauthCredentialHelper.decode_state/1","doc":"","ref":"LightningWeb.OauthCredentialHelper.html#decode_state/1"},{"type":"function","title":"LightningWeb.OauthCredentialHelper.subscribe/1","doc":"Subscribe to the oauth_credential topic. It expects the a unique ID for the topic, usually the LiveView's socket.id .","ref":"LightningWeb.OauthCredentialHelper.html#subscribe/1"},{"type":"module","title":"LightningWeb.OidcController","doc":"","ref":"LightningWeb.OidcController.html"},{"type":"function","title":"LightningWeb.OidcController.new/2","doc":"Once the user has completed the authorization flow from above, they are returned here, and the authorization code is used to log them in.","ref":"LightningWeb.OidcController.html#new/2"},{"type":"function","title":"LightningWeb.OidcController.show/2","doc":"Given a known provider, redirect them to the authorize url on the provider","ref":"LightningWeb.OidcController.html#show/2"},{"type":"module","title":"LightningWeb.PageView","doc":"","ref":"LightningWeb.PageView.html"},{"type":"function","title":"LightningWeb.PageView.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"LightningWeb.PageView.html#__resource__/0"},{"type":"function","title":"LightningWeb.PageView.render/2","doc":"Renders the given template locally.","ref":"LightningWeb.PageView.html#render/2"},{"type":"function","title":"LightningWeb.PageView.template_not_found/2","doc":"Callback invoked when no template is found. By default it raises but can be customized to render a particular template.","ref":"LightningWeb.PageView.html#template_not_found/2"},{"type":"module","title":"LightningWeb.Pagination","doc":"Pagination Components This has been extracted and adapted from scrivener_html . See: https://github.com/mgwidmann/scrivener_html","ref":"LightningWeb.Pagination.html"},{"type":"function","title":"LightningWeb.Pagination.page_link/1","doc":"","ref":"LightningWeb.Pagination.html#page_link/1"},{"type":"function","title":"LightningWeb.Pagination.pagination_bar/1","doc":"","ref":"LightningWeb.Pagination.html#pagination_bar/1"},{"type":"function","title":"LightningWeb.Pagination.raw_pagination_links/2","doc":"Returns the raw data in order to generate the proper HTML for pagination links. Data is returned in a {text, page_number} format where text is intended to be the text of the link and page_number is the page it should go to. Defaults are already supplied and they are as follows: [ distance : 5 , next : :next , previous : :previous , first : true , last : true , ellipsis : :ellipsis ] distance must be a positive non-zero integer or an exception is raised. next and previous should be strings but can be anything you want as long as it is truthy, falsey values will remove them from the output. first and last are only booleans, and they just include/remove their respective link from output. An example of the data returned: iex> Scrivener.HTML . raw_pagination_links ( %{ total_pages : 10 , page_number : 5 } ) [ { "<<" , 4 } , { 1 , 1 } , { 2 , 2 } , { 3 , 3 } , { 4 , 4 } , { 5 , 5 } , { 6 , 6 } , { 7 , 7 } , { 8 , 8 } , { 9 , 9 } , { 10 , 10 } , { ">>" , 6 } ] iex> Scrivener.HTML . raw_pagination_links ( %{ total_pages : 20 , page_number : 10 } , first : [ "←" ] , last : [ "→" ] ) [ { "<<" , 9 } , { [ "←" ] , 1 } , { :ellipsis , { :safe , "&hellip;" } } , { 5 , 5 } , { 6 , 6 } , { 7 , 7 } , { 8 , 8 } , { 9 , 9 } , { 10 , 10 } , { 11 , 11 } , { 12 , 12 } , { 13 , 13 } , { 14 , 14 } , { 15 , 15 } , { :ellipsis , { :safe , "&hellip;" } } , { [ "→" ] , 20 } , { ">>" , 11 } ] Simply loop and pattern match over each item and transform it to your custom HTML.","ref":"LightningWeb.Pagination.html#raw_pagination_links/2"},{"type":"module","title":"LightningWeb.Plugs.FirstSetup","doc":"Plug to redirect HTTP requests to /first_setup if there are no superusers in the system yet.","ref":"LightningWeb.Plugs.FirstSetup.html"},{"type":"module","title":"LightningWeb.ProfileLive.Edit","doc":"LiveView for user profile page.","ref":"LightningWeb.ProfileLive.Edit.html"},{"type":"function","title":"LightningWeb.ProfileLive.Edit.render/1","doc":"Callback implementation for Phoenix.LiveView.render/1 .","ref":"LightningWeb.ProfileLive.Edit.html#render/1"},{"type":"module","title":"LightningWeb.ProfileLive.FormComponent","doc":"Form component update profile email and password","ref":"LightningWeb.ProfileLive.FormComponent.html"},{"type":"function","title":"LightningWeb.ProfileLive.FormComponent.render/1","doc":"Callback implementation for Phoenix.LiveComponent.render/1 .","ref":"LightningWeb.ProfileLive.FormComponent.html#render/1"},{"type":"module","title":"LightningWeb.ProfileLive.MfaComponent","doc":"Component to enable MFA on a User's account","ref":"LightningWeb.ProfileLive.MfaComponent.html"},{"type":"function","title":"LightningWeb.ProfileLive.MfaComponent.render/1","doc":"Callback implementation for Phoenix.LiveComponent.render/1 .","ref":"LightningWeb.ProfileLive.MfaComponent.html#render/1"},{"type":"module","title":"LightningWeb.ProjectLive.FormComponent","doc":"Form Component for working with a single Job A Job's adaptor field is a combination of the module name and the version. It's formatted as an NPM style string. The form allows the user to select a module by name and then it's version, while the version dropdown itself references adaptor directly. Meaning the adaptor_name dropdown and assigns value is not persisted.","ref":"LightningWeb.ProjectLive.FormComponent.html"},{"type":"function","title":"LightningWeb.ProjectLive.FormComponent.render/1","doc":"Callback implementation for Phoenix.LiveComponent.render/1 .","ref":"LightningWeb.ProjectLive.FormComponent.html#render/1"},{"type":"module","title":"LightningWeb.ProjectLive.Index","doc":"LiveView for listing and managing Projects","ref":"LightningWeb.ProjectLive.Index.html"},{"type":"function","title":"LightningWeb.ProjectLive.Index.delete_action/1","doc":"","ref":"LightningWeb.ProjectLive.Index.html#delete_action/1"},{"type":"function","title":"LightningWeb.ProjectLive.Index.render/1","doc":"Callback implementation for Phoenix.LiveView.render/1 .","ref":"LightningWeb.ProjectLive.Index.html#render/1"},{"type":"module","title":"LightningWeb.ProjectLive.MFARequired","doc":"Liveview for project access denied error messages","ref":"LightningWeb.ProjectLive.MFARequired.html"},{"type":"function","title":"LightningWeb.ProjectLive.MFARequired.on_mount/4","doc":"","ref":"LightningWeb.ProjectLive.MFARequired.html#on_mount/4"},{"type":"function","title":"LightningWeb.ProjectLive.MFARequired.render/1","doc":"Callback implementation for Phoenix.LiveView.render/1 .","ref":"LightningWeb.ProjectLive.MFARequired.html#render/1"},{"type":"module","title":"LightningWeb.ProjectLive.Settings","doc":"Index Liveview for Runs","ref":"LightningWeb.ProjectLive.Settings.html"},{"type":"function","title":"LightningWeb.ProjectLive.Settings.digest/1","doc":"","ref":"LightningWeb.ProjectLive.Settings.html#digest/1"},{"type":"function","title":"LightningWeb.ProjectLive.Settings.failure_alert/1","doc":"","ref":"LightningWeb.ProjectLive.Settings.html#failure_alert/1"},{"type":"function","title":"LightningWeb.ProjectLive.Settings.render/1","doc":"Callback implementation for Phoenix.LiveView.render/1 .","ref":"LightningWeb.ProjectLive.Settings.html#render/1"},{"type":"function","title":"LightningWeb.ProjectLive.Settings.role/1","doc":"","ref":"LightningWeb.ProjectLive.Settings.html#role/1"},{"type":"function","title":"LightningWeb.ProjectLive.Settings.user/1","doc":"","ref":"LightningWeb.ProjectLive.Settings.html#user/1"},{"type":"module","title":"LightningWeb.ReAuthenticateLive.New","doc":"LiveView for re-authentication page.","ref":"LightningWeb.ReAuthenticateLive.New.html"},{"type":"function","title":"LightningWeb.ReAuthenticateLive.New.render/1","doc":"Callback implementation for Phoenix.LiveView.render/1 .","ref":"LightningWeb.ReAuthenticateLive.New.html#render/1"},{"type":"module","title":"LightningWeb.RouteHelpers","doc":"Convenience functions for generating paths.","ref":"LightningWeb.RouteHelpers.html"},{"type":"function","title":"LightningWeb.RouteHelpers.oidc_callback_url/0","doc":"","ref":"LightningWeb.RouteHelpers.html#oidc_callback_url/0"},{"type":"function","title":"LightningWeb.RouteHelpers.show_run_url/2","doc":"","ref":"LightningWeb.RouteHelpers.html#show_run_url/2"},{"type":"module","title":"LightningWeb.Router","doc":"","ref":"LightningWeb.Router.html"},{"type":"function","title":"LightningWeb.Router.api/2","doc":"","ref":"LightningWeb.Router.html#api/2"},{"type":"function","title":"LightningWeb.Router.browser/2","doc":"","ref":"LightningWeb.Router.html#browser/2"},{"type":"function","title":"LightningWeb.Router.call/2","doc":"Callback invoked by Plug on every request.","ref":"LightningWeb.Router.html#call/2"},{"type":"function","title":"LightningWeb.Router.init/1","doc":"Callback required by Plug that initializes the router for serving web requests.","ref":"LightningWeb.Router.html#init/1"},{"type":"function","title":"LightningWeb.Router.storybook_assets/2","doc":"","ref":"LightningWeb.Router.html#storybook_assets/2"},{"type":"function","title":"LightningWeb.Router.storybook_browser/2","doc":"","ref":"LightningWeb.Router.html#storybook_browser/2"},{"type":"module","title":"LightningWeb.RunLive.Index","doc":"Index Liveview for Runs","ref":"LightningWeb.RunLive.Index.html"},{"type":"function","title":"LightningWeb.RunLive.Index.checked/2","doc":"","ref":"LightningWeb.RunLive.Index.html#checked/2"},{"type":"function","title":"LightningWeb.RunLive.Index.render/1","doc":"Callback implementation for Phoenix.LiveView.render/1 .","ref":"LightningWeb.RunLive.Index.html#render/1"},{"type":"module","title":"LightningWeb.RunLive.RerunJobComponent","doc":"Rerun job component","ref":"LightningWeb.RunLive.RerunJobComponent.html"},{"type":"function","title":"LightningWeb.RunLive.RerunJobComponent.handle_event/3","doc":"Callback implementation for Phoenix.LiveComponent.handle_event/3 .","ref":"LightningWeb.RunLive.RerunJobComponent.html#handle_event/3"},{"type":"function","title":"LightningWeb.RunLive.RerunJobComponent.render/1","doc":"Callback implementation for Phoenix.LiveComponent.render/1 .","ref":"LightningWeb.RunLive.RerunJobComponent.html#render/1"},{"type":"function","title":"LightningWeb.RunLive.RerunJobComponent.update/2","doc":"Callback implementation for Phoenix.LiveComponent.update/2 .","ref":"LightningWeb.RunLive.RerunJobComponent.html#update/2"},{"type":"module","title":"LightningWeb.RunLive.RunViewerLive","doc":"","ref":"LightningWeb.RunLive.RunViewerLive.html"},{"type":"function","title":"LightningWeb.RunLive.RunViewerLive.handle_info/2","doc":"Reload the run when any update messages arrive.","ref":"LightningWeb.RunLive.RunViewerLive.html#handle_info/2"},{"type":"module","title":"LightningWeb.RunLive.Show","doc":"Show page for individual runs.","ref":"LightningWeb.RunLive.Show.html"},{"type":"function","title":"LightningWeb.RunLive.Show.apply_action/3","doc":"","ref":"LightningWeb.RunLive.Show.html#apply_action/3"},{"type":"module","title":"LightningWeb.RunLive.WorkOrderComponent","doc":"Workorder component","ref":"LightningWeb.RunLive.WorkOrderComponent.html"},{"type":"function","title":"LightningWeb.RunLive.WorkOrderComponent.render/1","doc":"Attributes show_details ( :boolean ) - Defaults to false . entry_selected ( :boolean ) - Defaults to false .","ref":"LightningWeb.RunLive.WorkOrderComponent.html#render/1"},{"type":"module","title":"LightningWeb.Telemetry","doc":"Assorted metrics to collect during runtime. See https://hexdocs.pm/phoenix/telemetry.html","ref":"LightningWeb.Telemetry.html"},{"type":"function","title":"LightningWeb.Telemetry.child_spec/1","doc":"Returns a specification to start this module under a supervisor. See Supervisor .","ref":"LightningWeb.Telemetry.html#child_spec/1"},{"type":"function","title":"LightningWeb.Telemetry.metrics/0","doc":"","ref":"LightningWeb.Telemetry.html#metrics/0"},{"type":"function","title":"LightningWeb.Telemetry.start_link/1","doc":"","ref":"LightningWeb.Telemetry.html#start_link/1"},{"type":"module","title":"LightningWeb.TokensLive.Index","doc":"LiveView for listing and managing tokens","ref":"LightningWeb.TokensLive.Index.html"},{"type":"function","title":"LightningWeb.TokensLive.Index.render/1","doc":"Callback implementation for Phoenix.LiveView.render/1 .","ref":"LightningWeb.TokensLive.Index.html#render/1"},{"type":"module","title":"LightningWeb.UserAuth","doc":"The UserAuth controller.","ref":"LightningWeb.UserAuth.html"},{"type":"function","title":"LightningWeb.UserAuth.authenticate_bearer/2","doc":"","ref":"LightningWeb.UserAuth.html#authenticate_bearer/2"},{"type":"function","title":"LightningWeb.UserAuth.fetch_current_user/2","doc":"Authenticates the user by looking into the session and remember me token.","ref":"LightningWeb.UserAuth.html#fetch_current_user/2"},{"type":"function","title":"LightningWeb.UserAuth.log_in_user/2","doc":"Logs the user in by creating a new session token.","ref":"LightningWeb.UserAuth.html#log_in_user/2"},{"type":"function","title":"LightningWeb.UserAuth.log_out_user/1","doc":"Logs the user out. It clears all session data for safety. See renew_session.","ref":"LightningWeb.UserAuth.html#log_out_user/1"},{"type":"function","title":"LightningWeb.UserAuth.mark_totp_pending/1","doc":"","ref":"LightningWeb.UserAuth.html#mark_totp_pending/1"},{"type":"function","title":"LightningWeb.UserAuth.new_session/2","doc":"Assigns the token to a new session. It renews the session ID and clears the whole session to avoid fixation attacks. See the renew_session function to customize this behaviour. It also sets a :live_socket_id key in the session, so LiveView sessions are identified and automatically disconnected on log out. The line can be safely removed if you are not using LiveView.","ref":"LightningWeb.UserAuth.html#new_session/2"},{"type":"function","title":"LightningWeb.UserAuth.on_mount/4","doc":"Used for LiveView routes that require the user to be re-authenticated.","ref":"LightningWeb.UserAuth.html#on_mount/4"},{"type":"function","title":"LightningWeb.UserAuth.reauth_sudo_mode/2","doc":"Re-Authenticates the user by using the sudo token","ref":"LightningWeb.UserAuth.html#reauth_sudo_mode/2"},{"type":"function","title":"LightningWeb.UserAuth.redirect_if_user_is_authenticated/2","doc":"Used for routes that require the user to not be authenticated.","ref":"LightningWeb.UserAuth.html#redirect_if_user_is_authenticated/2"},{"type":"function","title":"LightningWeb.UserAuth.redirect_with_return_to/2","doc":"Returns to or redirects to the dashboard and potentially set remember_me token.","ref":"LightningWeb.UserAuth.html#redirect_with_return_to/2"},{"type":"function","title":"LightningWeb.UserAuth.require_authenticated_user/2","doc":"Used for routes that require the user to be authenticated. If you want to enforce the user email is confirmed before they use the application at all, here would be a good place.","ref":"LightningWeb.UserAuth.html#require_authenticated_user/2"},{"type":"function","title":"LightningWeb.UserAuth.require_sudo_user/2","doc":"Used for routes that require the user to be re-authenticated.","ref":"LightningWeb.UserAuth.html#require_sudo_user/2"},{"type":"function","title":"LightningWeb.UserAuth.totp_pending?/1","doc":"","ref":"LightningWeb.UserAuth.html#totp_pending?/1"},{"type":"function","title":"LightningWeb.UserAuth.totp_validated/1","doc":"","ref":"LightningWeb.UserAuth.html#totp_validated/1"},{"type":"module","title":"LightningWeb.UserConfirmationController","doc":"","ref":"LightningWeb.UserConfirmationController.html"},{"type":"function","title":"LightningWeb.UserConfirmationController.confirm_email/2","doc":"","ref":"LightningWeb.UserConfirmationController.html#confirm_email/2"},{"type":"function","title":"LightningWeb.UserConfirmationController.create/2","doc":"","ref":"LightningWeb.UserConfirmationController.html#create/2"},{"type":"function","title":"LightningWeb.UserConfirmationController.edit/2","doc":"","ref":"LightningWeb.UserConfirmationController.html#edit/2"},{"type":"function","title":"LightningWeb.UserConfirmationController.new/2","doc":"","ref":"LightningWeb.UserConfirmationController.html#new/2"},{"type":"function","title":"LightningWeb.UserConfirmationController.update/2","doc":"","ref":"LightningWeb.UserConfirmationController.html#update/2"},{"type":"module","title":"LightningWeb.UserLive.Edit","doc":"LiveView for editing a single job, which inturn uses LightningWeb.JobLive.BigFormComponent for common functionality.","ref":"LightningWeb.UserLive.Edit.html"},{"type":"function","title":"LightningWeb.UserLive.Edit.render/1","doc":"Callback implementation for Phoenix.LiveView.render/1 .","ref":"LightningWeb.UserLive.Edit.html#render/1"},{"type":"module","title":"LightningWeb.UserLive.FormComponent","doc":"Form component for creating and editing users","ref":"LightningWeb.UserLive.FormComponent.html"},{"type":"function","title":"LightningWeb.UserLive.FormComponent.render/1","doc":"Callback implementation for Phoenix.LiveComponent.render/1 .","ref":"LightningWeb.UserLive.FormComponent.html#render/1"},{"type":"module","title":"LightningWeb.UserLive.Index","doc":"Index page for listing users","ref":"LightningWeb.UserLive.Index.html"},{"type":"function","title":"LightningWeb.UserLive.Index.delete_action/1","doc":"","ref":"LightningWeb.UserLive.Index.html#delete_action/1"},{"type":"function","title":"LightningWeb.UserLive.Index.render/1","doc":"Callback implementation for Phoenix.LiveView.render/1 .","ref":"LightningWeb.UserLive.Index.html#render/1"},{"type":"module","title":"LightningWeb.UserRegistrationController","doc":"","ref":"LightningWeb.UserRegistrationController.html"},{"type":"function","title":"LightningWeb.UserRegistrationController.create/2","doc":"","ref":"LightningWeb.UserRegistrationController.html#create/2"},{"type":"function","title":"LightningWeb.UserRegistrationController.new/2","doc":"","ref":"LightningWeb.UserRegistrationController.html#new/2"},{"type":"module","title":"LightningWeb.UserResetPasswordController","doc":"","ref":"LightningWeb.UserResetPasswordController.html"},{"type":"function","title":"LightningWeb.UserResetPasswordController.create/2","doc":"","ref":"LightningWeb.UserResetPasswordController.html#create/2"},{"type":"function","title":"LightningWeb.UserResetPasswordController.edit/2","doc":"","ref":"LightningWeb.UserResetPasswordController.html#edit/2"},{"type":"function","title":"LightningWeb.UserResetPasswordController.new/2","doc":"","ref":"LightningWeb.UserResetPasswordController.html#new/2"},{"type":"function","title":"LightningWeb.UserResetPasswordController.update/2","doc":"","ref":"LightningWeb.UserResetPasswordController.html#update/2"},{"type":"module","title":"LightningWeb.UserSessionController","doc":"","ref":"LightningWeb.UserSessionController.html"},{"type":"function","title":"LightningWeb.UserSessionController.auth_handler_url/0","doc":"","ref":"LightningWeb.UserSessionController.html#auth_handler_url/0"},{"type":"function","title":"LightningWeb.UserSessionController.create/2","doc":"","ref":"LightningWeb.UserSessionController.html#create/2"},{"type":"function","title":"LightningWeb.UserSessionController.delete/2","doc":"","ref":"LightningWeb.UserSessionController.html#delete/2"},{"type":"function","title":"LightningWeb.UserSessionController.exchange_token/2","doc":"","ref":"LightningWeb.UserSessionController.html#exchange_token/2"},{"type":"function","title":"LightningWeb.UserSessionController.new/2","doc":"","ref":"LightningWeb.UserSessionController.html#new/2"},{"type":"module","title":"LightningWeb.UserTOTPController","doc":"","ref":"LightningWeb.UserTOTPController.html"},{"type":"function","title":"LightningWeb.UserTOTPController.create/2","doc":"","ref":"LightningWeb.UserTOTPController.html#create/2"},{"type":"function","title":"LightningWeb.UserTOTPController.new/2","doc":"","ref":"LightningWeb.UserTOTPController.html#new/2"},{"type":"module","title":"LightningWeb.VersionControlController","doc":"","ref":"LightningWeb.VersionControlController.html"},{"type":"function","title":"LightningWeb.VersionControlController.index/2","doc":"","ref":"LightningWeb.VersionControlController.html#index/2"},{"type":"module","title":"LightningWeb.WebhooksController","doc":"","ref":"LightningWeb.WebhooksController.html"},{"type":"function","title":"LightningWeb.WebhooksController.create/2","doc":"","ref":"LightningWeb.WebhooksController.html#create/2"},{"type":"module","title":"LightningWeb.WorkflowLive.EditorPane","doc":"","ref":"LightningWeb.WorkflowLive.EditorPane.html"},{"type":"function","title":"LightningWeb.WorkflowLive.EditorPane.render/1","doc":"Attributes id ( :string ) (required) disabled ( :boolean ) - Defaults to false . class ( :string ) - Defaults to "" . on_change ( :any ) (required) adaptor ( :string ) (required) source ( :string ) (required) job_id ( :string ) (required)","ref":"LightningWeb.WorkflowLive.EditorPane.html#render/1"},{"type":"module","title":"LightningWeb.WorkflowLive.JobView","doc":"","ref":"LightningWeb.WorkflowLive.JobView.html"},{"type":"function","title":"LightningWeb.WorkflowLive.JobView.container/1","doc":"Attributes id ( :string ) (required) Slots top column - Accepts attributes: class ( :string ) - Extra CSS classes for the column. bottom","ref":"LightningWeb.WorkflowLive.JobView.html#container/1"},{"type":"function","title":"LightningWeb.WorkflowLive.JobView.input_pane/1","doc":"Attributes job ( :map ) (required) user ( :map ) (required) project ( :map ) (required) on_run ( :any ) (required) - Callback to run a job manually. can_run_job ( :boolean ) - Defaults to true .","ref":"LightningWeb.WorkflowLive.JobView.html#input_pane/1"},{"type":"function","title":"LightningWeb.WorkflowLive.JobView.job_edit_view/1","doc":"Attributes job ( :map ) (required) form ( :map ) (required) - A form built from a job. current_user ( :map ) (required) project ( :map ) (required) close_url ( :any ) (required) socket ( :any ) (required) on_run ( :any ) (required) - Callback to run a job manually. follow_run_id ( :any ) - Defaults to nil . Slots footer","ref":"LightningWeb.WorkflowLive.JobView.html#job_edit_view/1"},{"type":"module","title":"LightningWeb.WorkflowNewLive.WorkflowParams","doc":"Various function for reconciling changes to a workflow params map. The front end editor uses JSON patches to represent changes to the workflow.","ref":"LightningWeb.WorkflowNewLive.WorkflowParams.html"},{"type":"function","title":"LightningWeb.WorkflowNewLive.WorkflowParams.apply_form_params/2","doc":"Produce a new set of params by applying the given form params to the current params.","ref":"LightningWeb.WorkflowNewLive.WorkflowParams.html#apply_form_params/2"},{"type":"function","title":"LightningWeb.WorkflowNewLive.WorkflowParams.apply_patches/2","doc":"Produce a new set of params by applying the given patches to the current parms","ref":"LightningWeb.WorkflowNewLive.WorkflowParams.html#apply_patches/2"},{"type":"function","title":"LightningWeb.WorkflowNewLive.WorkflowParams.to_map/1","doc":"Convert a changeset to a serializable map of workflow params, suitable for sending to the front end editor. It uses Lightning.Helpers.json_safe/1 to ensure that the map is safe to serialize to JSON. This is necessary because the underlying model may contain atom values.","ref":"LightningWeb.WorkflowNewLive.WorkflowParams.html#to_map/1"},{"type":"function","title":"LightningWeb.WorkflowNewLive.WorkflowParams.to_patches/2","doc":"Produce a set of patches that represent the difference between the initial params and the target params. This usually is used to produce a set of patches that represent the changes introduced by a changeset.","ref":"LightningWeb.WorkflowNewLive.WorkflowParams.html#to_patches/2"},{"type":"task","title":"Mix.Tasks.Lightning.GenEncryptionKey","doc":"Helper to generate a unique encryption key for Vault","ref":"Mix.Tasks.Lightning.GenEncryptionKey.html"},{"type":"task","title":"Mix.Tasks.Lightning.InstallRuntime","doc":"Installs the following NodeJS packages: core language-common","ref":"Mix.Tasks.Lightning.InstallRuntime.html"},{"type":"function","title":"Mix.Tasks.Lightning.InstallRuntime.packages/0","doc":"","ref":"Mix.Tasks.Lightning.InstallRuntime.html#packages/0"},{"type":"function","title":"Mix.Tasks.Lightning.InstallRuntime.run/1","doc":"Callback implementation for Mix.Task.run/1 .","ref":"Mix.Tasks.Lightning.InstallRuntime.html#run/1"},{"type":"task","title":"Mix.Tasks.Lightning.InstallSchemas","doc":"Install the credential json schemas Use --exclude language-package1, language-package2 to exclude specific packages","ref":"Mix.Tasks.Lightning.InstallSchemas.html"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.delete/3","doc":"Issues a DELETE request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#delete/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.delete!/3","doc":"Issues a DELETE request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#delete!/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.fetch_schemas/2","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#fetch_schemas/2"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.get/3","doc":"Issues a GET request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#get/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.get!/3","doc":"Issues a GET request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#get!/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.head/3","doc":"Issues a HEAD request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#head/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.head!/3","doc":"Issues a HEAD request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#head!/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.options/3","doc":"Issues an OPTIONS request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#options/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.options!/3","doc":"Issues a OPTIONS request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#options!/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.parse_excluded/1","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#parse_excluded/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.patch/4","doc":"Issues a PATCH request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#patch/4"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.patch!/4","doc":"Issues a PATCH request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#patch!/4"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.persist_schema/2","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#persist_schema/2"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.post/4","doc":"Issues a POST request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#post/4"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.post!/4","doc":"Issues a POST request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#post!/4"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_headers/1","doc":"Callback implementation for HTTPoison.Base.process_headers/1 .","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_headers/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_request_body/1","doc":"Callback implementation for HTTPoison.Base.process_request_body/1 .","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_request_body/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_request_headers/1","doc":"Callback implementation for HTTPoison.Base.process_request_headers/1 .","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_request_headers/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_request_options/1","doc":"Callback implementation for HTTPoison.Base.process_request_options/1 .","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_request_options/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_request_params/1","doc":"Callback implementation for HTTPoison.Base.process_request_params/1 .","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_request_params/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_request_url/1","doc":"Callback implementation for HTTPoison.Base.process_request_url/1 .","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_request_url/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_response/1","doc":"Callback implementation for HTTPoison.Base.process_response/1 .","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_response/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_response_body/1","doc":"Callback implementation for HTTPoison.Base.process_response_body/1 .","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_response_body/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_response_chunk/1","doc":"Callback implementation for HTTPoison.Base.process_response_chunk/1 .","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_response_chunk/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_response_headers/1","doc":"Callback implementation for HTTPoison.Base.process_response_headers/1 .","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_response_headers/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_response_status_code/1","doc":"Callback implementation for HTTPoison.Base.process_response_status_code/1 .","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_response_status_code/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_status_code/1","doc":"Callback implementation for HTTPoison.Base.process_status_code/1 .","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_status_code/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_url/1","doc":"Callback implementation for HTTPoison.Base.process_url/1 .","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_url/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.put/4","doc":"Issues a PUT request to the given url. Returns {:ok, response} if the request is successful, {:error, reason} otherwise. See request/5 for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#put/4"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.put!/4","doc":"Issues a PUT request to the given url, raising an exception in case of failure. If the request does not fail, the response is returned. See request!/5 for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#put!/4"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.request/1","doc":"Issues an HTTP request using a Request struct. This function returns {:ok, response} , {:ok, async_response} , or {:ok, maybe_redirect} if the request is successful, {:error, reason} otherwise. Redirect handling If the option :follow_redirect is given, HTTP redirects are automatically follow if the method is set to :get or :head and the response's status_code is 301 , 302 or 307 . If the method is set to :post , then the only status_code that get's automatically followed is 303 . If any other method or status_code is returned, then this function returns a returns a {:ok, %HTTPoison.MaybeRedirect{}} containing the redirect_url for you to re-request with the method set to :get . Examples request = % HTTPoison.Request { method : :post , url : "https://my.website.com" , body : "{ \\" foo \\" : 3}" , headers : [ { "Accept" , "application/json" } ] } request ( request )","ref":"Mix.Tasks.Lightning.InstallSchemas.html#request/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.request/5","doc":"Issues an HTTP request with the given method to the given url. This function is usually used indirectly by get/3 , post/4 , put/4 , etc Args: method - HTTP method as an atom ( :get , :head , :post , :put , :delete , etc.) url - target url as a binary string or char list body - request body. See more below headers - HTTP headers as an orddict (e.g., [{"Accept", "application/json"}] ) options - Keyword list of options Body: see type HTTPoison.Request Options: see type HTTPoison.Request This function returns {:ok, response} , {:ok, async_response} , or {:ok, maybe_redirect} if the request is successful, {:error, reason} otherwise. Redirect handling If the option :follow_redirect is given, HTTP redirects are automatically follow if the method is set to :get or :head and the response's status_code is 301 , 302 or 307 . If the method is set to :post , then the only status_code that get's automatically followed is 303 . If any other method or status_code is returned, then this function returns a returns a {:ok, %HTTPoison.MaybeRedirect{}} containing the redirect_url for you to re-request with the method set to :get . Examples request ( :post , "https://my.website.com" , "{ \\" foo \\" : 3}" , [ { "Accept" , "application/json" } ] )","ref":"Mix.Tasks.Lightning.InstallSchemas.html#request/5"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.request!/5","doc":"Issues an HTTP request with the given method to the given url, raising an exception in case of failure. request!/5 works exactly like request/5 but it returns just the response in case of a successful request, raising an exception in case the request fails.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#request!/5"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.run/1","doc":"Callback implementation for Mix.Task.run/1 .","ref":"Mix.Tasks.Lightning.InstallSchemas.html#run/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.start/0","doc":"Starts HTTPoison and its dependencies.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#start/0"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.stream_next/1","doc":"Requests the next message to be streamed for a given HTTPoison.AsyncResponse . See request!/5 for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#stream_next/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.write_schema/3","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#write_schema/3"},{"type":"type","title":"Mix.Tasks.Lightning.InstallSchemas.body/0","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#t:body/0"},{"type":"type","title":"Mix.Tasks.Lightning.InstallSchemas.headers/0","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#t:headers/0"},{"type":"type","title":"Mix.Tasks.Lightning.InstallSchemas.method/0","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#t:method/0"},{"type":"type","title":"Mix.Tasks.Lightning.InstallSchemas.options/0","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#t:options/0"},{"type":"type","title":"Mix.Tasks.Lightning.InstallSchemas.params/0","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#t:params/0"},{"type":"type","title":"Mix.Tasks.Lightning.InstallSchemas.request/0","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#t:request/0"},{"type":"type","title":"Mix.Tasks.Lightning.InstallSchemas.url/0","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#t:url/0"},{"type":"module","title":"ObanPruner","doc":"The Oban Pruner removes completed Oban jobs. It leaves everything else for manual inspection.","ref":"ObanPruner.html"},{"type":"function","title":"ObanPruner.perform/1","doc":"Deletes completed Oban jobs, leaving discarded for manual inspection.","ref":"ObanPruner.html#perform/1"},{"type":"module","title":"Storybook.Root","doc":"","ref":"Storybook.Root.html"},{"type":"module","title":"Lightning.Accounts","doc":"The Accounts context.","ref":"Lightning.Accounts.html"},{"type":"function","title":"Lightning.Accounts.apply_user_email/3","doc":"Emulates that the email will change without actually changing it in the database. Examples iex> apply_user_email ( user , "valid password" , %{ email : ... } ) { :ok , % User { } } role : :superuser iex> apply_user_email ( user , "invalid password" , %{ email : ... } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Accounts.html#apply_user_email/3"},{"type":"function","title":"Lightning.Accounts.cancel_scheduled_deletion/1","doc":"","ref":"Lightning.Accounts.html#cancel_scheduled_deletion/1"},{"type":"function","title":"Lightning.Accounts.change_scheduled_deletion/2","doc":"Returns an %Ecto.Changeset{} for changing the user scheduled_deletion. Examples iex> change_scheduled_deletion ( user ) % Ecto.Changeset { data : % User { } }","ref":"Lightning.Accounts.html#change_scheduled_deletion/2"},{"type":"function","title":"Lightning.Accounts.change_superuser_registration/1","doc":"Returns an %Ecto.Changeset{} for tracking superuser changes. Examples iex> change_superuser_registration ( user ) % Ecto.Changeset { data : % User { } }","ref":"Lightning.Accounts.html#change_superuser_registration/1"},{"type":"function","title":"Lightning.Accounts.change_user_details/2","doc":"","ref":"Lightning.Accounts.html#change_user_details/2"},{"type":"function","title":"Lightning.Accounts.change_user_email/2","doc":"Returns an %Ecto.Changeset{} for changing the user email. Examples iex> change_user_email ( user ) % Ecto.Changeset { data : % User { } }","ref":"Lightning.Accounts.html#change_user_email/2"},{"type":"function","title":"Lightning.Accounts.change_user_password/2","doc":"Returns an %Ecto.Changeset{} for changing the user password. Examples iex> change_user_password ( user ) % Ecto.Changeset { data : % User { } }","ref":"Lightning.Accounts.html#change_user_password/2"},{"type":"function","title":"Lightning.Accounts.change_user_registration/1","doc":"Returns an %Ecto.Changeset{} for tracking user changes. Examples iex> change_user_registration ( user ) % Ecto.Changeset { data : % User { } }","ref":"Lightning.Accounts.html#change_user_registration/1"},{"type":"function","title":"Lightning.Accounts.confirm_user/1","doc":"Confirms a user by the given token. If the token matches, the user account is marked as confirmed and the token is deleted.","ref":"Lightning.Accounts.html#confirm_user/1"},{"type":"function","title":"Lightning.Accounts.delete_auth_token/1","doc":"Deletes the signed token with the given context.","ref":"Lightning.Accounts.html#delete_auth_token/1"},{"type":"function","title":"Lightning.Accounts.delete_session_token/1","doc":"Deletes the signed token with the given context.","ref":"Lightning.Accounts.html#delete_session_token/1"},{"type":"function","title":"Lightning.Accounts.delete_sudo_session_token/1","doc":"Deletes the signed token with the given context.","ref":"Lightning.Accounts.html#delete_sudo_session_token/1"},{"type":"function","title":"Lightning.Accounts.delete_token/1","doc":"Deletes a token. Examples iex> delete_token ( token ) { :ok , % UserToken { } } iex> delete_token ( token ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Accounts.html#delete_token/1"},{"type":"function","title":"Lightning.Accounts.delete_user/1","doc":"Deletes a user. Examples iex> delete_user ( user ) { :ok , % User { } } iex> delete_user ( user ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Accounts.html#delete_user/1"},{"type":"function","title":"Lightning.Accounts.delete_user_totp/1","doc":"Deletes the given user's TOTP","ref":"Lightning.Accounts.html#delete_user_totp/1"},{"type":"function","title":"Lightning.Accounts.deliver_update_email_instructions/3","doc":"Delivers the update email instructions to the given user. Examples iex> deliver_update_email_instructions ( user , current_email , & Routes . user_update_email_url ( conn , :edit , &1 ) ) { :ok , %{ to : ... , body : ... } }","ref":"Lightning.Accounts.html#deliver_update_email_instructions/3"},{"type":"function","title":"Lightning.Accounts.deliver_user_confirmation_instructions/2","doc":"Delivers the confirmation email instructions to the given 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 }","ref":"Lightning.Accounts.html#deliver_user_confirmation_instructions/2"},{"type":"function","title":"Lightning.Accounts.deliver_user_confirmation_instructions/3","doc":"","ref":"Lightning.Accounts.html#deliver_user_confirmation_instructions/3"},{"type":"function","title":"Lightning.Accounts.deliver_user_reset_password_instructions/2","doc":"Delivers the reset password email to the given user. Examples iex> deliver_user_reset_password_instructions ( user , & Routes . user_reset_password_url ( conn , :edit , &1 ) ) { :ok , %{ to : ... , body : ... } }","ref":"Lightning.Accounts.html#deliver_user_reset_password_instructions/2"},{"type":"function","title":"Lightning.Accounts.exchange_auth_token/1","doc":"Exchanges an auth token for a session token. The auth token is removed from the database if successful.","ref":"Lightning.Accounts.html#exchange_auth_token/1"},{"type":"function","title":"Lightning.Accounts.generate_api_token/1","doc":"Generates an API token for a user.","ref":"Lightning.Accounts.html#generate_api_token/1"},{"type":"function","title":"Lightning.Accounts.generate_auth_token/1","doc":"Generates an auth token.","ref":"Lightning.Accounts.html#generate_auth_token/1"},{"type":"function","title":"Lightning.Accounts.generate_sudo_session_token/1","doc":"Generates a 2FA session token.","ref":"Lightning.Accounts.html#generate_sudo_session_token/1"},{"type":"function","title":"Lightning.Accounts.generate_user_session_token/1","doc":"Generates a session token.","ref":"Lightning.Accounts.html#generate_user_session_token/1"},{"type":"function","title":"Lightning.Accounts.get_token!/1","doc":"Gets a single token. Raises Ecto.NoResultsError if the UserToken does not exist. Examples iex> get_token! ( 123 ) % UserToken { } iex> get_token! ( 456 ) ** (Ecto.NoResultsError)","ref":"Lightning.Accounts.html#get_token!/1"},{"type":"function","title":"Lightning.Accounts.get_user!/1","doc":"Gets a single user. Raises Ecto.NoResultsError if the User does not exist. Examples iex> get_user! ( 123 ) % User { } iex> get_user! ( 456 ) ** (Ecto.NoResultsError)","ref":"Lightning.Accounts.html#get_user!/1"},{"type":"function","title":"Lightning.Accounts.get_user_by_api_token/1","doc":"Gets the user with the given signed token.","ref":"Lightning.Accounts.html#get_user_by_api_token/1"},{"type":"function","title":"Lightning.Accounts.get_user_by_auth_token/1","doc":"Gets the user with the given signed token.","ref":"Lightning.Accounts.html#get_user_by_auth_token/1"},{"type":"function","title":"Lightning.Accounts.get_user_by_email/1","doc":"Gets a user by email. Examples iex> get_user_by_email ( "foo@example.com" ) % User { } iex> get_user_by_email ( "unknown@example.com" ) nil","ref":"Lightning.Accounts.html#get_user_by_email/1"},{"type":"function","title":"Lightning.Accounts.get_user_by_email_and_password/2","doc":"Gets a user by email and password. Examples 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" ) nil","ref":"Lightning.Accounts.html#get_user_by_email_and_password/2"},{"type":"function","title":"Lightning.Accounts.get_user_by_reset_password_token/1","doc":"Gets the user by reset password token. Examples iex> get_user_by_reset_password_token ( "validtoken" ) % User { } iex> get_user_by_reset_password_token ( "invalidtoken" ) nil","ref":"Lightning.Accounts.html#get_user_by_reset_password_token/1"},{"type":"function","title":"Lightning.Accounts.get_user_by_session_token/1","doc":"Gets the user with the given signed token.","ref":"Lightning.Accounts.html#get_user_by_session_token/1"},{"type":"function","title":"Lightning.Accounts.get_user_totp/1","doc":"Gets a single UserTOTP if any exists.","ref":"Lightning.Accounts.html#get_user_totp/1"},{"type":"function","title":"Lightning.Accounts.get_users_to_alert_for_project/1","doc":"Gets all users to alert of workflow failure for a project","ref":"Lightning.Accounts.html#get_users_to_alert_for_project/1"},{"type":"function","title":"Lightning.Accounts.has_activity_in_projects?/1","doc":"","ref":"Lightning.Accounts.html#has_activity_in_projects?/1"},{"type":"function","title":"Lightning.Accounts.has_one_superuser?/0","doc":"Used to determine if there is at least one Superuser in the system. This triggers the setup page on fresh installs.","ref":"Lightning.Accounts.html#has_one_superuser?/0"},{"type":"function","title":"Lightning.Accounts.list_api_tokens/1","doc":"Lists all user tokens","ref":"Lightning.Accounts.html#list_api_tokens/1"},{"type":"function","title":"Lightning.Accounts.list_user_backup_codes/1","doc":"Lists the user backup codes","ref":"Lightning.Accounts.html#list_user_backup_codes/1"},{"type":"function","title":"Lightning.Accounts.list_users/0","doc":"Returns the list of users. Examples iex> list_users ( ) [ % User { } , ... ]","ref":"Lightning.Accounts.html#list_users/0"},{"type":"function","title":"Lightning.Accounts.perform/1","doc":"Perform, when called with %{"type" => "purge_deleted"} will find users that are ready for permanent deletion and purge them.","ref":"Lightning.Accounts.html#perform/1"},{"type":"function","title":"Lightning.Accounts.purge_user/1","doc":"","ref":"Lightning.Accounts.html#purge_user/1"},{"type":"function","title":"Lightning.Accounts.regenerate_user_backup_codes/1","doc":"Regenerates the user backup codes","ref":"Lightning.Accounts.html#regenerate_user_backup_codes/1"},{"type":"function","title":"Lightning.Accounts.register_superuser/1","doc":"Registers a superuser. Examples iex> register_superuser ( %{ field : value } ) { :ok , % User { } } iex> register_superuser ( %{ field : bad_value } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Accounts.html#register_superuser/1"},{"type":"function","title":"Lightning.Accounts.register_user/1","doc":"Registers a user. Examples iex> register_user ( %{ field : value } ) { :ok , % User { } } iex> register_user ( %{ field : bad_value } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Accounts.html#register_user/1"},{"type":"function","title":"Lightning.Accounts.reset_user_password/2","doc":"Resets the user password. 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 { } }","ref":"Lightning.Accounts.html#reset_user_password/2"},{"type":"function","title":"Lightning.Accounts.schedule_user_deletion/2","doc":"Given a user and a confirmation email, this function sets a scheduled deletion date based on the PURGE_DELETED_AFTER_DAYS environment variable. If no ENV is set, this date defaults to NOW but the automatic user purge cronjob will never run. (Note that subsequent logins will be blocked for users pending deletion.)","ref":"Lightning.Accounts.html#schedule_user_deletion/2"},{"type":"function","title":"Lightning.Accounts.sudo_session_token_valid?/2","doc":"Checks if the given sudo token for the user is valid","ref":"Lightning.Accounts.html#sudo_session_token_valid?/2"},{"type":"function","title":"Lightning.Accounts.update_user_details/2","doc":"","ref":"Lightning.Accounts.html#update_user_details/2"},{"type":"function","title":"Lightning.Accounts.update_user_email/2","doc":"Updates the user email using the given token. If the token matches, the user email is updated and the token is deleted. The confirmed_at date is also updated to the current time.","ref":"Lightning.Accounts.html#update_user_email/2"},{"type":"function","title":"Lightning.Accounts.update_user_password/3","doc":"Updates the user password. Examples iex> update_user_password ( user , "valid password" , %{ password : ... } ) { :ok , % User { } } iex> update_user_password ( user , "invalid password" , %{ password : ... } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Accounts.html#update_user_password/3"},{"type":"function","title":"Lightning.Accounts.upsert_user_totp/2","doc":"Updates or Inserts the user's TOTP","ref":"Lightning.Accounts.html#upsert_user_totp/2"},{"type":"function","title":"Lightning.Accounts.valid_user_backup_code?/2","doc":"Validates if the given Backup code is valid.","ref":"Lightning.Accounts.html#valid_user_backup_code?/2"},{"type":"function","title":"Lightning.Accounts.valid_user_totp?/2","doc":"Validates if the given TOTP code is valid.","ref":"Lightning.Accounts.html#valid_user_totp?/2"},{"type":"function","title":"Lightning.Accounts.validate_change_user_email/2","doc":"","ref":"Lightning.Accounts.html#validate_change_user_email/2"},{"type":"module","title":"Lightning.Accounts.User","doc":"The User model.","ref":"Lightning.Accounts.User.html"},{"type":"function","title":"Lightning.Accounts.User.confirm_changeset/1","doc":"Confirms the account by setting confirmed_at .","ref":"Lightning.Accounts.User.html#confirm_changeset/1"},{"type":"function","title":"Lightning.Accounts.User.details_changeset/2","doc":"A user changeset for user details: email first_name last_name role","ref":"Lightning.Accounts.User.html#details_changeset/2"},{"type":"function","title":"Lightning.Accounts.User.email_changeset/2","doc":"A user changeset for changing the email. It requires the email to change otherwise an error is added.","ref":"Lightning.Accounts.User.html#email_changeset/2"},{"type":"function","title":"Lightning.Accounts.User.password_changeset/3","doc":"A user changeset for changing the password. Options :hash_password - Hashes the password so it can be stored securely in the database and ensures the password field is cleared to prevent leaks in the logs. If password hashing is not needed and clearing the password field is not desired (like when using this changeset for validations on a LiveView form), this option can be set to false . Defaults to true .","ref":"Lightning.Accounts.User.html#password_changeset/3"},{"type":"function","title":"Lightning.Accounts.User.scheduled_deletion_changeset/2","doc":"A user changeset for changing the scheduled_deletion property.","ref":"Lightning.Accounts.User.html#scheduled_deletion_changeset/2"},{"type":"function","title":"Lightning.Accounts.User.superuser_registration_changeset/2","doc":"A superuser changeset for registration. It is important to validate the length of both email and password. Otherwise databases may truncate the email without warnings, which could lead to unpredictable or insecure behaviour. Long passwords may also be very expensive to hash for certain algorithms. Options :hash_password - Hashes the password so it can be stored securely in the database and ensures the password field is cleared to prevent leaks in the logs. If password hashing is not needed and clearing the password field is not desired (like when using this changeset for validations on a LiveView form), this option can be set to false . Defaults to true .","ref":"Lightning.Accounts.User.html#superuser_registration_changeset/2"},{"type":"function","title":"Lightning.Accounts.User.user_registration_changeset/2","doc":"A user changeset for registration. It is important to validate the length of both email and password. Otherwise databases may truncate the email without warnings, which could lead to unpredictable or insecure behaviour. Long passwords may also be very expensive to hash for certain algorithms. Options :hash_password - Hashes the password so it can be stored securely in the database and ensures the password field is cleared to prevent leaks in the logs. If password hashing is not needed and clearing the password field is not desired (like when using this changeset for validations on a LiveView form), this option can be set to false . Defaults to true .","ref":"Lightning.Accounts.User.html#user_registration_changeset/2"},{"type":"function","title":"Lightning.Accounts.User.valid_password?/2","doc":"Verifies the password. If there is no user or the user doesn't have a password, we call Bcrypt.no_user_verify/0 to avoid timing attacks.","ref":"Lightning.Accounts.User.html#valid_password?/2"},{"type":"function","title":"Lightning.Accounts.User.validate_current_password/2","doc":"Validates the current password otherwise adds an error to the changeset.","ref":"Lightning.Accounts.User.html#validate_current_password/2"},{"type":"type","title":"Lightning.Accounts.User.t/0","doc":"","ref":"Lightning.Accounts.User.html#t:t/0"},{"type":"module","title":"Lightning.Accounts.User.RolesEnum","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.cast/1","doc":"Callback implementation for Ecto.Type.cast/1 .","ref":"Lightning.Accounts.User.RolesEnum.html#cast/1"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.create_type/0","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html#create_type/0"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.drop_type/0","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html#drop_type/0"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.dump/1","doc":"Callback implementation for Ecto.Type.dump/1 .","ref":"Lightning.Accounts.User.RolesEnum.html#dump/1"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.embed_as/1","doc":"Callback implementation for Ecto.Type.embed_as/1 .","ref":"Lightning.Accounts.User.RolesEnum.html#embed_as/1"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.equal?/2","doc":"Callback implementation for Ecto.Type.equal?/2 .","ref":"Lightning.Accounts.User.RolesEnum.html#equal?/2"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.load/1","doc":"Callback implementation for Ecto.Type.load/1 .","ref":"Lightning.Accounts.User.RolesEnum.html#load/1"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.schema/0","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html#schema/0"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.schemaless_type/0","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html#schemaless_type/0"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.type/0","doc":"Callback implementation for Ecto.Type.type/0 .","ref":"Lightning.Accounts.User.RolesEnum.html#type/0"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.valid_value?/1","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html#valid_value?/1"},{"type":"type","title":"Lightning.Accounts.User.RolesEnum.t/0","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html#t:t/0"},{"type":"module","title":"Lightning.Accounts.UserBackupCode","doc":"User backup codes schema","ref":"Lightning.Accounts.UserBackupCode.html"},{"type":"function","title":"Lightning.Accounts.UserBackupCode.changeset/2","doc":"","ref":"Lightning.Accounts.UserBackupCode.html#changeset/2"},{"type":"function","title":"Lightning.Accounts.UserBackupCode.generate_backup_code/0","doc":"","ref":"Lightning.Accounts.UserBackupCode.html#generate_backup_code/0"},{"type":"type","title":"Lightning.Accounts.UserBackupCode.t/0","doc":"","ref":"Lightning.Accounts.UserBackupCode.html#t:t/0"},{"type":"module","title":"Lightning.Accounts.UserNotifier","doc":"The UserNotifier module.","ref":"Lightning.Accounts.UserNotifier.html"},{"type":"function","title":"Lightning.Accounts.UserNotifier.build_digest_url/3","doc":"","ref":"Lightning.Accounts.UserNotifier.html#build_digest_url/3"},{"type":"function","title":"Lightning.Accounts.UserNotifier.deliver_confirmation_instructions/2","doc":"Deliver instructions to confirm account.","ref":"Lightning.Accounts.UserNotifier.html#deliver_confirmation_instructions/2"},{"type":"function","title":"Lightning.Accounts.UserNotifier.deliver_confirmation_instructions/3","doc":"Deliver instructions to confirm account.","ref":"Lightning.Accounts.UserNotifier.html#deliver_confirmation_instructions/3"},{"type":"function","title":"Lightning.Accounts.UserNotifier.deliver_project_addition_notification/2","doc":"Deliver email to notify user of his addition of a project.","ref":"Lightning.Accounts.UserNotifier.html#deliver_project_addition_notification/2"},{"type":"function","title":"Lightning.Accounts.UserNotifier.deliver_project_digest/2","doc":"Deliver a project digest of daily/weekly or monthly activity to a user.","ref":"Lightning.Accounts.UserNotifier.html#deliver_project_digest/2"},{"type":"function","title":"Lightning.Accounts.UserNotifier.deliver_reset_password_instructions/2","doc":"Deliver instructions to reset a user password.","ref":"Lightning.Accounts.UserNotifier.html#deliver_reset_password_instructions/2"},{"type":"function","title":"Lightning.Accounts.UserNotifier.deliver_update_email_instructions/2","doc":"Deliver instructions to update a user email.","ref":"Lightning.Accounts.UserNotifier.html#deliver_update_email_instructions/2"},{"type":"function","title":"Lightning.Accounts.UserNotifier.deliver_update_email_warning/2","doc":"Deliver warning to update a user email.","ref":"Lightning.Accounts.UserNotifier.html#deliver_update_email_warning/2"},{"type":"function","title":"Lightning.Accounts.UserNotifier.notify_project_deletion/2","doc":"","ref":"Lightning.Accounts.UserNotifier.html#notify_project_deletion/2"},{"type":"function","title":"Lightning.Accounts.UserNotifier.send_deletion_notification_email/1","doc":"Deliver an email to notify the user about their account being deleted","ref":"Lightning.Accounts.UserNotifier.html#send_deletion_notification_email/1"},{"type":"module","title":"Lightning.Accounts.UserTOTP","doc":"User Time based OTPs schema","ref":"Lightning.Accounts.UserTOTP.html"},{"type":"function","title":"Lightning.Accounts.UserTOTP.changeset/2","doc":"","ref":"Lightning.Accounts.UserTOTP.html#changeset/2"},{"type":"function","title":"Lightning.Accounts.UserTOTP.valid_totp?/2","doc":"","ref":"Lightning.Accounts.UserTOTP.html#valid_totp?/2"},{"type":"type","title":"Lightning.Accounts.UserTOTP.t/0","doc":"","ref":"Lightning.Accounts.UserTOTP.html#t:t/0"},{"type":"module","title":"Lightning.Accounts.UserToken","doc":"The UserToken model. The reason why we store session tokens in the database, even though Phoenix already provides a session cookie, is because Phoenix' default session cookies are not persisted, they are simply signed and potentially encrypted. This means they are valid indefinitely, unless you change the signing/encryption salt. Therefore, storing them allows individual user sessions to be expired. The token system can also be extended to store additional data, such as the device used for logging in. You could then use this information to display all valid sessions and devices in the UI and allow users to explicitly expire any session they deem invalid.","ref":"Lightning.Accounts.UserToken.html"},{"type":"function","title":"Lightning.Accounts.UserToken.build_email_token/3","doc":"Builds a token and its hash to be delivered to the user's email. The non-hashed token is sent to the user email while the hashed part is stored in the database. The original token cannot be reconstructed, which means anyone with read-only access to the database cannot directly use the token in the application to gain access. Furthermore, if the user changes their email in the system, the tokens sent to the previous email are no longer valid. Users can easily adapt the existing code to provide other types of delivery methods, for example, by phone numbers.","ref":"Lightning.Accounts.UserToken.html#build_email_token/3"},{"type":"function","title":"Lightning.Accounts.UserToken.build_token/2","doc":"Generates a token that will be stored in a signed place, such as session or cookie. As they are signed, those tokens do not need to be hashed.","ref":"Lightning.Accounts.UserToken.html#build_token/2"},{"type":"function","title":"Lightning.Accounts.UserToken.changeset/2","doc":"","ref":"Lightning.Accounts.UserToken.html#changeset/2"},{"type":"function","title":"Lightning.Accounts.UserToken.generate_and_sign/2","doc":"Combines generate_claims/1 and encode_and_sign/2","ref":"Lightning.Accounts.UserToken.html#generate_and_sign/2"},{"type":"function","title":"Lightning.Accounts.UserToken.generate_and_sign!/2","doc":"Same as generate_and_sign/2 but raises if error","ref":"Lightning.Accounts.UserToken.html#generate_and_sign!/2"},{"type":"function","title":"Lightning.Accounts.UserToken.last_used_changeset/1","doc":"Update when the api token was last used by setting last_used_at .","ref":"Lightning.Accounts.UserToken.html#last_used_changeset/1"},{"type":"function","title":"Lightning.Accounts.UserToken.token_and_context_query/2","doc":"Returns the token struct for the given token value and context.","ref":"Lightning.Accounts.UserToken.html#token_and_context_query/2"},{"type":"function","title":"Lightning.Accounts.UserToken.user_and_contexts_query/2","doc":"Gets all tokens for the given user for the given contexts.","ref":"Lightning.Accounts.UserToken.html#user_and_contexts_query/2"},{"type":"function","title":"Lightning.Accounts.UserToken.verify_and_validate/3","doc":"Combines verify/2 and validate/2","ref":"Lightning.Accounts.UserToken.html#verify_and_validate/3"},{"type":"function","title":"Lightning.Accounts.UserToken.verify_and_validate!/3","doc":"Same as verify_and_validate/2 but raises if error","ref":"Lightning.Accounts.UserToken.html#verify_and_validate!/3"},{"type":"function","title":"Lightning.Accounts.UserToken.verify_change_email_token_query/2","doc":"Checks if the token is valid and returns its underlying lookup query. The query returns the user found by the token, if any. This is used to validate requests to change the user email. It is different from verify_email_token_query/2 precisely because verify_email_token_query/2 validates the email has not changed, which is the starting point by this function. The given token is valid if it matches its hashed counterpart in the database and if it has not expired (after @change_email_validity_in_days). The context must always start with "change:".","ref":"Lightning.Accounts.UserToken.html#verify_change_email_token_query/2"},{"type":"function","title":"Lightning.Accounts.UserToken.verify_email_token_query/2","doc":"Checks if the token is valid and returns its underlying lookup query. The query returns the user found by the token, if any. The given token is valid if it matches its hashed counterpart in the database and the user email has not changed. This function also checks if the token is being used within a certain period, depending on the context. The default contexts supported by this function are either "confirm", for account confirmation emails, and "reset_password", for resetting the password. For verifying requests to change the email, see verify_change_email_token_query/2 .","ref":"Lightning.Accounts.UserToken.html#verify_email_token_query/2"},{"type":"function","title":"Lightning.Accounts.UserToken.verify_token_query/2","doc":"Checks if the token is valid and returns its underlying lookup query. The query returns the user found by the token, if any. The token is valid if it matches the value in the database and it has not expired (after @auth_validity_in_seconds or @session_validity_in_days).","ref":"Lightning.Accounts.UserToken.html#verify_token_query/2"},{"type":"module","title":"Lightning.Credentials","doc":"The Credentials context.","ref":"Lightning.Credentials.html"},{"type":"function","title":"Lightning.Credentials.change_credential/2","doc":"Returns an %Ecto.Changeset{} for tracking credential changes. Examples iex> change_credential ( credential ) % Ecto.Changeset { data : % Credential { } }","ref":"Lightning.Credentials.html#change_credential/2"},{"type":"function","title":"Lightning.Credentials.create_credential/1","doc":"Creates a credential. Examples iex> create_credential ( %{ field : value } ) { :ok , % Credential { } } iex> create_credential ( %{ field : bad_value } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Credentials.html#create_credential/1"},{"type":"function","title":"Lightning.Credentials.delete_credential/1","doc":"Deletes a credential. Examples iex> delete_credential ( credential ) { :ok , % Credential { } } iex> delete_credential ( credential ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Credentials.html#delete_credential/1"},{"type":"function","title":"Lightning.Credentials.get_credential!/1","doc":"Gets a single credential. Raises Ecto.NoResultsError if the Credential does not exist. Examples iex> get_credential! ( 123 ) % Credential { } iex> get_credential! ( 456 ) ** (Ecto.NoResultsError)","ref":"Lightning.Credentials.html#get_credential!/1"},{"type":"function","title":"Lightning.Credentials.invalid_projects_for_user/2","doc":"Given a credential and a user, returns a list of invalid projects—i.e., those that the credential is shared with but that the user does not have access to. This is used to generate a validation error when a credential cannot be transferred. Examples 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" ]","ref":"Lightning.Credentials.html#invalid_projects_for_user/2"},{"type":"function","title":"Lightning.Credentials.list_credentials/0","doc":"Returns the list of credentials. Examples iex> list_credentials ( ) [ % Credential { } , ... ]","ref":"Lightning.Credentials.html#list_credentials/0"},{"type":"function","title":"Lightning.Credentials.list_credentials/1","doc":"","ref":"Lightning.Credentials.html#list_credentials/1"},{"type":"function","title":"Lightning.Credentials.list_credentials_for_user/1","doc":"Returns the list of credentials for a given user. Examples iex> list_credentials_for_user ( 123 ) [ % Credential { user_id : 123 } , % Credential { user_id : 123 } , ... ]","ref":"Lightning.Credentials.html#list_credentials_for_user/1"},{"type":"function","title":"Lightning.Credentials.maybe_refresh_token/1","doc":"","ref":"Lightning.Credentials.html#maybe_refresh_token/1"},{"type":"function","title":"Lightning.Credentials.sensitive_values_for/1","doc":"","ref":"Lightning.Credentials.html#sensitive_values_for/1"},{"type":"function","title":"Lightning.Credentials.update_credential/2","doc":"Updates a credential. Examples iex> update_credential ( credential , %{ field : new_value } ) { :ok , % Credential { } } iex> update_credential ( credential , %{ field : bad_value } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Credentials.html#update_credential/2"},{"type":"module","title":"Lightning.Credentials.Audit","doc":"Model for storing changes to Credentials","ref":"Lightning.Credentials.Audit.html"},{"type":"function","title":"Lightning.Credentials.Audit.event/4","doc":"","ref":"Lightning.Credentials.Audit.html#event/4"},{"type":"function","title":"Lightning.Credentials.Audit.save/1","doc":"","ref":"Lightning.Credentials.Audit.html#save/1"},{"type":"module","title":"Lightning.Credentials.Credential","doc":"The Credential model.","ref":"Lightning.Credentials.Credential.html"},{"type":"type","title":"Lightning.Credentials.Credential.t/0","doc":"","ref":"Lightning.Credentials.Credential.html#t:t/0"},{"type":"module","title":"Lightning.Credentials.Schema","doc":"Structure that can parse JsonSchemas (using ExJsonSchema ) and validate changesets for a given schema.","ref":"Lightning.Credentials.Schema.html"},{"type":"function","title":"Lightning.Credentials.Schema.new/2","doc":"","ref":"Lightning.Credentials.Schema.html#new/2"},{"type":"function","title":"Lightning.Credentials.Schema.properties/2","doc":"","ref":"Lightning.Credentials.Schema.html#properties/2"},{"type":"function","title":"Lightning.Credentials.Schema.required?/2","doc":"","ref":"Lightning.Credentials.Schema.html#required?/2"},{"type":"function","title":"Lightning.Credentials.Schema.validate/2","doc":"","ref":"Lightning.Credentials.Schema.html#validate/2"},{"type":"type","title":"Lightning.Credentials.Schema.t/0","doc":"","ref":"Lightning.Credentials.Schema.html#t:t/0"},{"type":"module","title":"Lightning.Credentials.SchemaDocument","doc":"Provides facilities to dynamically create and validate a changeset for a given Schema","ref":"Lightning.Credentials.SchemaDocument.html"},{"type":"function","title":"Lightning.Credentials.SchemaDocument.changeset/3","doc":"","ref":"Lightning.Credentials.SchemaDocument.html#changeset/3"},{"type":"module","title":"Lightning.Credentials.SensitiveValues","doc":"Functions to pull out sensitive values inside a credential. These values are used to scrub logs for leaked secrets.","ref":"Lightning.Credentials.SensitiveValues.html"},{"type":"function","title":"Lightning.Credentials.SensitiveValues.flatten_map/1","doc":"Keys that are not considered sensitive","ref":"Lightning.Credentials.SensitiveValues.html#flatten_map/1"},{"type":"function","title":"Lightning.Credentials.SensitiveValues.secret_values/1","doc":"Given a map, find all values allowed (via @safe_keys ) and return them as a list.","ref":"Lightning.Credentials.SensitiveValues.html#secret_values/1"},{"type":"type","title":"Lightning.Credentials.SensitiveValues.pairs/0","doc":"","ref":"Lightning.Credentials.SensitiveValues.html#t:pairs/0"},{"type":"type","title":"Lightning.Credentials.SensitiveValues.raw_pairs/0","doc":"","ref":"Lightning.Credentials.SensitiveValues.html#t:raw_pairs/0"},{"type":"module","title":"Lightning.Invocation","doc":"The Invocation context.","ref":"Lightning.Invocation.html"},{"type":"function","title":"Lightning.Invocation.change_dataclip/2","doc":"Returns an %Ecto.Changeset{} for tracking dataclip changes. Examples iex> change_dataclip ( dataclip ) % Ecto.Changeset { data : % Dataclip { } }","ref":"Lightning.Invocation.html#change_dataclip/2"},{"type":"function","title":"Lightning.Invocation.change_run/2","doc":"Returns an %Ecto.Changeset{} for tracking run changes. Examples iex> change_run ( run ) % Ecto.Changeset { data : % Run { } }","ref":"Lightning.Invocation.html#change_run/2"},{"type":"function","title":"Lightning.Invocation.create_dataclip/1","doc":"Creates a dataclip. Examples iex> create_dataclip ( %{ field : value } ) { :ok , % Dataclip { } } iex> create_dataclip ( %{ field : bad_value } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Invocation.html#create_dataclip/1"},{"type":"function","title":"Lightning.Invocation.create_log_line/2","doc":"","ref":"Lightning.Invocation.html#create_log_line/2"},{"type":"function","title":"Lightning.Invocation.create_run/1","doc":"Creates a run. Examples iex> create_run ( %{ field : value } ) { :ok , % Run { } } iex> create_run ( %{ field : bad_value } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Invocation.html#create_run/1"},{"type":"function","title":"Lightning.Invocation.delete_dataclip/1","doc":"Deletes a dataclip. Examples iex> delete_dataclip ( dataclip ) { :ok , % Dataclip { } } iex> delete_dataclip ( dataclip ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Invocation.html#delete_dataclip/1"},{"type":"function","title":"Lightning.Invocation.delete_run/1","doc":"Deletes a run. Examples iex> delete_run ( run ) { :ok , % Run { } } iex> delete_run ( run ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Invocation.html#delete_run/1"},{"type":"function","title":"Lightning.Invocation.filter_run_body_and_logs_where/2","doc":"","ref":"Lightning.Invocation.html#filter_run_body_and_logs_where/2"},{"type":"function","title":"Lightning.Invocation.filter_run_finished_after_where/1","doc":"","ref":"Lightning.Invocation.html#filter_run_finished_after_where/1"},{"type":"function","title":"Lightning.Invocation.filter_run_finished_before_where/1","doc":"","ref":"Lightning.Invocation.html#filter_run_finished_before_where/1"},{"type":"function","title":"Lightning.Invocation.filter_run_status_where/1","doc":"","ref":"Lightning.Invocation.html#filter_run_status_where/1"},{"type":"function","title":"Lightning.Invocation.filter_workflow_where/1","doc":"","ref":"Lightning.Invocation.html#filter_workflow_where/1"},{"type":"function","title":"Lightning.Invocation.filter_workorder_insert_after_where/1","doc":"","ref":"Lightning.Invocation.html#filter_workorder_insert_after_where/1"},{"type":"function","title":"Lightning.Invocation.filter_workorder_insert_before_where/1","doc":"","ref":"Lightning.Invocation.html#filter_workorder_insert_before_where/1"},{"type":"function","title":"Lightning.Invocation.get_dataclip/1","doc":"Gets a single dataclip given one of: a Dataclip uuid a Run model Returns nil if the Dataclip does not exist. Examples iex> get_dataclip ( "27b73932-16c7-4a72-86a3-85d805ccff98" ) % Dataclip { } iex> get_dataclip ( "27b73932-16c7-4a72-86a3-85d805ccff98" ) nil iex> get_dataclip ( % Run { id : "a uuid" } ) % Dataclip { }","ref":"Lightning.Invocation.html#get_dataclip/1"},{"type":"function","title":"Lightning.Invocation.get_dataclip!/1","doc":"Gets a single dataclip. Raises Ecto.NoResultsError if the Dataclip does not exist. Examples iex> get_dataclip! ( 123 ) % Dataclip { } iex> get_dataclip! ( 456 ) ** (Ecto.NoResultsError)","ref":"Lightning.Invocation.html#get_dataclip!/1"},{"type":"function","title":"Lightning.Invocation.get_dataclip_query/1","doc":"Query for retrieving the dataclip that a runs starting dataclip.","ref":"Lightning.Invocation.html#get_dataclip_query/1"},{"type":"function","title":"Lightning.Invocation.get_result_dataclip_query/1","doc":"Query for retrieving the dataclip that was the result of a successful run.","ref":"Lightning.Invocation.html#get_result_dataclip_query/1"},{"type":"function","title":"Lightning.Invocation.get_run!/1","doc":"Gets a single run. Raises Ecto.NoResultsError if the Run does not exist. Examples iex> get_run! ( 123 ) % Run { } iex> get_run! ( 456 ) ** (Ecto.NoResultsError)","ref":"Lightning.Invocation.html#get_run!/1"},{"type":"function","title":"Lightning.Invocation.get_run_with_job!/1","doc":"Fetches a run and preloads the job via the run's event.","ref":"Lightning.Invocation.html#get_run_with_job!/1"},{"type":"function","title":"Lightning.Invocation.get_workorders_by_ids/1","doc":"","ref":"Lightning.Invocation.html#get_workorders_by_ids/1"},{"type":"function","title":"Lightning.Invocation.list_dataclips/0","doc":"Returns the list of dataclips. Examples iex> list_dataclips ( ) [ % Dataclip { } , ... ]","ref":"Lightning.Invocation.html#list_dataclips/0"},{"type":"function","title":"Lightning.Invocation.list_dataclips/1","doc":"","ref":"Lightning.Invocation.html#list_dataclips/1"},{"type":"function","title":"Lightning.Invocation.list_dataclips_for_job/1","doc":"","ref":"Lightning.Invocation.html#list_dataclips_for_job/1"},{"type":"function","title":"Lightning.Invocation.list_dataclips_query/1","doc":"","ref":"Lightning.Invocation.html#list_dataclips_query/1"},{"type":"function","title":"Lightning.Invocation.list_runs/0","doc":"Returns the list of runs. Examples iex> list_runs ( ) [ % Run { } , ... ]","ref":"Lightning.Invocation.html#list_runs/0"},{"type":"function","title":"Lightning.Invocation.list_runs_for_project/2","doc":"","ref":"Lightning.Invocation.html#list_runs_for_project/2"},{"type":"function","title":"Lightning.Invocation.list_runs_for_project_query/1","doc":"","ref":"Lightning.Invocation.html#list_runs_for_project_query/1"},{"type":"function","title":"Lightning.Invocation.list_work_orders_for_project_query/2","doc":"","ref":"Lightning.Invocation.html#list_work_orders_for_project_query/2"},{"type":"function","title":"Lightning.Invocation.search_workorders/1","doc":"","ref":"Lightning.Invocation.html#search_workorders/1"},{"type":"function","title":"Lightning.Invocation.search_workorders/3","doc":"","ref":"Lightning.Invocation.html#search_workorders/3"},{"type":"function","title":"Lightning.Invocation.update_dataclip/2","doc":"Updates a dataclip. Examples iex> update_dataclip ( dataclip , %{ field : new_value } ) { :ok , % Dataclip { } } iex> update_dataclip ( dataclip , %{ field : bad_value } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Invocation.html#update_dataclip/2"},{"type":"function","title":"Lightning.Invocation.update_run/2","doc":"Updates a run. Examples iex> update_run ( run , %{ field : new_value } ) { :ok , % Run { } } iex> update_run ( run , %{ field : bad_value } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Invocation.html#update_run/2"},{"type":"function","title":"Lightning.Invocation.with_attempts/1","doc":"","ref":"Lightning.Invocation.html#with_attempts/1"},{"type":"module","title":"Lightning.Invocation.Dataclip","doc":"Ecto model for Dataclips. Dataclips represent some data that arrived in the system, and records both the data and the source of the data. Types :http_request The data arrived via a webhook. :global Was created manually, and is intended to be used multiple times. When repetitive static data is needed to be maintained, instead of hard-coding into a Job - a more convenient solution is to create a :global Dataclip and access it inside the Job. :run_result The final state of a successful run. :saved_input An arbitrary input, created by a user. (Only configuration will be overwritten.)","ref":"Lightning.Invocation.Dataclip.html"},{"type":"function","title":"Lightning.Invocation.Dataclip.get_types/0","doc":"","ref":"Lightning.Invocation.Dataclip.html#get_types/0"},{"type":"function","title":"Lightning.Invocation.Dataclip.new/1","doc":"","ref":"Lightning.Invocation.Dataclip.html#new/1"},{"type":"function","title":"Lightning.Invocation.Dataclip.validate_by_type/1","doc":"Append validations based on the type of the Dataclip. :run_result must have an associated Run model.","ref":"Lightning.Invocation.Dataclip.html#validate_by_type/1"},{"type":"type","title":"Lightning.Invocation.Dataclip.source_type/0","doc":"","ref":"Lightning.Invocation.Dataclip.html#t:source_type/0"},{"type":"type","title":"Lightning.Invocation.Dataclip.t/0","doc":"","ref":"Lightning.Invocation.Dataclip.html#t:t/0"},{"type":"module","title":"Lightning.Invocation.LogLine","doc":"Ecto model for run logs.","ref":"Lightning.Invocation.LogLine.html"},{"type":"function","title":"Lightning.Invocation.LogLine.validate/1","doc":"","ref":"Lightning.Invocation.LogLine.html#validate/1"},{"type":"type","title":"Lightning.Invocation.LogLine.t/0","doc":"","ref":"Lightning.Invocation.LogLine.html#t:t/0"},{"type":"module","title":"Lightning.Invocation.Query","doc":"Query functions for working with Runs and Dataclips","ref":"Lightning.Invocation.Query.html"},{"type":"function","title":"Lightning.Invocation.Query.last_run_for_job/1","doc":"The last run for a job","ref":"Lightning.Invocation.Query.html#last_run_for_job/1"},{"type":"function","title":"Lightning.Invocation.Query.last_successful_run_for_job/1","doc":"The last run for a job for a particular exit code, used in scheduler","ref":"Lightning.Invocation.Query.html#last_successful_run_for_job/1"},{"type":"function","title":"Lightning.Invocation.Query.runs_for/1","doc":"Runs for a specific user","ref":"Lightning.Invocation.Query.html#runs_for/1"},{"type":"function","title":"Lightning.Invocation.Query.runs_with_code/2","doc":"The last run for a job for a particular exit code, used in scheduler","ref":"Lightning.Invocation.Query.html#runs_with_code/2"},{"type":"module","title":"Lightning.Invocation.Run","doc":"Ecto model for Runs. A run represents the work initiated for a Job with an input dataclip. Once completed (successfully) it will have an output_dataclip associated with it as well.","ref":"Lightning.Invocation.Run.html"},{"type":"function","title":"Lightning.Invocation.Run.new/1","doc":"","ref":"Lightning.Invocation.Run.html#new/1"},{"type":"function","title":"Lightning.Invocation.Run.new_from/1","doc":"Creates a new Run changeset, but copies over certain fields. This is used to create new runs for retrys.","ref":"Lightning.Invocation.Run.html#new_from/1"},{"type":"type","title":"Lightning.Invocation.Run.t/0","doc":"","ref":"Lightning.Invocation.Run.html#t:t/0"},{"type":"module","title":"Lightning.InvocationReason","doc":"Ecto model for InvocationReasons.","ref":"Lightning.InvocationReason.html"},{"type":"function","title":"Lightning.InvocationReason.new/1","doc":"","ref":"Lightning.InvocationReason.html#new/1"},{"type":"function","title":"Lightning.InvocationReason.validate_by_trigger_type/1","doc":"","ref":"Lightning.InvocationReason.html#validate_by_trigger_type/1"},{"type":"type","title":"Lightning.InvocationReason.source_type/0","doc":"","ref":"Lightning.InvocationReason.html#t:source_type/0"},{"type":"type","title":"Lightning.InvocationReason.t/0","doc":"","ref":"Lightning.InvocationReason.html#t:t/0"},{"type":"module","title":"Lightning.InvocationReasons","doc":"The InvocationReasons context.","ref":"Lightning.InvocationReasons.html"},{"type":"function","title":"Lightning.InvocationReasons.build/2","doc":"","ref":"Lightning.InvocationReasons.html#build/2"},{"type":"function","title":"Lightning.InvocationReasons.create_reason/1","doc":"Creates a reason. Examples iex> create_reason ( %{ field : value } ) { :ok , % InvocationReason { } } iex> create_reason ( %{ field : bad_value } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.InvocationReasons.html#create_reason/1"},{"type":"type","title":"Lightning.InvocationReasons.reason_type/0","doc":"","ref":"Lightning.InvocationReasons.html#t:reason_type/0"},{"type":"module","title":"Lightning.Pipeline","doc":"Service class to coordinate the running of jobs, and their downstream jobs.","ref":"Lightning.Pipeline.html"},{"type":"function","title":"Lightning.Pipeline.assemble_logs_for_run/1","doc":"Return all logs for a run as a string of text, separated by new line breaks","ref":"Lightning.Pipeline.html#assemble_logs_for_run/1"},{"type":"function","title":"Lightning.Pipeline.logs_for_run/1","doc":"Return all logs for a run as a list","ref":"Lightning.Pipeline.html#logs_for_run/1"},{"type":"function","title":"Lightning.Pipeline.process/1","doc":"","ref":"Lightning.Pipeline.html#process/1"},{"type":"module","title":"Lightning.Pipeline.Runner","doc":"Job running entrypoint","ref":"Lightning.Pipeline.Runner.html"},{"type":"function","title":"Lightning.Pipeline.Runner.create_dataclip_from_result/2","doc":"Creates a dataclip linked to the run that just finished. If either the file doesn't exist or there is a JSON decoding error, it logs and returns an error tuple.","ref":"Lightning.Pipeline.Runner.html#create_dataclip_from_result/2"},{"type":"function","title":"Lightning.Pipeline.Runner.find_or_install_adaptor/1","doc":"Make sure an adaptor matching the name is available. If it is available, return it's Engine.Adaptor struct - if not then install it.","ref":"Lightning.Pipeline.Runner.html#find_or_install_adaptor/1"},{"type":"function","title":"Lightning.Pipeline.Runner.scrub_result/1","doc":"Scrubs values from all keys in configuration, will be replaced by extensions to scrubber.ex, which is currently only used for logs.","ref":"Lightning.Pipeline.Runner.html#scrub_result/1"},{"type":"function","title":"Lightning.Pipeline.Runner.start/2","doc":"Execute a Run. Given a valid run: Persist the Dataclip and the Job's body to disk Create a blank output file on disk Build up a %Lightning.Runtime.Runspec{} with the paths, and adaptor module name And start it via Handler.start/2 . The callbacks implemented on Handler ( c:Handler.on_start/1 and c:Handler.on_finish/2 ) update the run when a Run is started and when it's finished, attaching the exit_code and log when they are available.","ref":"Lightning.Pipeline.Runner.html#start/2"},{"type":"module","title":"Lightning.Pipeline.Runner.Handler","doc":"Custom handler callbacks for Lightnings use of Engine to execute runs.","ref":"Lightning.Pipeline.Runner.Handler.html"},{"type":"function","title":"Lightning.Pipeline.Runner.Handler.on_start/1","doc":"The on_start handler updates the run, setting the started_at time and stamping the run with the ID of the credential that was used, if any, to facilitate easier auditing.","ref":"Lightning.Pipeline.Runner.Handler.html#on_start/1"},{"type":"function","title":"Lightning.Pipeline.Runner.Handler.stop/1","doc":"","ref":"Lightning.Pipeline.Runner.Handler.html#stop/1"},{"type":"type","title":"Lightning.Pipeline.Runner.Handler.handler_opts/0","doc":"","ref":"Lightning.Pipeline.Runner.Handler.html#t:handler_opts/0"},{"type":"module","title":"Lightning.Pipeline.StateAssembler","doc":"Facilities for building the state for a Run How state is assembled 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 > } Saved inputs Saved custom inputs will only have state.configuration changed, everything else will remain as displayed. Flow Jobs When a Job is triggered by a previous Jobs success or failure these are the rules for constructing that Jobs state: For jobs that trigger on it's upstream jobs failure, the event will have the previous runs input dataclip as its input dataclip. The state will also have the log of the previous run attached on the error key. For Jobs triggered by a previous success, the run will have the previous runs output dataclip as its input dataclip. :run_result dataclips are expected to already have a data key, and are merged into the root.","ref":"Lightning.Pipeline.StateAssembler.html"},{"type":"function","title":"Lightning.Pipeline.StateAssembler.assemble/1","doc":"Assemble state for use in a Run.","ref":"Lightning.Pipeline.StateAssembler.html#assemble/1"},{"type":"module","title":"Lightning.Jobs","doc":"The Jobs context.","ref":"Lightning.Jobs.html"},{"type":"function","title":"Lightning.Jobs.change_job/2","doc":"Returns an %Ecto.Changeset{} for tracking job changes. Examples iex> change_job ( job ) % Ecto.Changeset { data : % Job { } }","ref":"Lightning.Jobs.html#change_job/2"},{"type":"function","title":"Lightning.Jobs.create_job/1","doc":"Creates a job. Examples iex> create_job ( %{ field : value } ) { :ok , % Job { } } iex> create_job ( %{ field : bad_value } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Jobs.html#create_job/1"},{"type":"function","title":"Lightning.Jobs.delete_job/1","doc":"Deletes a job. Examples iex> delete_job ( job ) { :ok , % Job { } } iex> delete_job ( job ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Jobs.html#delete_job/1"},{"type":"function","title":"Lightning.Jobs.get_downstream_jobs_for/2","doc":"Returns the list of downstream jobs for a given job, optionally matching a specific trigger type. When downstream_jobs_for is called without a trigger that means its between jobs when it called with a trigger that means we are starting from outside the pipeline","ref":"Lightning.Jobs.html#get_downstream_jobs_for/2"},{"type":"function","title":"Lightning.Jobs.get_job/1","doc":"","ref":"Lightning.Jobs.html#get_job/1"},{"type":"function","title":"Lightning.Jobs.get_job!/1","doc":"Gets a single job. Raises Ecto.NoResultsError if the Job does not exist. Examples iex> get_job! ( 123 ) % Job { } iex> get_job! ( 456 ) ** (Ecto.NoResultsError)","ref":"Lightning.Jobs.html#get_job!/1"},{"type":"function","title":"Lightning.Jobs.get_upstream_jobs_for/1","doc":"Returns the list of jobs excluding the one given.","ref":"Lightning.Jobs.html#get_upstream_jobs_for/1"},{"type":"function","title":"Lightning.Jobs.jobs_for_project/1","doc":"","ref":"Lightning.Jobs.html#jobs_for_project/1"},{"type":"function","title":"Lightning.Jobs.jobs_for_project_query/1","doc":"","ref":"Lightning.Jobs.html#jobs_for_project_query/1"},{"type":"function","title":"Lightning.Jobs.list_active_cron_jobs/0","doc":"","ref":"Lightning.Jobs.html#list_active_cron_jobs/0"},{"type":"function","title":"Lightning.Jobs.list_jobs/0","doc":"Returns the list of jobs.","ref":"Lightning.Jobs.html#list_jobs/0"},{"type":"function","title":"Lightning.Jobs.list_jobs_for_workflow/1","doc":"","ref":"Lightning.Jobs.html#list_jobs_for_workflow/1"},{"type":"function","title":"Lightning.Jobs.update_job/2","doc":"Updates a job. Examples iex> update_job ( job , %{ field : new_value } ) { :ok , % Job { } } iex> update_job ( job , %{ field : bad_value } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Jobs.html#update_job/2"},{"type":"module","title":"Lightning.Jobs.Job","doc":"Ecto model for Jobs. A Job contains the fields for defining a job. body The expression/javascript code name A plain text identifier adaptor An NPM style string that contains both the module name and it's version. E.g. @openfn/language-http@v1.2.3 or @openfn/language-foo@latest . While the version suffix isn't enforced here as it's not strictly necessary in this context, the front end will ensure a version is stated ( @latest being the default).","ref":"Lightning.Jobs.Job.html"},{"type":"function","title":"Lightning.Jobs.Job.new/1","doc":"","ref":"Lightning.Jobs.Job.html#new/1"},{"type":"function","title":"Lightning.Jobs.Job.put_project_credential/2","doc":"","ref":"Lightning.Jobs.Job.html#put_project_credential/2"},{"type":"function","title":"Lightning.Jobs.Job.put_workflow/2","doc":"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 ] ) job = % Job { } |> Ecto.Changeset . change ( ) |> Job . put_workflow ( workflow ) |> Job . changeset ( attrs )","ref":"Lightning.Jobs.Job.html#put_workflow/2"},{"type":"function","title":"Lightning.Jobs.Job.validate/1","doc":"","ref":"Lightning.Jobs.Job.html#validate/1"},{"type":"type","title":"Lightning.Jobs.Job.t/0","doc":"","ref":"Lightning.Jobs.Job.html#t:t/0"},{"type":"module","title":"Lightning.Jobs.Query","doc":"Query module for finding Jobs.","ref":"Lightning.Jobs.Query.html"},{"type":"function","title":"Lightning.Jobs.Query.enabled_cron_jobs_by_edge/0","doc":"Returns active jobs with their cron triggers for use in the cron scheduling service.","ref":"Lightning.Jobs.Query.html#enabled_cron_jobs_by_edge/0"},{"type":"function","title":"Lightning.Jobs.Query.jobs_for/1","doc":"Returns all jobs accessible to a user, via their projects or all jobs in a given project.","ref":"Lightning.Jobs.Query.html#jobs_for/1"},{"type":"module","title":"Lightning.Jobs.Scheduler","doc":"The Scheduler is responsible for finding jobs that are ready to run based on their cron schedule, and then running them.","ref":"Lightning.Jobs.Scheduler.html"},{"type":"function","title":"Lightning.Jobs.Scheduler.enqueue_cronjobs/0","doc":"Find and start any cronjobs that are scheduled to run for a given time (defaults to the current time).","ref":"Lightning.Jobs.Scheduler.html#enqueue_cronjobs/0"},{"type":"function","title":"Lightning.Jobs.Scheduler.enqueue_cronjobs/1","doc":"","ref":"Lightning.Jobs.Scheduler.html#enqueue_cronjobs/1"},{"type":"module","title":"Lightning.Jobs.Trigger","doc":"Ecto model for Triggers. Triggers represent the criteria in which a Job might be invoked. Types Webhook (default) A webhook trigger allows a Job to invoked (via Lightning.Invocation ) when it's endpoint is called.","ref":"Lightning.Jobs.Trigger.html"},{"type":"function","title":"Lightning.Jobs.Trigger.new/1","doc":"","ref":"Lightning.Jobs.Trigger.html#new/1"},{"type":"function","title":"Lightning.Jobs.Trigger.validate/1","doc":"","ref":"Lightning.Jobs.Trigger.html#validate/1"},{"type":"type","title":"Lightning.Jobs.Trigger.t/0","doc":"","ref":"Lightning.Jobs.Trigger.html#t:t/0"},{"type":"type","title":"Lightning.Jobs.Trigger.trigger_type/0","doc":"","ref":"Lightning.Jobs.Trigger.html#t:trigger_type/0"},{"type":"module","title":"Lightning.Projects","doc":"The Projects context.","ref":"Lightning.Projects.html"},{"type":"function","title":"Lightning.Projects.cancel_scheduled_deletion/1","doc":"","ref":"Lightning.Projects.html#cancel_scheduled_deletion/1"},{"type":"function","title":"Lightning.Projects.change_project/2","doc":"Returns an %Ecto.Changeset{} for tracking project changes. Examples iex> change_project ( project ) % Ecto.Changeset { data : % Project { } }","ref":"Lightning.Projects.html#change_project/2"},{"type":"function","title":"Lightning.Projects.create_project/1","doc":"Creates a project. Examples iex> create_project ( %{ field : value } ) { :ok , % Project { } } iex> create_project ( %{ field : bad_value } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Projects.html#create_project/1"},{"type":"function","title":"Lightning.Projects.delete_project/1","doc":"Deletes a project and its related data, including workflows, work orders, runs, jobs, attempts, triggers, project users, project credentials, and dataclips Examples iex> delete_project ( project ) { :ok , % Project { } } iex> delete_project ( project ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Projects.html#delete_project/1"},{"type":"function","title":"Lightning.Projects.export_project/2","doc":"Exports a project as yaml. Examples iex> export_project ( :yaml , project_id ) { :ok , string }","ref":"Lightning.Projects.html#export_project/2"},{"type":"function","title":"Lightning.Projects.get_project/1","doc":"","ref":"Lightning.Projects.html#get_project/1"},{"type":"function","title":"Lightning.Projects.get_project!/1","doc":"Gets a single project. Raises Ecto.NoResultsError if the Project does not exist. Examples iex> get_project! ( 123 ) % Project { } iex> get_project! ( 456 ) ** (Ecto.NoResultsError)","ref":"Lightning.Projects.html#get_project!/1"},{"type":"function","title":"Lightning.Projects.get_project_credential/2","doc":"","ref":"Lightning.Projects.html#get_project_credential/2"},{"type":"function","title":"Lightning.Projects.get_project_user/1","doc":"","ref":"Lightning.Projects.html#get_project_user/1"},{"type":"function","title":"Lightning.Projects.get_project_user/2","doc":"","ref":"Lightning.Projects.html#get_project_user/2"},{"type":"function","title":"Lightning.Projects.get_project_user!/1","doc":"Gets a single project_user. Raises Ecto.NoResultsError if the ProjectUser does not exist. Examples iex> get_project_user! ( 123 ) % ProjectUser { } iex> get_project_user! ( 456 ) ** (Ecto.NoResultsError)","ref":"Lightning.Projects.html#get_project_user!/1"},{"type":"function","title":"Lightning.Projects.get_project_user_role/2","doc":"Returns the role of a user in a project. Possible roles are :admin, :viewer, :editor, and :owner Examples iex> get_project_user_role ( user , project ) :admin iex> get_project_user_role ( user , project ) :viewer iex> get_project_user_role ( user , project ) :editor iex> get_project_user_role ( user , project ) :owner","ref":"Lightning.Projects.html#get_project_user_role/2"},{"type":"function","title":"Lightning.Projects.get_project_with_users!/1","doc":"Gets a single project with it's members via project_users . Raises Ecto.NoResultsError if the Project does not exist. Examples iex> get_project! ( 123 ) % Project { } iex> get_project! ( 456 ) ** (Ecto.NoResultsError)","ref":"Lightning.Projects.html#get_project_with_users!/1"},{"type":"function","title":"Lightning.Projects.get_projects_for_user/1","doc":"","ref":"Lightning.Projects.html#get_projects_for_user/1"},{"type":"function","title":"Lightning.Projects.is_member_of?/2","doc":"","ref":"Lightning.Projects.html#is_member_of?/2"},{"type":"function","title":"Lightning.Projects.list_project_credentials/1","doc":"","ref":"Lightning.Projects.html#list_project_credentials/1"},{"type":"function","title":"Lightning.Projects.list_projects/0","doc":"Returns the list of projects. Examples iex> list_projects ( ) [ % Project { } , ... ]","ref":"Lightning.Projects.html#list_projects/0"},{"type":"function","title":"Lightning.Projects.perform/1","doc":"Perform, when called with %{"type" => "purge_deleted"} will find projects that are ready for permanent deletion and purge them.","ref":"Lightning.Projects.html#perform/1"},{"type":"function","title":"Lightning.Projects.project_attempt_run_query/1","doc":"","ref":"Lightning.Projects.html#project_attempt_run_query/1"},{"type":"function","title":"Lightning.Projects.project_attempts_query/1","doc":"","ref":"Lightning.Projects.html#project_attempts_query/1"},{"type":"function","title":"Lightning.Projects.project_credentials_query/1","doc":"","ref":"Lightning.Projects.html#project_credentials_query/1"},{"type":"function","title":"Lightning.Projects.project_dataclip_invocation_reason/1","doc":"","ref":"Lightning.Projects.html#project_dataclip_invocation_reason/1"},{"type":"function","title":"Lightning.Projects.project_dataclips_query/1","doc":"","ref":"Lightning.Projects.html#project_dataclips_query/1"},{"type":"function","title":"Lightning.Projects.project_jobs_query/1","doc":"","ref":"Lightning.Projects.html#project_jobs_query/1"},{"type":"function","title":"Lightning.Projects.project_run_invocation_reasons/1","doc":"","ref":"Lightning.Projects.html#project_run_invocation_reasons/1"},{"type":"function","title":"Lightning.Projects.project_runs_query/1","doc":"","ref":"Lightning.Projects.html#project_runs_query/1"},{"type":"function","title":"Lightning.Projects.project_trigger_invocation_reason/1","doc":"","ref":"Lightning.Projects.html#project_trigger_invocation_reason/1"},{"type":"function","title":"Lightning.Projects.project_triggers_query/1","doc":"","ref":"Lightning.Projects.html#project_triggers_query/1"},{"type":"function","title":"Lightning.Projects.project_user_role_query/2","doc":"","ref":"Lightning.Projects.html#project_user_role_query/2"},{"type":"function","title":"Lightning.Projects.project_users_query/1","doc":"","ref":"Lightning.Projects.html#project_users_query/1"},{"type":"function","title":"Lightning.Projects.project_workflows_query/1","doc":"","ref":"Lightning.Projects.html#project_workflows_query/1"},{"type":"function","title":"Lightning.Projects.project_workorders_query/1","doc":"","ref":"Lightning.Projects.html#project_workorders_query/1"},{"type":"function","title":"Lightning.Projects.projects_for_user_query/1","doc":"","ref":"Lightning.Projects.html#projects_for_user_query/1"},{"type":"function","title":"Lightning.Projects.schedule_project_deletion/1","doc":"Given a project, this function sets a scheduled deletion date based on the PURGE_DELETED_AFTER_DAYS environment variable. If no ENV is set, this date defaults to NOW but the automatic project purge cronjob will never run. (Note that subsequent logins will be blocked for projects pending deletion.)","ref":"Lightning.Projects.html#schedule_project_deletion/1"},{"type":"function","title":"Lightning.Projects.select_first_project_for_user/1","doc":"","ref":"Lightning.Projects.html#select_first_project_for_user/1"},{"type":"function","title":"Lightning.Projects.update_project/2","doc":"Updates a project. Examples iex> update_project ( project , %{ field : new_value } ) { :ok , % Project { } } iex> update_project ( project , %{ field : bad_value } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Projects.html#update_project/2"},{"type":"function","title":"Lightning.Projects.update_project_user/2","doc":"Updates a project user. Examples iex> update_project_user ( project_user , %{ field : new_value } ) { :ok , % ProjectUser { } } iex> update_project_user ( projectUser , %{ field : bad_value } ) { :error , % Ecto.Changeset { } }","ref":"Lightning.Projects.html#update_project_user/2"},{"type":"function","title":"Lightning.Projects.url_safe_project_name/1","doc":"","ref":"Lightning.Projects.html#url_safe_project_name/1"},{"type":"function","title":"Lightning.Projects.validate_for_deletion/2","doc":"Returns an %Ecto.Changeset{} for changing the project scheduled_deletion. Examples iex> validate_for_deletion ( project ) % Ecto.Changeset { data : % Project { } }","ref":"Lightning.Projects.html#validate_for_deletion/2"},{"type":"module","title":"Lightning.Projects.Project","doc":"Project model","ref":"Lightning.Projects.Project.html"},{"type":"function","title":"Lightning.Projects.Project.deletion_changeset/2","doc":"Changeset to validate a project deletion request, the user must enter the projects name to confirm.","ref":"Lightning.Projects.Project.html#deletion_changeset/2"},{"type":"function","title":"Lightning.Projects.Project.validate/1","doc":"","ref":"Lightning.Projects.Project.html#validate/1"},{"type":"type","title":"Lightning.Projects.Project.t/0","doc":"","ref":"Lightning.Projects.Project.html#t:t/0"},{"type":"module","title":"Lightning.Projects.ProjectCredential","doc":"Join table to assign credentials to a project","ref":"Lightning.Projects.ProjectCredential.html"},{"type":"type","title":"Lightning.Projects.ProjectCredential.t/0","doc":"","ref":"Lightning.Projects.ProjectCredential.html#t:t/0"},{"type":"module","title":"Lightning.Projects.ProjectUser","doc":"Join table to assign users to a project","ref":"Lightning.Projects.ProjectUser.html"},{"type":"type","title":"Lightning.Projects.ProjectUser.t/0","doc":"","ref":"Lightning.Projects.ProjectUser.html#t:t/0"},{"type":"module","title":"Lightning.Projects.ProjectUser.DigestEnum","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.cast/1","doc":"Callback implementation for Ecto.Type.cast/1 .","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#cast/1"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.create_type/0","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#create_type/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.drop_type/0","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#drop_type/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.dump/1","doc":"Callback implementation for Ecto.Type.dump/1 .","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#dump/1"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.embed_as/1","doc":"Callback implementation for Ecto.Type.embed_as/1 .","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#embed_as/1"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.equal?/2","doc":"Callback implementation for Ecto.Type.equal?/2 .","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#equal?/2"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.load/1","doc":"Callback implementation for Ecto.Type.load/1 .","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#load/1"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.schema/0","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#schema/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.schemaless_type/0","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#schemaless_type/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.type/0","doc":"Callback implementation for Ecto.Type.type/0 .","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#type/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.valid_value?/1","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#valid_value?/1"},{"type":"type","title":"Lightning.Projects.ProjectUser.DigestEnum.t/0","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#t:t/0"},{"type":"module","title":"Lightning.Projects.ProjectUser.RolesEnum","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.cast/1","doc":"Callback implementation for Ecto.Type.cast/1 .","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#cast/1"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.create_type/0","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#create_type/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.drop_type/0","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#drop_type/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.dump/1","doc":"Callback implementation for Ecto.Type.dump/1 .","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#dump/1"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.embed_as/1","doc":"Callback implementation for Ecto.Type.embed_as/1 .","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#embed_as/1"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.equal?/2","doc":"Callback implementation for Ecto.Type.equal?/2 .","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#equal?/2"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.load/1","doc":"Callback implementation for Ecto.Type.load/1 .","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#load/1"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.schema/0","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#schema/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.schemaless_type/0","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#schemaless_type/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.type/0","doc":"Callback implementation for Ecto.Type.type/0 .","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#type/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.valid_value?/1","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#valid_value?/1"},{"type":"type","title":"Lightning.Projects.ProjectUser.RolesEnum.t/0","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#t:t/0"},{"type":"module","title":"Lightning.Projects.Provisioner","doc":"Provides functions for importing projects. This module is used by the provisioning HTTP API. When providing a project to import, all records must have an id field. It's up to the caller to ensure that the id is unique and generated ahead of time in the case of new records.","ref":"Lightning.Projects.Provisioner.html"},{"type":"function","title":"Lightning.Projects.Provisioner.import_document/3","doc":"Import a project.","ref":"Lightning.Projects.Provisioner.html#import_document/3"},{"type":"function","title":"Lightning.Projects.Provisioner.load_project/1","doc":"Load a project by ID, including all workflows and their associated jobs, triggers and edges. Returns nil if the project does not exist.","ref":"Lightning.Projects.Provisioner.html#load_project/1"},{"type":"function","title":"Lightning.Projects.Provisioner.parse_document/2","doc":"","ref":"Lightning.Projects.Provisioner.html#parse_document/2"},{"type":"function","title":"Lightning.Projects.Provisioner.validate_extraneous_params/1","doc":"Validate that there are no extraneous parameters in the changeset. For all params in the changeset, ensure that the param is in the list of known fields in the schema.","ref":"Lightning.Projects.Provisioner.html#validate_extraneous_params/1"},{"type":"module","title":"Lightning.Runtime.ChildProcess","doc":"Provides an interface between a RunSpec and the shell. Internally it calls node , and more specifically the OpenFn core CLI.","ref":"Lightning.Runtime.ChildProcess.html"},{"type":"function","title":"Lightning.Runtime.ChildProcess.build_command/1","doc":"Builds up a string for shell execution based on the RunSpec","ref":"Lightning.Runtime.ChildProcess.html#build_command/1"},{"type":"function","title":"Lightning.Runtime.ChildProcess.build_env/2","doc":"","ref":"Lightning.Runtime.ChildProcess.html#build_env/2"},{"type":"function","title":"Lightning.Runtime.ChildProcess.run/2","doc":"","ref":"Lightning.Runtime.ChildProcess.html#run/2"},{"type":"behaviour","title":"Lightning.Runtime.Handler","doc":"A strategy for executing things via ChildProcess. This module handles the dirty bits, setting up processes and coordinating results (and logs) as they arrive. Since it is a macro, see Lightning.Pipeline.Runner.Handler for a usage example.","ref":"Lightning.Runtime.Handler.html"},{"type":"function","title":"Lightning.Runtime.Handler.env/2","doc":"","ref":"Lightning.Runtime.Handler.html#env/2"},{"type":"callback","title":"Lightning.Runtime.Handler.env/2","doc":"","ref":"Lightning.Runtime.Handler.html#c:env/2"},{"type":"callback","title":"Lightning.Runtime.Handler.log_callback/3","doc":"","ref":"Lightning.Runtime.Handler.html#c:log_callback/3"},{"type":"function","title":"Lightning.Runtime.Handler.on_finish/2","doc":"","ref":"Lightning.Runtime.Handler.html#on_finish/2"},{"type":"callback","title":"Lightning.Runtime.Handler.on_finish/2","doc":"","ref":"Lightning.Runtime.Handler.html#c:on_finish/2"},{"type":"function","title":"Lightning.Runtime.Handler.on_log_emit/2","doc":"","ref":"Lightning.Runtime.Handler.html#on_log_emit/2"},{"type":"callback","title":"Lightning.Runtime.Handler.on_log_emit/2","doc":"","ref":"Lightning.Runtime.Handler.html#c:on_log_emit/2"},{"type":"function","title":"Lightning.Runtime.Handler.on_start/1","doc":"","ref":"Lightning.Runtime.Handler.html#on_start/1"},{"type":"callback","title":"Lightning.Runtime.Handler.on_start/1","doc":"Called with context, if any - when the Run has been started.","ref":"Lightning.Runtime.Handler.html#c:on_start/1"},{"type":"callback","title":"Lightning.Runtime.Handler.start/2","doc":"The entrypoint for executing a run.","ref":"Lightning.Runtime.Handler.html#c:start/2"},{"type":"type","title":"Lightning.Runtime.Handler.t/0","doc":"","ref":"Lightning.Runtime.Handler.html#t:t/0"},{"type":"module","title":"Lightning.Runtime.LogAgent","doc":"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" } )","ref":"Lightning.Runtime.LogAgent.html"},{"type":"function","title":"Lightning.Runtime.LogAgent.buffer/1","doc":"","ref":"Lightning.Runtime.LogAgent.html#buffer/1"},{"type":"function","title":"Lightning.Runtime.LogAgent.child_spec/1","doc":"Returns a specification to start this module under a supervisor. See Supervisor .","ref":"Lightning.Runtime.LogAgent.html#child_spec/1"},{"type":"function","title":"Lightning.Runtime.LogAgent.process_chunk/2","doc":"","ref":"Lightning.Runtime.LogAgent.html#process_chunk/2"},{"type":"function","title":"Lightning.Runtime.LogAgent.start_link/1","doc":"","ref":"Lightning.Runtime.LogAgent.html#start_link/1"},{"type":"type","title":"Lightning.Runtime.LogAgent.logline/0","doc":"","ref":"Lightning.Runtime.LogAgent.html#t:logline/0"},{"type":"module","title":"Lightning.Runtime.LogAgent.StringBuffer","doc":"Internal datastructure to hold and process new bytes for a list of characters. By checking the if the buffer is a complete grapheme, emitting the buffer once valid and returning nil otherwise. In the case of emojis and other language character sets, a character (in UTF-8) can be between 1-4 bytes - when streaming logs for example it's quite easy to receive less than the whole character which can result in crashes or corrupt text.","ref":"Lightning.Runtime.LogAgent.StringBuffer.html"},{"type":"function","title":"Lightning.Runtime.LogAgent.StringBuffer.buffer/1","doc":"","ref":"Lightning.Runtime.LogAgent.StringBuffer.html#buffer/1"},{"type":"function","title":"Lightning.Runtime.LogAgent.StringBuffer.new/0","doc":"","ref":"Lightning.Runtime.LogAgent.StringBuffer.html#new/0"},{"type":"function","title":"Lightning.Runtime.LogAgent.StringBuffer.process_chunk/2","doc":"","ref":"Lightning.Runtime.LogAgent.StringBuffer.html#process_chunk/2"},{"type":"function","title":"Lightning.Runtime.LogAgent.StringBuffer.reduce_chunk/2","doc":"","ref":"Lightning.Runtime.LogAgent.StringBuffer.html#reduce_chunk/2"},{"type":"type","title":"Lightning.Runtime.LogAgent.StringBuffer.t/0","doc":"","ref":"Lightning.Runtime.LogAgent.StringBuffer.html#t:t/0"},{"type":"module","title":"Lightning.Runtime.Result","doc":"Data structure used to represent the result of a Run executed by Lightning.Runtime.ChildProcess .","ref":"Lightning.Runtime.Result.html"},{"type":"function","title":"Lightning.Runtime.Result.new/1","doc":"","ref":"Lightning.Runtime.Result.html#new/1"},{"type":"type","title":"Lightning.Runtime.Result.t/0","doc":"","ref":"Lightning.Runtime.Result.html#t:t/0"},{"type":"module","title":"Lightning.Runtime.RunSpec","doc":"A struct containing all the parameters required to execute a Job.","ref":"Lightning.Runtime.RunSpec.html"},{"type":"function","title":"Lightning.Runtime.RunSpec.new/1","doc":"","ref":"Lightning.Runtime.RunSpec.html#new/1"},{"type":"type","title":"Lightning.Runtime.RunSpec.t/0","doc":"","ref":"Lightning.Runtime.RunSpec.html#t:t/0"},{"type":"exception","title":"Lightning.MetadataService.Error","doc":"","ref":"Lightning.MetadataService.Error.html"},{"type":"function","title":"Lightning.MetadataService.Error.message/1","doc":"Callback implementation for Exception.message/1 .","ref":"Lightning.MetadataService.Error.html#message/1"},{"type":"function","title":"Lightning.MetadataService.Error.new/1","doc":"","ref":"Lightning.MetadataService.Error.html#new/1"},{"type":"type","title":"Lightning.MetadataService.Error.t/0","doc":"","ref":"Lightning.MetadataService.Error.html#t:t/0"},{"type":"extras","title":"Lightning","doc":"OpenFn/Lightning is a fully open source, workflow automation platform that's used to automate critical business processes and integrate information systems. From last-mile services to national-level reporting, it boosts efficiency & effectiveness while enabling secure, stable, scalable interoperability at all levels. Read more about Lightning on OpenFn/Docs . Lightning is the latest "v2" of OpenFn, the Digital Public Good for workflow automation . Use Lightning to visually build, execute and manage workflows. The latest version of the OpenFn technology - first launched in 2014, now tried and tested by NGOs in over 40 countries Fully open source (no premium features or community edition, you get the same product whether using SaaS or self-hosted) Recognised as a Digital Public Good by the DPGA and a Global Good for Health by Digital Square","ref":"readme.html"},{"type":"extras","title":"Lightning - Contents","doc":"Demo Sign up for the BETA Features Getting started Run Lightning via Docker Deploy Lightning on Docker or Kubernetes Run Lightning on your local machine (contributors) Troubleshooting Contribute Project Configuration Quickstart Generate the documentation Security and standards Server specs for self-hosting Questions or feedback?","ref":"readme.html#contents"},{"type":"extras","title":"Lightning - Demo","doc":"Watch a quick demo here: https://www.youtube.com/watch?v=BNaxlHAWb5I Explore our demo app* with username: demo@openfn.org , password: welcome123 , or read through the features section to view screenshots of the app. *Note that the demo app refreshes daily, so do not configure workflows you want to save.","ref":"readme.html#demo"},{"type":"extras","title":"Lightning - Register for a Beta account","doc":"Register for a Beta account at app.openfn.org and go through the quick-start guide to get familiar with the app.","ref":"readme.html#register-for-a-beta-account"},{"type":"extras","title":"Lightning - Features","doc":"Build Plan and build workflows using Lightning's visual interface to quickly define when, where and what you want your automation to do. Use our CLI to quickly build, edit and deploy projects from the comfort of your own code editor. Monitor Monitor all workflow activity in one place. Filter and search runs to identify issues that need addressing and follow how a specific request has been processed Configure alerts to be notified on run failures Receive a project digest for a daily/weekly/monthly summary of your project activity Manage Manage users and access by project Roles and permissions Authorization is a central part of Lightning. As such, users are given different roles which determine what level of access they have for resources in the application. For more details about roles and permissions in Lightning, please refer to our documentation . Roadmap View our public roadmap here .","ref":"readme.html#features"},{"type":"extras","title":"Lightning - Getting Started","doc":"If you only want to RUN Lightning on your own server, we recommend using Docker. If you want to DEPLOY Lightning, we recommend Docker builds and Kubernetes. If you want to CONTRIBUTE to the project, we recommend running Lightning on your local machine .","ref":"readme.html#getting-started"},{"type":"extras","title":"Lightning - Run via Docker","doc":"Install the latest version of Docker Clone this repo using git Copy the .env.example file to .env Run docker compose run --rm web mix ecto.migrate By default the application will be running at localhost:4000 . You can then rebuild and run with docker compose build and docker compose up . See "Problems with Docker" for additional troubleshooting help. Note that you can also create your own docker-compose.yml file, configuring a postgres database and using a pre-built image from Dockerhub.","ref":"readme.html#run-via-docker"},{"type":"extras","title":"Lightning - Deploy on external infrastructure","doc":"See Deployment for more detailed information.","ref":"readme.html#deploy-on-external-infrastructure"},{"type":"extras","title":"Lightning - Run Lightning locally","doc":"Clone the repo and optionally set ENVs git clone git@github.com:OpenFn/Lightning.git # or from YOUR fork! cd Lightning cp .env.example .env # and adjust as necessary! Take note of database names and ports in particular—they've got to match across your Postgres setup and your ENVs. You can run lightning without any ENVs assuming a vanilla postgres setup (see below), but you may want to make adjustments. Database Setup If you're already using Postgres locally, create a new database called lightning_dev , for example. If you'd rather use Docker to set up a Postgres DB, create a new volume and image: docker volume create lightning-postgres-data docker create \\ --name lightning-postgres \\ --mount source=lightning-postgres-data,target=/var/lib/postgresql/data \\ --publish 5432:5432 \\ -e POSTGRES_PASSWORD=postgres \\ postgres:15.3-alpine docker start lightning-postgres Elixir & Ecto Setup We use asdf to configure our local environments. Included in the repo is a .tool-versions file that is read by asdf in order to dynamically make the specified versions of Elixir and Erlang available. You'll need asdf plugins for Erlang , NodeJs Elixir and k6 . asdf install # Install language versions mix local.hex mix deps.get mix local.rebar --force mix ecto.create # Create a development database in Postgres mix ecto.migrate [[ $(uname -m) == 'arm64' ]] && mix compile.rambo # Force compile rambo if on M1 mix lightning.install_runtime mix lightning.install_schemas npm install --prefix assets Run the app Lightning is a web app. To run it in interactive Elixir mode, start the development server by running with your environment variables by running: iex -S mix phx.server or if you have set up custom environment variables, run: env $(cat .env | grep -v "#" | xargs ) iex -S mix phx.server Once the server has started, head to localhost:4000 in your browser. Run the tests Before the first time running the tests, you need a test database setup. MIX_ENV=test mix ecto.create And then after that run the tests using: MIX_ENV=test mix test We also have test.watch installed which can be used to rerun the tests on file changes.","ref":"readme.html#run-lightning-locally"},{"type":"extras","title":"Lightning - Benchmarking","doc":"We are using k6 to benchmark Lightning. Under benchmarking folder you can find a script for benchmarking Webhook Workflows. See Benchmarking for more detailed information.","ref":"readme.html#benchmarking"},{"type":"extras","title":"Lightning - Troubleshooting","doc":"Trouble with environment variables For troubleshooting custom environment variable configuration it's important to know how an Elixir app loads and modifies configuration. The order is as follows: Stuff in config.exs is loaded. That is then modified (think: overwritten ) by stuff your ENV-specific config: dev.exs , prod.exs or test.exs . That is then modified by runtime.exs which is where you are allowed to use System.env() Finally init/2 (if present in a child application) gets called (which takes the config which has been set in steps 1-3) when that child application is started during the parent app startup defined in application.ex . Problems with Postgres If you're having connecting issues with Postgres, check the database section of your .env to ensure the DB url is correctly set for your environment — note that composing a DB url out of other, earlier declared variables, does not work while using xargs . Problems with Debian If you're getting this error on debian == > earmark_parser Compiling 1 file ( . yrl ) / usr / lib / erlang / lib / parsetools - 2.3 . 1 / include / yeccpre . hrl : no such file or directory could not compile dependency :earmark_parser , "mix compile" failed . You can recompile this dependency with "mix deps.compile earmark_parser" , update it with "mix deps.update earmark_parser" or clean it with "mix deps.clean earmark_parser" You need to install erlang development environment sudo apt install erlang-dev refer to this issue Problems with Docker Versions The build may not work on old versions of Docker and Docker compose. It has been tested against: Docker version 20.10 . 17 , build 100 c701 Docker Compose version v2 . 6.0 Problems with rambo When running mix compile.rambo on Apple Silicon (an Apple M1/M2, macarm , aarch64-apple-darwin ) and encountering the following error: ** (RuntimeError) Rambo does not ship with binaries for your environment. aarch64 - apple - darwin22 . 3.0 detected Install the Rust compiler so a binary can be prepared for you . lib / mix / tasks / compile . rambo . ex : 89 : Mix.Tasks.Compile.Rambo . compile! / 0 lib / mix / tasks / compile . rambo . ex : 51 : Mix.Tasks.Compile.Rambo . run / 1 ( mix 1.14 . 2 ) lib / mix / task . ex : 421 : anonymous fn / 3 in Mix.Task . run_task / 4 ( mix 1.14 . 2 ) lib / mix / cli . ex : 84 : Mix.CLI . run_task / 2 You can resolve this error by installing the Rust compiler using Homebrew. Run the following command in your terminal: brew install rust If you have already compiled Rambo explicitly via mix compile.rambo , and you are still seeing the following error: sh : / path_to_directory / Lightning / _build / dev / lib / rambo / priv / rambo : No such file or directory sh : line 0 : exec : / path_to_directory / Lightning / _build / dev / lib / rambo / priv / rambo : cannot execute : No such file or directory You can try renaming deps/rambo/priv/rambo-mac to deps/rambo/priv/rambo . If neither of the approaches above work, please raise an issue. Starting from scratch If you're actively working with docker, you start experiencing issues, and you would like to start from scratch you can clean up everything and start over like this: # To remove any ignored files and reset your .env to it's example git clean -fdx && cp .env.example .env # You can skip the line below if you want to keep your database docker compose down --rmi all --volumes docker compose build --no-cache web && \\ docker compose create --force-recreate docker compose run --rm web mix ecto.migrate docker compose up","ref":"readme.html#troubleshooting"},{"type":"extras","title":"Lightning - Project Configuration Quickstart","doc":"For help getting started with your OpenFn/Lightning Project and Workflows configuration, check out the Lightning Quickstart Guidance on OpenFn/Docs.","ref":"readme.html#project-configuration-quickstart"},{"type":"extras","title":"Lightning - Contribute to this project","doc":"First, thanks for being here! You're contributing to a digital public good that will always be free and open source and aimed at serving innovative NGOs, governments, and social impact organizations the world over! You rock. ❤️ FYI, Lightning is built in Elixir , harnessing the Phoenix Framework . Currently, the only unbundled dependency is a PostgreSQL database. If you'd like to contribute to this projects, follow the steps below: Assign yourself to an issue Read through the existing issues , assign yourself to the issue you have chosen. Leave a comment on the issue to let us know you'll be working on it, and if you have any questions of clarifications that would help you get started ask them there - we will get back to you as soon as possible. If there isn't already an issue for the feature you would like to contribute, please start a discussion in our community forum . Open a pull request Clone the Lightning repository, then fork it . Run through setting up your environment and make your changes. Make sure you have written your tests and updated /CHANGELOG.md (in the 'Unreleased' section, add a short description of the changes you are making, along with a link to your issue). Open a draft pull request by clicking "Contribute > Open Pull Request" from your forked repository. Fill out the pull request template (this will be added automatically for you), then make sure to self-review your code and go through the 'Review checklist'. Don't worry about the QA checkbox, our product manager Amber will tick that once she has reviewed your PR. You can leave any notes for the reviewer in a comment. Once you're ready to submit a pull request, you can mark your draft PR as 'Ready for review' and assign @stuartc or @taylordowns2000.","ref":"readme.html#contribute-to-this-project"},{"type":"extras","title":"Lightning - Generating Documentation","doc":"You can generate the HTML and EPUB documentation locally using: mix docs and opening doc/index.html in your browser.","ref":"readme.html#generating-documentation"},{"type":"extras","title":"Lightning - Security and Standards","doc":"We use a host of common Elixir static analysis tools to help us avoid common pitfalls and make sure we keep everything clean and consistent. In addition to our test suite, you can run the following commands: mix format --check-formatted Code formatting checker, run again without the --check-formatted flag to have your code automatically changed. mix dialyzer Static analysis for type mismatches and other common warnings. See dialyxir . mix credo Static analysis for consistency, and coding standards. See Credo . mix sobelow Check for commonly known security exploits. See Sobelow . MIX_ENV=test mix coveralls Test coverage reporter. This command also runs the test suite, and can be used in place of mix test when checking everything before pushing your code. See excoveralls . For convenience there is a verify mix task that runs all of the above and defaults the MIX_ENV to test . For more guidance on security best practices for workflow automation implementations, check out OpenFn Docs: docs.openfn.org/documentation/getting-started/security","ref":"readme.html#security-and-standards"},{"type":"extras","title":"Lightning - Server Specs for Self-Hosting","doc":"For recommend server specifications for self-hosting of Lightning, check out this Community topic: community.openfn.org/t/specs-for-self-hosting-lightning/292","ref":"readme.html#server-specs-for-self-hosting"},{"type":"extras","title":"Lightning - Support","doc":"If you have any questions, feedback, or issues, please: Post on the OpenFn Community at community.openfn.org Open an issue directly on this Github Repo: github.com/OpenFn/Lightning/issues","ref":"readme.html#support"},{"type":"extras","title":"Deployment","doc":"","ref":"deployment.html"},{"type":"extras","title":"Deployment - Encryption","doc":"Lightning enforces encryption at rest for Credentials, for which an encryption key must be provided when running in production. The key is expected to be a randomized set of bytes, 32 long; and Base64 encoded when setting the environment variable. There is a mix task that can generate keys in the correct shape for use as an environment variable: mix lightning.gen_encryption_key 0bJ9w+hn4ebQrsCaWXuA9JY49fP9kbHmywGd5K7k+/s= Copy your key (NOT THIS ONE) and set it as PRIMARY_ENCRYPTION_KEY in your environment.","ref":"deployment.html#encryption"},{"type":"extras","title":"Deployment - Environment Variables","doc":"Note that for secure deployments, it's recommended to use a combination of secrets and configMaps to generate secure environment variables. ADAPTORS_PATH - where you store your locally installed adaptors DISABLE_DB_SSL - in production the use of an SSL conntection to Postgres is required by default, setting this to "true" allows unencrypted connections to the database. This is strongly discouraged in real production environment. K8S_HEADLESS_SERVICE - this environment variable is automatically set if you're running on GKE and it is used to establish an Erlang node cluster. Note that if you're not using Kubernetes, the "gossip" strategy is used for establish clusters. LISTEN_ADDRESS " - the address the web server should bind to, defaults to 127.0.0.1 to block access from other machines. LOG_LEVEL - how noisy you want the logs to be (e.g. debug , info ) MAX_RUN_DURATION - the maximum time (in milliseconds) that jobs are allowed to run (keep this below your termination_grace_period if using kubernetes) MIX_ENV - your mix env, likely prod for deployment NODE_ENV - node env, likely production for deployment ORIGINS - the allowed origins for web traffic to the backend PORT - the port your Phoenix app runs on PRIMARY_ENCRYPTION_KEY - a base64 encoded 32 character long string. See Encryption . SCHEMAS_PATH - path to the credential schemas that provide forms for different adaptors SECRET_KEY_BASE - a secret key used as a base to generate secrets for encrypting and signing data. SENTRY_DSN - if using Sentry for error monitoring, your DSN URL_HOST - the host, used for writing urls (e.g., demo.openfn.org ) URL_PORT - the port, usually 443 for production URL_SCHEME - the scheme for writing urls, (e.g., https ) Google Using your Google Cloud account, provision a new OAuth 2.0 Client with the 'Web application' type. Set the callback url to: https://<ENDPOINT DOMAIN>/authenticate/callback . Replacing ENDPOINT DOMAIN with the host name of your instance. Once the client has been created, get/download the OAuth client JSON and set the following environment variables: GOOGLE_CLIENT_ID - Which is client_id from the client details. GOOGLE_CLIENT_SECRET - client_secret from the client details.","ref":"deployment.html#environment-variables"},{"type":"extras","title":"Benchmarking","doc":"Execute the following steps to run a benchmark on Lightning: Make sure you have k6 installed locally. If you're using asdf you can run asdf install in the project root. Spin up your Lightning local instance Run the demo setup script: mix run --no-start priv/repo/demo.exs The webhookURL is already set to default to the webhook created in the demo data In another terminal (do not stop the Lightning server) run the benchmarking/script.js file using the following command k6 run benchmarking/script.js If the script exits succesfully, this means the app met the defined performance thresholds. To collect the benchmarking data in a CSV file, run the previous command with the --out filename option. k6 run --out csv=test_results.csv benchmarking/script.js See results output for other available output formats.","ref":"benchmarking.html"},{"type":"extras","title":"Provisioning","doc":"Lightning offers the ability to configure projects via the HTTP API. By providing a JSON document with the desired configuration, the project can be configured to your liking.","ref":"provisioning.html"},{"type":"extras","title":"Provisioning - Using the API","doc":"The API is available at /api/provision , and expects an application/json Content-Type. Authentication The API requires a valid auth token to be provided in the Authorization header. Example Request curl -X POST \\ -d @project.json \\ -H "Authorization: Bearer $TOKEN" \\ -H "Content-Type: application/json" \\ $ENDPOINT/api/provision","ref":"provisioning.html#using-the-api"},{"type":"extras","title":"Provisioning - Document Structure","doc":"The provisioning document is a JSON document with the project at the root. All entities must have an id field, which is a UUIDv4 string. In the case of new entities, this must be generated by the client. The API is idempotent, and the distinction between creating and updating is determined by the presence of the id field. { "id": "<<project-id>>", "name": "<<project-name>>", "workflows": [ { "id": "<<workflow-id>>", "name": "<<workflow-name>>", "jobs": [ { "id": "<<job-id>>", "name": "<<job-name>>", "body": "<<job-body>>", "adaptor": "<<adaptor-name>>", "enabled": true } // ... more jobs ], "triggers": [ { "id": "<<trigger-id>>", "name": "<<trigger-name>>", "type": "webhook" } // ... more triggers ], "edges": [ { "id": "<<edge-id>>", "source_trigger_id": "<<trigger-id>>", "target_job_id": "<<job-id>>" } // ... more edges ] } // ... more workflows ] }","ref":"provisioning.html#document-structure"},{"type":"extras","title":"Provisioning - API Behaviour","doc":"The API expects all existing entities to be provided in the provisioning document. If the document provided is out of date (e.g. a new job was added on the server), a new reference document should be fetched and the changes applied to it. Deleting Entities Entities can be deleted by setting the disabled key to true . Example: { "id": "<<project-id>>", "workflows": [ { "id": "<<workflow-id>>", "jobs": [ { "id": "<<job-id>>", "delete": true // <== delete this job } ] } ] }","ref":"provisioning.html#api-behaviour"},{"type":"extras","title":"Provisioning - Relationship with Projects as Code","doc":"The Projects as Code spec is a superset of the provisioning API. Projects as Code allows for the user to specify a key for each entity, which makes it easier to manage the project in the future. For example: name: my-project workflows: workflow-one: jobs: job-one: body: | console.log("Hello World"); adaptor: '@openfn/language-common' enabled: true triggers: trigger-one: type: webhook edges: - source_trigger: trigger-one target_job: job-one The above YAML document illustrates the use of keys being used to identify entities. Allowing the user to provision the same project to multiple environments. The API is unaware of 'keys', and expects IDs to be provided by the client. In order to convert the above YAML document to a provisioning document, the CLI uses a local state file (if available) to map the keys to UUIDs. Using the example above a state file might look like this: { "id": "f6ba9a8c-b687-473a-908e-e250686f1eed", "workflows": { "workflow-one": { "id": "f206aa85-4fce-492e-94eb-ffd32c75d178", "jobs": {}, "triggers": {} } } } The state file shows that the project and workflow already exist, but the job, trigger and edge do not. In order to create these new entities, IDs will be applied them. On a successful application of the provisioning document, the state file will be updated to reflect the new IDs and entities. { "id": "f6ba9a8c-b687-473a-908e-e250686f1eed", "workflows": { "workflow-one": { "id": "f206aa85-4fce-492e-94eb-ffd32c75d178", "jobs": { "job-one": { "id": "18ed71de-caf8-4822-aefc-5b19351f4016" } }, "triggers": { "trigger-one": { "id": "e0b9f357-9cf9-4206-9924-4d5674aad830" } }, "edges": [ { "id": "c239d994-6662-4637-90f8-0293c924b461", "source_trigger_id": "e0b9f357-9cf9-4206-9924-4d5674aad830", "target_job_id": "18ed71de-caf8-4822-aefc-5b19351f4016" } ] } } }","ref":"provisioning.html#relationship-with-projects-as-code"},{"type":"extras","title":"Changelog","doc":"All notable changes to this project will be documented in this file. The format is based on Keep a Changelog , and this project adheres to Semantic Versioning .","ref":"changelog.html"},{"type":"extras","title":"Changelog - [Unreleased]","doc":"Added Introduces Github sync feature, users can now setup our github app on their instance and sync projects using our latest portability spec #970 Support Backup Codes for Multi-Factor Authentication 937 Log a warning in the console when the Editor/docs component is given latest #958 Changed Fixed","ref":"changelog.html#unreleased"},{"type":"extras","title":"Changelog - [v0.7.3] - 2023-08-15","doc":"Added Changed Version control in project settings is now named Export your project #1015 Fixed Tooltip for credential select in Job Edit form is cut off #972 Dataclip type and state assembly notice for creating new dataclip dropped during refactor #975","ref":"changelog.html#v0-7-3-2023-08-15"},{"type":"extras","title":"Changelog - [v0.7.2] - 2023-08-10","doc":"Added Changed NodeJs security patch 1009 Fixed","ref":"changelog.html#v0-7-2-2023-08-10"},{"type":"extras","title":"Changelog - [v0.7.1] - 2023-08-04","doc":"Added Changed Fixed Fixed flickery icons on new workflow job creation.","ref":"changelog.html#v0-7-1-2023-08-04"},{"type":"extras","title":"Changelog - [v0.7.0] - 2023-08-04","doc":"Added Project owners can require MFA for their users 892 Changed Moved to Elixir 1.15 and Erlang 26.0.2 to sort our an annoying ElixirLS issue that was slowing down our engineers. Update Debian base to use bookworm (Debian 12) for our Docker images Change new credential modal to take up less space on the screen #931 Placeholder nodes are now purely handled client-side Fixed Fix issue creating a new credential from the Job editor where the new credential was not being set on the job. #951 Fix issue where checking a credential type radio button shows as unchecked on first click. #976 Return the pre-filled workflow names #971 Fix version reporting and external reset_demo() call via Application.spec() #1010 Fixed issue where entering a placeholder name through the form would result an in unsaveable workflow #1001 Ensure the DownloadController checks for authentication and authorisation.","ref":"changelog.html#v0-7-0-2023-08-04"},{"type":"extras","title":"Changelog - [v0.7.0-pre5] - 2023-07-28","doc":"Added Changed Unless otherwise specified, only show workorders with activity in last 14 days #968 Fixed","ref":"changelog.html#v0-7-0-pre5-2023-07-28"},{"type":"extras","title":"Changelog - [v0.7.0-pre4] - 2023-07-27","doc":"Added Changed Don't add cast fragments if the search_term is nil #968 Fixed","ref":"changelog.html#v0-7-0-pre4-2023-07-27"},{"type":"extras","title":"Changelog - [v0.7.0-pre3] - 2023-07-26","doc":"Added Changed Fixed Fixed an issue with newly created edges that prevented downstream jobs 977","ref":"changelog.html#v0-7-0-pre3-2023-07-26"},{"type":"extras","title":"Changelog - [v0.7.0-pre2] - 2023-07-26","doc":"Note that this is a pre-release with a couple of known bugs that are tracked in the Nodes and Edges epic . Added Added ability for a user to enable MFA on their account; using 2FA apps like Authy, Google Authenticator etc #890 Write/run sql script to convert triggers #875 Export projects as .yaml via UI #249 Changed In v0.7.0 we change the underlying workflow building and execution infrastructure to align with a standard "nodes and edges" design for directed acyclic graphs (DAGs). Make sure to run the migrations! 793 Fixed Propagate url pushState/changes to Workflow Diagram selection #944 Fix issue when deleting nodes from the workflow editor #830 Fix issue when clicking a trigger on a new/unsaved workflow #954","ref":"changelog.html#v0-7-0-pre2-2023-07-26"},{"type":"extras","title":"Changelog - [0.6.7] - 2023-07-13","doc":"Added Add feature to bulk rerun work orders from a specific step in their workflow; e.g., "rerun these 50 work orders, starting each at step 4." #906 Changed Fixed Oban exception: "value too long" when log lines are longer than 255 chars #929","ref":"changelog.html#0-6-7-2023-07-13"},{"type":"extras","title":"Changelog - [0.6.6] - 2023-06-30","doc":"Added Add public API token to the demo site setup script Check and renew OAuth credentials when running a job #646 Fixed Remove google sheets from adaptors list until supporting oauth flow #792 Remove duplicate google sheets adaptor display on credential type picklist #663 Fix demo setup script for calling from outside the app on Kubernetes deployments #917","ref":"changelog.html#0-6-6-2023-06-30"},{"type":"extras","title":"Changelog - [0.6.5] - 2023-06-22","doc":"Added Ability to rerun workorders from start by selecting one of more of them from the History page and clicking the "Rerun" button. #659 Fixed Example runs for demo incorrect #856","ref":"changelog.html#0-6-5-2023-06-22"},{"type":"extras","title":"Changelog - [0.6.3] - 2023-06-15","doc":"Fixed Prevent saving null log lines to the database, fix issue with run display #866","ref":"changelog.html#0-6-3-2023-06-15"},{"type":"extras","title":"Changelog - [0.6.2] - 2023-06-09","doc":"Fixed Fixed viewer permissions for delete workflow Fixed bug with workflow cards #859","ref":"changelog.html#0-6-2-2023-06-09"},{"type":"extras","title":"Changelog - [0.6.1] - 2023-06-08","doc":"Fixed Fixed bug with run logs #864 Correctly stagger demo runs to maintain order #856 Remove Timex use from SetupUtils in favor of DateTime to fix issue when calling it in escript.","ref":"changelog.html#0-6-1-2023-06-08"},{"type":"extras","title":"Changelog - [0.6.0]- 2023-04-12","doc":"Added Create sample runs when generating sample workflow #821 Added a provisioning api for creating and updating projects and their workflows See: PROVISIONING.md #641 Add ability for a superuser to schedule deletion, cancel deletion, and delete projects #757 Add ability for a project owner to schedule deletion, cancel deletion, and delete projects #746 Changed Ability to store run log lines as rows in a separate table #514 Fixed Incorrect project digest queries #768 ] Fix issue when purging deleted users #747 Generate a random name for Workflows when creating one via the UI. #828 Handle error when deleting a job with runs. #814","ref":"changelog.html#0-6-0-2023-04-12"},{"type":"extras","title":"Changelog - [0.5.2]","doc":"Added Add workflow_edges table in preparation for new workflow editor implementation #794 Stamped credential_id on run directly for easier auditing of the history interface. Admins can now see which credential was used to run a run. #800 Better errors when using magic functions: "no magic yet" and "check credential" #812 Changed The delete-project function now delete all associated activities #759 Fixed","ref":"changelog.html#0-5-2"},{"type":"extras","title":"Changelog - [0.5.1] - 2023-04-12","doc":"Added Added ability to create and revoke personal API tokens #147 Add last-used at to API tokens #722 Improved "save" for job builder; users can now press Ctrl + S or ⌘ + S to save new or updated jobs job panel will not close. (Click elsewhere in the canvas or click the "Close" button to close.) #568 Add filtered search params to the history page URL #660 Changed The secret scrubber now ignores booleans 690 Fixed The secret scrubber now properly handles integer secrets from credentials 690 Updated describe-package dependency, fixing sparkles in adaptor-docs 657 Clicks on the workflow canvas were not lining up with the nodes users clicked on; they are now 733 Job panel behaves better when collapsed 774","ref":"changelog.html#0-5-1-2023-04-12"},{"type":"extras","title":"Changelog - [0.5.0] - 2023-04-03","doc":"Added Magic functions that fetch real metadata from connected systems via credentials and suggest completions in the job builder (e.g., pressing control-space when setting the orgUnit attribute for a DHIS2 create operation will pull the actual list of orgUnits with human readable labels and fill in their orgUnit codes upon enter.) 670 A "metadata explorer" to browse actual system metadata for connected instances. 658 Resizable job builder panel for the main canvas/workflow view. 681 Changed Display timezone for cron schedule—it is always UTC. #716 Instance administrators can now configure the interval between when a project owner or user requests deletion and when these records are purged from the database. It defaults to 7, but by providing a PURGE_DELETED_AFTER_DAYS environment variable the grace period can be altered. Note that setting this variable to 0 will make automatic purging never occur but will still make "deleted" projects and users unavailable. This has been requested by certain organizations that must retain audit logs in a Lightning instance. 758 Fixed Locked CLI version to @openfn/cli@0.0.35 . #761","ref":"changelog.html#0-5-0-2023-04-03"},{"type":"extras","title":"Changelog - [0.4.8] - 2023-03-29","doc":"Added Added a test harness for monitoring critical parts of the app using Telemetry #654 Changed Set log level to info for runs. Most of the debug logging is useful for the CLI, but not for Lightning. In the future the log level will be configurable at instance > project > job level by the superuser and any project admin . Renamed license file so that automagic github icon is less confusing Fixed Broken links in failure alert email #732 Registration Submission on app.openfn.org shows internal server error in browser #686 Run the correct runtime install mix task in Dockerfile-dev #541 Users not disabled when scheduled for deletion #719","ref":"changelog.html#0-4-8-2023-03-29"},{"type":"extras","title":"Changelog - [0.4.6] - 2023-03-23","doc":"Added Implement roles and permissions across entire app #645 Fix webhook URL ( https://<<HOST_URL>>/i/cae544ab-03dc-4ccc-a09c-fb4edb255d7a ) for the OpenHIE demo workflow 448 Phoenix Storybook for improved component development Load test for webhook endpoint performance #645 Notify user via email when they're added to a project #306 Added notify user via email when their account is created #307 Changed Improved errors when decoding encryption keys for use with Cloak. #684 Allow users to run ANY job with a custom input. #629 Fixed Ensure JSON schema form inputs are in the same order as they are written in the schema #685","ref":"changelog.html#0-4-6-2023-03-23"},{"type":"extras","title":"Changelog - [0.4.4] - 2023-03-10","doc":"Added Users can receive a digest email reporting on a specified project. #638 #585 Changed Fixed","ref":"changelog.html#0-4-4-2023-03-10"},{"type":"extras","title":"Changelog - [0.4.3] - 2023-03-06","doc":"Added Tooltips on Job Builder panel #650 Changed Upgraded to Phoenix 1.7 (3945856) Fixed Issue with FailureAlerter configuration missing in prod mode.","ref":"changelog.html#0-4-3-2023-03-06"},{"type":"extras","title":"Changelog - [0.4.2] - 2023-02-24","doc":"Added A user can change their own email #247 Added a SCHEMAS_PATH environment variable to override the default folder location for credential schemas #604 Added the ability to configure Google Sheets credentials #536 Function to import a project #574 Changed Users cannot register if they have not selected the terms and conditions #531 Fixed Jobs panel slow for first open after restart #567","ref":"changelog.html#0-4-2-2023-02-24"},{"type":"extras","title":"Changelog - [0.4.0] - 2023-02-08","doc":"Added Added a Delete job button in Inspector Filter workflow runs by text/value in run logs or input body Drop "configuration" key from Run output dataclips after completion Ability to 'rerun' a run from the Run list Attempts and Runs update themselves in the Runs list Configure a project and workflow for a new registering user Run a job with a custom input Added plausible analytics Allow user to click on Webhook Trigger Node to copy webhook URL on workflow diagram Allow any user to delete a credential that they own Create any credential through a form except for OAuth Refit all diagram nodes on browser and container resize Enable distributed Erlang, allowing any number of redundant Lightning nodes to communicate with each other. Users can set up realtime alerts for a project Changed Better code-assist and intelliense in the Job Editor Updated @openfn/workflow-diagram to 0.4.0 Make plus button part of job nodes in Workflow Diagram Updated @openfn/adaptor-docs to 0.0.5 Updated @openfn/describe-package to 0.0.10 Create an follow a manual Run from the Job Inspector View all workflows in a project on the workflows index page Move @openfn/workflow-diagram into the application, the NPM module is now deprecated. Remove workflow name from first node Move the used parts of @openfn/engine into the application. [BREAKING CHANGE] Ported mix openfn.install.runtime into application, use mix lightning.install_runtime . [BREAKING CHANGE] Introduced @openfn/cli as the new runtime for Jobs Rename a workflow through the page heading Hide the dataclips tab for beta Make adaptor default to common@latest Remove jobs list page Better error handling in the docs panel Disable credential ownership transfer in dev and prod environments Add project settings page Change Workorder filters to apply to the aggregate state of the workorder and not the run directly Enable jobs by default Set log level to info Add Beta checkbox to register page User roles and permissions Fixed Don't consider disabled jobs when calculating subsequent runs Fixed overflow on Job Editor Tooltips Fixed auto-scroll when adding a new snippet in the Job Editor Fixed common operation typings in Job Editor","ref":"changelog.html#0-4-0-2023-02-08"},{"type":"extras","title":"Changelog - [0.3.1] - 2022-11-22","doc":"Fixed Fixed bug that attempted to execute HTML scripts in dataclips Fixed bug that prevented workorders from displaying in the order of their last run, descending. Remove alerts after set timeout or close","ref":"changelog.html#0-3-1-2022-11-22"},{"type":"extras","title":"Changelog - [0.3.0] - 2022-11-21","doc":"Added Add seed data for demo site Create adaptor credentials through a form Configure cron expressions through a form View runs grouped by workorders and attempts Run an existing Job with any dataclip uuid from the Job form Changed Redirect users to projects list page when they click on Admin Settings menu Move job, project, input and output Dataclips to Run table Reverse the relationship between Jobs and Triggers. Triggers now can exist on their own; setting the stage for branching and merging workflows Updated Elixir and frontend dependencies [BREAKING CHANGE] Pipeline now uses WorkOrders, previous data is not compatible. Runs, Dataclips and Attempts now all correctly use usec resolution timestamps. Upgraded LiveView to 0.18.0 Upgraded Elixir to 1.14.1 and OTP 25 Workflow Job editor now behaves like a panel Split JobLive.InspectorFormComponent into different plug-able subcomponents Ensure new jobs with cron triggers receive a default frequency Webhooks are now referenced by the trigger id instead of job id. Filter runs by status Filter runs by workflow Filter runs by date View a job run from the runs history View latest matching inputs to run a job with","ref":"changelog.html#0-3-0-2022-11-21"},{"type":"extras","title":"Changelog - [0.2.0] - 2022-09-12","doc":"Changed [BREAKING CHANGE] Add Workflow model, Jobs now belong to a Workflow This is a breaking change to the schema. Use Node.js 18, soon to be in LTS. Visualize success/fail triggers in workflow diagram. Move WorkflowDiagram related actions from DashboardLive into WorkflowLive Move WorkflowDiagram component into liveview, so that we can subscribe to channels (i.e. updating of the diagram when someone changes something). Integrate @openfn/workflow-diagram@0.0.8 and use the new Store interface for updating it. Remove component_mounted event from WorkflowDiagram hook, using a MutationObserver and a Base64 encoded JSON payload. Fixed an issue where the compiler component would try and load a 'nothing adaptor', added a condition to check an adaptor is actually selected. Removed previous Workflow CTE queries, replaced by the introduction of the Workflow model, see ( https://github.com/OpenFn/Lightning/blob/53da6883483e7d8d078783f348da327d1dd72d20/lib/lightning/workflows.ex#L111-L119 ).","ref":"changelog.html#0-2-0-2022-09-12"},{"type":"extras","title":"Changelog - [0.1.13] - 2022-08-29","doc":"Added Allow administrators to configure OIDC providers for authentication (note that this is just for authenticating, not yet for creating new accounts via OIDC) Add Monaco editor to the step/job panel Allow users to delete their own accounts. Schedule their user and credentials data for deletion when they do. Allow superusers to delete a user account. Schedule the user's credentials and user data for deletion when they do. If a user is scheduled for deletion, disable their account and prevent them from logging in. The 'User profile' and 'Credentials' page now have a sidebar menu Changed Project users now have one of the following roles: viewer, editor, admin, owner Users only have the following roles: user, superuser","ref":"changelog.html#0-1-13-2022-08-29"},{"type":"extras","title":"Changelog - [0.1.12] - 2022-08-15","doc":"Added Transfer credential ownership to another user. Create credentials via a form interface* Show "projects with access" in credentials list view. Show job in runs list and run view. Added roles and permissions to workflows and history page #645 *The form is defined by a JSON schema provided by an adaptor, in most cases: e.g., language-dhis2 provides a single schema which defines the required attributes for state.configuration , while language-common provides multiple credential schemas like "oauth" or "basic auth" which define attributes for state.configuration and which might be used by lots of different jobs.) Fixed User menu (top right) appears on top of all other components. User profile screen integrated with the rest of the liveview app.","ref":"changelog.html#0-1-12-2022-08-15"},{"type":"extras","title":"Changelog - [0.1.11] - 2022-08-05","doc":"Fixed Fixed logging in Runner when :debug log level used; note that this caused crashes in Oban","ref":"changelog.html#0-1-11-2022-08-05"},{"type":"extras","title":"Changelog - [0.1.10] - 2022-08-05","doc":"Added Credential auditing Build/version information display for easier debugging Fixed Fixed a bug that enqueued cron-triggered jobs even when they were disabled","ref":"changelog.html#0-1-10-2022-08-05"},{"type":"extras","title":"Changelog - [0.1.9] - 2022-07-27","doc":"Added Navigate to user profile or credentials page and log out through the user icon dropdown Create and edit dataclips Add a production tag to credentials View a dropdown of operations and their description for the language-common v2.0.0-rc2 adaptor (this pattern to be rolled out across adaptors) Changed Navigate between projects through a project picker on the navbar Fixed Run Lightning with docker Security Sensitive credential values are scrubbed from run logs All credentials are encrypted at REST","ref":"changelog.html#0-1-9-2022-07-27"},{"type":"extras","title":"Changelog - [0.1.7] - 2022-06-24","doc":"Added Run a job with a cron trigger Queue jobs via Oban/Postgres Edit jobs via the workflow canvas","ref":"changelog.html#0-1-7-2022-06-24"},{"type":"extras","title":"Changelog - [0.1.6] - 2022-06-07","doc":"Added Register, log in and log out of an account Allow superusers and admin users to create projects Allow admin users to create or disable a user’s account Allow superusers for local deployments to create users and give them access to project spaces Create and edit a job with a webhook, flow/fail or cron trigger Create and edit credentials for a job Copy a job's webhook URL View all workflows in a project visually Deploy lightning locally with Docker Enable a job to automatically process incoming requests Run a job with a webhook or flow/fail trigger View job runs along with their logs, exit code, start and end time View data clips that have initiated job runs (http requests for webhooks, run results) Changed - Removed -","ref":"changelog.html#0-1-6-2022-06-07"}] \ No newline at end of file diff --git a/dist/sidebar_items-0263EBFD.js b/dist/sidebar_items-0263EBFD.js deleted file mode 100644 index 308e8c0822..0000000000 --- a/dist/sidebar_items-0263EBFD.js +++ /dev/null @@ -1 +0,0 @@ -sidebarNodes={"modules":[{"id":"Lightning","group":"","title":"Lightning","sections":[]},{"id":"Lightning.AdaptorRegistry","group":"","title":"Lightning.AdaptorRegistry","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"all/1","title":"all(server \\\\ __MODULE__)","anchor":"all/1"},{"id":"child_spec/1","title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"fetch/0","title":"fetch()","anchor":"fetch/0"},{"id":"latest_for/2","title":"latest_for(server \\\\ __MODULE__, module_name)","anchor":"latest_for/2"},{"id":"resolve_adaptor/1","title":"resolve_adaptor(adaptor)","anchor":"resolve_adaptor/1"},{"id":"resolve_package_name/1","title":"resolve_package_name(package_name)","anchor":"resolve_package_name/1"},{"id":"resolve_package_name!/1","title":"resolve_package_name!(package_name)","anchor":"resolve_package_name!/1"},{"id":"start_link/1","title":"start_link(opts \\\\ [use_cache: true])","anchor":"start_link/1"},{"id":"versions_for/2","title":"versions_for(server \\\\ __MODULE__, module_name)","anchor":"versions_for/2"}],"key":"functions"}]},{"id":"Lightning.AdaptorRegistry.Npm","group":"","title":"Lightning.AdaptorRegistry.Npm","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"body/0","title":"body()","anchor":"t:body/0"},{"id":"headers/0","title":"headers()","anchor":"t:headers/0"},{"id":"method/0","title":"method()","anchor":"t:method/0"},{"id":"options/0","title":"options()","anchor":"t:options/0"},{"id":"params/0","title":"params()","anchor":"t:params/0"},{"id":"request/0","title":"request()","anchor":"t:request/0"},{"id":"url/0","title":"url()","anchor":"t:url/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"delete/3","title":"delete(url, headers \\\\ [], options \\\\ [])","anchor":"delete/3"},{"id":"delete!/3","title":"delete!(url, headers \\\\ [], options \\\\ [])","anchor":"delete!/3"},{"id":"get/3","title":"get(url, headers \\\\ [], options \\\\ [])","anchor":"get/3"},{"id":"get!/3","title":"get!(url, headers \\\\ [], options \\\\ [])","anchor":"get!/3"},{"id":"head/3","title":"head(url, headers \\\\ [], options \\\\ [])","anchor":"head/3"},{"id":"head!/3","title":"head!(url, headers \\\\ [], options \\\\ [])","anchor":"head!/3"},{"id":"options/3","title":"options(url, headers \\\\ [], options \\\\ [])","anchor":"options/3"},{"id":"options!/3","title":"options!(url, headers \\\\ [], options \\\\ [])","anchor":"options!/3"},{"id":"package_detail/1","title":"package_detail(package_name)","anchor":"package_detail/1"},{"id":"patch/4","title":"patch(url, body, headers \\\\ [], options \\\\ [])","anchor":"patch/4"},{"id":"patch!/4","title":"patch!(url, body, headers \\\\ [], options \\\\ [])","anchor":"patch!/4"},{"id":"post/4","title":"post(url, body, headers \\\\ [], options \\\\ [])","anchor":"post/4"},{"id":"post!/4","title":"post!(url, body, headers \\\\ [], options \\\\ [])","anchor":"post!/4"},{"id":"process_headers/1","title":"process_headers(headers)","anchor":"process_headers/1"},{"id":"process_request_body/1","title":"process_request_body(body)","anchor":"process_request_body/1"},{"id":"process_request_headers/1","title":"process_request_headers(headers)","anchor":"process_request_headers/1"},{"id":"process_request_options/1","title":"process_request_options(options)","anchor":"process_request_options/1"},{"id":"process_request_params/1","title":"process_request_params(params)","anchor":"process_request_params/1"},{"id":"process_response/1","title":"process_response(response)","anchor":"process_response/1"},{"id":"process_response_chunk/1","title":"process_response_chunk(chunk)","anchor":"process_response_chunk/1"},{"id":"process_response_headers/1","title":"process_response_headers(headers)","anchor":"process_response_headers/1"},{"id":"process_response_status_code/1","title":"process_response_status_code(status_code)","anchor":"process_response_status_code/1"},{"id":"process_status_code/1","title":"process_status_code(status_code)","anchor":"process_status_code/1"},{"id":"process_url/1","title":"process_url(url)","anchor":"process_url/1"},{"id":"put/4","title":"put(url, body \\\\ \"\", headers \\\\ [], options \\\\ [])","anchor":"put/4"},{"id":"put!/4","title":"put!(url, body \\\\ \"\", headers \\\\ [], options \\\\ [])","anchor":"put!/4"},{"id":"request/1","title":"request(request)","anchor":"request/1"},{"id":"request/5","title":"request(method, url, body \\\\ \"\", headers \\\\ [], options \\\\ [])","anchor":"request/5"},{"id":"request!/5","title":"request!(method, url, body \\\\ \"\", headers \\\\ [], options \\\\ [])","anchor":"request!/5"},{"id":"start/0","title":"start()","anchor":"start/0"},{"id":"stream_next/1","title":"stream_next(resp)","anchor":"stream_next/1"},{"id":"user_packages/1","title":"user_packages(user)","anchor":"user_packages/1"}],"key":"functions"}]},{"id":"Lightning.AdaptorService","group":"","title":"Lightning.AdaptorService","sections":[{"id":"Configuration","anchor":"module-configuration"},{"id":"Installing Adaptors","anchor":"module-installing-adaptors"},{"id":"Looking up adaptors","anchor":"module-looking-up-adaptors"}],"nodeGroups":[{"name":"Types","nodes":[{"id":"package_spec/0","title":"package_spec()","anchor":"t:package_spec/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"build_aliased_name/1","title":"build_aliased_name(arg)","anchor":"build_aliased_name/1"},{"id":"child_spec/1","title":"child_spec(arg)","anchor":"child_spec/1"},{"id":"find_adaptor/2","title":"find_adaptor(agent, package)","anchor":"find_adaptor/2"},{"id":"get_adaptors/1","title":"get_adaptors(agent)","anchor":"get_adaptors/1"},{"id":"install/2","title":"install(agent, package)","anchor":"install/2"},{"id":"install!/2","title":"install!(agent, package_spec)","anchor":"install!/2"},{"id":"installed?/2","title":"installed?(agent, package_spec)","anchor":"installed?/2"},{"id":"resolve_package_name/1","title":"resolve_package_name(package_name)","anchor":"resolve_package_name/1"},{"id":"start_link/1","title":"start_link(opts)","anchor":"start_link/1"}],"key":"functions"}]},{"id":"Lightning.Attempt","group":"","title":"Lightning.Attempt","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"new/1","title":"new(attrs \\\\ %{})","anchor":"new/1"}],"key":"functions"}]},{"id":"Lightning.AttemptRun","group":"","title":"Lightning.AttemptRun","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"new/1","title":"new(attrs \\\\ %{})","anchor":"new/1"},{"id":"new/2","title":"new(attempt, run)","anchor":"new/2"}],"key":"functions"}]},{"id":"Lightning.AttemptService","group":"","title":"Lightning.AttemptService","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"append/2","title":"append(attempt, run)","anchor":"append/2"},{"id":"build_attempt/2","title":"build_attempt(work_order, reason)","anchor":"build_attempt/2"},{"id":"calculate_runs/3","title":"calculate_runs(workflow, existing_runs, starting_run)","anchor":"calculate_runs/3"},{"id":"create_attempt/3","title":"create_attempt(work_order, job, reason)","anchor":"create_attempt/3"},{"id":"get_for_rerun/2","title":"get_for_rerun(attempt_id, run_id)","anchor":"get_for_rerun/2"},{"id":"get_last_attempt_for/1","title":"get_last_attempt_for(run)","anchor":"get_last_attempt_for/1"},{"id":"get_workflow_for/1","title":"get_workflow_for(attempt)","anchor":"get_workflow_for/1"},{"id":"list_for_rerun_from_job/2","title":"list_for_rerun_from_job(order_ids, job_id)","anchor":"list_for_rerun_from_job/2"},{"id":"list_for_rerun_from_start/1","title":"list_for_rerun_from_start(order_ids)","anchor":"list_for_rerun_from_start/1"},{"id":"retry/3","title":"retry(attempt, run, reason)","anchor":"retry/3"},{"id":"retry_many/2","title":"retry_many(attempt_runs, reasons)","anchor":"retry_many/2"}],"key":"functions"}]},{"id":"Lightning.Auditing","group":"","title":"Lightning.Auditing","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"list_all/1","title":"list_all(params \\\\ %{})","anchor":"list_all/1"}],"key":"functions"}]},{"id":"Lightning.Auditing.Model","group":"","title":"Lightning.Auditing.Model","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"event/5","title":"event(schema, event, row_id, actor_id, metadata \\\\ %{})","anchor":"event/5"},{"id":"save/2","title":"save(changes, repo)","anchor":"save/2"}],"key":"functions"}]},{"id":"Lightning.AuthProviders","group":"","title":"Lightning.AuthProviders","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"build_handler/2","title":"build_handler(name, opts)","anchor":"build_handler/2"},{"id":"create/1","title":"create(attrs)","anchor":"create/1"},{"id":"create_handler/1","title":"create_handler(config)","anchor":"create_handler/1"},{"id":"delete!/1","title":"delete!(model)","anchor":"delete!/1"},{"id":"get_authorize_url/1","title":"get_authorize_url(name)","anchor":"get_authorize_url/1"},{"id":"get_existing/0","title":"get_existing()","anchor":"get_existing/0"},{"id":"get_existing/1","title":"get_existing(name)","anchor":"get_existing/1"},{"id":"get_handler/1","title":"get_handler(name)","anchor":"get_handler/1"},{"id":"get_handlers/0","title":"get_handlers()","anchor":"get_handlers/0"},{"id":"new/0","title":"new()","anchor":"new/0"},{"id":"remove_handler/1","title":"remove_handler(name)","anchor":"remove_handler/1"},{"id":"update/2","title":"update(model, attrs)","anchor":"update/2"}],"key":"functions"}]},{"id":"Lightning.AuthProviders.AuthConfig","group":"","title":"Lightning.AuthProviders.AuthConfig","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"}]},{"id":"Lightning.AuthProviders.CacheWarmer","group":"","title":"Lightning.AuthProviders.CacheWarmer","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"execute/1","title":"execute(state)","anchor":"execute/1"},{"id":"interval/0","title":"interval()","anchor":"interval/0"}],"key":"functions"}]},{"id":"Lightning.AuthProviders.Google","group":"","title":"Lightning.AuthProviders.Google","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"authorize_url/2","title":"authorize_url(client, state)","anchor":"authorize_url/2"},{"id":"build_client/1","title":"build_client(opts \\\\ [])","anchor":"build_client/1"},{"id":"get_config/0","title":"get_config()","anchor":"get_config/0"},{"id":"get_token/2","title":"get_token(client, params)","anchor":"get_token/2"},{"id":"get_userinfo/2","title":"get_userinfo(client, token)","anchor":"get_userinfo/2"},{"id":"get_wellknown/0","title":"get_wellknown()","anchor":"get_wellknown/0"},{"id":"get_wellknown!/0","title":"get_wellknown!()","anchor":"get_wellknown!/0"},{"id":"refresh_token/2","title":"refresh_token(client, token)","anchor":"refresh_token/2"}],"key":"functions"}]},{"id":"Lightning.AuthProviders.Handler","group":"","title":"Lightning.AuthProviders.Handler","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"opts/0","title":"opts()","anchor":"t:opts/0"},{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"authorize_url/1","title":"authorize_url(handler)","anchor":"authorize_url/1"},{"id":"from_model/1","title":"from_model(model)","anchor":"from_model/1"},{"id":"get_token/2","title":"get_token(handler, code)","anchor":"get_token/2"},{"id":"get_userinfo/2","title":"get_userinfo(handler, token)","anchor":"get_userinfo/2"},{"id":"new/2","title":"new(name, opts)","anchor":"new/2"}],"key":"functions"}]},{"id":"Lightning.AuthProviders.Store","group":"","title":"Lightning.AuthProviders.Store","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"finder/0","title":"finder()","anchor":"t:finder/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"get_handler/2","title":"get_handler(name, finder \\\\ &default/1)","anchor":"get_handler/2"},{"id":"get_handlers/0","title":"get_handlers()","anchor":"get_handlers/0"},{"id":"put_handler/2","title":"put_handler(name, handler)","anchor":"put_handler/2"},{"id":"remove_handler/1","title":"remove_handler(name)","anchor":"remove_handler/1"}],"key":"functions"}]},{"id":"Lightning.AuthProviders.WellKnown","group":"","title":"Lightning.AuthProviders.WellKnown","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"body/0","title":"body()","anchor":"t:body/0"},{"id":"headers/0","title":"headers()","anchor":"t:headers/0"},{"id":"method/0","title":"method()","anchor":"t:method/0"},{"id":"options/0","title":"options()","anchor":"t:options/0"},{"id":"params/0","title":"params()","anchor":"t:params/0"},{"id":"request/0","title":"request()","anchor":"t:request/0"},{"id":"t/0","title":"t()","anchor":"t:t/0"},{"id":"url/0","title":"url()","anchor":"t:url/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"delete/3","title":"delete(url, headers \\\\ [], options \\\\ [])","anchor":"delete/3"},{"id":"delete!/3","title":"delete!(url, headers \\\\ [], options \\\\ [])","anchor":"delete!/3"},{"id":"fetch/1","title":"fetch(discovery_url)","anchor":"fetch/1"},{"id":"fetch!/1","title":"fetch!(discovery_url)","anchor":"fetch!/1"},{"id":"get/3","title":"get(url, headers \\\\ [], options \\\\ [])","anchor":"get/3"},{"id":"get!/3","title":"get!(url, headers \\\\ [], options \\\\ [])","anchor":"get!/3"},{"id":"head/3","title":"head(url, headers \\\\ [], options \\\\ [])","anchor":"head/3"},{"id":"head!/3","title":"head!(url, headers \\\\ [], options \\\\ [])","anchor":"head!/3"},{"id":"new/1","title":"new(json_body)","anchor":"new/1"},{"id":"options/3","title":"options(url, headers \\\\ [], options \\\\ [])","anchor":"options/3"},{"id":"options!/3","title":"options!(url, headers \\\\ [], options \\\\ [])","anchor":"options!/3"},{"id":"patch/4","title":"patch(url, body, headers \\\\ [], options \\\\ [])","anchor":"patch/4"},{"id":"patch!/4","title":"patch!(url, body, headers \\\\ [], options \\\\ [])","anchor":"patch!/4"},{"id":"post/4","title":"post(url, body, headers \\\\ [], options \\\\ [])","anchor":"post/4"},{"id":"post!/4","title":"post!(url, body, headers \\\\ [], options \\\\ [])","anchor":"post!/4"},{"id":"process_headers/1","title":"process_headers(headers)","anchor":"process_headers/1"},{"id":"process_request_body/1","title":"process_request_body(body)","anchor":"process_request_body/1"},{"id":"process_request_headers/1","title":"process_request_headers(headers)","anchor":"process_request_headers/1"},{"id":"process_request_options/1","title":"process_request_options(options)","anchor":"process_request_options/1"},{"id":"process_request_params/1","title":"process_request_params(params)","anchor":"process_request_params/1"},{"id":"process_request_url/1","title":"process_request_url(url)","anchor":"process_request_url/1"},{"id":"process_response/1","title":"process_response(response)","anchor":"process_response/1"},{"id":"process_response_body/1","title":"process_response_body(body)","anchor":"process_response_body/1"},{"id":"process_response_chunk/1","title":"process_response_chunk(chunk)","anchor":"process_response_chunk/1"},{"id":"process_response_headers/1","title":"process_response_headers(headers)","anchor":"process_response_headers/1"},{"id":"process_response_status_code/1","title":"process_response_status_code(status_code)","anchor":"process_response_status_code/1"},{"id":"process_status_code/1","title":"process_status_code(status_code)","anchor":"process_status_code/1"},{"id":"process_url/1","title":"process_url(url)","anchor":"process_url/1"},{"id":"put/4","title":"put(url, body \\\\ \"\", headers \\\\ [], options \\\\ [])","anchor":"put/4"},{"id":"put!/4","title":"put!(url, body \\\\ \"\", headers \\\\ [], options \\\\ [])","anchor":"put!/4"},{"id":"request/1","title":"request(request)","anchor":"request/1"},{"id":"request/5","title":"request(method, url, body \\\\ \"\", headers \\\\ [], options \\\\ [])","anchor":"request/5"},{"id":"request!/5","title":"request!(method, url, body \\\\ \"\", headers \\\\ [], options \\\\ [])","anchor":"request!/5"},{"id":"start/0","title":"start()","anchor":"start/0"},{"id":"stream_next/1","title":"stream_next(resp)","anchor":"stream_next/1"}],"key":"functions"}]},{"id":"Lightning.CLI","group":"","title":"Lightning.CLI","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"execute/1","title":"execute(command)","anchor":"execute/1"},{"id":"metadata/2","title":"metadata(state, adaptor_path)","anchor":"metadata/2"}],"key":"functions"}]},{"id":"Lightning.CLI.Result","group":"","title":"Lightning.CLI.Result","sections":[{"id":"Logs","anchor":"module-logs"}],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"get_messages/1","title":"get_messages(result)","anchor":"get_messages/1"},{"id":"new/1","title":"new(data)","anchor":"new/1"},{"id":"parse/2","title":"parse(result, extra \\\\ [])","anchor":"parse/2"}],"key":"functions"}]},{"id":"Lightning.Demo","group":"","title":"Lightning.Demo","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"reset_demo/0","title":"reset_demo()","anchor":"reset_demo/0"}],"key":"functions"}]},{"id":"Lightning.ExportUtils","group":"","title":"Lightning.ExportUtils","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"build_yaml_tree/2","title":"build_yaml_tree(workflows, project)","anchor":"build_yaml_tree/2"},{"id":"generate_new_yaml/1","title":"generate_new_yaml(project_id)","anchor":"generate_new_yaml/1"}],"key":"functions"}]},{"id":"Lightning.FailureNotifierView","group":"","title":"Lightning.FailureNotifierView","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","title":"__resource__()","anchor":"__resource__/0"},{"id":"failure_alert.html/1","title":"failure_alert.html(assigns)","anchor":"failure_alert.html/1"},{"id":"render/2","title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"template_not_found/2","title":"template_not_found(template, assigns)","anchor":"template_not_found/2"}],"key":"functions"}]},{"id":"Lightning.Helpers","group":"","title":"Lightning.Helpers","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"coerce_json_field/2","title":"coerce_json_field(attrs, field)","anchor":"coerce_json_field/2"},{"id":"indefinite_article/1","title":"indefinite_article(noun)","anchor":"indefinite_article/1"},{"id":"json_safe/1","title":"json_safe(data)","anchor":"json_safe/1"},{"id":"ms_to_human/1","title":"ms_to_human(milliseconds)","anchor":"ms_to_human/1"}],"key":"functions"}]},{"id":"Lightning.MetadataService","group":"","title":"Lightning.MetadataService","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"fetch/2","title":"fetch(adaptor, credential)","anchor":"fetch/2"}],"key":"functions"}]},{"id":"Lightning.Name","group":"","title":"Lightning.Name","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"generate/1","title":"generate(max_id \\\\ 9999)","anchor":"generate/1"}],"key":"functions"}]},{"id":"Lightning.ObanManager","group":"","title":"Lightning.ObanManager","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/4","title":"handle_event(list, measure, meta, pid)","anchor":"handle_event/4"}],"key":"functions"}]},{"id":"Lightning.Policies.Permissions","group":"","title":"Lightning.Policies.Permissions","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"can/4","title":"can(policy, action, user, params \\\\ [])","anchor":"can/4"},{"id":"can?/4","title":"can?(policy, action, user, params \\\\ [])","anchor":"can?/4"}],"key":"functions"}]},{"id":"Lightning.Policies.ProjectUsers","group":"","title":"Lightning.Policies.ProjectUsers","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"actions/0","title":"actions()","anchor":"t:actions/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"authorize/3","title":"authorize(action, user, project)","anchor":"authorize/3"}],"key":"functions"}]},{"id":"Lightning.Policies.Provisioning","group":"","title":"Lightning.Policies.Provisioning","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"actions/0","title":"actions()","anchor":"t:actions/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"authorize/3","title":"authorize(arg1, user, project)","anchor":"authorize/3"}],"key":"functions"}]},{"id":"Lightning.Policies.Users","group":"","title":"Lightning.Policies.Users","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"actions/0","title":"actions()","anchor":"t:actions/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"authorize/3","title":"authorize(action, authenticated_user, account_user)","anchor":"authorize/3"}],"key":"functions"}]},{"id":"Lightning.Release","group":"","title":"Lightning.Release","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create_db/0","title":"create_db()","anchor":"create_db/0"},{"id":"load_app/0","title":"load_app()","anchor":"load_app/0"},{"id":"migrate/0","title":"migrate()","anchor":"migrate/0"},{"id":"rollback/2","title":"rollback(repo, version)","anchor":"rollback/2"}],"key":"functions"}]},{"id":"Lightning.Repo","group":"","title":"Lightning.Repo","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"aggregate/3","title":"aggregate(queryable, aggregate, opts \\\\ [])","anchor":"aggregate/3"},{"id":"aggregate/4","title":"aggregate(queryable, aggregate, field, opts)","anchor":"aggregate/4"},{"id":"all/2","title":"all(queryable, opts \\\\ [])","anchor":"all/2"},{"id":"checked_out?/0","title":"checked_out?()","anchor":"checked_out?/0"},{"id":"checkout/2","title":"checkout(fun, opts \\\\ [])","anchor":"checkout/2"},{"id":"child_spec/1","title":"child_spec(opts)","anchor":"child_spec/1"},{"id":"config/0","title":"config()","anchor":"config/0"},{"id":"default_options/1","title":"default_options(operation)","anchor":"default_options/1"},{"id":"delete/2","title":"delete(struct, opts \\\\ [])","anchor":"delete/2"},{"id":"delete!/2","title":"delete!(struct, opts \\\\ [])","anchor":"delete!/2"},{"id":"delete_all/2","title":"delete_all(queryable, opts \\\\ [])","anchor":"delete_all/2"},{"id":"disconnect_all/2","title":"disconnect_all(interval, opts \\\\ [])","anchor":"disconnect_all/2"},{"id":"exists?/2","title":"exists?(queryable, opts \\\\ [])","anchor":"exists?/2"},{"id":"explain/3","title":"explain(operation, queryable, opts \\\\ [])","anchor":"explain/3"},{"id":"get/3","title":"get(queryable, id, opts \\\\ [])","anchor":"get/3"},{"id":"get!/3","title":"get!(queryable, id, opts \\\\ [])","anchor":"get!/3"},{"id":"get_by/3","title":"get_by(queryable, clauses, opts \\\\ [])","anchor":"get_by/3"},{"id":"get_by!/3","title":"get_by!(queryable, clauses, opts \\\\ [])","anchor":"get_by!/3"},{"id":"get_dynamic_repo/0","title":"get_dynamic_repo()","anchor":"get_dynamic_repo/0"},{"id":"in_transaction?/0","title":"in_transaction?()","anchor":"in_transaction?/0"},{"id":"insert/2","title":"insert(struct, opts \\\\ [])","anchor":"insert/2"},{"id":"insert!/2","title":"insert!(struct, opts \\\\ [])","anchor":"insert!/2"},{"id":"insert_all/3","title":"insert_all(schema_or_source, entries, opts \\\\ [])","anchor":"insert_all/3"},{"id":"insert_or_update/2","title":"insert_or_update(changeset, opts \\\\ [])","anchor":"insert_or_update/2"},{"id":"insert_or_update!/2","title":"insert_or_update!(changeset, opts \\\\ [])","anchor":"insert_or_update!/2"},{"id":"load/2","title":"load(schema_or_types, data)","anchor":"load/2"},{"id":"one/2","title":"one(queryable, opts \\\\ [])","anchor":"one/2"},{"id":"one!/2","title":"one!(queryable, opts \\\\ [])","anchor":"one!/2"},{"id":"paginate/2","title":"paginate(pageable, options \\\\ [])","anchor":"paginate/2"},{"id":"preload/3","title":"preload(struct_or_structs_or_nil, preloads, opts \\\\ [])","anchor":"preload/3"},{"id":"prepare_query/3","title":"prepare_query(operation, query, opts)","anchor":"prepare_query/3"},{"id":"put_dynamic_repo/1","title":"put_dynamic_repo(dynamic)","anchor":"put_dynamic_repo/1"},{"id":"query/3","title":"query(sql, params \\\\ [], opts \\\\ [])","anchor":"query/3"},{"id":"query!/3","title":"query!(sql, params \\\\ [], opts \\\\ [])","anchor":"query!/3"},{"id":"query_many/3","title":"query_many(sql, params \\\\ [], opts \\\\ [])","anchor":"query_many/3"},{"id":"query_many!/3","title":"query_many!(sql, params \\\\ [], opts \\\\ [])","anchor":"query_many!/3"},{"id":"reload/2","title":"reload(queryable, opts \\\\ [])","anchor":"reload/2"},{"id":"reload!/2","title":"reload!(queryable, opts \\\\ [])","anchor":"reload!/2"},{"id":"rollback/1","title":"rollback(value)","anchor":"rollback/1"},{"id":"scrivener_defaults/0","title":"scrivener_defaults()","anchor":"scrivener_defaults/0"},{"id":"start_link/1","title":"start_link(opts \\\\ [])","anchor":"start_link/1"},{"id":"stop/1","title":"stop(timeout \\\\ 5000)","anchor":"stop/1"},{"id":"stream/2","title":"stream(queryable, opts \\\\ [])","anchor":"stream/2"},{"id":"to_sql/2","title":"to_sql(operation, queryable)","anchor":"to_sql/2"},{"id":"transaction/2","title":"transaction(fun_or_multi, opts \\\\ [])","anchor":"transaction/2"},{"id":"update/2","title":"update(struct, opts \\\\ [])","anchor":"update/2"},{"id":"update!/2","title":"update!(struct, opts \\\\ [])","anchor":"update!/2"},{"id":"update_all/3","title":"update_all(queryable, updates, opts \\\\ [])","anchor":"update_all/3"}],"key":"functions"}]},{"id":"Lightning.RunSearchForm","group":"","title":"Lightning.RunSearchForm","sections":[]},{"id":"Lightning.SafetyString","group":"","title":"Lightning.SafetyString","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"decode/1","title":"decode(data)","anchor":"decode/1"},{"id":"encode/1","title":"encode(data)","anchor":"encode/1"}],"key":"functions"}]},{"id":"Lightning.Scrubber","group":"","title":"Lightning.Scrubber","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","title":"child_spec(arg)","anchor":"child_spec/1"},{"id":"encode_samples/1","title":"encode_samples(samples)","anchor":"encode_samples/1"},{"id":"samples/1","title":"samples(agent)","anchor":"samples/1"},{"id":"scrub/2","title":"scrub(agent, lines)","anchor":"scrub/2"},{"id":"start_link/1","title":"start_link(opts)","anchor":"start_link/1"}],"key":"functions"}]},{"id":"Lightning.SetupUtils","group":"","title":"Lightning.SetupUtils","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"add_and_update_runs/3","title":"add_and_update_runs(multi, run_params, output_dataclip_id)","anchor":"add_and_update_runs/3"},{"id":"create_dhis2_project/1","title":"create_dhis2_project(project_users)","anchor":"create_dhis2_project/1"},{"id":"create_openhie_project/1","title":"create_openhie_project(project_users)","anchor":"create_openhie_project/1"},{"id":"create_starter_project/2","title":"create_starter_project(name, project_users)","anchor":"create_starter_project/2"},{"id":"setup_demo/1","title":"setup_demo(opts \\\\ [create_super: false])","anchor":"setup_demo/1"},{"id":"tear_down/1","title":"tear_down(opts \\\\ [destroy_super: false])","anchor":"tear_down/1"}],"key":"functions"}]},{"id":"Lightning.TaskWorker","group":"","title":"Lightning.TaskWorker","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"get_status/1","title":"get_status(worker)","anchor":"get_status/1"},{"id":"start_link/1","title":"start_link(opts \\\\ [name: nil])","anchor":"start_link/1"},{"id":"start_task/2","title":"start_task(worker, fun)","anchor":"start_task/2"}],"key":"functions"}]},{"id":"Lightning.Validators","group":"","title":"Lightning.Validators","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"validate_exclusive/3","title":"validate_exclusive(changeset, fields, message)","anchor":"validate_exclusive/3"},{"id":"validate_one_required/3","title":"validate_one_required(changeset, fields, message)","anchor":"validate_one_required/3"}],"key":"functions"}]},{"id":"Lightning.Vault","group":"","title":"Lightning.Vault","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"start_link/1","title":"start_link(config \\\\ [])","anchor":"start_link/1"}],"key":"functions"}]},{"id":"Lightning.VersionControl","group":"","title":"Lightning.VersionControl","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"add_github_installation_id/2","title":"add_github_installation_id(user_id, installation_id)","anchor":"add_github_installation_id/2"},{"id":"add_github_repo_and_branch/3","title":"add_github_repo_and_branch(project_id, repo, branch)","anchor":"add_github_repo_and_branch/3"},{"id":"create_github_connection/1","title":"create_github_connection(attrs)","anchor":"create_github_connection/1"},{"id":"fetch_installation_repos/1","title":"fetch_installation_repos(project_id)","anchor":"fetch_installation_repos/1"},{"id":"fetch_repo_branches/2","title":"fetch_repo_branches(project_id, repo_name)","anchor":"fetch_repo_branches/2"},{"id":"get_repo_connection/1","title":"get_repo_connection(project_id)","anchor":"get_repo_connection/1"},{"id":"github_enabled?/0","title":"github_enabled?()","anchor":"github_enabled?/0"},{"id":"remove_github_connection/1","title":"remove_github_connection(project_id)","anchor":"remove_github_connection/1"},{"id":"run_sync/2","title":"run_sync(project_id, user_name)","anchor":"run_sync/2"}],"key":"functions"}]},{"id":"Lightning.VersionControl.GithubClient","group":"","title":"Lightning.VersionControl.GithubClient","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"option/0","title":"option()","anchor":"t:option/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"delete/3","title":"delete(client, url, opts)","anchor":"delete/3"},{"id":"delete!/3","title":"delete!(client, url, opts)","anchor":"delete!/3"},{"id":"fire_repository_dispatch/3","title":"fire_repository_dispatch(installation_id, repo_name, user_name)","anchor":"fire_repository_dispatch/3"},{"id":"get/3","title":"get(client, url, opts)","anchor":"get/3"},{"id":"get!/3","title":"get!(client, url, opts)","anchor":"get!/3"},{"id":"get_repo_branches/2","title":"get_repo_branches(installation_id, repo_name)","anchor":"get_repo_branches/2"},{"id":"head/3","title":"head(client, url, opts)","anchor":"head/3"},{"id":"head!/3","title":"head!(client, url, opts)","anchor":"head!/3"},{"id":"installation_repos/1","title":"installation_repos(installation_id)","anchor":"installation_repos/1"},{"id":"options/3","title":"options(client, url, opts)","anchor":"options/3"},{"id":"options!/3","title":"options!(client, url, opts)","anchor":"options!/3"},{"id":"patch/4","title":"patch(client, url, body, opts)","anchor":"patch/4"},{"id":"patch!/4","title":"patch!(client, url, body, opts)","anchor":"patch!/4"},{"id":"post/4","title":"post(client, url, body, opts)","anchor":"post/4"},{"id":"post!/4","title":"post!(client, url, body, opts)","anchor":"post!/4"},{"id":"put/4","title":"put(client, url, body, opts)","anchor":"put/4"},{"id":"put!/4","title":"put!(client, url, body, opts)","anchor":"put!/4"},{"id":"request/2","title":"request(client \\\\ %Tesla.Client{}, options)","anchor":"request/2"},{"id":"request!/2","title":"request!(client \\\\ %Tesla.Client{}, options)","anchor":"request!/2"},{"id":"trace/3","title":"trace(client, url, opts)","anchor":"trace/3"},{"id":"trace!/3","title":"trace!(client, url, opts)","anchor":"trace!/3"}],"key":"functions"}]},{"id":"Lightning.VersionControl.GithubToken","group":"","title":"Lightning.VersionControl.GithubToken","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"build/2","title":"build(cert, app_id)","anchor":"build/2"},{"id":"generate_and_sign/2","title":"generate_and_sign(extra_claims \\\\ %{}, key \\\\ __default_signer__())","anchor":"generate_and_sign/2"},{"id":"generate_and_sign!/2","title":"generate_and_sign!(extra_claims \\\\ %{}, key \\\\ __default_signer__())","anchor":"generate_and_sign!/2"},{"id":"verify_and_validate/3","title":"verify_and_validate(bearer_token, key \\\\ __default_signer__(), context \\\\ %{})","anchor":"verify_and_validate/3"},{"id":"verify_and_validate!/3","title":"verify_and_validate!(bearer_token, key \\\\ __default_signer__(), context \\\\ %{})","anchor":"verify_and_validate!/3"}],"key":"functions"}]},{"id":"Lightning.VersionControl.ProjectRepo","group":"","title":"Lightning.VersionControl.ProjectRepo","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"changeset/2","title":"changeset(project_repo, attrs)","anchor":"changeset/2"}],"key":"functions"}]},{"id":"Lightning.WorkOrder","group":"","title":"Lightning.WorkOrder","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"new/0","title":"new()","anchor":"new/0"}],"key":"functions"}]},{"id":"Lightning.WorkOrderService","group":"","title":"Lightning.WorkOrderService","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"attempt_updated/1","title":"attempt_updated(run)","anchor":"attempt_updated/1"},{"id":"build/2","title":"build(workflow, reason)","anchor":"build/2"},{"id":"create_manual_workorder/3","title":"create_manual_workorder(job, dataclip, user)","anchor":"create_manual_workorder/3"},{"id":"create_webhook_workorder/2","title":"create_webhook_workorder(edge, dataclip_body)","anchor":"create_webhook_workorder/2"},{"id":"create_work_order/1","title":"create_work_order(attrs \\\\ %{})","anchor":"create_work_order/1"},{"id":"multi_for/3","title":"multi_for(type, edge, dataclip_body)","anchor":"multi_for/3"},{"id":"multi_for_manual/3","title":"multi_for_manual(job, dataclip, user)","anchor":"multi_for_manual/3"},{"id":"retry_attempt_run/2","title":"retry_attempt_run(attempt_run, user)","anchor":"retry_attempt_run/2"},{"id":"retry_attempt_runs/2","title":"retry_attempt_runs(attempt_runs, user)","anchor":"retry_attempt_runs/2"},{"id":"subscribe/1","title":"subscribe(project_id)","anchor":"subscribe/1"}],"key":"functions"}]},{"id":"Lightning.Workflows","group":"","title":"Lightning.Workflows","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"build_trigger/1","title":"build_trigger(attrs)","anchor":"build_trigger/1"},{"id":"change_workflow/2","title":"change_workflow(workflow, attrs \\\\ %{})","anchor":"change_workflow/2"},{"id":"create_edge/1","title":"create_edge(attrs)","anchor":"create_edge/1"},{"id":"create_workflow/1","title":"create_workflow(attrs \\\\ %{})","anchor":"create_workflow/1"},{"id":"delete_workflow/1","title":"delete_workflow(workflow)","anchor":"delete_workflow/1"},{"id":"get_edge_by_webhook/1","title":"get_edge_by_webhook(path)","anchor":"get_edge_by_webhook/1"},{"id":"get_edges_for_cron_execution/1","title":"get_edges_for_cron_execution(datetime)","anchor":"get_edges_for_cron_execution/1"},{"id":"get_workflow/1","title":"get_workflow(id)","anchor":"get_workflow/1"},{"id":"get_workflow!/1","title":"get_workflow!(id)","anchor":"get_workflow!/1"},{"id":"get_workflows_for/1","title":"get_workflows_for(project)","anchor":"get_workflows_for/1"},{"id":"get_workflows_for_query/1","title":"get_workflows_for_query(project)","anchor":"get_workflows_for_query/1"},{"id":"list_workflows/0","title":"list_workflows()","anchor":"list_workflows/0"},{"id":"mark_for_deletion/2","title":"mark_for_deletion(workflow, attrs \\\\ %{})","anchor":"mark_for_deletion/2"},{"id":"to_project_space/1","title":"to_project_space(workflows)","anchor":"to_project_space/1"},{"id":"update_trigger/2","title":"update_trigger(trigger, attrs)","anchor":"update_trigger/2"},{"id":"update_workflow/2","title":"update_workflow(workflow, attrs)","anchor":"update_workflow/2"}],"key":"functions"}]},{"id":"Lightning.Workflows.Edge","group":"","title":"Lightning.Workflows.Edge","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"edge_condition/0","title":"edge_condition()","anchor":"t:edge_condition/0"},{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"changeset/2","title":"changeset(edge, attrs)","anchor":"changeset/2"},{"id":"new/1","title":"new(attrs)","anchor":"new/1"},{"id":"validate/1","title":"validate(changeset)","anchor":"validate/1"}],"key":"functions"}]},{"id":"Lightning.Workflows.Graph","group":"","title":"Lightning.Workflows.Graph","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"},{"id":"vertex/0","title":"vertex()","anchor":"t:vertex/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"new/1","title":"new(workflow)","anchor":"new/1"},{"id":"remove/2","title":"remove(graph, job_id)","anchor":"remove/2"},{"id":"vertices/1","title":"vertices(graph)","anchor":"vertices/1"}],"key":"functions"}]},{"id":"Lightning.Workflows.Workflow","group":"","title":"Lightning.Workflows.Workflow","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"request_deletion_changeset/2","title":"request_deletion_changeset(workflow, attrs)","anchor":"request_deletion_changeset/2"},{"id":"validate/1","title":"validate(changeset)","anchor":"validate/1"}],"key":"functions"}]},{"id":"Lightning.Workorders.SearchParams","group":"","title":"Lightning.Workorders.SearchParams","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"new/1","title":"new(params)","anchor":"new/1"},{"id":"to_uri_params/1","title":"to_uri_params(search_params)","anchor":"to_uri_params/1"}],"key":"functions"}]},{"id":"LightningWeb","group":"","title":"LightningWeb","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__using__/1","title":"__using__(which)","anchor":"__using__/1"},{"id":"channel/0","title":"channel()","anchor":"channel/0"},{"id":"component/0","title":"component()","anchor":"component/0"},{"id":"controller/0","title":"controller()","anchor":"controller/0"},{"id":"html/0","title":"html()","anchor":"html/0"},{"id":"live_component/0","title":"live_component()","anchor":"live_component/0"},{"id":"live_view/1","title":"live_view(opts \\\\ [])","anchor":"live_view/1"},{"id":"router/0","title":"router()","anchor":"router/0"},{"id":"static_paths/0","title":"static_paths()","anchor":"static_paths/0"},{"id":"verified_routes/0","title":"verified_routes()","anchor":"verified_routes/0"},{"id":"view/0","title":"view()","anchor":"view/0"}],"key":"functions"}]},{"id":"LightningWeb.API.Helpers","group":"","title":"LightningWeb.API.Helpers","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"pagination_link/3","title":"pagination_link(conn, page, atom)","anchor":"pagination_link/3"},{"id":"pagination_links/2","title":"pagination_links(conn, page)","anchor":"pagination_links/2"},{"id":"url_for/2","title":"url_for(conn, params \\\\ %{})","anchor":"url_for/2"}],"key":"functions"}]},{"id":"LightningWeb.API.JobController","group":"","title":"LightningWeb.API.JobController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"index/2","title":"index(conn, params)","anchor":"index/2"},{"id":"show/2","title":"show(conn, map)","anchor":"show/2"}],"key":"functions"}]},{"id":"LightningWeb.API.ProjectController","group":"","title":"LightningWeb.API.ProjectController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"index/2","title":"index(conn, params)","anchor":"index/2"},{"id":"show/2","title":"show(conn, map)","anchor":"show/2"}],"key":"functions"}]},{"id":"LightningWeb.API.ProvisioningController","group":"","title":"LightningWeb.API.ProvisioningController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create/2","title":"create(conn, params)","anchor":"create/2"},{"id":"show/2","title":"show(conn, params)","anchor":"show/2"},{"id":"show_yaml/2","title":"show_yaml(conn, map)","anchor":"show_yaml/2"}],"key":"functions"}]},{"id":"LightningWeb.API.RunController","group":"","title":"LightningWeb.API.RunController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"index/2","title":"index(conn, params)","anchor":"index/2"},{"id":"show/2","title":"show(conn, map)","anchor":"show/2"}],"key":"functions"}]},{"id":"LightningWeb.AuditLive.Index","group":"","title":"LightningWeb.AuditLive.Index","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"diff/1","title":"diff(assigns)","anchor":"diff/1"},{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.AuthProvidersLive.FormComponent","group":"","title":"LightningWeb.AuthProvidersLive.FormComponent","sections":[]},{"id":"LightningWeb.AuthProvidersLive.Index","group":"","title":"LightningWeb.AuthProvidersLive.Index","sections":[]},{"id":"LightningWeb.BackupCodesController","group":"","title":"LightningWeb.BackupCodesController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"print/2","title":"print(conn, params)","anchor":"print/2"}],"key":"functions"}]},{"id":"LightningWeb.BackupCodesLive.Index","group":"","title":"LightningWeb.BackupCodesLive.Index","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.ChangesetJSON","group":"","title":"LightningWeb.ChangesetJSON","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"error/1","title":"error(map)","anchor":"error/1"}],"key":"functions"}]},{"id":"LightningWeb.ChangesetView","group":"","title":"LightningWeb.ChangesetView","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","title":"__resource__()","anchor":"__resource__/0"},{"id":"render/2","title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"template_not_found/2","title":"template_not_found(template, assigns)","anchor":"template_not_found/2"},{"id":"translate_errors/1","title":"translate_errors(changeset)","anchor":"translate_errors/1"}],"key":"functions"}]},{"id":"LightningWeb.Components.Modal","group":"","title":"LightningWeb.Components.Modal","sections":[]},{"id":"LightningWeb.CredentialLive.Edit","group":"","title":"LightningWeb.CredentialLive.Edit","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_info/2","title":"handle_info(arg, socket)","anchor":"handle_info/2"}],"key":"functions"}]},{"id":"LightningWeb.CredentialLive.FormComponent","group":"","title":"LightningWeb.CredentialLive.FormComponent","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"credential_transfer/1","title":"credential_transfer(assigns)","anchor":"credential_transfer/1"},{"id":"form_component/1","title":"form_component(assigns)","anchor":"form_component/1"},{"id":"project_credentials/1","title":"project_credentials(assigns)","anchor":"project_credentials/1"}],"key":"functions"}]},{"id":"LightningWeb.CredentialLive.GoogleSheetsComponent","group":"","title":"LightningWeb.CredentialLive.GoogleSheetsComponent","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"authorize_button/1","title":"authorize_button(assigns)","anchor":"authorize_button/1"},{"id":"disabled_authorize_button/1","title":"disabled_authorize_button(assigns)","anchor":"disabled_authorize_button/1"},{"id":"error_block/1","title":"error_block(assigns)","anchor":"error_block/1"},{"id":"fieldset/1","title":"fieldset(assigns)","anchor":"fieldset/1"},{"id":"userinfo/1","title":"userinfo(assigns)","anchor":"userinfo/1"}],"key":"functions"}]},{"id":"LightningWeb.CredentialLive.Index","group":"","title":"LightningWeb.CredentialLive.Index","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.CredentialLive.JsonSchemaBodyComponent","group":"","title":"LightningWeb.CredentialLive.JsonSchemaBodyComponent","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"fieldset/1","title":"fieldset(assigns)","anchor":"fieldset/1"},{"id":"schema_input/1","title":"schema_input(assigns)","anchor":"schema_input/1"}],"key":"functions"}]},{"id":"LightningWeb.CredentialLive.RawBodyComponent","group":"","title":"LightningWeb.CredentialLive.RawBodyComponent","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"fieldset/1","title":"fieldset(assigns)","anchor":"fieldset/1"}],"key":"functions"}]},{"id":"LightningWeb.CredentialLive.TypePicker","group":"","title":"LightningWeb.CredentialLive.TypePicker","sections":[]},{"id":"LightningWeb.DataclipLive.Edit","group":"","title":"LightningWeb.DataclipLive.Edit","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.DataclipLive.FormComponent","group":"","title":"LightningWeb.DataclipLive.FormComponent","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.DataclipLive.Index","group":"","title":"LightningWeb.DataclipLive.Index","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.DownloadsController","group":"","title":"LightningWeb.DownloadsController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"download_project_yaml/2","title":"download_project_yaml(conn, map)","anchor":"download_project_yaml/2"}],"key":"functions"}]},{"id":"LightningWeb.Endpoint","group":"","title":"LightningWeb.Endpoint","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"broadcast/3","title":"broadcast(topic, event, msg)","anchor":"broadcast/3"},{"id":"broadcast!/3","title":"broadcast!(topic, event, msg)","anchor":"broadcast!/3"},{"id":"broadcast_from/4","title":"broadcast_from(from, topic, event, msg)","anchor":"broadcast_from/4"},{"id":"broadcast_from!/4","title":"broadcast_from!(from, topic, event, msg)","anchor":"broadcast_from!/4"},{"id":"call/2","title":"call(conn, opts)","anchor":"call/2"},{"id":"child_spec/1","title":"child_spec(opts)","anchor":"child_spec/1"},{"id":"config/2","title":"config(key, default \\\\ nil)","anchor":"config/2"},{"id":"config_change/2","title":"config_change(changed, removed)","anchor":"config_change/2"},{"id":"host/0","title":"host()","anchor":"host/0"},{"id":"init/1","title":"init(opts)","anchor":"init/1"},{"id":"local_broadcast/3","title":"local_broadcast(topic, event, msg)","anchor":"local_broadcast/3"},{"id":"local_broadcast_from/4","title":"local_broadcast_from(from, topic, event, msg)","anchor":"local_broadcast_from/4"},{"id":"path/1","title":"path(path)","anchor":"path/1"},{"id":"script_name/0","title":"script_name()","anchor":"script_name/0"},{"id":"start_link/1","title":"start_link(opts \\\\ [])","anchor":"start_link/1"},{"id":"static_integrity/1","title":"static_integrity(path)","anchor":"static_integrity/1"},{"id":"static_lookup/1","title":"static_lookup(path)","anchor":"static_lookup/1"},{"id":"static_path/1","title":"static_path(path)","anchor":"static_path/1"},{"id":"static_url/0","title":"static_url()","anchor":"static_url/0"},{"id":"struct_url/0","title":"struct_url()","anchor":"struct_url/0"},{"id":"subscribe/2","title":"subscribe(topic, opts \\\\ [])","anchor":"subscribe/2"},{"id":"unsubscribe/1","title":"unsubscribe(topic)","anchor":"unsubscribe/1"},{"id":"url/0","title":"url()","anchor":"url/0"}],"key":"functions"}]},{"id":"LightningWeb.ErrorView","group":"","title":"LightningWeb.ErrorView","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","title":"__resource__()","anchor":"__resource__/0"},{"id":"render/2","title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"template_not_found/2","title":"template_not_found(template, assigns)","anchor":"template_not_found/2"}],"key":"functions"}]},{"id":"LightningWeb.FallbackController","group":"","title":"LightningWeb.FallbackController","sections":[]},{"id":"LightningWeb.FirstSetupLive.Superuser","group":"","title":"LightningWeb.FirstSetupLive.Superuser","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.FormHelpers","group":"","title":"LightningWeb.FormHelpers","sections":[]},{"id":"LightningWeb.Gettext","group":"","title":"LightningWeb.Gettext","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"dgettext/3","title":"dgettext(domain, msgid, bindings \\\\ Macro.escape(%{}))","anchor":"dgettext/3"},{"id":"dgettext_noop/2","title":"dgettext_noop(domain, msgid)","anchor":"dgettext_noop/2"},{"id":"dngettext/5","title":"dngettext(domain, msgid, msgid_plural, n, bindings \\\\ Macro.escape(%{}))","anchor":"dngettext/5"},{"id":"dngettext_noop/3","title":"dngettext_noop(domain, msgid, msgid_plural)","anchor":"dngettext_noop/3"},{"id":"dpgettext/4","title":"dpgettext(domain, msgctxt, msgid, bindings \\\\ Macro.escape(%{}))","anchor":"dpgettext/4"},{"id":"dpgettext_noop/3","title":"dpgettext_noop(domain, msgctxt, msgid)","anchor":"dpgettext_noop/3"},{"id":"dpngettext/6","title":"dpngettext(domain, msgctxt, msgid, msgid_plural, n, bindings \\\\ Macro.escape(%{}))","anchor":"dpngettext/6"},{"id":"dpngettext_noop/4","title":"dpngettext_noop(domain, msgctxt, msgid, msgid_plural)","anchor":"dpngettext_noop/4"},{"id":"gettext/2","title":"gettext(msgid, bindings \\\\ Macro.escape(%{}))","anchor":"gettext/2"},{"id":"gettext_comment/1","title":"gettext_comment(comment)","anchor":"gettext_comment/1"},{"id":"gettext_noop/1","title":"gettext_noop(msgid)","anchor":"gettext_noop/1"},{"id":"handle_missing_bindings/2","title":"handle_missing_bindings(exception, incomplete)","anchor":"handle_missing_bindings/2"},{"id":"handle_missing_plural_translation/7","title":"handle_missing_plural_translation(locale, domain, msgctxt, msgid, msgid_plural, n, bindings)","anchor":"handle_missing_plural_translation/7"},{"id":"handle_missing_translation/5","title":"handle_missing_translation(locale, domain, msgctxt, msgid, bindings)","anchor":"handle_missing_translation/5"},{"id":"lgettext/5","title":"lgettext(locale, domain, msgctxt \\\\ nil, msgid, bindings)","anchor":"lgettext/5"},{"id":"lngettext/7","title":"lngettext(locale, domain, msgctxt \\\\ nil, msgid, msgid_plural, n, bindings)","anchor":"lngettext/7"},{"id":"ngettext/4","title":"ngettext(msgid, msgid_plural, n, bindings \\\\ Macro.escape(%{}))","anchor":"ngettext/4"},{"id":"ngettext_noop/2","title":"ngettext_noop(msgid, msgid_plural)","anchor":"ngettext_noop/2"},{"id":"pgettext/3","title":"pgettext(msgctxt, msgid, bindings \\\\ Macro.escape(%{}))","anchor":"pgettext/3"},{"id":"pgettext_noop/2","title":"pgettext_noop(msgid, context)","anchor":"pgettext_noop/2"},{"id":"pngettext/5","title":"pngettext(msgctxt, msgid, msgid_plural, n, bindings \\\\ Macro.escape(%{}))","anchor":"pngettext/5"},{"id":"pngettext_noop/3","title":"pngettext_noop(msgctxt, msgid, msgid_plural)","anchor":"pngettext_noop/3"}],"key":"functions"}]},{"id":"LightningWeb.HealthCheck","group":"","title":"LightningWeb.HealthCheck","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","title":"call(conn, opts)","anchor":"call/2"},{"id":"init/1","title":"init(opts)","anchor":"init/1"}],"key":"functions"}]},{"id":"LightningWeb.Hooks","group":"","title":"LightningWeb.Hooks","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"on_mount/4","title":"on_mount(atom, arg2, session, socket)","anchor":"on_mount/4"}],"key":"functions"}]},{"id":"LightningWeb.InitAssigns","group":"","title":"LightningWeb.InitAssigns","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"on_mount/4","title":"on_mount(atom, params, session, socket)","anchor":"on_mount/4"}],"key":"functions"}]},{"id":"LightningWeb.JobLive.AdaptorPicker","group":"","title":"LightningWeb.JobLive.AdaptorPicker","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"display_name_for_adaptor/1","title":"display_name_for_adaptor(name)","anchor":"display_name_for_adaptor/1"},{"id":"get_adaptor_version_options/1","title":"get_adaptor_version_options(adaptor)","anchor":"get_adaptor_version_options/1"},{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.JobLive.CredentialPicker","group":"","title":"LightningWeb.JobLive.CredentialPicker","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.JobLive.CronSetupComponent","group":"","title":"LightningWeb.JobLive.CronSetupComponent","sections":[{"id":"Usage","anchor":"module-usage"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"build_cron_expression/2","title":"build_cron_expression(prev, next)","anchor":"build_cron_expression/2"},{"id":"frequency_field/1","title":"frequency_field(assigns)","anchor":"frequency_field/1"},{"id":"get_cron_data/1","title":"get_cron_data(cron_expression)","anchor":"get_cron_data/1"},{"id":"hour_field/1","title":"hour_field(assigns)","anchor":"hour_field/1"},{"id":"minute_field/1","title":"minute_field(assigns)","anchor":"minute_field/1"},{"id":"monthday_field/1","title":"monthday_field(assigns)","anchor":"monthday_field/1"},{"id":"render/1","title":"render(assigns)","anchor":"render/1"},{"id":"time_field/1","title":"time_field(assigns)","anchor":"time_field/1"},{"id":"weekday_field/1","title":"weekday_field(assigns)","anchor":"weekday_field/1"}],"key":"functions"}]},{"id":"LightningWeb.JobLive.JobBuilder","group":"","title":"LightningWeb.JobLive.JobBuilder","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"delete_title/2","title":"delete_title(is_deletable, can_delete_job)","anchor":"delete_title/2"},{"id":"follow_run/2","title":"follow_run(job_id, attempt_run)","anchor":"follow_run/2"},{"id":"render/1","title":"render(assigns)","anchor":"render/1"},{"id":"send_adaptor/2","title":"send_adaptor(job_id, adaptor)","anchor":"send_adaptor/2"},{"id":"send_credential/2","title":"send_credential(job_id, credential)","anchor":"send_credential/2"},{"id":"update_cron_expression/2","title":"update_cron_expression(job_id, cron_expression)","anchor":"update_cron_expression/2"}],"key":"functions"}]},{"id":"LightningWeb.JobLive.JobBuilderComponents","group":"","title":"LightningWeb.JobLive.JobBuilderComponents","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"job_editor_component/1","title":"job_editor_component(assigns)","anchor":"job_editor_component/1"},{"id":"trigger_picker/1","title":"trigger_picker(assigns)","anchor":"trigger_picker/1"},{"id":"when_invalid/1","title":"when_invalid(assigns)","anchor":"when_invalid/1"}],"key":"functions"}]},{"id":"LightningWeb.JobLive.ManualRunComponent","group":"","title":"LightningWeb.JobLive.ManualRunComponent","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.JobLive.ManualRunComponent.ManualWorkorder","group":"","title":"LightningWeb.JobLive.ManualRunComponent.ManualWorkorder","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","title":"changeset(map, attrs)","anchor":"changeset/2"}],"key":"functions"}]},{"id":"LightningWeb.LiveHelpers","group":"","title":"LightningWeb.LiveHelpers","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"display_short_uuid/1","title":"display_short_uuid(uuid_string)","anchor":"display_short_uuid/1"},{"id":"fade_in/1","title":"fade_in(opts \\\\ [])","anchor":"fade_in/1"},{"id":"fade_out/1","title":"fade_out(opts \\\\ [])","anchor":"fade_out/1"},{"id":"live_error_block/1","title":"live_error_block(assigns)","anchor":"live_error_block/1"},{"id":"live_info_block/1","title":"live_info_block(assigns)","anchor":"live_info_block/1"},{"id":"live_nav_block/1","title":"live_nav_block(assigns)","anchor":"live_nav_block/1"}],"key":"functions"}]},{"id":"LightningWeb.ModalPortal","group":"","title":"LightningWeb.ModalPortal","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"close_modal/0","title":"close_modal()","anchor":"close_modal/0"},{"id":"handle_event/3","title":"handle_event(binary, _, socket)","anchor":"handle_event/3"},{"id":"on_hide/2","title":"on_hide(close_modal_target \\\\ nil, id \\\\ \"modal\")","anchor":"on_hide/2"},{"id":"on_show/2","title":"on_show(js \\\\ %JS{}, id)","anchor":"on_show/2"},{"id":"open_modal/2","title":"open_modal(module, attrs)","anchor":"open_modal/2"},{"id":"render/1","title":"render(assigns)","anchor":"render/1"},{"id":"update/2","title":"update(assigns, socket)","anchor":"update/2"}],"key":"functions"}]},{"id":"LightningWeb.OauthCredentialHelper","group":"","title":"LightningWeb.OauthCredentialHelper","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"broadcast/2","title":"broadcast(subscription_id, msg)","anchor":"broadcast/2"},{"id":"broadcast_forward/3","title":"broadcast_forward(subscription_id, mod, opts)","anchor":"broadcast_forward/3"},{"id":"build_state/3","title":"build_state(subscription_id, mod, component_id)","anchor":"build_state/3"},{"id":"decode_state/1","title":"decode_state(state)","anchor":"decode_state/1"},{"id":"subscribe/1","title":"subscribe(subscription_id)","anchor":"subscribe/1"}],"key":"functions"}]},{"id":"LightningWeb.OidcController","group":"","title":"LightningWeb.OidcController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"new/2","title":"new(conn, map)","anchor":"new/2"},{"id":"show/2","title":"show(conn, map)","anchor":"show/2"}],"key":"functions"}]},{"id":"LightningWeb.PageView","group":"","title":"LightningWeb.PageView","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","title":"__resource__()","anchor":"__resource__/0"},{"id":"render/2","title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"template_not_found/2","title":"template_not_found(template, assigns)","anchor":"template_not_found/2"}],"key":"functions"}]},{"id":"LightningWeb.Pagination","group":"","title":"LightningWeb.Pagination","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"page_link/1","title":"page_link(assigns)","anchor":"page_link/1"},{"id":"pagination_bar/1","title":"pagination_bar(assigns)","anchor":"pagination_bar/1"},{"id":"raw_pagination_links/2","title":"raw_pagination_links(paginator, options \\\\ [])","anchor":"raw_pagination_links/2"}],"key":"functions"}]},{"id":"LightningWeb.Plugs.FirstSetup","group":"","title":"LightningWeb.Plugs.FirstSetup","sections":[]},{"id":"LightningWeb.ProfileLive.Edit","group":"","title":"LightningWeb.ProfileLive.Edit","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.ProfileLive.FormComponent","group":"","title":"LightningWeb.ProfileLive.FormComponent","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.ProfileLive.MfaComponent","group":"","title":"LightningWeb.ProfileLive.MfaComponent","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.ProjectLive.FormComponent","group":"","title":"LightningWeb.ProjectLive.FormComponent","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.ProjectLive.Index","group":"","title":"LightningWeb.ProjectLive.Index","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"delete_action/1","title":"delete_action(assigns)","anchor":"delete_action/1"},{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.ProjectLive.MFARequired","group":"","title":"LightningWeb.ProjectLive.MFARequired","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"on_mount/4","title":"on_mount(atom, params, session, socket)","anchor":"on_mount/4"},{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.ProjectLive.Settings","group":"","title":"LightningWeb.ProjectLive.Settings","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"digest/1","title":"digest(assigns)","anchor":"digest/1"},{"id":"failure_alert/1","title":"failure_alert(assigns)","anchor":"failure_alert/1"},{"id":"render/1","title":"render(assigns)","anchor":"render/1"},{"id":"role/1","title":"role(assigns)","anchor":"role/1"},{"id":"user/1","title":"user(assigns)","anchor":"user/1"}],"key":"functions"}]},{"id":"LightningWeb.ReAuthenticateLive.New","group":"","title":"LightningWeb.ReAuthenticateLive.New","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.RouteHelpers","group":"","title":"LightningWeb.RouteHelpers","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"oidc_callback_url/0","title":"oidc_callback_url()","anchor":"oidc_callback_url/0"},{"id":"show_run_url/2","title":"show_run_url(project_id, run_id)","anchor":"show_run_url/2"}],"key":"functions"}]},{"id":"LightningWeb.Router","group":"","title":"LightningWeb.Router","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"api/2","title":"api(conn, _)","anchor":"api/2"},{"id":"browser/2","title":"browser(conn, _)","anchor":"browser/2"},{"id":"call/2","title":"call(conn, opts)","anchor":"call/2"},{"id":"init/1","title":"init(opts)","anchor":"init/1"},{"id":"storybook_assets/2","title":"storybook_assets(conn, _)","anchor":"storybook_assets/2"},{"id":"storybook_browser/2","title":"storybook_browser(conn, _)","anchor":"storybook_browser/2"}],"key":"functions"}]},{"id":"LightningWeb.RunLive.Index","group":"","title":"LightningWeb.RunLive.Index","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"checked/2","title":"checked(changeset, id)","anchor":"checked/2"},{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.RunLive.RerunJobComponent","group":"","title":"LightningWeb.RunLive.RerunJobComponent","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","title":"handle_event(binary, map, socket)","anchor":"handle_event/3"},{"id":"render/1","title":"render(assigns)","anchor":"render/1"},{"id":"update/2","title":"update(assigns, socket)","anchor":"update/2"}],"key":"functions"}]},{"id":"LightningWeb.RunLive.RunViewerLive","group":"","title":"LightningWeb.RunLive.RunViewerLive","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_info/2","title":"handle_info(broadcast, socket)","anchor":"handle_info/2"}],"key":"functions"}]},{"id":"LightningWeb.RunLive.Show","group":"","title":"LightningWeb.RunLive.Show","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"apply_action/3","title":"apply_action(socket, atom, map)","anchor":"apply_action/3"}],"key":"functions"}]},{"id":"LightningWeb.RunLive.WorkOrderComponent","group":"","title":"LightningWeb.RunLive.WorkOrderComponent","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.Telemetry","group":"","title":"LightningWeb.Telemetry","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"metrics/0","title":"metrics()","anchor":"metrics/0"},{"id":"start_link/1","title":"start_link(arg)","anchor":"start_link/1"}],"key":"functions"}]},{"id":"LightningWeb.TokensLive.Index","group":"","title":"LightningWeb.TokensLive.Index","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.UserAuth","group":"","title":"LightningWeb.UserAuth","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"authenticate_bearer/2","title":"authenticate_bearer(conn, opts)","anchor":"authenticate_bearer/2"},{"id":"fetch_current_user/2","title":"fetch_current_user(conn, opts)","anchor":"fetch_current_user/2"},{"id":"log_in_user/2","title":"log_in_user(conn, user)","anchor":"log_in_user/2"},{"id":"log_out_user/1","title":"log_out_user(conn)","anchor":"log_out_user/1"},{"id":"mark_totp_pending/1","title":"mark_totp_pending(conn)","anchor":"mark_totp_pending/1"},{"id":"new_session/2","title":"new_session(conn, token)","anchor":"new_session/2"},{"id":"on_mount/4","title":"on_mount(atom, params, session, socket)","anchor":"on_mount/4"},{"id":"reauth_sudo_mode/2","title":"reauth_sudo_mode(conn, opts)","anchor":"reauth_sudo_mode/2"},{"id":"redirect_if_user_is_authenticated/2","title":"redirect_if_user_is_authenticated(conn, opts)","anchor":"redirect_if_user_is_authenticated/2"},{"id":"redirect_with_return_to/2","title":"redirect_with_return_to(conn, params \\\\ %{})","anchor":"redirect_with_return_to/2"},{"id":"require_authenticated_user/2","title":"require_authenticated_user(conn, opts)","anchor":"require_authenticated_user/2"},{"id":"require_sudo_user/2","title":"require_sudo_user(conn, opts)","anchor":"require_sudo_user/2"},{"id":"totp_pending?/1","title":"totp_pending?(conn)","anchor":"totp_pending?/1"},{"id":"totp_validated/1","title":"totp_validated(conn)","anchor":"totp_validated/1"}],"key":"functions"}]},{"id":"LightningWeb.UserConfirmationController","group":"","title":"LightningWeb.UserConfirmationController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"confirm_email/2","title":"confirm_email(conn, map)","anchor":"confirm_email/2"},{"id":"create/2","title":"create(conn, map)","anchor":"create/2"},{"id":"edit/2","title":"edit(conn, map)","anchor":"edit/2"},{"id":"new/2","title":"new(conn, params)","anchor":"new/2"},{"id":"update/2","title":"update(conn, map)","anchor":"update/2"}],"key":"functions"}]},{"id":"LightningWeb.UserLive.Edit","group":"","title":"LightningWeb.UserLive.Edit","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.UserLive.FormComponent","group":"","title":"LightningWeb.UserLive.FormComponent","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.UserLive.Index","group":"","title":"LightningWeb.UserLive.Index","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"delete_action/1","title":"delete_action(assigns)","anchor":"delete_action/1"},{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.UserRegistrationController","group":"","title":"LightningWeb.UserRegistrationController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create/2","title":"create(conn, map)","anchor":"create/2"},{"id":"new/2","title":"new(conn, params)","anchor":"new/2"}],"key":"functions"}]},{"id":"LightningWeb.UserResetPasswordController","group":"","title":"LightningWeb.UserResetPasswordController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create/2","title":"create(conn, map)","anchor":"create/2"},{"id":"edit/2","title":"edit(conn, params)","anchor":"edit/2"},{"id":"new/2","title":"new(conn, params)","anchor":"new/2"},{"id":"update/2","title":"update(conn, map)","anchor":"update/2"}],"key":"functions"}]},{"id":"LightningWeb.UserSessionController","group":"","title":"LightningWeb.UserSessionController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"auth_handler_url/0","title":"auth_handler_url()","anchor":"auth_handler_url/0"},{"id":"create/2","title":"create(conn, map)","anchor":"create/2"},{"id":"delete/2","title":"delete(conn, params)","anchor":"delete/2"},{"id":"exchange_token/2","title":"exchange_token(conn, map)","anchor":"exchange_token/2"},{"id":"new/2","title":"new(conn, params)","anchor":"new/2"}],"key":"functions"}]},{"id":"LightningWeb.UserTOTPController","group":"","title":"LightningWeb.UserTOTPController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create/2","title":"create(conn, map)","anchor":"create/2"},{"id":"new/2","title":"new(conn, params)","anchor":"new/2"}],"key":"functions"}]},{"id":"LightningWeb.VersionControlController","group":"","title":"LightningWeb.VersionControlController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"index/2","title":"index(conn, params)","anchor":"index/2"}],"key":"functions"}]},{"id":"LightningWeb.WebhooksController","group":"","title":"LightningWeb.WebhooksController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create/2","title":"create(conn, map)","anchor":"create/2"}],"key":"functions"}]},{"id":"LightningWeb.WorkflowLive.EditorPane","group":"","title":"LightningWeb.WorkflowLive.EditorPane","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.WorkflowLive.JobView","group":"","title":"LightningWeb.WorkflowLive.JobView","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"container/1","title":"container(assigns)","anchor":"container/1"},{"id":"input_pane/1","title":"input_pane(assigns)","anchor":"input_pane/1"},{"id":"job_edit_view/1","title":"job_edit_view(assigns)","anchor":"job_edit_view/1"}],"key":"functions"}]},{"id":"LightningWeb.WorkflowNewLive.WorkflowParams","group":"","title":"LightningWeb.WorkflowNewLive.WorkflowParams","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"apply_form_params/2","title":"apply_form_params(current_params, form_params)","anchor":"apply_form_params/2"},{"id":"apply_patches/2","title":"apply_patches(current_params, patches)","anchor":"apply_patches/2"},{"id":"to_map/1","title":"to_map(changeset)","anchor":"to_map/1"},{"id":"to_patches/2","title":"to_patches(initial_params, target_params)","anchor":"to_patches/2"}],"key":"functions"}]},{"id":"ObanPruner","group":"","title":"ObanPruner","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"perform/1","title":"perform(job)","anchor":"perform/1"}],"key":"functions"}]},{"id":"Storybook.Root","group":"","title":"Storybook.Root","sections":[]},{"id":"Lightning.Accounts","group":"Accounts","title":"Lightning.Accounts","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"apply_user_email/3","title":"apply_user_email(user, password, attrs)","anchor":"apply_user_email/3"},{"id":"cancel_scheduled_deletion/1","title":"cancel_scheduled_deletion(user_id)","anchor":"cancel_scheduled_deletion/1"},{"id":"change_scheduled_deletion/2","title":"change_scheduled_deletion(user, attrs \\\\ %{})","anchor":"change_scheduled_deletion/2"},{"id":"change_superuser_registration/1","title":"change_superuser_registration(attrs \\\\ %{})","anchor":"change_superuser_registration/1"},{"id":"change_user_details/2","title":"change_user_details(user, attrs \\\\ %{})","anchor":"change_user_details/2"},{"id":"change_user_email/2","title":"change_user_email(user, attrs \\\\ %{})","anchor":"change_user_email/2"},{"id":"change_user_password/2","title":"change_user_password(user, attrs \\\\ %{})","anchor":"change_user_password/2"},{"id":"change_user_registration/1","title":"change_user_registration(attrs \\\\ %{})","anchor":"change_user_registration/1"},{"id":"confirm_user/1","title":"confirm_user(token)","anchor":"confirm_user/1"},{"id":"delete_auth_token/1","title":"delete_auth_token(token)","anchor":"delete_auth_token/1"},{"id":"delete_session_token/1","title":"delete_session_token(token)","anchor":"delete_session_token/1"},{"id":"delete_sudo_session_token/1","title":"delete_sudo_session_token(token)","anchor":"delete_sudo_session_token/1"},{"id":"delete_token/1","title":"delete_token(token)","anchor":"delete_token/1"},{"id":"delete_user/1","title":"delete_user(user)","anchor":"delete_user/1"},{"id":"delete_user_totp/1","title":"delete_user_totp(totp)","anchor":"delete_user_totp/1"},{"id":"deliver_update_email_instructions/3","title":"deliver_update_email_instructions(user, current_email, update_email_url_fun)","anchor":"deliver_update_email_instructions/3"},{"id":"deliver_user_confirmation_instructions/2","title":"deliver_user_confirmation_instructions(user, confirmation_url_fun)","anchor":"deliver_user_confirmation_instructions/2"},{"id":"deliver_user_confirmation_instructions/3","title":"deliver_user_confirmation_instructions(registerer, user, confirmation_url_fun)","anchor":"deliver_user_confirmation_instructions/3"},{"id":"deliver_user_reset_password_instructions/2","title":"deliver_user_reset_password_instructions(user, reset_password_url_fun)","anchor":"deliver_user_reset_password_instructions/2"},{"id":"exchange_auth_token/1","title":"exchange_auth_token(auth_token)","anchor":"exchange_auth_token/1"},{"id":"generate_api_token/1","title":"generate_api_token(user)","anchor":"generate_api_token/1"},{"id":"generate_auth_token/1","title":"generate_auth_token(user)","anchor":"generate_auth_token/1"},{"id":"generate_sudo_session_token/1","title":"generate_sudo_session_token(user)","anchor":"generate_sudo_session_token/1"},{"id":"generate_user_session_token/1","title":"generate_user_session_token(user)","anchor":"generate_user_session_token/1"},{"id":"get_token!/1","title":"get_token!(id)","anchor":"get_token!/1"},{"id":"get_user!/1","title":"get_user!(id)","anchor":"get_user!/1"},{"id":"get_user_by_api_token/1","title":"get_user_by_api_token(token)","anchor":"get_user_by_api_token/1"},{"id":"get_user_by_auth_token/1","title":"get_user_by_auth_token(token)","anchor":"get_user_by_auth_token/1"},{"id":"get_user_by_email/1","title":"get_user_by_email(email)","anchor":"get_user_by_email/1"},{"id":"get_user_by_email_and_password/2","title":"get_user_by_email_and_password(email, password)","anchor":"get_user_by_email_and_password/2"},{"id":"get_user_by_reset_password_token/1","title":"get_user_by_reset_password_token(token)","anchor":"get_user_by_reset_password_token/1"},{"id":"get_user_by_session_token/1","title":"get_user_by_session_token(token)","anchor":"get_user_by_session_token/1"},{"id":"get_user_totp/1","title":"get_user_totp(user)","anchor":"get_user_totp/1"},{"id":"get_users_to_alert_for_project/1","title":"get_users_to_alert_for_project(map)","anchor":"get_users_to_alert_for_project/1"},{"id":"has_activity_in_projects?/1","title":"has_activity_in_projects?(user)","anchor":"has_activity_in_projects?/1"},{"id":"has_one_superuser?/0","title":"has_one_superuser?()","anchor":"has_one_superuser?/0"},{"id":"list_api_tokens/1","title":"list_api_tokens(user)","anchor":"list_api_tokens/1"},{"id":"list_user_backup_codes/1","title":"list_user_backup_codes(user)","anchor":"list_user_backup_codes/1"},{"id":"list_users/0","title":"list_users()","anchor":"list_users/0"},{"id":"perform/1","title":"perform(job)","anchor":"perform/1"},{"id":"purge_user/1","title":"purge_user(id)","anchor":"purge_user/1"},{"id":"regenerate_user_backup_codes/1","title":"regenerate_user_backup_codes(user)","anchor":"regenerate_user_backup_codes/1"},{"id":"register_superuser/1","title":"register_superuser(attrs)","anchor":"register_superuser/1"},{"id":"register_user/1","title":"register_user(attrs)","anchor":"register_user/1"},{"id":"reset_user_password/2","title":"reset_user_password(user, attrs)","anchor":"reset_user_password/2"},{"id":"schedule_user_deletion/2","title":"schedule_user_deletion(user, email)","anchor":"schedule_user_deletion/2"},{"id":"sudo_session_token_valid?/2","title":"sudo_session_token_valid?(user, token)","anchor":"sudo_session_token_valid?/2"},{"id":"update_user_details/2","title":"update_user_details(user, attrs \\\\ %{})","anchor":"update_user_details/2"},{"id":"update_user_email/2","title":"update_user_email(user, token)","anchor":"update_user_email/2"},{"id":"update_user_password/3","title":"update_user_password(user, password, attrs)","anchor":"update_user_password/3"},{"id":"upsert_user_totp/2","title":"upsert_user_totp(totp, attrs)","anchor":"upsert_user_totp/2"},{"id":"valid_user_backup_code?/2","title":"valid_user_backup_code?(user, code)","anchor":"valid_user_backup_code?/2"},{"id":"valid_user_totp?/2","title":"valid_user_totp?(user, code)","anchor":"valid_user_totp?/2"},{"id":"validate_change_user_email/2","title":"validate_change_user_email(user, params)","anchor":"validate_change_user_email/2"}],"key":"functions"}]},{"id":"Lightning.Accounts.User","group":"Accounts","title":"Lightning.Accounts.User","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"confirm_changeset/1","title":"confirm_changeset(user)","anchor":"confirm_changeset/1"},{"id":"details_changeset/2","title":"details_changeset(user, attrs)","anchor":"details_changeset/2"},{"id":"email_changeset/2","title":"email_changeset(user, attrs)","anchor":"email_changeset/2"},{"id":"password_changeset/3","title":"password_changeset(user, attrs, opts \\\\ [])","anchor":"password_changeset/3"},{"id":"scheduled_deletion_changeset/2","title":"scheduled_deletion_changeset(user, attrs)","anchor":"scheduled_deletion_changeset/2"},{"id":"superuser_registration_changeset/2","title":"superuser_registration_changeset(attrs, opts \\\\ [])","anchor":"superuser_registration_changeset/2"},{"id":"user_registration_changeset/2","title":"user_registration_changeset(attrs, opts \\\\ [])","anchor":"user_registration_changeset/2"},{"id":"valid_password?/2","title":"valid_password?(arg1, password)","anchor":"valid_password?/2"},{"id":"validate_current_password/2","title":"validate_current_password(changeset, password)","anchor":"validate_current_password/2"}],"key":"functions"}]},{"id":"Lightning.Accounts.User.RolesEnum","group":"Accounts","title":"Lightning.Accounts.User.RolesEnum","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"cast/1","title":"cast(arg1)","anchor":"cast/1"},{"id":"create_type/0","title":"create_type()","anchor":"create_type/0"},{"id":"drop_type/0","title":"drop_type()","anchor":"drop_type/0"},{"id":"dump/1","title":"dump(term)","anchor":"dump/1"},{"id":"embed_as/1","title":"embed_as(_)","anchor":"embed_as/1"},{"id":"equal?/2","title":"equal?(term1, term2)","anchor":"equal?/2"},{"id":"load/1","title":"load(arg1)","anchor":"load/1"},{"id":"schema/0","title":"schema()","anchor":"schema/0"},{"id":"schemaless_type/0","title":"schemaless_type()","anchor":"schemaless_type/0"},{"id":"type/0","title":"type()","anchor":"type/0"},{"id":"valid_value?/1","title":"valid_value?(value)","anchor":"valid_value?/1"}],"key":"functions"}]},{"id":"Lightning.Accounts.UserBackupCode","group":"Accounts","title":"Lightning.Accounts.UserBackupCode","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"changeset/2","title":"changeset(backup_code, attrs)","anchor":"changeset/2"},{"id":"generate_backup_code/0","title":"generate_backup_code()","anchor":"generate_backup_code/0"}],"key":"functions"}]},{"id":"Lightning.Accounts.UserNotifier","group":"Accounts","title":"Lightning.Accounts.UserNotifier","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"build_digest_url/3","title":"build_digest_url(workflow, start_date, end_date)","anchor":"build_digest_url/3"},{"id":"deliver_confirmation_instructions/2","title":"deliver_confirmation_instructions(user, url)","anchor":"deliver_confirmation_instructions/2"},{"id":"deliver_confirmation_instructions/3","title":"deliver_confirmation_instructions(enroller, user, url)","anchor":"deliver_confirmation_instructions/3"},{"id":"deliver_project_addition_notification/2","title":"deliver_project_addition_notification(user, project)","anchor":"deliver_project_addition_notification/2"},{"id":"deliver_project_digest/2","title":"deliver_project_digest(digest_data, params)","anchor":"deliver_project_digest/2"},{"id":"deliver_reset_password_instructions/2","title":"deliver_reset_password_instructions(user, url)","anchor":"deliver_reset_password_instructions/2"},{"id":"deliver_update_email_instructions/2","title":"deliver_update_email_instructions(email, url)","anchor":"deliver_update_email_instructions/2"},{"id":"deliver_update_email_warning/2","title":"deliver_update_email_warning(email, new_email)","anchor":"deliver_update_email_warning/2"},{"id":"notify_project_deletion/2","title":"notify_project_deletion(user, project)","anchor":"notify_project_deletion/2"},{"id":"send_deletion_notification_email/1","title":"send_deletion_notification_email(user)","anchor":"send_deletion_notification_email/1"}],"key":"functions"}]},{"id":"Lightning.Accounts.UserTOTP","group":"Accounts","title":"Lightning.Accounts.UserTOTP","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"changeset/2","title":"changeset(totp, attrs)","anchor":"changeset/2"},{"id":"valid_totp?/2","title":"valid_totp?(totp, code)","anchor":"valid_totp?/2"}],"key":"functions"}]},{"id":"Lightning.Accounts.UserToken","group":"Accounts","title":"Lightning.Accounts.UserToken","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"build_email_token/3","title":"build_email_token(user, context, sent_to)","anchor":"build_email_token/3"},{"id":"build_token/2","title":"build_token(user, context)","anchor":"build_token/2"},{"id":"changeset/2","title":"changeset(user_token, attrs)","anchor":"changeset/2"},{"id":"generate_and_sign/2","title":"generate_and_sign(extra_claims \\\\ %{}, key \\\\ __default_signer__())","anchor":"generate_and_sign/2"},{"id":"generate_and_sign!/2","title":"generate_and_sign!(extra_claims \\\\ %{}, key \\\\ __default_signer__())","anchor":"generate_and_sign!/2"},{"id":"last_used_changeset/1","title":"last_used_changeset(user)","anchor":"last_used_changeset/1"},{"id":"token_and_context_query/2","title":"token_and_context_query(token, context)","anchor":"token_and_context_query/2"},{"id":"user_and_contexts_query/2","title":"user_and_contexts_query(user, contexts)","anchor":"user_and_contexts_query/2"},{"id":"verify_and_validate/3","title":"verify_and_validate(bearer_token, key \\\\ __default_signer__(), context \\\\ %{})","anchor":"verify_and_validate/3"},{"id":"verify_and_validate!/3","title":"verify_and_validate!(bearer_token, key \\\\ __default_signer__(), context \\\\ %{})","anchor":"verify_and_validate!/3"},{"id":"verify_change_email_token_query/2","title":"verify_change_email_token_query(token, context)","anchor":"verify_change_email_token_query/2"},{"id":"verify_email_token_query/2","title":"verify_email_token_query(token, context)","anchor":"verify_email_token_query/2"},{"id":"verify_token_query/2","title":"verify_token_query(token, context)","anchor":"verify_token_query/2"}],"key":"functions"}]},{"id":"Lightning.Credentials","group":"Credentials","title":"Lightning.Credentials","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"change_credential/2","title":"change_credential(credential, attrs \\\\ %{})","anchor":"change_credential/2"},{"id":"create_credential/1","title":"create_credential(attrs \\\\ %{})","anchor":"create_credential/1"},{"id":"delete_credential/1","title":"delete_credential(credential)","anchor":"delete_credential/1"},{"id":"get_credential!/1","title":"get_credential!(id)","anchor":"get_credential!/1"},{"id":"invalid_projects_for_user/2","title":"invalid_projects_for_user(credential_id, user_id)","anchor":"invalid_projects_for_user/2"},{"id":"list_credentials/0","title":"list_credentials()","anchor":"list_credentials/0"},{"id":"list_credentials/1","title":"list_credentials(project)","anchor":"list_credentials/1"},{"id":"list_credentials_for_user/1","title":"list_credentials_for_user(user_id)","anchor":"list_credentials_for_user/1"},{"id":"maybe_refresh_token/1","title":"maybe_refresh_token(credential)","anchor":"maybe_refresh_token/1"},{"id":"sensitive_values_for/1","title":"sensitive_values_for(id)","anchor":"sensitive_values_for/1"},{"id":"update_credential/2","title":"update_credential(credential, attrs)","anchor":"update_credential/2"}],"key":"functions"}]},{"id":"Lightning.Credentials.Audit","group":"Credentials","title":"Lightning.Credentials.Audit","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"event/4","title":"event(event, row_id, actor_id, metadata \\\\ %{})","anchor":"event/4"},{"id":"save/1","title":"save(changes)","anchor":"save/1"}],"key":"functions"}]},{"id":"Lightning.Credentials.Credential","group":"Credentials","title":"Lightning.Credentials.Credential","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"}]},{"id":"Lightning.Credentials.Schema","group":"Credentials","title":"Lightning.Credentials.Schema","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"new/2","title":"new(body, name \\\\ nil)","anchor":"new/2"},{"id":"properties/2","title":"properties(schema, field)","anchor":"properties/2"},{"id":"required?/2","title":"required?(schema, field)","anchor":"required?/2"},{"id":"validate/2","title":"validate(changeset, schema)","anchor":"validate/2"}],"key":"functions"}]},{"id":"Lightning.Credentials.SchemaDocument","group":"Credentials","title":"Lightning.Credentials.SchemaDocument","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/3","title":"changeset(document, attrs, list)","anchor":"changeset/3"}],"key":"functions"}]},{"id":"Lightning.Credentials.SensitiveValues","group":"Credentials","title":"Lightning.Credentials.SensitiveValues","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"pairs/0","title":"pairs()","anchor":"t:pairs/0"},{"id":"raw_pairs/0","title":"raw_pairs()","anchor":"t:raw_pairs/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"flatten_map/1","title":"flatten_map(item)","anchor":"flatten_map/1"},{"id":"secret_values/1","title":"secret_values(map)","anchor":"secret_values/1"}],"key":"functions"}]},{"id":"Lightning.Invocation","group":"Invocations","title":"Lightning.Invocation","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"change_dataclip/2","title":"change_dataclip(dataclip, attrs \\\\ %{})","anchor":"change_dataclip/2"},{"id":"change_run/2","title":"change_run(run, attrs \\\\ %{})","anchor":"change_run/2"},{"id":"create_dataclip/1","title":"create_dataclip(attrs \\\\ %{})","anchor":"create_dataclip/1"},{"id":"create_log_line/2","title":"create_log_line(run, body)","anchor":"create_log_line/2"},{"id":"create_run/1","title":"create_run(attrs \\\\ %{})","anchor":"create_run/1"},{"id":"delete_dataclip/1","title":"delete_dataclip(dataclip)","anchor":"delete_dataclip/1"},{"id":"delete_run/1","title":"delete_run(run)","anchor":"delete_run/1"},{"id":"filter_run_body_and_logs_where/2","title":"filter_run_body_and_logs_where(search_term, search_fields)","anchor":"filter_run_body_and_logs_where/2"},{"id":"filter_run_finished_after_where/1","title":"filter_run_finished_after_where(date_after)","anchor":"filter_run_finished_after_where/1"},{"id":"filter_run_finished_before_where/1","title":"filter_run_finished_before_where(date_before)","anchor":"filter_run_finished_before_where/1"},{"id":"filter_run_status_where/1","title":"filter_run_status_where(statuses)","anchor":"filter_run_status_where/1"},{"id":"filter_workflow_where/1","title":"filter_workflow_where(workflow_id)","anchor":"filter_workflow_where/1"},{"id":"filter_workorder_insert_after_where/1","title":"filter_workorder_insert_after_where(date_after)","anchor":"filter_workorder_insert_after_where/1"},{"id":"filter_workorder_insert_before_where/1","title":"filter_workorder_insert_before_where(date_before)","anchor":"filter_workorder_insert_before_where/1"},{"id":"get_dataclip/1","title":"get_dataclip(run)","anchor":"get_dataclip/1"},{"id":"get_dataclip!/1","title":"get_dataclip!(id)","anchor":"get_dataclip!/1"},{"id":"get_dataclip_query/1","title":"get_dataclip_query(run)","anchor":"get_dataclip_query/1"},{"id":"get_result_dataclip_query/1","title":"get_result_dataclip_query(run)","anchor":"get_result_dataclip_query/1"},{"id":"get_run!/1","title":"get_run!(id)","anchor":"get_run!/1"},{"id":"get_run_with_job!/1","title":"get_run_with_job!(id)","anchor":"get_run_with_job!/1"},{"id":"get_workorders_by_ids/1","title":"get_workorders_by_ids(ids)","anchor":"get_workorders_by_ids/1"},{"id":"list_dataclips/0","title":"list_dataclips()","anchor":"list_dataclips/0"},{"id":"list_dataclips/1","title":"list_dataclips(project)","anchor":"list_dataclips/1"},{"id":"list_dataclips_for_job/1","title":"list_dataclips_for_job(job)","anchor":"list_dataclips_for_job/1"},{"id":"list_dataclips_query/1","title":"list_dataclips_query(project)","anchor":"list_dataclips_query/1"},{"id":"list_runs/0","title":"list_runs()","anchor":"list_runs/0"},{"id":"list_runs_for_project/2","title":"list_runs_for_project(project, params \\\\ %{})","anchor":"list_runs_for_project/2"},{"id":"list_runs_for_project_query/1","title":"list_runs_for_project_query(project)","anchor":"list_runs_for_project_query/1"},{"id":"list_work_orders_for_project_query/2","title":"list_work_orders_for_project_query(project, search_params)","anchor":"list_work_orders_for_project_query/2"},{"id":"search_workorders/1","title":"search_workorders(project)","anchor":"search_workorders/1"},{"id":"search_workorders/3","title":"search_workorders(project, filter, params \\\\ %{})","anchor":"search_workorders/3"},{"id":"update_dataclip/2","title":"update_dataclip(dataclip, attrs)","anchor":"update_dataclip/2"},{"id":"update_run/2","title":"update_run(run, attrs)","anchor":"update_run/2"},{"id":"with_attempts/1","title":"with_attempts(query)","anchor":"with_attempts/1"}],"key":"functions"}]},{"id":"Lightning.Invocation.Dataclip","group":"Invocations","title":"Lightning.Invocation.Dataclip","sections":[{"id":"Types","anchor":"module-types"}],"nodeGroups":[{"name":"Types","nodes":[{"id":"source_type/0","title":"source_type()","anchor":"t:source_type/0"},{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"get_types/0","title":"get_types()","anchor":"get_types/0"},{"id":"new/1","title":"new(attrs \\\\ %{})","anchor":"new/1"},{"id":"validate_by_type/1","title":"validate_by_type(changeset)","anchor":"validate_by_type/1"}],"key":"functions"}]},{"id":"Lightning.Invocation.LogLine","group":"Invocations","title":"Lightning.Invocation.LogLine","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"validate/1","title":"validate(changeset)","anchor":"validate/1"}],"key":"functions"}]},{"id":"Lightning.Invocation.Query","group":"Invocations","title":"Lightning.Invocation.Query","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"last_run_for_job/1","title":"last_run_for_job(job)","anchor":"last_run_for_job/1"},{"id":"last_successful_run_for_job/1","title":"last_successful_run_for_job(job)","anchor":"last_successful_run_for_job/1"},{"id":"runs_for/1","title":"runs_for(user)","anchor":"runs_for/1"},{"id":"runs_with_code/2","title":"runs_with_code(query, exit_code)","anchor":"runs_with_code/2"}],"key":"functions"}]},{"id":"Lightning.Invocation.Run","group":"Invocations","title":"Lightning.Invocation.Run","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"new/1","title":"new(attrs \\\\ %{})","anchor":"new/1"},{"id":"new_from/1","title":"new_from(run)","anchor":"new_from/1"}],"key":"functions"}]},{"id":"Lightning.InvocationReason","group":"Invocations","title":"Lightning.InvocationReason","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"source_type/0","title":"source_type()","anchor":"t:source_type/0"},{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"new/1","title":"new(attrs \\\\ %{})","anchor":"new/1"},{"id":"validate_by_trigger_type/1","title":"validate_by_trigger_type(changeset)","anchor":"validate_by_trigger_type/1"}],"key":"functions"}]},{"id":"Lightning.InvocationReasons","group":"Invocations","title":"Lightning.InvocationReasons","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"reason_type/0","title":"reason_type()","anchor":"t:reason_type/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"build/2","title":"build(type, arg2)","anchor":"build/2"},{"id":"create_reason/1","title":"create_reason(attrs \\\\ %{})","anchor":"create_reason/1"}],"key":"functions"}]},{"id":"Lightning.Pipeline","group":"Pipeline","title":"Lightning.Pipeline","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"assemble_logs_for_run/1","title":"assemble_logs_for_run(run)","anchor":"assemble_logs_for_run/1"},{"id":"logs_for_run/1","title":"logs_for_run(run)","anchor":"logs_for_run/1"},{"id":"process/1","title":"process(attempt_run)","anchor":"process/1"}],"key":"functions"}]},{"id":"Lightning.Pipeline.Runner","group":"Pipeline","title":"Lightning.Pipeline.Runner","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create_dataclip_from_result/2","title":"create_dataclip_from_result(result, run)","anchor":"create_dataclip_from_result/2"},{"id":"find_or_install_adaptor/1","title":"find_or_install_adaptor(adaptor)","anchor":"find_or_install_adaptor/1"},{"id":"scrub_result/1","title":"scrub_result(body)","anchor":"scrub_result/1"},{"id":"start/2","title":"start(run, opts \\\\ [])","anchor":"start/2"}],"key":"functions"}]},{"id":"Lightning.Pipeline.Runner.Handler","group":"Pipeline","title":"Lightning.Pipeline.Runner.Handler","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"handler_opts/0","title":"handler_opts()","anchor":"t:handler_opts/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"on_start/1","title":"on_start(context)","anchor":"on_start/1"},{"id":"stop/1","title":"stop(state)","anchor":"stop/1"}],"key":"functions"}]},{"id":"Lightning.Pipeline.StateAssembler","group":"Pipeline","title":"Lightning.Pipeline.StateAssembler","sections":[{"id":"How state is assembled","anchor":"module-how-state-is-assembled"},{"id":"Saved inputs","anchor":"module-saved-inputs"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"assemble/1","title":"assemble(run)","anchor":"assemble/1"}],"key":"functions"}]},{"id":"Lightning.Jobs","group":"Jobs","title":"Lightning.Jobs","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"change_job/2","title":"change_job(job, attrs \\\\ %{})","anchor":"change_job/2"},{"id":"create_job/1","title":"create_job(attrs \\\\ %{})","anchor":"create_job/1"},{"id":"delete_job/1","title":"delete_job(job)","anchor":"delete_job/1"},{"id":"get_downstream_jobs_for/2","title":"get_downstream_jobs_for(job, edge_condition \\\\ nil)","anchor":"get_downstream_jobs_for/2"},{"id":"get_job/1","title":"get_job(id)","anchor":"get_job/1"},{"id":"get_job!/1","title":"get_job!(id)","anchor":"get_job!/1"},{"id":"get_upstream_jobs_for/1","title":"get_upstream_jobs_for(map)","anchor":"get_upstream_jobs_for/1"},{"id":"jobs_for_project/1","title":"jobs_for_project(project)","anchor":"jobs_for_project/1"},{"id":"jobs_for_project_query/1","title":"jobs_for_project_query(project)","anchor":"jobs_for_project_query/1"},{"id":"list_active_cron_jobs/0","title":"list_active_cron_jobs()","anchor":"list_active_cron_jobs/0"},{"id":"list_jobs/0","title":"list_jobs()","anchor":"list_jobs/0"},{"id":"list_jobs_for_workflow/1","title":"list_jobs_for_workflow(workflow)","anchor":"list_jobs_for_workflow/1"},{"id":"update_job/2","title":"update_job(job, attrs)","anchor":"update_job/2"}],"key":"functions"}]},{"id":"Lightning.Jobs.Job","group":"Jobs","title":"Lightning.Jobs.Job","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"new/1","title":"new(attrs \\\\ %{})","anchor":"new/1"},{"id":"put_project_credential/2","title":"put_project_credential(job, project_credential)","anchor":"put_project_credential/2"},{"id":"put_workflow/2","title":"put_workflow(changeset, workflow)","anchor":"put_workflow/2"},{"id":"validate/1","title":"validate(changeset)","anchor":"validate/1"}],"key":"functions"}]},{"id":"Lightning.Jobs.Query","group":"Jobs","title":"Lightning.Jobs.Query","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"enabled_cron_jobs_by_edge/0","title":"enabled_cron_jobs_by_edge()","anchor":"enabled_cron_jobs_by_edge/0"},{"id":"jobs_for/1","title":"jobs_for(user)","anchor":"jobs_for/1"}],"key":"functions"}]},{"id":"Lightning.Jobs.Scheduler","group":"Jobs","title":"Lightning.Jobs.Scheduler","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"enqueue_cronjobs/0","title":"enqueue_cronjobs()","anchor":"enqueue_cronjobs/0"},{"id":"enqueue_cronjobs/1","title":"enqueue_cronjobs(date_time)","anchor":"enqueue_cronjobs/1"}],"key":"functions"}]},{"id":"Lightning.Jobs.Trigger","group":"Jobs","title":"Lightning.Jobs.Trigger","sections":[{"id":"Types","anchor":"module-types"}],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"},{"id":"trigger_type/0","title":"trigger_type()","anchor":"t:trigger_type/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"new/1","title":"new(attrs)","anchor":"new/1"},{"id":"validate/1","title":"validate(changeset)","anchor":"validate/1"}],"key":"functions"}]},{"id":"Lightning.Projects","group":"Projects","title":"Lightning.Projects","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"cancel_scheduled_deletion/1","title":"cancel_scheduled_deletion(project_id)","anchor":"cancel_scheduled_deletion/1"},{"id":"change_project/2","title":"change_project(project, attrs \\\\ %{})","anchor":"change_project/2"},{"id":"create_project/1","title":"create_project(attrs \\\\ %{})","anchor":"create_project/1"},{"id":"delete_project/1","title":"delete_project(project)","anchor":"delete_project/1"},{"id":"export_project/2","title":"export_project(atom, project_id)","anchor":"export_project/2"},{"id":"get_project/1","title":"get_project(id)","anchor":"get_project/1"},{"id":"get_project!/1","title":"get_project!(id)","anchor":"get_project!/1"},{"id":"get_project_credential/2","title":"get_project_credential(project_id, credential_id)","anchor":"get_project_credential/2"},{"id":"get_project_user/1","title":"get_project_user(id)","anchor":"get_project_user/1"},{"id":"get_project_user/2","title":"get_project_user(project, user)","anchor":"get_project_user/2"},{"id":"get_project_user!/1","title":"get_project_user!(id)","anchor":"get_project_user!/1"},{"id":"get_project_user_role/2","title":"get_project_user_role(user, project)","anchor":"get_project_user_role/2"},{"id":"get_project_with_users!/1","title":"get_project_with_users!(id)","anchor":"get_project_with_users!/1"},{"id":"get_projects_for_user/1","title":"get_projects_for_user(user)","anchor":"get_projects_for_user/1"},{"id":"is_member_of?/2","title":"is_member_of?(project, user)","anchor":"is_member_of?/2"},{"id":"list_project_credentials/1","title":"list_project_credentials(project)","anchor":"list_project_credentials/1"},{"id":"list_projects/0","title":"list_projects()","anchor":"list_projects/0"},{"id":"perform/1","title":"perform(job)","anchor":"perform/1"},{"id":"project_attempt_run_query/1","title":"project_attempt_run_query(project)","anchor":"project_attempt_run_query/1"},{"id":"project_attempts_query/1","title":"project_attempts_query(project)","anchor":"project_attempts_query/1"},{"id":"project_credentials_query/1","title":"project_credentials_query(project)","anchor":"project_credentials_query/1"},{"id":"project_dataclip_invocation_reason/1","title":"project_dataclip_invocation_reason(project)","anchor":"project_dataclip_invocation_reason/1"},{"id":"project_dataclips_query/1","title":"project_dataclips_query(project)","anchor":"project_dataclips_query/1"},{"id":"project_jobs_query/1","title":"project_jobs_query(project)","anchor":"project_jobs_query/1"},{"id":"project_run_invocation_reasons/1","title":"project_run_invocation_reasons(project)","anchor":"project_run_invocation_reasons/1"},{"id":"project_runs_query/1","title":"project_runs_query(project)","anchor":"project_runs_query/1"},{"id":"project_trigger_invocation_reason/1","title":"project_trigger_invocation_reason(project)","anchor":"project_trigger_invocation_reason/1"},{"id":"project_triggers_query/1","title":"project_triggers_query(project)","anchor":"project_triggers_query/1"},{"id":"project_user_role_query/2","title":"project_user_role_query(user, project)","anchor":"project_user_role_query/2"},{"id":"project_users_query/1","title":"project_users_query(project)","anchor":"project_users_query/1"},{"id":"project_workflows_query/1","title":"project_workflows_query(project)","anchor":"project_workflows_query/1"},{"id":"project_workorders_query/1","title":"project_workorders_query(project)","anchor":"project_workorders_query/1"},{"id":"projects_for_user_query/1","title":"projects_for_user_query(user)","anchor":"projects_for_user_query/1"},{"id":"schedule_project_deletion/1","title":"schedule_project_deletion(project)","anchor":"schedule_project_deletion/1"},{"id":"select_first_project_for_user/1","title":"select_first_project_for_user(user)","anchor":"select_first_project_for_user/1"},{"id":"update_project/2","title":"update_project(project, attrs)","anchor":"update_project/2"},{"id":"update_project_user/2","title":"update_project_user(project_user, attrs)","anchor":"update_project_user/2"},{"id":"url_safe_project_name/1","title":"url_safe_project_name(name)","anchor":"url_safe_project_name/1"},{"id":"validate_for_deletion/2","title":"validate_for_deletion(project, attrs)","anchor":"validate_for_deletion/2"}],"key":"functions"}]},{"id":"Lightning.Projects.Project","group":"Projects","title":"Lightning.Projects.Project","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"deletion_changeset/2","title":"deletion_changeset(project, attrs)","anchor":"deletion_changeset/2"},{"id":"validate/1","title":"validate(changeset)","anchor":"validate/1"}],"key":"functions"}]},{"id":"Lightning.Projects.ProjectCredential","group":"Projects","title":"Lightning.Projects.ProjectCredential","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"}]},{"id":"Lightning.Projects.ProjectUser","group":"Projects","title":"Lightning.Projects.ProjectUser","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"}]},{"id":"Lightning.Projects.ProjectUser.DigestEnum","group":"Projects","title":"Lightning.Projects.ProjectUser.DigestEnum","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"cast/1","title":"cast(arg1)","anchor":"cast/1"},{"id":"create_type/0","title":"create_type()","anchor":"create_type/0"},{"id":"drop_type/0","title":"drop_type()","anchor":"drop_type/0"},{"id":"dump/1","title":"dump(term)","anchor":"dump/1"},{"id":"embed_as/1","title":"embed_as(_)","anchor":"embed_as/1"},{"id":"equal?/2","title":"equal?(term1, term2)","anchor":"equal?/2"},{"id":"load/1","title":"load(arg1)","anchor":"load/1"},{"id":"schema/0","title":"schema()","anchor":"schema/0"},{"id":"schemaless_type/0","title":"schemaless_type()","anchor":"schemaless_type/0"},{"id":"type/0","title":"type()","anchor":"type/0"},{"id":"valid_value?/1","title":"valid_value?(value)","anchor":"valid_value?/1"}],"key":"functions"}]},{"id":"Lightning.Projects.ProjectUser.RolesEnum","group":"Projects","title":"Lightning.Projects.ProjectUser.RolesEnum","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"cast/1","title":"cast(arg1)","anchor":"cast/1"},{"id":"create_type/0","title":"create_type()","anchor":"create_type/0"},{"id":"drop_type/0","title":"drop_type()","anchor":"drop_type/0"},{"id":"dump/1","title":"dump(term)","anchor":"dump/1"},{"id":"embed_as/1","title":"embed_as(_)","anchor":"embed_as/1"},{"id":"equal?/2","title":"equal?(term1, term2)","anchor":"equal?/2"},{"id":"load/1","title":"load(arg1)","anchor":"load/1"},{"id":"schema/0","title":"schema()","anchor":"schema/0"},{"id":"schemaless_type/0","title":"schemaless_type()","anchor":"schemaless_type/0"},{"id":"type/0","title":"type()","anchor":"type/0"},{"id":"valid_value?/1","title":"valid_value?(value)","anchor":"valid_value?/1"}],"key":"functions"}]},{"id":"Lightning.Projects.Provisioner","group":"Projects","title":"Lightning.Projects.Provisioner","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"import_document/3","title":"import_document(project, user, data)","anchor":"import_document/3"},{"id":"load_project/1","title":"load_project(id)","anchor":"load_project/1"},{"id":"parse_document/2","title":"parse_document(project, data)","anchor":"parse_document/2"},{"id":"validate_extraneous_params/1","title":"validate_extraneous_params(changeset)","anchor":"validate_extraneous_params/1"}],"key":"functions"}]},{"id":"Lightning.Runtime.ChildProcess","group":"Runtime","title":"Lightning.Runtime.ChildProcess","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"build_command/1","title":"build_command(runspec)","anchor":"build_command/1"},{"id":"build_env/2","title":"build_env(arg1, env)","anchor":"build_env/2"},{"id":"run/2","title":"run(runspec, opts \\\\ [])","anchor":"run/2"}],"key":"functions"}]},{"id":"Lightning.Runtime.Handler","group":"Runtime","title":"Lightning.Runtime.Handler","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Callbacks","nodes":[{"id":"env/2","title":"env(run_spec, opts)","anchor":"c:env/2"},{"id":"log_callback/3","title":"log_callback(agent, context, args)","anchor":"c:log_callback/3"},{"id":"on_finish/2","title":"on_finish(result, context)","anchor":"c:on_finish/2"},{"id":"on_log_emit/2","title":"on_log_emit(chunk, context)","anchor":"c:on_log_emit/2"},{"id":"on_start/1","title":"on_start(context)","anchor":"c:on_start/1"},{"id":"start/2","title":"start(any, opts)","anchor":"c:start/2"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"env/2","title":"env(run_spec, opts)","anchor":"env/2"},{"id":"on_finish/2","title":"on_finish(result, context)","anchor":"on_finish/2"},{"id":"on_log_emit/2","title":"on_log_emit(chunk, context)","anchor":"on_log_emit/2"},{"id":"on_start/1","title":"on_start(context)","anchor":"on_start/1"}],"key":"functions"}]},{"id":"Lightning.Runtime.LogAgent","group":"Runtime","title":"Lightning.Runtime.LogAgent","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"logline/0","title":"logline()","anchor":"t:logline/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"buffer/1","title":"buffer(agent)","anchor":"buffer/1"},{"id":"child_spec/1","title":"child_spec(arg)","anchor":"child_spec/1"},{"id":"process_chunk/2","title":"process_chunk(agent, arg)","anchor":"process_chunk/2"},{"id":"start_link/1","title":"start_link(_ \\\\ [])","anchor":"start_link/1"}],"key":"functions"}]},{"id":"Lightning.Runtime.LogAgent.StringBuffer","group":"Runtime","title":"Lightning.Runtime.LogAgent.StringBuffer","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"buffer/1","title":"buffer(arg)","anchor":"buffer/1"},{"id":"new/0","title":"new()","anchor":"new/0"},{"id":"process_chunk/2","title":"process_chunk(data, arg)","anchor":"process_chunk/2"},{"id":"reduce_chunk/2","title":"reduce_chunk(data, arg)","anchor":"reduce_chunk/2"}],"key":"functions"}]},{"id":"Lightning.Runtime.Result","group":"Runtime","title":"Lightning.Runtime.Result","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"new/1","title":"new(fields \\\\ [])","anchor":"new/1"}],"key":"functions"}]},{"id":"Lightning.Runtime.RunSpec","group":"Runtime","title":"Lightning.Runtime.RunSpec","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"new/1","title":"new(fields \\\\ [])","anchor":"new/1"}],"key":"functions"}]},{"id":"Lightning.MetadataService.Error","group":"Exceptions","title":"Lightning.MetadataService.Error","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"message/1","title":"message(map)","anchor":"message/1"},{"id":"new/1","title":"new(type)","anchor":"new/1"}],"key":"functions"}]}],"extras":[{"id":"api-reference","group":"","title":"API Reference","headers":[{"id":"Modules","anchor":"modules"},{"id":"Mix Tasks","anchor":"mix-tasks"}]},{"id":"readme","group":"","title":"Lightning","headers":[{"id":"Contents","anchor":"contents"},{"id":"Demo","anchor":"demo"},{"id":"Register for a Beta account","anchor":"register-for-a-beta-account"},{"id":"Features","anchor":"features"},{"id":"Getting Started","anchor":"getting-started"},{"id":"Run via Docker","anchor":"run-via-docker"},{"id":"Deploy on external infrastructure","anchor":"deploy-on-external-infrastructure"},{"id":"Run Lightning locally","anchor":"run-lightning-locally"},{"id":"Benchmarking","anchor":"benchmarking"},{"id":"Troubleshooting","anchor":"troubleshooting"},{"id":"Project Configuration Quickstart","anchor":"project-configuration-quickstart"},{"id":"Contribute to this project","anchor":"contribute-to-this-project"},{"id":"Generating Documentation","anchor":"generating-documentation"},{"id":"Security and Standards","anchor":"security-and-standards"},{"id":"Server Specs for Self-Hosting","anchor":"server-specs-for-self-hosting"},{"id":"Support","anchor":"support"}]},{"id":"deployment","group":"","title":"Deployment","headers":[{"id":"Encryption","anchor":"encryption"},{"id":"Environment Variables","anchor":"environment-variables"}]},{"id":"benchmarking","group":"","title":"Benchmarking","headers":[]},{"id":"provisioning","group":"","title":"Provisioning","headers":[{"id":"Using the API","anchor":"using-the-api"},{"id":"Document Structure","anchor":"document-structure"},{"id":"API Behaviour","anchor":"api-behaviour"},{"id":"Relationship with Projects as Code","anchor":"relationship-with-projects-as-code"}]},{"id":"changelog","group":"","title":"Changelog","headers":[{"id":"[Unreleased]","anchor":"unreleased"},{"id":"[v0.7.3] - 2023-08-15","anchor":"v0-7-3-2023-08-15"},{"id":"[v0.7.2] - 2023-08-10","anchor":"v0-7-2-2023-08-10"},{"id":"[v0.7.1] - 2023-08-04","anchor":"v0-7-1-2023-08-04"},{"id":"[v0.7.0] - 2023-08-04","anchor":"v0-7-0-2023-08-04"},{"id":"[v0.7.0-pre5] - 2023-07-28","anchor":"v0-7-0-pre5-2023-07-28"},{"id":"[v0.7.0-pre4] - 2023-07-27","anchor":"v0-7-0-pre4-2023-07-27"},{"id":"[v0.7.0-pre3] - 2023-07-26","anchor":"v0-7-0-pre3-2023-07-26"},{"id":"[v0.7.0-pre2] - 2023-07-26","anchor":"v0-7-0-pre2-2023-07-26"},{"id":"[0.6.7] - 2023-07-13","anchor":"0-6-7-2023-07-13"},{"id":"[0.6.6] - 2023-06-30","anchor":"0-6-6-2023-06-30"},{"id":"[0.6.5] - 2023-06-22","anchor":"0-6-5-2023-06-22"},{"id":"[0.6.3] - 2023-06-15","anchor":"0-6-3-2023-06-15"},{"id":"[0.6.2] - 2023-06-09","anchor":"0-6-2-2023-06-09"},{"id":"[0.6.1] - 2023-06-08","anchor":"0-6-1-2023-06-08"},{"id":"[0.6.0]- 2023-04-12","anchor":"0-6-0-2023-04-12"},{"id":"[0.5.2]","anchor":"0-5-2"},{"id":"[0.5.1] - 2023-04-12","anchor":"0-5-1-2023-04-12"},{"id":"[0.5.0] - 2023-04-03","anchor":"0-5-0-2023-04-03"},{"id":"[0.4.8] - 2023-03-29","anchor":"0-4-8-2023-03-29"},{"id":"[0.4.6] - 2023-03-23","anchor":"0-4-6-2023-03-23"},{"id":"[0.4.4] - 2023-03-10","anchor":"0-4-4-2023-03-10"},{"id":"[0.4.3] - 2023-03-06","anchor":"0-4-3-2023-03-06"},{"id":"[0.4.2] - 2023-02-24","anchor":"0-4-2-2023-02-24"},{"id":"[0.4.0] - 2023-02-08","anchor":"0-4-0-2023-02-08"},{"id":"[0.3.1] - 2022-11-22","anchor":"0-3-1-2022-11-22"},{"id":"[0.3.0] - 2022-11-21","anchor":"0-3-0-2022-11-21"},{"id":"[0.2.0] - 2022-09-12","anchor":"0-2-0-2022-09-12"},{"id":"[0.1.13] - 2022-08-29","anchor":"0-1-13-2022-08-29"},{"id":"[0.1.12] - 2022-08-15","anchor":"0-1-12-2022-08-15"},{"id":"[0.1.11] - 2022-08-05","anchor":"0-1-11-2022-08-05"},{"id":"[0.1.10] - 2022-08-05","anchor":"0-1-10-2022-08-05"},{"id":"[0.1.9] - 2022-07-27","anchor":"0-1-9-2022-07-27"},{"id":"[0.1.7] - 2022-06-24","anchor":"0-1-7-2022-06-24"},{"id":"[0.1.6] - 2022-06-07","anchor":"0-1-6-2022-06-07"}]}],"tasks":[{"id":"Mix.Tasks.Lightning.GenEncryptionKey","group":"","title":"mix lightning.gen_encryption_key","sections":[]},{"id":"Mix.Tasks.Lightning.InstallRuntime","group":"","title":"mix lightning.install_runtime","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"packages/0","title":"packages()","anchor":"packages/0"},{"id":"run/1","title":"run(_)","anchor":"run/1"}],"key":"functions"}]},{"id":"Mix.Tasks.Lightning.InstallSchemas","group":"","title":"mix lightning.install_schemas","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"body/0","title":"body()","anchor":"t:body/0"},{"id":"headers/0","title":"headers()","anchor":"t:headers/0"},{"id":"method/0","title":"method()","anchor":"t:method/0"},{"id":"options/0","title":"options()","anchor":"t:options/0"},{"id":"params/0","title":"params()","anchor":"t:params/0"},{"id":"request/0","title":"request()","anchor":"t:request/0"},{"id":"url/0","title":"url()","anchor":"t:url/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"delete/3","title":"delete(url, headers \\\\ [], options \\\\ [])","anchor":"delete/3"},{"id":"delete!/3","title":"delete!(url, headers \\\\ [], options \\\\ [])","anchor":"delete!/3"},{"id":"fetch_schemas/2","title":"fetch_schemas(excluded \\\\ [], fun)","anchor":"fetch_schemas/2"},{"id":"get/3","title":"get(url, headers \\\\ [], options \\\\ [])","anchor":"get/3"},{"id":"get!/3","title":"get!(url, headers \\\\ [], options \\\\ [])","anchor":"get!/3"},{"id":"head/3","title":"head(url, headers \\\\ [], options \\\\ [])","anchor":"head/3"},{"id":"head!/3","title":"head!(url, headers \\\\ [], options \\\\ [])","anchor":"head!/3"},{"id":"options/3","title":"options(url, headers \\\\ [], options \\\\ [])","anchor":"options/3"},{"id":"options!/3","title":"options!(url, headers \\\\ [], options \\\\ [])","anchor":"options!/3"},{"id":"parse_excluded/1","title":"parse_excluded(args)","anchor":"parse_excluded/1"},{"id":"patch/4","title":"patch(url, body, headers \\\\ [], options \\\\ [])","anchor":"patch/4"},{"id":"patch!/4","title":"patch!(url, body, headers \\\\ [], options \\\\ [])","anchor":"patch!/4"},{"id":"persist_schema/2","title":"persist_schema(dir, package_name)","anchor":"persist_schema/2"},{"id":"post/4","title":"post(url, body, headers \\\\ [], options \\\\ [])","anchor":"post/4"},{"id":"post!/4","title":"post!(url, body, headers \\\\ [], options \\\\ [])","anchor":"post!/4"},{"id":"process_headers/1","title":"process_headers(headers)","anchor":"process_headers/1"},{"id":"process_request_body/1","title":"process_request_body(body)","anchor":"process_request_body/1"},{"id":"process_request_headers/1","title":"process_request_headers(headers)","anchor":"process_request_headers/1"},{"id":"process_request_options/1","title":"process_request_options(options)","anchor":"process_request_options/1"},{"id":"process_request_params/1","title":"process_request_params(params)","anchor":"process_request_params/1"},{"id":"process_request_url/1","title":"process_request_url(url)","anchor":"process_request_url/1"},{"id":"process_response/1","title":"process_response(response)","anchor":"process_response/1"},{"id":"process_response_body/1","title":"process_response_body(body)","anchor":"process_response_body/1"},{"id":"process_response_chunk/1","title":"process_response_chunk(chunk)","anchor":"process_response_chunk/1"},{"id":"process_response_headers/1","title":"process_response_headers(headers)","anchor":"process_response_headers/1"},{"id":"process_response_status_code/1","title":"process_response_status_code(status_code)","anchor":"process_response_status_code/1"},{"id":"process_status_code/1","title":"process_status_code(status_code)","anchor":"process_status_code/1"},{"id":"process_url/1","title":"process_url(url)","anchor":"process_url/1"},{"id":"put/4","title":"put(url, body \\\\ \"\", headers \\\\ [], options \\\\ [])","anchor":"put/4"},{"id":"put!/4","title":"put!(url, body \\\\ \"\", headers \\\\ [], options \\\\ [])","anchor":"put!/4"},{"id":"request/1","title":"request(request)","anchor":"request/1"},{"id":"request/5","title":"request(method, url, body \\\\ \"\", headers \\\\ [], options \\\\ [])","anchor":"request/5"},{"id":"request!/5","title":"request!(method, url, body \\\\ \"\", headers \\\\ [], options \\\\ [])","anchor":"request!/5"},{"id":"run/1","title":"run(args)","anchor":"run/1"},{"id":"start/0","title":"start()","anchor":"start/0"},{"id":"stream_next/1","title":"stream_next(resp)","anchor":"stream_next/1"},{"id":"write_schema/3","title":"write_schema(dir, package_name, data)","anchor":"write_schema/3"}],"key":"functions"}]}]} \ No newline at end of file diff --git a/dist/sidebar_items-E3A9783E.js b/dist/sidebar_items-E3A9783E.js new file mode 100644 index 0000000000..5009e7abbd --- /dev/null +++ b/dist/sidebar_items-E3A9783E.js @@ -0,0 +1 @@ +sidebarNodes={"modules":[{"id":"Lightning","group":"","title":"Lightning","sections":[]},{"id":"Lightning.AdaptorRegistry","group":"","title":"Lightning.AdaptorRegistry","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"all/1","title":"all(server \\\\ __MODULE__)","anchor":"all/1"},{"id":"child_spec/1","title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"fetch/0","title":"fetch()","anchor":"fetch/0"},{"id":"latest_for/2","title":"latest_for(server \\\\ __MODULE__, module_name)","anchor":"latest_for/2"},{"id":"resolve_adaptor/1","title":"resolve_adaptor(adaptor)","anchor":"resolve_adaptor/1"},{"id":"resolve_package_name/1","title":"resolve_package_name(package_name)","anchor":"resolve_package_name/1"},{"id":"resolve_package_name!/1","title":"resolve_package_name!(package_name)","anchor":"resolve_package_name!/1"},{"id":"start_link/1","title":"start_link(opts \\\\ [use_cache: true])","anchor":"start_link/1"},{"id":"versions_for/2","title":"versions_for(server \\\\ __MODULE__, module_name)","anchor":"versions_for/2"}],"key":"functions"}]},{"id":"Lightning.AdaptorRegistry.Npm","group":"","title":"Lightning.AdaptorRegistry.Npm","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"body/0","title":"body()","anchor":"t:body/0"},{"id":"headers/0","title":"headers()","anchor":"t:headers/0"},{"id":"method/0","title":"method()","anchor":"t:method/0"},{"id":"options/0","title":"options()","anchor":"t:options/0"},{"id":"params/0","title":"params()","anchor":"t:params/0"},{"id":"request/0","title":"request()","anchor":"t:request/0"},{"id":"url/0","title":"url()","anchor":"t:url/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"delete/3","title":"delete(url, headers \\\\ [], options \\\\ [])","anchor":"delete/3"},{"id":"delete!/3","title":"delete!(url, headers \\\\ [], options \\\\ [])","anchor":"delete!/3"},{"id":"get/3","title":"get(url, headers \\\\ [], options \\\\ [])","anchor":"get/3"},{"id":"get!/3","title":"get!(url, headers \\\\ [], options \\\\ [])","anchor":"get!/3"},{"id":"head/3","title":"head(url, headers \\\\ [], options \\\\ [])","anchor":"head/3"},{"id":"head!/3","title":"head!(url, headers \\\\ [], options \\\\ [])","anchor":"head!/3"},{"id":"options/3","title":"options(url, headers \\\\ [], options \\\\ [])","anchor":"options/3"},{"id":"options!/3","title":"options!(url, headers \\\\ [], options \\\\ [])","anchor":"options!/3"},{"id":"package_detail/1","title":"package_detail(package_name)","anchor":"package_detail/1"},{"id":"patch/4","title":"patch(url, body, headers \\\\ [], options \\\\ [])","anchor":"patch/4"},{"id":"patch!/4","title":"patch!(url, body, headers \\\\ [], options \\\\ [])","anchor":"patch!/4"},{"id":"post/4","title":"post(url, body, headers \\\\ [], options \\\\ [])","anchor":"post/4"},{"id":"post!/4","title":"post!(url, body, headers \\\\ [], options \\\\ [])","anchor":"post!/4"},{"id":"process_headers/1","title":"process_headers(headers)","anchor":"process_headers/1"},{"id":"process_request_body/1","title":"process_request_body(body)","anchor":"process_request_body/1"},{"id":"process_request_headers/1","title":"process_request_headers(headers)","anchor":"process_request_headers/1"},{"id":"process_request_options/1","title":"process_request_options(options)","anchor":"process_request_options/1"},{"id":"process_request_params/1","title":"process_request_params(params)","anchor":"process_request_params/1"},{"id":"process_response/1","title":"process_response(response)","anchor":"process_response/1"},{"id":"process_response_chunk/1","title":"process_response_chunk(chunk)","anchor":"process_response_chunk/1"},{"id":"process_response_headers/1","title":"process_response_headers(headers)","anchor":"process_response_headers/1"},{"id":"process_response_status_code/1","title":"process_response_status_code(status_code)","anchor":"process_response_status_code/1"},{"id":"process_status_code/1","title":"process_status_code(status_code)","anchor":"process_status_code/1"},{"id":"process_url/1","title":"process_url(url)","anchor":"process_url/1"},{"id":"put/4","title":"put(url, body \\\\ \"\", headers \\\\ [], options \\\\ [])","anchor":"put/4"},{"id":"put!/4","title":"put!(url, body \\\\ \"\", headers \\\\ [], options \\\\ [])","anchor":"put!/4"},{"id":"request/1","title":"request(request)","anchor":"request/1"},{"id":"request/5","title":"request(method, url, body \\\\ \"\", headers \\\\ [], options \\\\ [])","anchor":"request/5"},{"id":"request!/5","title":"request!(method, url, body \\\\ \"\", headers \\\\ [], options \\\\ [])","anchor":"request!/5"},{"id":"start/0","title":"start()","anchor":"start/0"},{"id":"stream_next/1","title":"stream_next(resp)","anchor":"stream_next/1"},{"id":"user_packages/1","title":"user_packages(user)","anchor":"user_packages/1"}],"key":"functions"}]},{"id":"Lightning.AdaptorService","group":"","title":"Lightning.AdaptorService","sections":[{"id":"Configuration","anchor":"module-configuration"},{"id":"Installing Adaptors","anchor":"module-installing-adaptors"},{"id":"Looking up adaptors","anchor":"module-looking-up-adaptors"}],"nodeGroups":[{"name":"Types","nodes":[{"id":"package_spec/0","title":"package_spec()","anchor":"t:package_spec/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"build_aliased_name/1","title":"build_aliased_name(arg)","anchor":"build_aliased_name/1"},{"id":"child_spec/1","title":"child_spec(arg)","anchor":"child_spec/1"},{"id":"find_adaptor/2","title":"find_adaptor(agent, package)","anchor":"find_adaptor/2"},{"id":"get_adaptors/1","title":"get_adaptors(agent)","anchor":"get_adaptors/1"},{"id":"install/2","title":"install(agent, package)","anchor":"install/2"},{"id":"install!/2","title":"install!(agent, package_spec)","anchor":"install!/2"},{"id":"installed?/2","title":"installed?(agent, package_spec)","anchor":"installed?/2"},{"id":"resolve_package_name/1","title":"resolve_package_name(package_name)","anchor":"resolve_package_name/1"},{"id":"start_link/1","title":"start_link(opts)","anchor":"start_link/1"}],"key":"functions"}]},{"id":"Lightning.Attempt","group":"","title":"Lightning.Attempt","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"new/1","title":"new(attrs \\\\ %{})","anchor":"new/1"}],"key":"functions"}]},{"id":"Lightning.AttemptRun","group":"","title":"Lightning.AttemptRun","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"new/1","title":"new(attrs \\\\ %{})","anchor":"new/1"},{"id":"new/2","title":"new(attempt, run)","anchor":"new/2"}],"key":"functions"}]},{"id":"Lightning.AttemptService","group":"","title":"Lightning.AttemptService","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"append/2","title":"append(attempt, run)","anchor":"append/2"},{"id":"build_attempt/2","title":"build_attempt(work_order, reason)","anchor":"build_attempt/2"},{"id":"calculate_runs/3","title":"calculate_runs(workflow, existing_runs, starting_run)","anchor":"calculate_runs/3"},{"id":"create_attempt/3","title":"create_attempt(work_order, job, reason)","anchor":"create_attempt/3"},{"id":"get_for_rerun/2","title":"get_for_rerun(attempt_id, run_id)","anchor":"get_for_rerun/2"},{"id":"get_last_attempt_for/1","title":"get_last_attempt_for(run)","anchor":"get_last_attempt_for/1"},{"id":"get_workflow_for/1","title":"get_workflow_for(attempt)","anchor":"get_workflow_for/1"},{"id":"list_for_rerun_from_job/2","title":"list_for_rerun_from_job(order_ids, job_id)","anchor":"list_for_rerun_from_job/2"},{"id":"list_for_rerun_from_start/1","title":"list_for_rerun_from_start(order_ids)","anchor":"list_for_rerun_from_start/1"},{"id":"retry/3","title":"retry(attempt, run, reason)","anchor":"retry/3"},{"id":"retry_many/2","title":"retry_many(attempt_runs, reasons)","anchor":"retry_many/2"}],"key":"functions"}]},{"id":"Lightning.Auditing","group":"","title":"Lightning.Auditing","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"list_all/1","title":"list_all(params \\\\ %{})","anchor":"list_all/1"}],"key":"functions"}]},{"id":"Lightning.Auditing.Model","group":"","title":"Lightning.Auditing.Model","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"event/5","title":"event(schema, event, row_id, actor_id, metadata \\\\ %{})","anchor":"event/5"},{"id":"save/2","title":"save(changes, repo)","anchor":"save/2"}],"key":"functions"}]},{"id":"Lightning.AuthProviders","group":"","title":"Lightning.AuthProviders","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"build_handler/2","title":"build_handler(name, opts)","anchor":"build_handler/2"},{"id":"create/1","title":"create(attrs)","anchor":"create/1"},{"id":"create_handler/1","title":"create_handler(config)","anchor":"create_handler/1"},{"id":"delete!/1","title":"delete!(model)","anchor":"delete!/1"},{"id":"get_authorize_url/1","title":"get_authorize_url(name)","anchor":"get_authorize_url/1"},{"id":"get_existing/0","title":"get_existing()","anchor":"get_existing/0"},{"id":"get_existing/1","title":"get_existing(name)","anchor":"get_existing/1"},{"id":"get_handler/1","title":"get_handler(name)","anchor":"get_handler/1"},{"id":"get_handlers/0","title":"get_handlers()","anchor":"get_handlers/0"},{"id":"new/0","title":"new()","anchor":"new/0"},{"id":"remove_handler/1","title":"remove_handler(name)","anchor":"remove_handler/1"},{"id":"update/2","title":"update(model, attrs)","anchor":"update/2"}],"key":"functions"}]},{"id":"Lightning.AuthProviders.AuthConfig","group":"","title":"Lightning.AuthProviders.AuthConfig","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"}]},{"id":"Lightning.AuthProviders.CacheWarmer","group":"","title":"Lightning.AuthProviders.CacheWarmer","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"execute/1","title":"execute(state)","anchor":"execute/1"},{"id":"interval/0","title":"interval()","anchor":"interval/0"}],"key":"functions"}]},{"id":"Lightning.AuthProviders.Google","group":"","title":"Lightning.AuthProviders.Google","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"authorize_url/2","title":"authorize_url(client, state)","anchor":"authorize_url/2"},{"id":"build_client/1","title":"build_client(opts \\\\ [])","anchor":"build_client/1"},{"id":"get_config/0","title":"get_config()","anchor":"get_config/0"},{"id":"get_token/2","title":"get_token(client, params)","anchor":"get_token/2"},{"id":"get_userinfo/2","title":"get_userinfo(client, token)","anchor":"get_userinfo/2"},{"id":"get_wellknown/0","title":"get_wellknown()","anchor":"get_wellknown/0"},{"id":"get_wellknown!/0","title":"get_wellknown!()","anchor":"get_wellknown!/0"},{"id":"refresh_token/2","title":"refresh_token(client, token)","anchor":"refresh_token/2"}],"key":"functions"}]},{"id":"Lightning.AuthProviders.Handler","group":"","title":"Lightning.AuthProviders.Handler","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"opts/0","title":"opts()","anchor":"t:opts/0"},{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"authorize_url/1","title":"authorize_url(handler)","anchor":"authorize_url/1"},{"id":"from_model/1","title":"from_model(model)","anchor":"from_model/1"},{"id":"get_token/2","title":"get_token(handler, code)","anchor":"get_token/2"},{"id":"get_userinfo/2","title":"get_userinfo(handler, token)","anchor":"get_userinfo/2"},{"id":"new/2","title":"new(name, opts)","anchor":"new/2"}],"key":"functions"}]},{"id":"Lightning.AuthProviders.Store","group":"","title":"Lightning.AuthProviders.Store","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"finder/0","title":"finder()","anchor":"t:finder/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"get_handler/2","title":"get_handler(name, finder \\\\ &default/1)","anchor":"get_handler/2"},{"id":"get_handlers/0","title":"get_handlers()","anchor":"get_handlers/0"},{"id":"put_handler/2","title":"put_handler(name, handler)","anchor":"put_handler/2"},{"id":"remove_handler/1","title":"remove_handler(name)","anchor":"remove_handler/1"}],"key":"functions"}]},{"id":"Lightning.AuthProviders.WellKnown","group":"","title":"Lightning.AuthProviders.WellKnown","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"body/0","title":"body()","anchor":"t:body/0"},{"id":"headers/0","title":"headers()","anchor":"t:headers/0"},{"id":"method/0","title":"method()","anchor":"t:method/0"},{"id":"options/0","title":"options()","anchor":"t:options/0"},{"id":"params/0","title":"params()","anchor":"t:params/0"},{"id":"request/0","title":"request()","anchor":"t:request/0"},{"id":"t/0","title":"t()","anchor":"t:t/0"},{"id":"url/0","title":"url()","anchor":"t:url/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"delete/3","title":"delete(url, headers \\\\ [], options \\\\ [])","anchor":"delete/3"},{"id":"delete!/3","title":"delete!(url, headers \\\\ [], options \\\\ [])","anchor":"delete!/3"},{"id":"fetch/1","title":"fetch(discovery_url)","anchor":"fetch/1"},{"id":"fetch!/1","title":"fetch!(discovery_url)","anchor":"fetch!/1"},{"id":"get/3","title":"get(url, headers \\\\ [], options \\\\ [])","anchor":"get/3"},{"id":"get!/3","title":"get!(url, headers \\\\ [], options \\\\ [])","anchor":"get!/3"},{"id":"head/3","title":"head(url, headers \\\\ [], options \\\\ [])","anchor":"head/3"},{"id":"head!/3","title":"head!(url, headers \\\\ [], options \\\\ [])","anchor":"head!/3"},{"id":"new/1","title":"new(json_body)","anchor":"new/1"},{"id":"options/3","title":"options(url, headers \\\\ [], options \\\\ [])","anchor":"options/3"},{"id":"options!/3","title":"options!(url, headers \\\\ [], options \\\\ [])","anchor":"options!/3"},{"id":"patch/4","title":"patch(url, body, headers \\\\ [], options \\\\ [])","anchor":"patch/4"},{"id":"patch!/4","title":"patch!(url, body, headers \\\\ [], options \\\\ [])","anchor":"patch!/4"},{"id":"post/4","title":"post(url, body, headers \\\\ [], options \\\\ [])","anchor":"post/4"},{"id":"post!/4","title":"post!(url, body, headers \\\\ [], options \\\\ [])","anchor":"post!/4"},{"id":"process_headers/1","title":"process_headers(headers)","anchor":"process_headers/1"},{"id":"process_request_body/1","title":"process_request_body(body)","anchor":"process_request_body/1"},{"id":"process_request_headers/1","title":"process_request_headers(headers)","anchor":"process_request_headers/1"},{"id":"process_request_options/1","title":"process_request_options(options)","anchor":"process_request_options/1"},{"id":"process_request_params/1","title":"process_request_params(params)","anchor":"process_request_params/1"},{"id":"process_request_url/1","title":"process_request_url(url)","anchor":"process_request_url/1"},{"id":"process_response/1","title":"process_response(response)","anchor":"process_response/1"},{"id":"process_response_body/1","title":"process_response_body(body)","anchor":"process_response_body/1"},{"id":"process_response_chunk/1","title":"process_response_chunk(chunk)","anchor":"process_response_chunk/1"},{"id":"process_response_headers/1","title":"process_response_headers(headers)","anchor":"process_response_headers/1"},{"id":"process_response_status_code/1","title":"process_response_status_code(status_code)","anchor":"process_response_status_code/1"},{"id":"process_status_code/1","title":"process_status_code(status_code)","anchor":"process_status_code/1"},{"id":"process_url/1","title":"process_url(url)","anchor":"process_url/1"},{"id":"put/4","title":"put(url, body \\\\ \"\", headers \\\\ [], options \\\\ [])","anchor":"put/4"},{"id":"put!/4","title":"put!(url, body \\\\ \"\", headers \\\\ [], options \\\\ [])","anchor":"put!/4"},{"id":"request/1","title":"request(request)","anchor":"request/1"},{"id":"request/5","title":"request(method, url, body \\\\ \"\", headers \\\\ [], options \\\\ [])","anchor":"request/5"},{"id":"request!/5","title":"request!(method, url, body \\\\ \"\", headers \\\\ [], options \\\\ [])","anchor":"request!/5"},{"id":"start/0","title":"start()","anchor":"start/0"},{"id":"stream_next/1","title":"stream_next(resp)","anchor":"stream_next/1"}],"key":"functions"}]},{"id":"Lightning.CLI","group":"","title":"Lightning.CLI","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"execute/1","title":"execute(command)","anchor":"execute/1"},{"id":"metadata/2","title":"metadata(state, adaptor_path)","anchor":"metadata/2"}],"key":"functions"}]},{"id":"Lightning.CLI.Result","group":"","title":"Lightning.CLI.Result","sections":[{"id":"Logs","anchor":"module-logs"}],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"get_messages/1","title":"get_messages(result)","anchor":"get_messages/1"},{"id":"new/1","title":"new(data)","anchor":"new/1"},{"id":"parse/2","title":"parse(result, extra \\\\ [])","anchor":"parse/2"}],"key":"functions"}]},{"id":"Lightning.Demo","group":"","title":"Lightning.Demo","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"reset_demo/0","title":"reset_demo()","anchor":"reset_demo/0"}],"key":"functions"}]},{"id":"Lightning.ExportUtils","group":"","title":"Lightning.ExportUtils","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"build_yaml_tree/2","title":"build_yaml_tree(workflows, project)","anchor":"build_yaml_tree/2"},{"id":"generate_new_yaml/1","title":"generate_new_yaml(project_id)","anchor":"generate_new_yaml/1"}],"key":"functions"}]},{"id":"Lightning.FailureNotifierView","group":"","title":"Lightning.FailureNotifierView","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","title":"__resource__()","anchor":"__resource__/0"},{"id":"failure_alert.html/1","title":"failure_alert.html(assigns)","anchor":"failure_alert.html/1"},{"id":"render/2","title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"template_not_found/2","title":"template_not_found(template, assigns)","anchor":"template_not_found/2"}],"key":"functions"}]},{"id":"Lightning.Helpers","group":"","title":"Lightning.Helpers","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"coerce_json_field/2","title":"coerce_json_field(attrs, field)","anchor":"coerce_json_field/2"},{"id":"indefinite_article/1","title":"indefinite_article(noun)","anchor":"indefinite_article/1"},{"id":"json_safe/1","title":"json_safe(data)","anchor":"json_safe/1"},{"id":"ms_to_human/1","title":"ms_to_human(milliseconds)","anchor":"ms_to_human/1"}],"key":"functions"}]},{"id":"Lightning.MetadataService","group":"","title":"Lightning.MetadataService","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"fetch/2","title":"fetch(adaptor, credential)","anchor":"fetch/2"}],"key":"functions"}]},{"id":"Lightning.Name","group":"","title":"Lightning.Name","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"generate/1","title":"generate(max_id \\\\ 9999)","anchor":"generate/1"}],"key":"functions"}]},{"id":"Lightning.ObanManager","group":"","title":"Lightning.ObanManager","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/4","title":"handle_event(list, measure, meta, pid)","anchor":"handle_event/4"}],"key":"functions"}]},{"id":"Lightning.Policies.Permissions","group":"","title":"Lightning.Policies.Permissions","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"can/4","title":"can(policy, action, user, params \\\\ [])","anchor":"can/4"},{"id":"can?/4","title":"can?(policy, action, user, params \\\\ [])","anchor":"can?/4"}],"key":"functions"}]},{"id":"Lightning.Policies.ProjectUsers","group":"","title":"Lightning.Policies.ProjectUsers","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"actions/0","title":"actions()","anchor":"t:actions/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"authorize/3","title":"authorize(action, user, project)","anchor":"authorize/3"}],"key":"functions"}]},{"id":"Lightning.Policies.Provisioning","group":"","title":"Lightning.Policies.Provisioning","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"actions/0","title":"actions()","anchor":"t:actions/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"authorize/3","title":"authorize(arg1, user, project)","anchor":"authorize/3"}],"key":"functions"}]},{"id":"Lightning.Policies.Users","group":"","title":"Lightning.Policies.Users","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"actions/0","title":"actions()","anchor":"t:actions/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"authorize/3","title":"authorize(action, authenticated_user, account_user)","anchor":"authorize/3"}],"key":"functions"}]},{"id":"Lightning.Release","group":"","title":"Lightning.Release","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create_db/0","title":"create_db()","anchor":"create_db/0"},{"id":"load_app/0","title":"load_app()","anchor":"load_app/0"},{"id":"migrate/0","title":"migrate()","anchor":"migrate/0"},{"id":"rollback/2","title":"rollback(repo, version)","anchor":"rollback/2"}],"key":"functions"}]},{"id":"Lightning.Repo","group":"","title":"Lightning.Repo","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"aggregate/3","title":"aggregate(queryable, aggregate, opts \\\\ [])","anchor":"aggregate/3"},{"id":"aggregate/4","title":"aggregate(queryable, aggregate, field, opts)","anchor":"aggregate/4"},{"id":"all/2","title":"all(queryable, opts \\\\ [])","anchor":"all/2"},{"id":"checked_out?/0","title":"checked_out?()","anchor":"checked_out?/0"},{"id":"checkout/2","title":"checkout(fun, opts \\\\ [])","anchor":"checkout/2"},{"id":"child_spec/1","title":"child_spec(opts)","anchor":"child_spec/1"},{"id":"config/0","title":"config()","anchor":"config/0"},{"id":"default_options/1","title":"default_options(operation)","anchor":"default_options/1"},{"id":"delete/2","title":"delete(struct, opts \\\\ [])","anchor":"delete/2"},{"id":"delete!/2","title":"delete!(struct, opts \\\\ [])","anchor":"delete!/2"},{"id":"delete_all/2","title":"delete_all(queryable, opts \\\\ [])","anchor":"delete_all/2"},{"id":"disconnect_all/2","title":"disconnect_all(interval, opts \\\\ [])","anchor":"disconnect_all/2"},{"id":"exists?/2","title":"exists?(queryable, opts \\\\ [])","anchor":"exists?/2"},{"id":"explain/3","title":"explain(operation, queryable, opts \\\\ [])","anchor":"explain/3"},{"id":"get/3","title":"get(queryable, id, opts \\\\ [])","anchor":"get/3"},{"id":"get!/3","title":"get!(queryable, id, opts \\\\ [])","anchor":"get!/3"},{"id":"get_by/3","title":"get_by(queryable, clauses, opts \\\\ [])","anchor":"get_by/3"},{"id":"get_by!/3","title":"get_by!(queryable, clauses, opts \\\\ [])","anchor":"get_by!/3"},{"id":"get_dynamic_repo/0","title":"get_dynamic_repo()","anchor":"get_dynamic_repo/0"},{"id":"in_transaction?/0","title":"in_transaction?()","anchor":"in_transaction?/0"},{"id":"insert/2","title":"insert(struct, opts \\\\ [])","anchor":"insert/2"},{"id":"insert!/2","title":"insert!(struct, opts \\\\ [])","anchor":"insert!/2"},{"id":"insert_all/3","title":"insert_all(schema_or_source, entries, opts \\\\ [])","anchor":"insert_all/3"},{"id":"insert_or_update/2","title":"insert_or_update(changeset, opts \\\\ [])","anchor":"insert_or_update/2"},{"id":"insert_or_update!/2","title":"insert_or_update!(changeset, opts \\\\ [])","anchor":"insert_or_update!/2"},{"id":"load/2","title":"load(schema_or_types, data)","anchor":"load/2"},{"id":"one/2","title":"one(queryable, opts \\\\ [])","anchor":"one/2"},{"id":"one!/2","title":"one!(queryable, opts \\\\ [])","anchor":"one!/2"},{"id":"paginate/2","title":"paginate(pageable, options \\\\ [])","anchor":"paginate/2"},{"id":"preload/3","title":"preload(struct_or_structs_or_nil, preloads, opts \\\\ [])","anchor":"preload/3"},{"id":"prepare_query/3","title":"prepare_query(operation, query, opts)","anchor":"prepare_query/3"},{"id":"put_dynamic_repo/1","title":"put_dynamic_repo(dynamic)","anchor":"put_dynamic_repo/1"},{"id":"query/3","title":"query(sql, params \\\\ [], opts \\\\ [])","anchor":"query/3"},{"id":"query!/3","title":"query!(sql, params \\\\ [], opts \\\\ [])","anchor":"query!/3"},{"id":"query_many/3","title":"query_many(sql, params \\\\ [], opts \\\\ [])","anchor":"query_many/3"},{"id":"query_many!/3","title":"query_many!(sql, params \\\\ [], opts \\\\ [])","anchor":"query_many!/3"},{"id":"reload/2","title":"reload(queryable, opts \\\\ [])","anchor":"reload/2"},{"id":"reload!/2","title":"reload!(queryable, opts \\\\ [])","anchor":"reload!/2"},{"id":"rollback/1","title":"rollback(value)","anchor":"rollback/1"},{"id":"scrivener_defaults/0","title":"scrivener_defaults()","anchor":"scrivener_defaults/0"},{"id":"start_link/1","title":"start_link(opts \\\\ [])","anchor":"start_link/1"},{"id":"stop/1","title":"stop(timeout \\\\ 5000)","anchor":"stop/1"},{"id":"stream/2","title":"stream(queryable, opts \\\\ [])","anchor":"stream/2"},{"id":"to_sql/2","title":"to_sql(operation, queryable)","anchor":"to_sql/2"},{"id":"transaction/2","title":"transaction(fun_or_multi, opts \\\\ [])","anchor":"transaction/2"},{"id":"update/2","title":"update(struct, opts \\\\ [])","anchor":"update/2"},{"id":"update!/2","title":"update!(struct, opts \\\\ [])","anchor":"update!/2"},{"id":"update_all/3","title":"update_all(queryable, updates, opts \\\\ [])","anchor":"update_all/3"}],"key":"functions"}]},{"id":"Lightning.RunSearchForm","group":"","title":"Lightning.RunSearchForm","sections":[]},{"id":"Lightning.SafetyString","group":"","title":"Lightning.SafetyString","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"decode/1","title":"decode(data)","anchor":"decode/1"},{"id":"encode/1","title":"encode(data)","anchor":"encode/1"}],"key":"functions"}]},{"id":"Lightning.Scrubber","group":"","title":"Lightning.Scrubber","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","title":"child_spec(arg)","anchor":"child_spec/1"},{"id":"encode_samples/1","title":"encode_samples(samples)","anchor":"encode_samples/1"},{"id":"samples/1","title":"samples(agent)","anchor":"samples/1"},{"id":"scrub/2","title":"scrub(agent, lines)","anchor":"scrub/2"},{"id":"start_link/1","title":"start_link(opts)","anchor":"start_link/1"}],"key":"functions"}]},{"id":"Lightning.SetupUtils","group":"","title":"Lightning.SetupUtils","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"add_and_update_runs/3","title":"add_and_update_runs(multi, run_params, output_dataclip_id)","anchor":"add_and_update_runs/3"},{"id":"create_dhis2_project/1","title":"create_dhis2_project(project_users)","anchor":"create_dhis2_project/1"},{"id":"create_openhie_project/1","title":"create_openhie_project(project_users)","anchor":"create_openhie_project/1"},{"id":"create_starter_project/2","title":"create_starter_project(name, project_users)","anchor":"create_starter_project/2"},{"id":"setup_demo/1","title":"setup_demo(opts \\\\ [create_super: false])","anchor":"setup_demo/1"},{"id":"tear_down/1","title":"tear_down(opts \\\\ [destroy_super: false])","anchor":"tear_down/1"}],"key":"functions"}]},{"id":"Lightning.TaskWorker","group":"","title":"Lightning.TaskWorker","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"get_status/1","title":"get_status(worker)","anchor":"get_status/1"},{"id":"start_link/1","title":"start_link(opts \\\\ [name: nil])","anchor":"start_link/1"},{"id":"start_task/2","title":"start_task(worker, fun)","anchor":"start_task/2"}],"key":"functions"}]},{"id":"Lightning.Validators","group":"","title":"Lightning.Validators","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"validate_exclusive/3","title":"validate_exclusive(changeset, fields, message)","anchor":"validate_exclusive/3"},{"id":"validate_one_required/3","title":"validate_one_required(changeset, fields, message)","anchor":"validate_one_required/3"}],"key":"functions"}]},{"id":"Lightning.Vault","group":"","title":"Lightning.Vault","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"start_link/1","title":"start_link(config \\\\ [])","anchor":"start_link/1"}],"key":"functions"}]},{"id":"Lightning.VersionControl","group":"","title":"Lightning.VersionControl","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"add_github_installation_id/2","title":"add_github_installation_id(user_id, installation_id)","anchor":"add_github_installation_id/2"},{"id":"add_github_repo_and_branch/3","title":"add_github_repo_and_branch(project_id, repo, branch)","anchor":"add_github_repo_and_branch/3"},{"id":"create_github_connection/1","title":"create_github_connection(attrs)","anchor":"create_github_connection/1"},{"id":"fetch_installation_repos/1","title":"fetch_installation_repos(project_id)","anchor":"fetch_installation_repos/1"},{"id":"fetch_repo_branches/2","title":"fetch_repo_branches(project_id, repo_name)","anchor":"fetch_repo_branches/2"},{"id":"get_repo_connection/1","title":"get_repo_connection(project_id)","anchor":"get_repo_connection/1"},{"id":"github_enabled?/0","title":"github_enabled?()","anchor":"github_enabled?/0"},{"id":"remove_github_connection/1","title":"remove_github_connection(project_id)","anchor":"remove_github_connection/1"},{"id":"run_sync/2","title":"run_sync(project_id, user_name)","anchor":"run_sync/2"}],"key":"functions"}]},{"id":"Lightning.VersionControl.GithubClient","group":"","title":"Lightning.VersionControl.GithubClient","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"option/0","title":"option()","anchor":"t:option/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"delete/3","title":"delete(client, url, opts)","anchor":"delete/3"},{"id":"delete!/3","title":"delete!(client, url, opts)","anchor":"delete!/3"},{"id":"fire_repository_dispatch/3","title":"fire_repository_dispatch(installation_id, repo_name, user_email)","anchor":"fire_repository_dispatch/3"},{"id":"get/3","title":"get(client, url, opts)","anchor":"get/3"},{"id":"get!/3","title":"get!(client, url, opts)","anchor":"get!/3"},{"id":"get_repo_branches/2","title":"get_repo_branches(installation_id, repo_name)","anchor":"get_repo_branches/2"},{"id":"head/3","title":"head(client, url, opts)","anchor":"head/3"},{"id":"head!/3","title":"head!(client, url, opts)","anchor":"head!/3"},{"id":"installation_repos/1","title":"installation_repos(installation_id)","anchor":"installation_repos/1"},{"id":"options/3","title":"options(client, url, opts)","anchor":"options/3"},{"id":"options!/3","title":"options!(client, url, opts)","anchor":"options!/3"},{"id":"patch/4","title":"patch(client, url, body, opts)","anchor":"patch/4"},{"id":"patch!/4","title":"patch!(client, url, body, opts)","anchor":"patch!/4"},{"id":"post/4","title":"post(client, url, body, opts)","anchor":"post/4"},{"id":"post!/4","title":"post!(client, url, body, opts)","anchor":"post!/4"},{"id":"put/4","title":"put(client, url, body, opts)","anchor":"put/4"},{"id":"put!/4","title":"put!(client, url, body, opts)","anchor":"put!/4"},{"id":"request/2","title":"request(client \\\\ %Tesla.Client{}, options)","anchor":"request/2"},{"id":"request!/2","title":"request!(client \\\\ %Tesla.Client{}, options)","anchor":"request!/2"},{"id":"send_sentry_error/1","title":"send_sentry_error(msg)","anchor":"send_sentry_error/1"},{"id":"trace/3","title":"trace(client, url, opts)","anchor":"trace/3"},{"id":"trace!/3","title":"trace!(client, url, opts)","anchor":"trace!/3"}],"key":"functions"}]},{"id":"Lightning.VersionControl.GithubToken","group":"","title":"Lightning.VersionControl.GithubToken","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"build/2","title":"build(cert, app_id)","anchor":"build/2"},{"id":"generate_and_sign/2","title":"generate_and_sign(extra_claims \\\\ %{}, key \\\\ __default_signer__())","anchor":"generate_and_sign/2"},{"id":"generate_and_sign!/2","title":"generate_and_sign!(extra_claims \\\\ %{}, key \\\\ __default_signer__())","anchor":"generate_and_sign!/2"},{"id":"verify_and_validate/3","title":"verify_and_validate(bearer_token, key \\\\ __default_signer__(), context \\\\ %{})","anchor":"verify_and_validate/3"},{"id":"verify_and_validate!/3","title":"verify_and_validate!(bearer_token, key \\\\ __default_signer__(), context \\\\ %{})","anchor":"verify_and_validate!/3"}],"key":"functions"}]},{"id":"Lightning.VersionControl.ProjectRepo","group":"","title":"Lightning.VersionControl.ProjectRepo","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"changeset/2","title":"changeset(project_repo, attrs)","anchor":"changeset/2"}],"key":"functions"}]},{"id":"Lightning.WorkOrder","group":"","title":"Lightning.WorkOrder","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"new/0","title":"new()","anchor":"new/0"}],"key":"functions"}]},{"id":"Lightning.WorkOrderService","group":"","title":"Lightning.WorkOrderService","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"attempt_updated/1","title":"attempt_updated(run)","anchor":"attempt_updated/1"},{"id":"build/2","title":"build(workflow, reason)","anchor":"build/2"},{"id":"create_manual_workorder/3","title":"create_manual_workorder(job, dataclip, user)","anchor":"create_manual_workorder/3"},{"id":"create_webhook_workorder/2","title":"create_webhook_workorder(edge, dataclip_body)","anchor":"create_webhook_workorder/2"},{"id":"create_work_order/1","title":"create_work_order(attrs \\\\ %{})","anchor":"create_work_order/1"},{"id":"multi_for/3","title":"multi_for(type, edge, dataclip_body)","anchor":"multi_for/3"},{"id":"multi_for_manual/3","title":"multi_for_manual(job, dataclip, user)","anchor":"multi_for_manual/3"},{"id":"retry_attempt_run/2","title":"retry_attempt_run(attempt_run, user)","anchor":"retry_attempt_run/2"},{"id":"retry_attempt_runs/2","title":"retry_attempt_runs(attempt_runs, user)","anchor":"retry_attempt_runs/2"},{"id":"subscribe/1","title":"subscribe(project_id)","anchor":"subscribe/1"}],"key":"functions"}]},{"id":"Lightning.Workflows","group":"","title":"Lightning.Workflows","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"build_trigger/1","title":"build_trigger(attrs)","anchor":"build_trigger/1"},{"id":"change_workflow/2","title":"change_workflow(workflow, attrs \\\\ %{})","anchor":"change_workflow/2"},{"id":"create_edge/1","title":"create_edge(attrs)","anchor":"create_edge/1"},{"id":"create_workflow/1","title":"create_workflow(attrs \\\\ %{})","anchor":"create_workflow/1"},{"id":"delete_workflow/1","title":"delete_workflow(workflow)","anchor":"delete_workflow/1"},{"id":"get_edge_by_webhook/1","title":"get_edge_by_webhook(path)","anchor":"get_edge_by_webhook/1"},{"id":"get_edges_for_cron_execution/1","title":"get_edges_for_cron_execution(datetime)","anchor":"get_edges_for_cron_execution/1"},{"id":"get_workflow/1","title":"get_workflow(id)","anchor":"get_workflow/1"},{"id":"get_workflow!/1","title":"get_workflow!(id)","anchor":"get_workflow!/1"},{"id":"get_workflows_for/1","title":"get_workflows_for(project)","anchor":"get_workflows_for/1"},{"id":"get_workflows_for_query/1","title":"get_workflows_for_query(project)","anchor":"get_workflows_for_query/1"},{"id":"list_workflows/0","title":"list_workflows()","anchor":"list_workflows/0"},{"id":"mark_for_deletion/2","title":"mark_for_deletion(workflow, attrs \\\\ %{})","anchor":"mark_for_deletion/2"},{"id":"to_project_space/1","title":"to_project_space(workflows)","anchor":"to_project_space/1"},{"id":"update_trigger/2","title":"update_trigger(trigger, attrs)","anchor":"update_trigger/2"},{"id":"update_workflow/2","title":"update_workflow(workflow, attrs)","anchor":"update_workflow/2"}],"key":"functions"}]},{"id":"Lightning.Workflows.Edge","group":"","title":"Lightning.Workflows.Edge","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"edge_condition/0","title":"edge_condition()","anchor":"t:edge_condition/0"},{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"changeset/2","title":"changeset(edge, attrs)","anchor":"changeset/2"},{"id":"new/1","title":"new(attrs)","anchor":"new/1"},{"id":"validate/1","title":"validate(changeset)","anchor":"validate/1"}],"key":"functions"}]},{"id":"Lightning.Workflows.Graph","group":"","title":"Lightning.Workflows.Graph","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"},{"id":"vertex/0","title":"vertex()","anchor":"t:vertex/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"new/1","title":"new(workflow)","anchor":"new/1"},{"id":"remove/2","title":"remove(graph, job_id)","anchor":"remove/2"},{"id":"vertices/1","title":"vertices(graph)","anchor":"vertices/1"}],"key":"functions"}]},{"id":"Lightning.Workflows.Workflow","group":"","title":"Lightning.Workflows.Workflow","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"request_deletion_changeset/2","title":"request_deletion_changeset(workflow, attrs)","anchor":"request_deletion_changeset/2"},{"id":"validate/1","title":"validate(changeset)","anchor":"validate/1"}],"key":"functions"}]},{"id":"Lightning.Workorders.SearchParams","group":"","title":"Lightning.Workorders.SearchParams","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"new/1","title":"new(params)","anchor":"new/1"},{"id":"to_uri_params/1","title":"to_uri_params(search_params)","anchor":"to_uri_params/1"}],"key":"functions"}]},{"id":"LightningWeb","group":"","title":"LightningWeb","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__using__/1","title":"__using__(which)","anchor":"__using__/1"},{"id":"channel/0","title":"channel()","anchor":"channel/0"},{"id":"component/0","title":"component()","anchor":"component/0"},{"id":"controller/0","title":"controller()","anchor":"controller/0"},{"id":"html/0","title":"html()","anchor":"html/0"},{"id":"live_component/0","title":"live_component()","anchor":"live_component/0"},{"id":"live_view/1","title":"live_view(opts \\\\ [])","anchor":"live_view/1"},{"id":"router/0","title":"router()","anchor":"router/0"},{"id":"static_paths/0","title":"static_paths()","anchor":"static_paths/0"},{"id":"verified_routes/0","title":"verified_routes()","anchor":"verified_routes/0"},{"id":"view/0","title":"view()","anchor":"view/0"}],"key":"functions"}]},{"id":"LightningWeb.API.Helpers","group":"","title":"LightningWeb.API.Helpers","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"pagination_link/3","title":"pagination_link(conn, page, atom)","anchor":"pagination_link/3"},{"id":"pagination_links/2","title":"pagination_links(conn, page)","anchor":"pagination_links/2"},{"id":"url_for/2","title":"url_for(conn, params \\\\ %{})","anchor":"url_for/2"}],"key":"functions"}]},{"id":"LightningWeb.API.JobController","group":"","title":"LightningWeb.API.JobController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"index/2","title":"index(conn, params)","anchor":"index/2"},{"id":"show/2","title":"show(conn, map)","anchor":"show/2"}],"key":"functions"}]},{"id":"LightningWeb.API.ProjectController","group":"","title":"LightningWeb.API.ProjectController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"index/2","title":"index(conn, params)","anchor":"index/2"},{"id":"show/2","title":"show(conn, map)","anchor":"show/2"}],"key":"functions"}]},{"id":"LightningWeb.API.ProvisioningController","group":"","title":"LightningWeb.API.ProvisioningController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create/2","title":"create(conn, params)","anchor":"create/2"},{"id":"show/2","title":"show(conn, params)","anchor":"show/2"},{"id":"show_yaml/2","title":"show_yaml(conn, map)","anchor":"show_yaml/2"}],"key":"functions"}]},{"id":"LightningWeb.API.RunController","group":"","title":"LightningWeb.API.RunController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"index/2","title":"index(conn, params)","anchor":"index/2"},{"id":"show/2","title":"show(conn, map)","anchor":"show/2"}],"key":"functions"}]},{"id":"LightningWeb.AuditLive.Index","group":"","title":"LightningWeb.AuditLive.Index","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"diff/1","title":"diff(assigns)","anchor":"diff/1"},{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.AuthProvidersLive.FormComponent","group":"","title":"LightningWeb.AuthProvidersLive.FormComponent","sections":[]},{"id":"LightningWeb.AuthProvidersLive.Index","group":"","title":"LightningWeb.AuthProvidersLive.Index","sections":[]},{"id":"LightningWeb.BackupCodesController","group":"","title":"LightningWeb.BackupCodesController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"print/2","title":"print(conn, params)","anchor":"print/2"}],"key":"functions"}]},{"id":"LightningWeb.BackupCodesLive.Index","group":"","title":"LightningWeb.BackupCodesLive.Index","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.ChangesetJSON","group":"","title":"LightningWeb.ChangesetJSON","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"error/1","title":"error(map)","anchor":"error/1"}],"key":"functions"}]},{"id":"LightningWeb.ChangesetView","group":"","title":"LightningWeb.ChangesetView","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","title":"__resource__()","anchor":"__resource__/0"},{"id":"render/2","title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"template_not_found/2","title":"template_not_found(template, assigns)","anchor":"template_not_found/2"},{"id":"translate_errors/1","title":"translate_errors(changeset)","anchor":"translate_errors/1"}],"key":"functions"}]},{"id":"LightningWeb.Components.Modal","group":"","title":"LightningWeb.Components.Modal","sections":[]},{"id":"LightningWeb.CredentialLive.Edit","group":"","title":"LightningWeb.CredentialLive.Edit","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_info/2","title":"handle_info(arg, socket)","anchor":"handle_info/2"}],"key":"functions"}]},{"id":"LightningWeb.CredentialLive.FormComponent","group":"","title":"LightningWeb.CredentialLive.FormComponent","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"credential_transfer/1","title":"credential_transfer(assigns)","anchor":"credential_transfer/1"},{"id":"form_component/1","title":"form_component(assigns)","anchor":"form_component/1"},{"id":"project_credentials/1","title":"project_credentials(assigns)","anchor":"project_credentials/1"}],"key":"functions"}]},{"id":"LightningWeb.CredentialLive.GoogleSheetsComponent","group":"","title":"LightningWeb.CredentialLive.GoogleSheetsComponent","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"authorize_button/1","title":"authorize_button(assigns)","anchor":"authorize_button/1"},{"id":"disabled_authorize_button/1","title":"disabled_authorize_button(assigns)","anchor":"disabled_authorize_button/1"},{"id":"error_block/1","title":"error_block(assigns)","anchor":"error_block/1"},{"id":"fieldset/1","title":"fieldset(assigns)","anchor":"fieldset/1"},{"id":"userinfo/1","title":"userinfo(assigns)","anchor":"userinfo/1"}],"key":"functions"}]},{"id":"LightningWeb.CredentialLive.Index","group":"","title":"LightningWeb.CredentialLive.Index","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.CredentialLive.JsonSchemaBodyComponent","group":"","title":"LightningWeb.CredentialLive.JsonSchemaBodyComponent","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"fieldset/1","title":"fieldset(assigns)","anchor":"fieldset/1"},{"id":"schema_input/1","title":"schema_input(assigns)","anchor":"schema_input/1"}],"key":"functions"}]},{"id":"LightningWeb.CredentialLive.RawBodyComponent","group":"","title":"LightningWeb.CredentialLive.RawBodyComponent","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"fieldset/1","title":"fieldset(assigns)","anchor":"fieldset/1"}],"key":"functions"}]},{"id":"LightningWeb.CredentialLive.TypePicker","group":"","title":"LightningWeb.CredentialLive.TypePicker","sections":[]},{"id":"LightningWeb.DataclipLive.Edit","group":"","title":"LightningWeb.DataclipLive.Edit","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.DataclipLive.FormComponent","group":"","title":"LightningWeb.DataclipLive.FormComponent","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.DataclipLive.Index","group":"","title":"LightningWeb.DataclipLive.Index","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.DownloadsController","group":"","title":"LightningWeb.DownloadsController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"download_project_yaml/2","title":"download_project_yaml(conn, map)","anchor":"download_project_yaml/2"}],"key":"functions"}]},{"id":"LightningWeb.Endpoint","group":"","title":"LightningWeb.Endpoint","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"broadcast/3","title":"broadcast(topic, event, msg)","anchor":"broadcast/3"},{"id":"broadcast!/3","title":"broadcast!(topic, event, msg)","anchor":"broadcast!/3"},{"id":"broadcast_from/4","title":"broadcast_from(from, topic, event, msg)","anchor":"broadcast_from/4"},{"id":"broadcast_from!/4","title":"broadcast_from!(from, topic, event, msg)","anchor":"broadcast_from!/4"},{"id":"call/2","title":"call(conn, opts)","anchor":"call/2"},{"id":"child_spec/1","title":"child_spec(opts)","anchor":"child_spec/1"},{"id":"config/2","title":"config(key, default \\\\ nil)","anchor":"config/2"},{"id":"config_change/2","title":"config_change(changed, removed)","anchor":"config_change/2"},{"id":"host/0","title":"host()","anchor":"host/0"},{"id":"init/1","title":"init(opts)","anchor":"init/1"},{"id":"local_broadcast/3","title":"local_broadcast(topic, event, msg)","anchor":"local_broadcast/3"},{"id":"local_broadcast_from/4","title":"local_broadcast_from(from, topic, event, msg)","anchor":"local_broadcast_from/4"},{"id":"path/1","title":"path(path)","anchor":"path/1"},{"id":"script_name/0","title":"script_name()","anchor":"script_name/0"},{"id":"start_link/1","title":"start_link(opts \\\\ [])","anchor":"start_link/1"},{"id":"static_integrity/1","title":"static_integrity(path)","anchor":"static_integrity/1"},{"id":"static_lookup/1","title":"static_lookup(path)","anchor":"static_lookup/1"},{"id":"static_path/1","title":"static_path(path)","anchor":"static_path/1"},{"id":"static_url/0","title":"static_url()","anchor":"static_url/0"},{"id":"struct_url/0","title":"struct_url()","anchor":"struct_url/0"},{"id":"subscribe/2","title":"subscribe(topic, opts \\\\ [])","anchor":"subscribe/2"},{"id":"unsubscribe/1","title":"unsubscribe(topic)","anchor":"unsubscribe/1"},{"id":"url/0","title":"url()","anchor":"url/0"}],"key":"functions"}]},{"id":"LightningWeb.ErrorView","group":"","title":"LightningWeb.ErrorView","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","title":"__resource__()","anchor":"__resource__/0"},{"id":"render/2","title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"template_not_found/2","title":"template_not_found(template, assigns)","anchor":"template_not_found/2"}],"key":"functions"}]},{"id":"LightningWeb.FallbackController","group":"","title":"LightningWeb.FallbackController","sections":[]},{"id":"LightningWeb.FirstSetupLive.Superuser","group":"","title":"LightningWeb.FirstSetupLive.Superuser","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.FormHelpers","group":"","title":"LightningWeb.FormHelpers","sections":[]},{"id":"LightningWeb.Gettext","group":"","title":"LightningWeb.Gettext","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"dgettext/3","title":"dgettext(domain, msgid, bindings \\\\ Macro.escape(%{}))","anchor":"dgettext/3"},{"id":"dgettext_noop/2","title":"dgettext_noop(domain, msgid)","anchor":"dgettext_noop/2"},{"id":"dngettext/5","title":"dngettext(domain, msgid, msgid_plural, n, bindings \\\\ Macro.escape(%{}))","anchor":"dngettext/5"},{"id":"dngettext_noop/3","title":"dngettext_noop(domain, msgid, msgid_plural)","anchor":"dngettext_noop/3"},{"id":"dpgettext/4","title":"dpgettext(domain, msgctxt, msgid, bindings \\\\ Macro.escape(%{}))","anchor":"dpgettext/4"},{"id":"dpgettext_noop/3","title":"dpgettext_noop(domain, msgctxt, msgid)","anchor":"dpgettext_noop/3"},{"id":"dpngettext/6","title":"dpngettext(domain, msgctxt, msgid, msgid_plural, n, bindings \\\\ Macro.escape(%{}))","anchor":"dpngettext/6"},{"id":"dpngettext_noop/4","title":"dpngettext_noop(domain, msgctxt, msgid, msgid_plural)","anchor":"dpngettext_noop/4"},{"id":"gettext/2","title":"gettext(msgid, bindings \\\\ Macro.escape(%{}))","anchor":"gettext/2"},{"id":"gettext_comment/1","title":"gettext_comment(comment)","anchor":"gettext_comment/1"},{"id":"gettext_noop/1","title":"gettext_noop(msgid)","anchor":"gettext_noop/1"},{"id":"handle_missing_bindings/2","title":"handle_missing_bindings(exception, incomplete)","anchor":"handle_missing_bindings/2"},{"id":"handle_missing_plural_translation/7","title":"handle_missing_plural_translation(locale, domain, msgctxt, msgid, msgid_plural, n, bindings)","anchor":"handle_missing_plural_translation/7"},{"id":"handle_missing_translation/5","title":"handle_missing_translation(locale, domain, msgctxt, msgid, bindings)","anchor":"handle_missing_translation/5"},{"id":"lgettext/5","title":"lgettext(locale, domain, msgctxt \\\\ nil, msgid, bindings)","anchor":"lgettext/5"},{"id":"lngettext/7","title":"lngettext(locale, domain, msgctxt \\\\ nil, msgid, msgid_plural, n, bindings)","anchor":"lngettext/7"},{"id":"ngettext/4","title":"ngettext(msgid, msgid_plural, n, bindings \\\\ Macro.escape(%{}))","anchor":"ngettext/4"},{"id":"ngettext_noop/2","title":"ngettext_noop(msgid, msgid_plural)","anchor":"ngettext_noop/2"},{"id":"pgettext/3","title":"pgettext(msgctxt, msgid, bindings \\\\ Macro.escape(%{}))","anchor":"pgettext/3"},{"id":"pgettext_noop/2","title":"pgettext_noop(msgid, context)","anchor":"pgettext_noop/2"},{"id":"pngettext/5","title":"pngettext(msgctxt, msgid, msgid_plural, n, bindings \\\\ Macro.escape(%{}))","anchor":"pngettext/5"},{"id":"pngettext_noop/3","title":"pngettext_noop(msgctxt, msgid, msgid_plural)","anchor":"pngettext_noop/3"}],"key":"functions"}]},{"id":"LightningWeb.HealthCheck","group":"","title":"LightningWeb.HealthCheck","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","title":"call(conn, opts)","anchor":"call/2"},{"id":"init/1","title":"init(opts)","anchor":"init/1"}],"key":"functions"}]},{"id":"LightningWeb.Hooks","group":"","title":"LightningWeb.Hooks","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"on_mount/4","title":"on_mount(atom, arg2, session, socket)","anchor":"on_mount/4"}],"key":"functions"}]},{"id":"LightningWeb.InitAssigns","group":"","title":"LightningWeb.InitAssigns","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"on_mount/4","title":"on_mount(atom, params, session, socket)","anchor":"on_mount/4"}],"key":"functions"}]},{"id":"LightningWeb.JobLive.AdaptorPicker","group":"","title":"LightningWeb.JobLive.AdaptorPicker","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"display_name_for_adaptor/1","title":"display_name_for_adaptor(name)","anchor":"display_name_for_adaptor/1"},{"id":"get_adaptor_version_options/1","title":"get_adaptor_version_options(adaptor)","anchor":"get_adaptor_version_options/1"},{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.JobLive.CredentialPicker","group":"","title":"LightningWeb.JobLive.CredentialPicker","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.JobLive.CronSetupComponent","group":"","title":"LightningWeb.JobLive.CronSetupComponent","sections":[{"id":"Usage","anchor":"module-usage"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"build_cron_expression/2","title":"build_cron_expression(prev, next)","anchor":"build_cron_expression/2"},{"id":"frequency_field/1","title":"frequency_field(assigns)","anchor":"frequency_field/1"},{"id":"get_cron_data/1","title":"get_cron_data(cron_expression)","anchor":"get_cron_data/1"},{"id":"hour_field/1","title":"hour_field(assigns)","anchor":"hour_field/1"},{"id":"minute_field/1","title":"minute_field(assigns)","anchor":"minute_field/1"},{"id":"monthday_field/1","title":"monthday_field(assigns)","anchor":"monthday_field/1"},{"id":"render/1","title":"render(assigns)","anchor":"render/1"},{"id":"time_field/1","title":"time_field(assigns)","anchor":"time_field/1"},{"id":"weekday_field/1","title":"weekday_field(assigns)","anchor":"weekday_field/1"}],"key":"functions"}]},{"id":"LightningWeb.JobLive.JobBuilder","group":"","title":"LightningWeb.JobLive.JobBuilder","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"delete_title/2","title":"delete_title(is_deletable, can_delete_job)","anchor":"delete_title/2"},{"id":"follow_run/2","title":"follow_run(job_id, attempt_run)","anchor":"follow_run/2"},{"id":"render/1","title":"render(assigns)","anchor":"render/1"},{"id":"send_adaptor/2","title":"send_adaptor(job_id, adaptor)","anchor":"send_adaptor/2"},{"id":"send_credential/2","title":"send_credential(job_id, credential)","anchor":"send_credential/2"},{"id":"update_cron_expression/2","title":"update_cron_expression(job_id, cron_expression)","anchor":"update_cron_expression/2"}],"key":"functions"}]},{"id":"LightningWeb.JobLive.JobBuilderComponents","group":"","title":"LightningWeb.JobLive.JobBuilderComponents","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"job_editor_component/1","title":"job_editor_component(assigns)","anchor":"job_editor_component/1"},{"id":"trigger_picker/1","title":"trigger_picker(assigns)","anchor":"trigger_picker/1"},{"id":"when_invalid/1","title":"when_invalid(assigns)","anchor":"when_invalid/1"}],"key":"functions"}]},{"id":"LightningWeb.JobLive.ManualRunComponent","group":"","title":"LightningWeb.JobLive.ManualRunComponent","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.JobLive.ManualRunComponent.ManualWorkorder","group":"","title":"LightningWeb.JobLive.ManualRunComponent.ManualWorkorder","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","title":"changeset(map, attrs)","anchor":"changeset/2"}],"key":"functions"}]},{"id":"LightningWeb.LiveHelpers","group":"","title":"LightningWeb.LiveHelpers","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"display_short_uuid/1","title":"display_short_uuid(uuid_string)","anchor":"display_short_uuid/1"},{"id":"fade_in/1","title":"fade_in(opts \\\\ [])","anchor":"fade_in/1"},{"id":"fade_out/1","title":"fade_out(opts \\\\ [])","anchor":"fade_out/1"},{"id":"live_error_block/1","title":"live_error_block(assigns)","anchor":"live_error_block/1"},{"id":"live_info_block/1","title":"live_info_block(assigns)","anchor":"live_info_block/1"},{"id":"live_nav_block/1","title":"live_nav_block(assigns)","anchor":"live_nav_block/1"}],"key":"functions"}]},{"id":"LightningWeb.ModalPortal","group":"","title":"LightningWeb.ModalPortal","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"close_modal/0","title":"close_modal()","anchor":"close_modal/0"},{"id":"handle_event/3","title":"handle_event(binary, _, socket)","anchor":"handle_event/3"},{"id":"on_hide/2","title":"on_hide(close_modal_target \\\\ nil, id \\\\ \"modal\")","anchor":"on_hide/2"},{"id":"on_show/2","title":"on_show(js \\\\ %JS{}, id)","anchor":"on_show/2"},{"id":"open_modal/2","title":"open_modal(module, attrs)","anchor":"open_modal/2"},{"id":"render/1","title":"render(assigns)","anchor":"render/1"},{"id":"update/2","title":"update(assigns, socket)","anchor":"update/2"}],"key":"functions"}]},{"id":"LightningWeb.OauthCredentialHelper","group":"","title":"LightningWeb.OauthCredentialHelper","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"broadcast/2","title":"broadcast(subscription_id, msg)","anchor":"broadcast/2"},{"id":"broadcast_forward/3","title":"broadcast_forward(subscription_id, mod, opts)","anchor":"broadcast_forward/3"},{"id":"build_state/3","title":"build_state(subscription_id, mod, component_id)","anchor":"build_state/3"},{"id":"decode_state/1","title":"decode_state(state)","anchor":"decode_state/1"},{"id":"subscribe/1","title":"subscribe(subscription_id)","anchor":"subscribe/1"}],"key":"functions"}]},{"id":"LightningWeb.OidcController","group":"","title":"LightningWeb.OidcController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"new/2","title":"new(conn, map)","anchor":"new/2"},{"id":"show/2","title":"show(conn, map)","anchor":"show/2"}],"key":"functions"}]},{"id":"LightningWeb.PageView","group":"","title":"LightningWeb.PageView","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","title":"__resource__()","anchor":"__resource__/0"},{"id":"render/2","title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"template_not_found/2","title":"template_not_found(template, assigns)","anchor":"template_not_found/2"}],"key":"functions"}]},{"id":"LightningWeb.Pagination","group":"","title":"LightningWeb.Pagination","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"page_link/1","title":"page_link(assigns)","anchor":"page_link/1"},{"id":"pagination_bar/1","title":"pagination_bar(assigns)","anchor":"pagination_bar/1"},{"id":"raw_pagination_links/2","title":"raw_pagination_links(paginator, options \\\\ [])","anchor":"raw_pagination_links/2"}],"key":"functions"}]},{"id":"LightningWeb.Plugs.FirstSetup","group":"","title":"LightningWeb.Plugs.FirstSetup","sections":[]},{"id":"LightningWeb.ProfileLive.Edit","group":"","title":"LightningWeb.ProfileLive.Edit","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.ProfileLive.FormComponent","group":"","title":"LightningWeb.ProfileLive.FormComponent","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.ProfileLive.MfaComponent","group":"","title":"LightningWeb.ProfileLive.MfaComponent","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.ProjectLive.FormComponent","group":"","title":"LightningWeb.ProjectLive.FormComponent","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.ProjectLive.Index","group":"","title":"LightningWeb.ProjectLive.Index","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"delete_action/1","title":"delete_action(assigns)","anchor":"delete_action/1"},{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.ProjectLive.MFARequired","group":"","title":"LightningWeb.ProjectLive.MFARequired","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"on_mount/4","title":"on_mount(atom, params, session, socket)","anchor":"on_mount/4"},{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.ProjectLive.Settings","group":"","title":"LightningWeb.ProjectLive.Settings","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"digest/1","title":"digest(assigns)","anchor":"digest/1"},{"id":"failure_alert/1","title":"failure_alert(assigns)","anchor":"failure_alert/1"},{"id":"render/1","title":"render(assigns)","anchor":"render/1"},{"id":"role/1","title":"role(assigns)","anchor":"role/1"},{"id":"user/1","title":"user(assigns)","anchor":"user/1"}],"key":"functions"}]},{"id":"LightningWeb.ReAuthenticateLive.New","group":"","title":"LightningWeb.ReAuthenticateLive.New","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.RouteHelpers","group":"","title":"LightningWeb.RouteHelpers","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"oidc_callback_url/0","title":"oidc_callback_url()","anchor":"oidc_callback_url/0"},{"id":"show_run_url/2","title":"show_run_url(project_id, run_id)","anchor":"show_run_url/2"}],"key":"functions"}]},{"id":"LightningWeb.Router","group":"","title":"LightningWeb.Router","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"api/2","title":"api(conn, _)","anchor":"api/2"},{"id":"browser/2","title":"browser(conn, _)","anchor":"browser/2"},{"id":"call/2","title":"call(conn, opts)","anchor":"call/2"},{"id":"init/1","title":"init(opts)","anchor":"init/1"},{"id":"storybook_assets/2","title":"storybook_assets(conn, _)","anchor":"storybook_assets/2"},{"id":"storybook_browser/2","title":"storybook_browser(conn, _)","anchor":"storybook_browser/2"}],"key":"functions"}]},{"id":"LightningWeb.RunLive.Index","group":"","title":"LightningWeb.RunLive.Index","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"checked/2","title":"checked(changeset, id)","anchor":"checked/2"},{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.RunLive.RerunJobComponent","group":"","title":"LightningWeb.RunLive.RerunJobComponent","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","title":"handle_event(binary, map, socket)","anchor":"handle_event/3"},{"id":"render/1","title":"render(assigns)","anchor":"render/1"},{"id":"update/2","title":"update(assigns, socket)","anchor":"update/2"}],"key":"functions"}]},{"id":"LightningWeb.RunLive.RunViewerLive","group":"","title":"LightningWeb.RunLive.RunViewerLive","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_info/2","title":"handle_info(broadcast, socket)","anchor":"handle_info/2"}],"key":"functions"}]},{"id":"LightningWeb.RunLive.Show","group":"","title":"LightningWeb.RunLive.Show","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"apply_action/3","title":"apply_action(socket, atom, map)","anchor":"apply_action/3"}],"key":"functions"}]},{"id":"LightningWeb.RunLive.WorkOrderComponent","group":"","title":"LightningWeb.RunLive.WorkOrderComponent","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.Telemetry","group":"","title":"LightningWeb.Telemetry","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"metrics/0","title":"metrics()","anchor":"metrics/0"},{"id":"start_link/1","title":"start_link(arg)","anchor":"start_link/1"}],"key":"functions"}]},{"id":"LightningWeb.TokensLive.Index","group":"","title":"LightningWeb.TokensLive.Index","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.UserAuth","group":"","title":"LightningWeb.UserAuth","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"authenticate_bearer/2","title":"authenticate_bearer(conn, opts)","anchor":"authenticate_bearer/2"},{"id":"fetch_current_user/2","title":"fetch_current_user(conn, opts)","anchor":"fetch_current_user/2"},{"id":"log_in_user/2","title":"log_in_user(conn, user)","anchor":"log_in_user/2"},{"id":"log_out_user/1","title":"log_out_user(conn)","anchor":"log_out_user/1"},{"id":"mark_totp_pending/1","title":"mark_totp_pending(conn)","anchor":"mark_totp_pending/1"},{"id":"new_session/2","title":"new_session(conn, token)","anchor":"new_session/2"},{"id":"on_mount/4","title":"on_mount(atom, params, session, socket)","anchor":"on_mount/4"},{"id":"reauth_sudo_mode/2","title":"reauth_sudo_mode(conn, opts)","anchor":"reauth_sudo_mode/2"},{"id":"redirect_if_user_is_authenticated/2","title":"redirect_if_user_is_authenticated(conn, opts)","anchor":"redirect_if_user_is_authenticated/2"},{"id":"redirect_with_return_to/2","title":"redirect_with_return_to(conn, params \\\\ %{})","anchor":"redirect_with_return_to/2"},{"id":"require_authenticated_user/2","title":"require_authenticated_user(conn, opts)","anchor":"require_authenticated_user/2"},{"id":"require_sudo_user/2","title":"require_sudo_user(conn, opts)","anchor":"require_sudo_user/2"},{"id":"totp_pending?/1","title":"totp_pending?(conn)","anchor":"totp_pending?/1"},{"id":"totp_validated/1","title":"totp_validated(conn)","anchor":"totp_validated/1"}],"key":"functions"}]},{"id":"LightningWeb.UserConfirmationController","group":"","title":"LightningWeb.UserConfirmationController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"confirm_email/2","title":"confirm_email(conn, map)","anchor":"confirm_email/2"},{"id":"create/2","title":"create(conn, map)","anchor":"create/2"},{"id":"edit/2","title":"edit(conn, map)","anchor":"edit/2"},{"id":"new/2","title":"new(conn, params)","anchor":"new/2"},{"id":"update/2","title":"update(conn, map)","anchor":"update/2"}],"key":"functions"}]},{"id":"LightningWeb.UserLive.Edit","group":"","title":"LightningWeb.UserLive.Edit","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.UserLive.FormComponent","group":"","title":"LightningWeb.UserLive.FormComponent","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.UserLive.Index","group":"","title":"LightningWeb.UserLive.Index","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"delete_action/1","title":"delete_action(assigns)","anchor":"delete_action/1"},{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.UserRegistrationController","group":"","title":"LightningWeb.UserRegistrationController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create/2","title":"create(conn, map)","anchor":"create/2"},{"id":"new/2","title":"new(conn, params)","anchor":"new/2"}],"key":"functions"}]},{"id":"LightningWeb.UserResetPasswordController","group":"","title":"LightningWeb.UserResetPasswordController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create/2","title":"create(conn, map)","anchor":"create/2"},{"id":"edit/2","title":"edit(conn, params)","anchor":"edit/2"},{"id":"new/2","title":"new(conn, params)","anchor":"new/2"},{"id":"update/2","title":"update(conn, map)","anchor":"update/2"}],"key":"functions"}]},{"id":"LightningWeb.UserSessionController","group":"","title":"LightningWeb.UserSessionController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"auth_handler_url/0","title":"auth_handler_url()","anchor":"auth_handler_url/0"},{"id":"create/2","title":"create(conn, map)","anchor":"create/2"},{"id":"delete/2","title":"delete(conn, params)","anchor":"delete/2"},{"id":"exchange_token/2","title":"exchange_token(conn, map)","anchor":"exchange_token/2"},{"id":"new/2","title":"new(conn, params)","anchor":"new/2"}],"key":"functions"}]},{"id":"LightningWeb.UserTOTPController","group":"","title":"LightningWeb.UserTOTPController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create/2","title":"create(conn, map)","anchor":"create/2"},{"id":"new/2","title":"new(conn, params)","anchor":"new/2"}],"key":"functions"}]},{"id":"LightningWeb.VersionControlController","group":"","title":"LightningWeb.VersionControlController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"index/2","title":"index(conn, params)","anchor":"index/2"}],"key":"functions"}]},{"id":"LightningWeb.WebhooksController","group":"","title":"LightningWeb.WebhooksController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create/2","title":"create(conn, map)","anchor":"create/2"}],"key":"functions"}]},{"id":"LightningWeb.WorkflowLive.EditorPane","group":"","title":"LightningWeb.WorkflowLive.EditorPane","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"LightningWeb.WorkflowLive.JobView","group":"","title":"LightningWeb.WorkflowLive.JobView","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"container/1","title":"container(assigns)","anchor":"container/1"},{"id":"input_pane/1","title":"input_pane(assigns)","anchor":"input_pane/1"},{"id":"job_edit_view/1","title":"job_edit_view(assigns)","anchor":"job_edit_view/1"}],"key":"functions"}]},{"id":"LightningWeb.WorkflowNewLive.WorkflowParams","group":"","title":"LightningWeb.WorkflowNewLive.WorkflowParams","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"apply_form_params/2","title":"apply_form_params(current_params, form_params)","anchor":"apply_form_params/2"},{"id":"apply_patches/2","title":"apply_patches(current_params, patches)","anchor":"apply_patches/2"},{"id":"to_map/1","title":"to_map(changeset)","anchor":"to_map/1"},{"id":"to_patches/2","title":"to_patches(initial_params, target_params)","anchor":"to_patches/2"}],"key":"functions"}]},{"id":"ObanPruner","group":"","title":"ObanPruner","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"perform/1","title":"perform(job)","anchor":"perform/1"}],"key":"functions"}]},{"id":"Storybook.Root","group":"","title":"Storybook.Root","sections":[]},{"id":"Lightning.Accounts","group":"Accounts","title":"Lightning.Accounts","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"apply_user_email/3","title":"apply_user_email(user, password, attrs)","anchor":"apply_user_email/3"},{"id":"cancel_scheduled_deletion/1","title":"cancel_scheduled_deletion(user_id)","anchor":"cancel_scheduled_deletion/1"},{"id":"change_scheduled_deletion/2","title":"change_scheduled_deletion(user, attrs \\\\ %{})","anchor":"change_scheduled_deletion/2"},{"id":"change_superuser_registration/1","title":"change_superuser_registration(attrs \\\\ %{})","anchor":"change_superuser_registration/1"},{"id":"change_user_details/2","title":"change_user_details(user, attrs \\\\ %{})","anchor":"change_user_details/2"},{"id":"change_user_email/2","title":"change_user_email(user, attrs \\\\ %{})","anchor":"change_user_email/2"},{"id":"change_user_password/2","title":"change_user_password(user, attrs \\\\ %{})","anchor":"change_user_password/2"},{"id":"change_user_registration/1","title":"change_user_registration(attrs \\\\ %{})","anchor":"change_user_registration/1"},{"id":"confirm_user/1","title":"confirm_user(token)","anchor":"confirm_user/1"},{"id":"delete_auth_token/1","title":"delete_auth_token(token)","anchor":"delete_auth_token/1"},{"id":"delete_session_token/1","title":"delete_session_token(token)","anchor":"delete_session_token/1"},{"id":"delete_sudo_session_token/1","title":"delete_sudo_session_token(token)","anchor":"delete_sudo_session_token/1"},{"id":"delete_token/1","title":"delete_token(token)","anchor":"delete_token/1"},{"id":"delete_user/1","title":"delete_user(user)","anchor":"delete_user/1"},{"id":"delete_user_totp/1","title":"delete_user_totp(totp)","anchor":"delete_user_totp/1"},{"id":"deliver_update_email_instructions/3","title":"deliver_update_email_instructions(user, current_email, update_email_url_fun)","anchor":"deliver_update_email_instructions/3"},{"id":"deliver_user_confirmation_instructions/2","title":"deliver_user_confirmation_instructions(user, confirmation_url_fun)","anchor":"deliver_user_confirmation_instructions/2"},{"id":"deliver_user_confirmation_instructions/3","title":"deliver_user_confirmation_instructions(registerer, user, confirmation_url_fun)","anchor":"deliver_user_confirmation_instructions/3"},{"id":"deliver_user_reset_password_instructions/2","title":"deliver_user_reset_password_instructions(user, reset_password_url_fun)","anchor":"deliver_user_reset_password_instructions/2"},{"id":"exchange_auth_token/1","title":"exchange_auth_token(auth_token)","anchor":"exchange_auth_token/1"},{"id":"generate_api_token/1","title":"generate_api_token(user)","anchor":"generate_api_token/1"},{"id":"generate_auth_token/1","title":"generate_auth_token(user)","anchor":"generate_auth_token/1"},{"id":"generate_sudo_session_token/1","title":"generate_sudo_session_token(user)","anchor":"generate_sudo_session_token/1"},{"id":"generate_user_session_token/1","title":"generate_user_session_token(user)","anchor":"generate_user_session_token/1"},{"id":"get_token!/1","title":"get_token!(id)","anchor":"get_token!/1"},{"id":"get_user!/1","title":"get_user!(id)","anchor":"get_user!/1"},{"id":"get_user_by_api_token/1","title":"get_user_by_api_token(token)","anchor":"get_user_by_api_token/1"},{"id":"get_user_by_auth_token/1","title":"get_user_by_auth_token(token)","anchor":"get_user_by_auth_token/1"},{"id":"get_user_by_email/1","title":"get_user_by_email(email)","anchor":"get_user_by_email/1"},{"id":"get_user_by_email_and_password/2","title":"get_user_by_email_and_password(email, password)","anchor":"get_user_by_email_and_password/2"},{"id":"get_user_by_reset_password_token/1","title":"get_user_by_reset_password_token(token)","anchor":"get_user_by_reset_password_token/1"},{"id":"get_user_by_session_token/1","title":"get_user_by_session_token(token)","anchor":"get_user_by_session_token/1"},{"id":"get_user_totp/1","title":"get_user_totp(user)","anchor":"get_user_totp/1"},{"id":"get_users_to_alert_for_project/1","title":"get_users_to_alert_for_project(map)","anchor":"get_users_to_alert_for_project/1"},{"id":"has_activity_in_projects?/1","title":"has_activity_in_projects?(user)","anchor":"has_activity_in_projects?/1"},{"id":"has_one_superuser?/0","title":"has_one_superuser?()","anchor":"has_one_superuser?/0"},{"id":"list_api_tokens/1","title":"list_api_tokens(user)","anchor":"list_api_tokens/1"},{"id":"list_user_backup_codes/1","title":"list_user_backup_codes(user)","anchor":"list_user_backup_codes/1"},{"id":"list_users/0","title":"list_users()","anchor":"list_users/0"},{"id":"perform/1","title":"perform(job)","anchor":"perform/1"},{"id":"purge_user/1","title":"purge_user(id)","anchor":"purge_user/1"},{"id":"regenerate_user_backup_codes/1","title":"regenerate_user_backup_codes(user)","anchor":"regenerate_user_backup_codes/1"},{"id":"register_superuser/1","title":"register_superuser(attrs)","anchor":"register_superuser/1"},{"id":"register_user/1","title":"register_user(attrs)","anchor":"register_user/1"},{"id":"reset_user_password/2","title":"reset_user_password(user, attrs)","anchor":"reset_user_password/2"},{"id":"schedule_user_deletion/2","title":"schedule_user_deletion(user, email)","anchor":"schedule_user_deletion/2"},{"id":"sudo_session_token_valid?/2","title":"sudo_session_token_valid?(user, token)","anchor":"sudo_session_token_valid?/2"},{"id":"update_user_details/2","title":"update_user_details(user, attrs \\\\ %{})","anchor":"update_user_details/2"},{"id":"update_user_email/2","title":"update_user_email(user, token)","anchor":"update_user_email/2"},{"id":"update_user_password/3","title":"update_user_password(user, password, attrs)","anchor":"update_user_password/3"},{"id":"upsert_user_totp/2","title":"upsert_user_totp(totp, attrs)","anchor":"upsert_user_totp/2"},{"id":"valid_user_backup_code?/2","title":"valid_user_backup_code?(user, code)","anchor":"valid_user_backup_code?/2"},{"id":"valid_user_totp?/2","title":"valid_user_totp?(user, code)","anchor":"valid_user_totp?/2"},{"id":"validate_change_user_email/2","title":"validate_change_user_email(user, params)","anchor":"validate_change_user_email/2"}],"key":"functions"}]},{"id":"Lightning.Accounts.User","group":"Accounts","title":"Lightning.Accounts.User","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"confirm_changeset/1","title":"confirm_changeset(user)","anchor":"confirm_changeset/1"},{"id":"details_changeset/2","title":"details_changeset(user, attrs)","anchor":"details_changeset/2"},{"id":"email_changeset/2","title":"email_changeset(user, attrs)","anchor":"email_changeset/2"},{"id":"password_changeset/3","title":"password_changeset(user, attrs, opts \\\\ [])","anchor":"password_changeset/3"},{"id":"scheduled_deletion_changeset/2","title":"scheduled_deletion_changeset(user, attrs)","anchor":"scheduled_deletion_changeset/2"},{"id":"superuser_registration_changeset/2","title":"superuser_registration_changeset(attrs, opts \\\\ [])","anchor":"superuser_registration_changeset/2"},{"id":"user_registration_changeset/2","title":"user_registration_changeset(attrs, opts \\\\ [])","anchor":"user_registration_changeset/2"},{"id":"valid_password?/2","title":"valid_password?(arg1, password)","anchor":"valid_password?/2"},{"id":"validate_current_password/2","title":"validate_current_password(changeset, password)","anchor":"validate_current_password/2"}],"key":"functions"}]},{"id":"Lightning.Accounts.User.RolesEnum","group":"Accounts","title":"Lightning.Accounts.User.RolesEnum","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"cast/1","title":"cast(arg1)","anchor":"cast/1"},{"id":"create_type/0","title":"create_type()","anchor":"create_type/0"},{"id":"drop_type/0","title":"drop_type()","anchor":"drop_type/0"},{"id":"dump/1","title":"dump(term)","anchor":"dump/1"},{"id":"embed_as/1","title":"embed_as(_)","anchor":"embed_as/1"},{"id":"equal?/2","title":"equal?(term1, term2)","anchor":"equal?/2"},{"id":"load/1","title":"load(arg1)","anchor":"load/1"},{"id":"schema/0","title":"schema()","anchor":"schema/0"},{"id":"schemaless_type/0","title":"schemaless_type()","anchor":"schemaless_type/0"},{"id":"type/0","title":"type()","anchor":"type/0"},{"id":"valid_value?/1","title":"valid_value?(value)","anchor":"valid_value?/1"}],"key":"functions"}]},{"id":"Lightning.Accounts.UserBackupCode","group":"Accounts","title":"Lightning.Accounts.UserBackupCode","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"changeset/2","title":"changeset(backup_code, attrs)","anchor":"changeset/2"},{"id":"generate_backup_code/0","title":"generate_backup_code()","anchor":"generate_backup_code/0"}],"key":"functions"}]},{"id":"Lightning.Accounts.UserNotifier","group":"Accounts","title":"Lightning.Accounts.UserNotifier","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"build_digest_url/3","title":"build_digest_url(workflow, start_date, end_date)","anchor":"build_digest_url/3"},{"id":"deliver_confirmation_instructions/2","title":"deliver_confirmation_instructions(user, url)","anchor":"deliver_confirmation_instructions/2"},{"id":"deliver_confirmation_instructions/3","title":"deliver_confirmation_instructions(enroller, user, url)","anchor":"deliver_confirmation_instructions/3"},{"id":"deliver_project_addition_notification/2","title":"deliver_project_addition_notification(user, project)","anchor":"deliver_project_addition_notification/2"},{"id":"deliver_project_digest/2","title":"deliver_project_digest(digest_data, params)","anchor":"deliver_project_digest/2"},{"id":"deliver_reset_password_instructions/2","title":"deliver_reset_password_instructions(user, url)","anchor":"deliver_reset_password_instructions/2"},{"id":"deliver_update_email_instructions/2","title":"deliver_update_email_instructions(email, url)","anchor":"deliver_update_email_instructions/2"},{"id":"deliver_update_email_warning/2","title":"deliver_update_email_warning(email, new_email)","anchor":"deliver_update_email_warning/2"},{"id":"notify_project_deletion/2","title":"notify_project_deletion(user, project)","anchor":"notify_project_deletion/2"},{"id":"send_deletion_notification_email/1","title":"send_deletion_notification_email(user)","anchor":"send_deletion_notification_email/1"}],"key":"functions"}]},{"id":"Lightning.Accounts.UserTOTP","group":"Accounts","title":"Lightning.Accounts.UserTOTP","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"changeset/2","title":"changeset(totp, attrs)","anchor":"changeset/2"},{"id":"valid_totp?/2","title":"valid_totp?(totp, code)","anchor":"valid_totp?/2"}],"key":"functions"}]},{"id":"Lightning.Accounts.UserToken","group":"Accounts","title":"Lightning.Accounts.UserToken","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"build_email_token/3","title":"build_email_token(user, context, sent_to)","anchor":"build_email_token/3"},{"id":"build_token/2","title":"build_token(user, context)","anchor":"build_token/2"},{"id":"changeset/2","title":"changeset(user_token, attrs)","anchor":"changeset/2"},{"id":"generate_and_sign/2","title":"generate_and_sign(extra_claims \\\\ %{}, key \\\\ __default_signer__())","anchor":"generate_and_sign/2"},{"id":"generate_and_sign!/2","title":"generate_and_sign!(extra_claims \\\\ %{}, key \\\\ __default_signer__())","anchor":"generate_and_sign!/2"},{"id":"last_used_changeset/1","title":"last_used_changeset(user)","anchor":"last_used_changeset/1"},{"id":"token_and_context_query/2","title":"token_and_context_query(token, context)","anchor":"token_and_context_query/2"},{"id":"user_and_contexts_query/2","title":"user_and_contexts_query(user, contexts)","anchor":"user_and_contexts_query/2"},{"id":"verify_and_validate/3","title":"verify_and_validate(bearer_token, key \\\\ __default_signer__(), context \\\\ %{})","anchor":"verify_and_validate/3"},{"id":"verify_and_validate!/3","title":"verify_and_validate!(bearer_token, key \\\\ __default_signer__(), context \\\\ %{})","anchor":"verify_and_validate!/3"},{"id":"verify_change_email_token_query/2","title":"verify_change_email_token_query(token, context)","anchor":"verify_change_email_token_query/2"},{"id":"verify_email_token_query/2","title":"verify_email_token_query(token, context)","anchor":"verify_email_token_query/2"},{"id":"verify_token_query/2","title":"verify_token_query(token, context)","anchor":"verify_token_query/2"}],"key":"functions"}]},{"id":"Lightning.Credentials","group":"Credentials","title":"Lightning.Credentials","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"change_credential/2","title":"change_credential(credential, attrs \\\\ %{})","anchor":"change_credential/2"},{"id":"create_credential/1","title":"create_credential(attrs \\\\ %{})","anchor":"create_credential/1"},{"id":"delete_credential/1","title":"delete_credential(credential)","anchor":"delete_credential/1"},{"id":"get_credential!/1","title":"get_credential!(id)","anchor":"get_credential!/1"},{"id":"invalid_projects_for_user/2","title":"invalid_projects_for_user(credential_id, user_id)","anchor":"invalid_projects_for_user/2"},{"id":"list_credentials/0","title":"list_credentials()","anchor":"list_credentials/0"},{"id":"list_credentials/1","title":"list_credentials(project)","anchor":"list_credentials/1"},{"id":"list_credentials_for_user/1","title":"list_credentials_for_user(user_id)","anchor":"list_credentials_for_user/1"},{"id":"maybe_refresh_token/1","title":"maybe_refresh_token(credential)","anchor":"maybe_refresh_token/1"},{"id":"sensitive_values_for/1","title":"sensitive_values_for(id)","anchor":"sensitive_values_for/1"},{"id":"update_credential/2","title":"update_credential(credential, attrs)","anchor":"update_credential/2"}],"key":"functions"}]},{"id":"Lightning.Credentials.Audit","group":"Credentials","title":"Lightning.Credentials.Audit","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"event/4","title":"event(event, row_id, actor_id, metadata \\\\ %{})","anchor":"event/4"},{"id":"save/1","title":"save(changes)","anchor":"save/1"}],"key":"functions"}]},{"id":"Lightning.Credentials.Credential","group":"Credentials","title":"Lightning.Credentials.Credential","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"}]},{"id":"Lightning.Credentials.Schema","group":"Credentials","title":"Lightning.Credentials.Schema","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"new/2","title":"new(body, name \\\\ nil)","anchor":"new/2"},{"id":"properties/2","title":"properties(schema, field)","anchor":"properties/2"},{"id":"required?/2","title":"required?(schema, field)","anchor":"required?/2"},{"id":"validate/2","title":"validate(changeset, schema)","anchor":"validate/2"}],"key":"functions"}]},{"id":"Lightning.Credentials.SchemaDocument","group":"Credentials","title":"Lightning.Credentials.SchemaDocument","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/3","title":"changeset(document, attrs, list)","anchor":"changeset/3"}],"key":"functions"}]},{"id":"Lightning.Credentials.SensitiveValues","group":"Credentials","title":"Lightning.Credentials.SensitiveValues","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"pairs/0","title":"pairs()","anchor":"t:pairs/0"},{"id":"raw_pairs/0","title":"raw_pairs()","anchor":"t:raw_pairs/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"flatten_map/1","title":"flatten_map(item)","anchor":"flatten_map/1"},{"id":"secret_values/1","title":"secret_values(map)","anchor":"secret_values/1"}],"key":"functions"}]},{"id":"Lightning.Invocation","group":"Invocations","title":"Lightning.Invocation","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"change_dataclip/2","title":"change_dataclip(dataclip, attrs \\\\ %{})","anchor":"change_dataclip/2"},{"id":"change_run/2","title":"change_run(run, attrs \\\\ %{})","anchor":"change_run/2"},{"id":"create_dataclip/1","title":"create_dataclip(attrs \\\\ %{})","anchor":"create_dataclip/1"},{"id":"create_log_line/2","title":"create_log_line(run, body)","anchor":"create_log_line/2"},{"id":"create_run/1","title":"create_run(attrs \\\\ %{})","anchor":"create_run/1"},{"id":"delete_dataclip/1","title":"delete_dataclip(dataclip)","anchor":"delete_dataclip/1"},{"id":"delete_run/1","title":"delete_run(run)","anchor":"delete_run/1"},{"id":"filter_run_body_and_logs_where/2","title":"filter_run_body_and_logs_where(search_term, search_fields)","anchor":"filter_run_body_and_logs_where/2"},{"id":"filter_run_finished_after_where/1","title":"filter_run_finished_after_where(date_after)","anchor":"filter_run_finished_after_where/1"},{"id":"filter_run_finished_before_where/1","title":"filter_run_finished_before_where(date_before)","anchor":"filter_run_finished_before_where/1"},{"id":"filter_run_status_where/1","title":"filter_run_status_where(statuses)","anchor":"filter_run_status_where/1"},{"id":"filter_workflow_where/1","title":"filter_workflow_where(workflow_id)","anchor":"filter_workflow_where/1"},{"id":"filter_workorder_insert_after_where/1","title":"filter_workorder_insert_after_where(date_after)","anchor":"filter_workorder_insert_after_where/1"},{"id":"filter_workorder_insert_before_where/1","title":"filter_workorder_insert_before_where(date_before)","anchor":"filter_workorder_insert_before_where/1"},{"id":"get_dataclip/1","title":"get_dataclip(run)","anchor":"get_dataclip/1"},{"id":"get_dataclip!/1","title":"get_dataclip!(id)","anchor":"get_dataclip!/1"},{"id":"get_dataclip_query/1","title":"get_dataclip_query(run)","anchor":"get_dataclip_query/1"},{"id":"get_result_dataclip_query/1","title":"get_result_dataclip_query(run)","anchor":"get_result_dataclip_query/1"},{"id":"get_run!/1","title":"get_run!(id)","anchor":"get_run!/1"},{"id":"get_run_with_job!/1","title":"get_run_with_job!(id)","anchor":"get_run_with_job!/1"},{"id":"get_workorders_by_ids/1","title":"get_workorders_by_ids(ids)","anchor":"get_workorders_by_ids/1"},{"id":"list_dataclips/0","title":"list_dataclips()","anchor":"list_dataclips/0"},{"id":"list_dataclips/1","title":"list_dataclips(project)","anchor":"list_dataclips/1"},{"id":"list_dataclips_for_job/1","title":"list_dataclips_for_job(job)","anchor":"list_dataclips_for_job/1"},{"id":"list_dataclips_query/1","title":"list_dataclips_query(project)","anchor":"list_dataclips_query/1"},{"id":"list_runs/0","title":"list_runs()","anchor":"list_runs/0"},{"id":"list_runs_for_project/2","title":"list_runs_for_project(project, params \\\\ %{})","anchor":"list_runs_for_project/2"},{"id":"list_runs_for_project_query/1","title":"list_runs_for_project_query(project)","anchor":"list_runs_for_project_query/1"},{"id":"list_work_orders_for_project_query/2","title":"list_work_orders_for_project_query(project, search_params)","anchor":"list_work_orders_for_project_query/2"},{"id":"search_workorders/1","title":"search_workorders(project)","anchor":"search_workorders/1"},{"id":"search_workorders/3","title":"search_workorders(project, filter, params \\\\ %{})","anchor":"search_workorders/3"},{"id":"update_dataclip/2","title":"update_dataclip(dataclip, attrs)","anchor":"update_dataclip/2"},{"id":"update_run/2","title":"update_run(run, attrs)","anchor":"update_run/2"},{"id":"with_attempts/1","title":"with_attempts(query)","anchor":"with_attempts/1"}],"key":"functions"}]},{"id":"Lightning.Invocation.Dataclip","group":"Invocations","title":"Lightning.Invocation.Dataclip","sections":[{"id":"Types","anchor":"module-types"}],"nodeGroups":[{"name":"Types","nodes":[{"id":"source_type/0","title":"source_type()","anchor":"t:source_type/0"},{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"get_types/0","title":"get_types()","anchor":"get_types/0"},{"id":"new/1","title":"new(attrs \\\\ %{})","anchor":"new/1"},{"id":"validate_by_type/1","title":"validate_by_type(changeset)","anchor":"validate_by_type/1"}],"key":"functions"}]},{"id":"Lightning.Invocation.LogLine","group":"Invocations","title":"Lightning.Invocation.LogLine","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"validate/1","title":"validate(changeset)","anchor":"validate/1"}],"key":"functions"}]},{"id":"Lightning.Invocation.Query","group":"Invocations","title":"Lightning.Invocation.Query","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"last_run_for_job/1","title":"last_run_for_job(job)","anchor":"last_run_for_job/1"},{"id":"last_successful_run_for_job/1","title":"last_successful_run_for_job(job)","anchor":"last_successful_run_for_job/1"},{"id":"runs_for/1","title":"runs_for(user)","anchor":"runs_for/1"},{"id":"runs_with_code/2","title":"runs_with_code(query, exit_code)","anchor":"runs_with_code/2"}],"key":"functions"}]},{"id":"Lightning.Invocation.Run","group":"Invocations","title":"Lightning.Invocation.Run","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"new/1","title":"new(attrs \\\\ %{})","anchor":"new/1"},{"id":"new_from/1","title":"new_from(run)","anchor":"new_from/1"}],"key":"functions"}]},{"id":"Lightning.InvocationReason","group":"Invocations","title":"Lightning.InvocationReason","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"source_type/0","title":"source_type()","anchor":"t:source_type/0"},{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"new/1","title":"new(attrs \\\\ %{})","anchor":"new/1"},{"id":"validate_by_trigger_type/1","title":"validate_by_trigger_type(changeset)","anchor":"validate_by_trigger_type/1"}],"key":"functions"}]},{"id":"Lightning.InvocationReasons","group":"Invocations","title":"Lightning.InvocationReasons","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"reason_type/0","title":"reason_type()","anchor":"t:reason_type/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"build/2","title":"build(type, arg2)","anchor":"build/2"},{"id":"create_reason/1","title":"create_reason(attrs \\\\ %{})","anchor":"create_reason/1"}],"key":"functions"}]},{"id":"Lightning.Pipeline","group":"Pipeline","title":"Lightning.Pipeline","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"assemble_logs_for_run/1","title":"assemble_logs_for_run(run)","anchor":"assemble_logs_for_run/1"},{"id":"logs_for_run/1","title":"logs_for_run(run)","anchor":"logs_for_run/1"},{"id":"process/1","title":"process(attempt_run)","anchor":"process/1"}],"key":"functions"}]},{"id":"Lightning.Pipeline.Runner","group":"Pipeline","title":"Lightning.Pipeline.Runner","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create_dataclip_from_result/2","title":"create_dataclip_from_result(result, run)","anchor":"create_dataclip_from_result/2"},{"id":"find_or_install_adaptor/1","title":"find_or_install_adaptor(adaptor)","anchor":"find_or_install_adaptor/1"},{"id":"scrub_result/1","title":"scrub_result(body)","anchor":"scrub_result/1"},{"id":"start/2","title":"start(run, opts \\\\ [])","anchor":"start/2"}],"key":"functions"}]},{"id":"Lightning.Pipeline.Runner.Handler","group":"Pipeline","title":"Lightning.Pipeline.Runner.Handler","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"handler_opts/0","title":"handler_opts()","anchor":"t:handler_opts/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"on_start/1","title":"on_start(context)","anchor":"on_start/1"},{"id":"stop/1","title":"stop(state)","anchor":"stop/1"}],"key":"functions"}]},{"id":"Lightning.Pipeline.StateAssembler","group":"Pipeline","title":"Lightning.Pipeline.StateAssembler","sections":[{"id":"How state is assembled","anchor":"module-how-state-is-assembled"},{"id":"Saved inputs","anchor":"module-saved-inputs"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"assemble/1","title":"assemble(run)","anchor":"assemble/1"}],"key":"functions"}]},{"id":"Lightning.Jobs","group":"Jobs","title":"Lightning.Jobs","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"change_job/2","title":"change_job(job, attrs \\\\ %{})","anchor":"change_job/2"},{"id":"create_job/1","title":"create_job(attrs \\\\ %{})","anchor":"create_job/1"},{"id":"delete_job/1","title":"delete_job(job)","anchor":"delete_job/1"},{"id":"get_downstream_jobs_for/2","title":"get_downstream_jobs_for(job, edge_condition \\\\ nil)","anchor":"get_downstream_jobs_for/2"},{"id":"get_job/1","title":"get_job(id)","anchor":"get_job/1"},{"id":"get_job!/1","title":"get_job!(id)","anchor":"get_job!/1"},{"id":"get_upstream_jobs_for/1","title":"get_upstream_jobs_for(map)","anchor":"get_upstream_jobs_for/1"},{"id":"jobs_for_project/1","title":"jobs_for_project(project)","anchor":"jobs_for_project/1"},{"id":"jobs_for_project_query/1","title":"jobs_for_project_query(project)","anchor":"jobs_for_project_query/1"},{"id":"list_active_cron_jobs/0","title":"list_active_cron_jobs()","anchor":"list_active_cron_jobs/0"},{"id":"list_jobs/0","title":"list_jobs()","anchor":"list_jobs/0"},{"id":"list_jobs_for_workflow/1","title":"list_jobs_for_workflow(workflow)","anchor":"list_jobs_for_workflow/1"},{"id":"update_job/2","title":"update_job(job, attrs)","anchor":"update_job/2"}],"key":"functions"}]},{"id":"Lightning.Jobs.Job","group":"Jobs","title":"Lightning.Jobs.Job","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"new/1","title":"new(attrs \\\\ %{})","anchor":"new/1"},{"id":"put_project_credential/2","title":"put_project_credential(job, project_credential)","anchor":"put_project_credential/2"},{"id":"put_workflow/2","title":"put_workflow(changeset, workflow)","anchor":"put_workflow/2"},{"id":"validate/1","title":"validate(changeset)","anchor":"validate/1"}],"key":"functions"}]},{"id":"Lightning.Jobs.Query","group":"Jobs","title":"Lightning.Jobs.Query","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"enabled_cron_jobs_by_edge/0","title":"enabled_cron_jobs_by_edge()","anchor":"enabled_cron_jobs_by_edge/0"},{"id":"jobs_for/1","title":"jobs_for(user)","anchor":"jobs_for/1"}],"key":"functions"}]},{"id":"Lightning.Jobs.Scheduler","group":"Jobs","title":"Lightning.Jobs.Scheduler","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"enqueue_cronjobs/0","title":"enqueue_cronjobs()","anchor":"enqueue_cronjobs/0"},{"id":"enqueue_cronjobs/1","title":"enqueue_cronjobs(date_time)","anchor":"enqueue_cronjobs/1"}],"key":"functions"}]},{"id":"Lightning.Jobs.Trigger","group":"Jobs","title":"Lightning.Jobs.Trigger","sections":[{"id":"Types","anchor":"module-types"}],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"},{"id":"trigger_type/0","title":"trigger_type()","anchor":"t:trigger_type/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"new/1","title":"new(attrs)","anchor":"new/1"},{"id":"validate/1","title":"validate(changeset)","anchor":"validate/1"}],"key":"functions"}]},{"id":"Lightning.Projects","group":"Projects","title":"Lightning.Projects","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"cancel_scheduled_deletion/1","title":"cancel_scheduled_deletion(project_id)","anchor":"cancel_scheduled_deletion/1"},{"id":"change_project/2","title":"change_project(project, attrs \\\\ %{})","anchor":"change_project/2"},{"id":"create_project/1","title":"create_project(attrs \\\\ %{})","anchor":"create_project/1"},{"id":"delete_project/1","title":"delete_project(project)","anchor":"delete_project/1"},{"id":"export_project/2","title":"export_project(atom, project_id)","anchor":"export_project/2"},{"id":"get_project/1","title":"get_project(id)","anchor":"get_project/1"},{"id":"get_project!/1","title":"get_project!(id)","anchor":"get_project!/1"},{"id":"get_project_credential/2","title":"get_project_credential(project_id, credential_id)","anchor":"get_project_credential/2"},{"id":"get_project_user/1","title":"get_project_user(id)","anchor":"get_project_user/1"},{"id":"get_project_user/2","title":"get_project_user(project, user)","anchor":"get_project_user/2"},{"id":"get_project_user!/1","title":"get_project_user!(id)","anchor":"get_project_user!/1"},{"id":"get_project_user_role/2","title":"get_project_user_role(user, project)","anchor":"get_project_user_role/2"},{"id":"get_project_with_users!/1","title":"get_project_with_users!(id)","anchor":"get_project_with_users!/1"},{"id":"get_projects_for_user/1","title":"get_projects_for_user(user)","anchor":"get_projects_for_user/1"},{"id":"is_member_of?/2","title":"is_member_of?(project, user)","anchor":"is_member_of?/2"},{"id":"list_project_credentials/1","title":"list_project_credentials(project)","anchor":"list_project_credentials/1"},{"id":"list_projects/0","title":"list_projects()","anchor":"list_projects/0"},{"id":"perform/1","title":"perform(job)","anchor":"perform/1"},{"id":"project_attempt_run_query/1","title":"project_attempt_run_query(project)","anchor":"project_attempt_run_query/1"},{"id":"project_attempts_query/1","title":"project_attempts_query(project)","anchor":"project_attempts_query/1"},{"id":"project_credentials_query/1","title":"project_credentials_query(project)","anchor":"project_credentials_query/1"},{"id":"project_dataclip_invocation_reason/1","title":"project_dataclip_invocation_reason(project)","anchor":"project_dataclip_invocation_reason/1"},{"id":"project_dataclips_query/1","title":"project_dataclips_query(project)","anchor":"project_dataclips_query/1"},{"id":"project_jobs_query/1","title":"project_jobs_query(project)","anchor":"project_jobs_query/1"},{"id":"project_run_invocation_reasons/1","title":"project_run_invocation_reasons(project)","anchor":"project_run_invocation_reasons/1"},{"id":"project_runs_query/1","title":"project_runs_query(project)","anchor":"project_runs_query/1"},{"id":"project_trigger_invocation_reason/1","title":"project_trigger_invocation_reason(project)","anchor":"project_trigger_invocation_reason/1"},{"id":"project_triggers_query/1","title":"project_triggers_query(project)","anchor":"project_triggers_query/1"},{"id":"project_user_role_query/2","title":"project_user_role_query(user, project)","anchor":"project_user_role_query/2"},{"id":"project_users_query/1","title":"project_users_query(project)","anchor":"project_users_query/1"},{"id":"project_workflows_query/1","title":"project_workflows_query(project)","anchor":"project_workflows_query/1"},{"id":"project_workorders_query/1","title":"project_workorders_query(project)","anchor":"project_workorders_query/1"},{"id":"projects_for_user_query/1","title":"projects_for_user_query(user)","anchor":"projects_for_user_query/1"},{"id":"schedule_project_deletion/1","title":"schedule_project_deletion(project)","anchor":"schedule_project_deletion/1"},{"id":"select_first_project_for_user/1","title":"select_first_project_for_user(user)","anchor":"select_first_project_for_user/1"},{"id":"update_project/2","title":"update_project(project, attrs)","anchor":"update_project/2"},{"id":"update_project_user/2","title":"update_project_user(project_user, attrs)","anchor":"update_project_user/2"},{"id":"url_safe_project_name/1","title":"url_safe_project_name(name)","anchor":"url_safe_project_name/1"},{"id":"validate_for_deletion/2","title":"validate_for_deletion(project, attrs)","anchor":"validate_for_deletion/2"}],"key":"functions"}]},{"id":"Lightning.Projects.Project","group":"Projects","title":"Lightning.Projects.Project","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"deletion_changeset/2","title":"deletion_changeset(project, attrs)","anchor":"deletion_changeset/2"},{"id":"validate/1","title":"validate(changeset)","anchor":"validate/1"}],"key":"functions"}]},{"id":"Lightning.Projects.ProjectCredential","group":"Projects","title":"Lightning.Projects.ProjectCredential","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"}]},{"id":"Lightning.Projects.ProjectUser","group":"Projects","title":"Lightning.Projects.ProjectUser","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"}]},{"id":"Lightning.Projects.ProjectUser.DigestEnum","group":"Projects","title":"Lightning.Projects.ProjectUser.DigestEnum","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"cast/1","title":"cast(arg1)","anchor":"cast/1"},{"id":"create_type/0","title":"create_type()","anchor":"create_type/0"},{"id":"drop_type/0","title":"drop_type()","anchor":"drop_type/0"},{"id":"dump/1","title":"dump(term)","anchor":"dump/1"},{"id":"embed_as/1","title":"embed_as(_)","anchor":"embed_as/1"},{"id":"equal?/2","title":"equal?(term1, term2)","anchor":"equal?/2"},{"id":"load/1","title":"load(arg1)","anchor":"load/1"},{"id":"schema/0","title":"schema()","anchor":"schema/0"},{"id":"schemaless_type/0","title":"schemaless_type()","anchor":"schemaless_type/0"},{"id":"type/0","title":"type()","anchor":"type/0"},{"id":"valid_value?/1","title":"valid_value?(value)","anchor":"valid_value?/1"}],"key":"functions"}]},{"id":"Lightning.Projects.ProjectUser.RolesEnum","group":"Projects","title":"Lightning.Projects.ProjectUser.RolesEnum","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"cast/1","title":"cast(arg1)","anchor":"cast/1"},{"id":"create_type/0","title":"create_type()","anchor":"create_type/0"},{"id":"drop_type/0","title":"drop_type()","anchor":"drop_type/0"},{"id":"dump/1","title":"dump(term)","anchor":"dump/1"},{"id":"embed_as/1","title":"embed_as(_)","anchor":"embed_as/1"},{"id":"equal?/2","title":"equal?(term1, term2)","anchor":"equal?/2"},{"id":"load/1","title":"load(arg1)","anchor":"load/1"},{"id":"schema/0","title":"schema()","anchor":"schema/0"},{"id":"schemaless_type/0","title":"schemaless_type()","anchor":"schemaless_type/0"},{"id":"type/0","title":"type()","anchor":"type/0"},{"id":"valid_value?/1","title":"valid_value?(value)","anchor":"valid_value?/1"}],"key":"functions"}]},{"id":"Lightning.Projects.Provisioner","group":"Projects","title":"Lightning.Projects.Provisioner","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"import_document/3","title":"import_document(project, user, data)","anchor":"import_document/3"},{"id":"load_project/1","title":"load_project(id)","anchor":"load_project/1"},{"id":"parse_document/2","title":"parse_document(project, data)","anchor":"parse_document/2"},{"id":"validate_extraneous_params/1","title":"validate_extraneous_params(changeset)","anchor":"validate_extraneous_params/1"}],"key":"functions"}]},{"id":"Lightning.Runtime.ChildProcess","group":"Runtime","title":"Lightning.Runtime.ChildProcess","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"build_command/1","title":"build_command(runspec)","anchor":"build_command/1"},{"id":"build_env/2","title":"build_env(arg1, env)","anchor":"build_env/2"},{"id":"run/2","title":"run(runspec, opts \\\\ [])","anchor":"run/2"}],"key":"functions"}]},{"id":"Lightning.Runtime.Handler","group":"Runtime","title":"Lightning.Runtime.Handler","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Callbacks","nodes":[{"id":"env/2","title":"env(run_spec, opts)","anchor":"c:env/2"},{"id":"log_callback/3","title":"log_callback(agent, context, args)","anchor":"c:log_callback/3"},{"id":"on_finish/2","title":"on_finish(result, context)","anchor":"c:on_finish/2"},{"id":"on_log_emit/2","title":"on_log_emit(chunk, context)","anchor":"c:on_log_emit/2"},{"id":"on_start/1","title":"on_start(context)","anchor":"c:on_start/1"},{"id":"start/2","title":"start(any, opts)","anchor":"c:start/2"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"env/2","title":"env(run_spec, opts)","anchor":"env/2"},{"id":"on_finish/2","title":"on_finish(result, context)","anchor":"on_finish/2"},{"id":"on_log_emit/2","title":"on_log_emit(chunk, context)","anchor":"on_log_emit/2"},{"id":"on_start/1","title":"on_start(context)","anchor":"on_start/1"}],"key":"functions"}]},{"id":"Lightning.Runtime.LogAgent","group":"Runtime","title":"Lightning.Runtime.LogAgent","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"logline/0","title":"logline()","anchor":"t:logline/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"buffer/1","title":"buffer(agent)","anchor":"buffer/1"},{"id":"child_spec/1","title":"child_spec(arg)","anchor":"child_spec/1"},{"id":"process_chunk/2","title":"process_chunk(agent, arg)","anchor":"process_chunk/2"},{"id":"start_link/1","title":"start_link(_ \\\\ [])","anchor":"start_link/1"}],"key":"functions"}]},{"id":"Lightning.Runtime.LogAgent.StringBuffer","group":"Runtime","title":"Lightning.Runtime.LogAgent.StringBuffer","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"buffer/1","title":"buffer(arg)","anchor":"buffer/1"},{"id":"new/0","title":"new()","anchor":"new/0"},{"id":"process_chunk/2","title":"process_chunk(data, arg)","anchor":"process_chunk/2"},{"id":"reduce_chunk/2","title":"reduce_chunk(data, arg)","anchor":"reduce_chunk/2"}],"key":"functions"}]},{"id":"Lightning.Runtime.Result","group":"Runtime","title":"Lightning.Runtime.Result","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"new/1","title":"new(fields \\\\ [])","anchor":"new/1"}],"key":"functions"}]},{"id":"Lightning.Runtime.RunSpec","group":"Runtime","title":"Lightning.Runtime.RunSpec","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"new/1","title":"new(fields \\\\ [])","anchor":"new/1"}],"key":"functions"}]},{"id":"Lightning.MetadataService.Error","group":"Exceptions","title":"Lightning.MetadataService.Error","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"message/1","title":"message(map)","anchor":"message/1"},{"id":"new/1","title":"new(type)","anchor":"new/1"}],"key":"functions"}]}],"extras":[{"id":"api-reference","group":"","title":"API Reference","headers":[{"id":"Modules","anchor":"modules"},{"id":"Mix Tasks","anchor":"mix-tasks"}]},{"id":"readme","group":"","title":"Lightning","headers":[{"id":"Contents","anchor":"contents"},{"id":"Demo","anchor":"demo"},{"id":"Register for a Beta account","anchor":"register-for-a-beta-account"},{"id":"Features","anchor":"features"},{"id":"Getting Started","anchor":"getting-started"},{"id":"Run via Docker","anchor":"run-via-docker"},{"id":"Deploy on external infrastructure","anchor":"deploy-on-external-infrastructure"},{"id":"Run Lightning locally","anchor":"run-lightning-locally"},{"id":"Benchmarking","anchor":"benchmarking"},{"id":"Troubleshooting","anchor":"troubleshooting"},{"id":"Project Configuration Quickstart","anchor":"project-configuration-quickstart"},{"id":"Contribute to this project","anchor":"contribute-to-this-project"},{"id":"Generating Documentation","anchor":"generating-documentation"},{"id":"Security and Standards","anchor":"security-and-standards"},{"id":"Server Specs for Self-Hosting","anchor":"server-specs-for-self-hosting"},{"id":"Support","anchor":"support"}]},{"id":"deployment","group":"","title":"Deployment","headers":[{"id":"Encryption","anchor":"encryption"},{"id":"Environment Variables","anchor":"environment-variables"}]},{"id":"benchmarking","group":"","title":"Benchmarking","headers":[]},{"id":"provisioning","group":"","title":"Provisioning","headers":[{"id":"Using the API","anchor":"using-the-api"},{"id":"Document Structure","anchor":"document-structure"},{"id":"API Behaviour","anchor":"api-behaviour"},{"id":"Relationship with Projects as Code","anchor":"relationship-with-projects-as-code"}]},{"id":"changelog","group":"","title":"Changelog","headers":[{"id":"[Unreleased]","anchor":"unreleased"},{"id":"[v0.7.3] - 2023-08-15","anchor":"v0-7-3-2023-08-15"},{"id":"[v0.7.2] - 2023-08-10","anchor":"v0-7-2-2023-08-10"},{"id":"[v0.7.1] - 2023-08-04","anchor":"v0-7-1-2023-08-04"},{"id":"[v0.7.0] - 2023-08-04","anchor":"v0-7-0-2023-08-04"},{"id":"[v0.7.0-pre5] - 2023-07-28","anchor":"v0-7-0-pre5-2023-07-28"},{"id":"[v0.7.0-pre4] - 2023-07-27","anchor":"v0-7-0-pre4-2023-07-27"},{"id":"[v0.7.0-pre3] - 2023-07-26","anchor":"v0-7-0-pre3-2023-07-26"},{"id":"[v0.7.0-pre2] - 2023-07-26","anchor":"v0-7-0-pre2-2023-07-26"},{"id":"[0.6.7] - 2023-07-13","anchor":"0-6-7-2023-07-13"},{"id":"[0.6.6] - 2023-06-30","anchor":"0-6-6-2023-06-30"},{"id":"[0.6.5] - 2023-06-22","anchor":"0-6-5-2023-06-22"},{"id":"[0.6.3] - 2023-06-15","anchor":"0-6-3-2023-06-15"},{"id":"[0.6.2] - 2023-06-09","anchor":"0-6-2-2023-06-09"},{"id":"[0.6.1] - 2023-06-08","anchor":"0-6-1-2023-06-08"},{"id":"[0.6.0]- 2023-04-12","anchor":"0-6-0-2023-04-12"},{"id":"[0.5.2]","anchor":"0-5-2"},{"id":"[0.5.1] - 2023-04-12","anchor":"0-5-1-2023-04-12"},{"id":"[0.5.0] - 2023-04-03","anchor":"0-5-0-2023-04-03"},{"id":"[0.4.8] - 2023-03-29","anchor":"0-4-8-2023-03-29"},{"id":"[0.4.6] - 2023-03-23","anchor":"0-4-6-2023-03-23"},{"id":"[0.4.4] - 2023-03-10","anchor":"0-4-4-2023-03-10"},{"id":"[0.4.3] - 2023-03-06","anchor":"0-4-3-2023-03-06"},{"id":"[0.4.2] - 2023-02-24","anchor":"0-4-2-2023-02-24"},{"id":"[0.4.0] - 2023-02-08","anchor":"0-4-0-2023-02-08"},{"id":"[0.3.1] - 2022-11-22","anchor":"0-3-1-2022-11-22"},{"id":"[0.3.0] - 2022-11-21","anchor":"0-3-0-2022-11-21"},{"id":"[0.2.0] - 2022-09-12","anchor":"0-2-0-2022-09-12"},{"id":"[0.1.13] - 2022-08-29","anchor":"0-1-13-2022-08-29"},{"id":"[0.1.12] - 2022-08-15","anchor":"0-1-12-2022-08-15"},{"id":"[0.1.11] - 2022-08-05","anchor":"0-1-11-2022-08-05"},{"id":"[0.1.10] - 2022-08-05","anchor":"0-1-10-2022-08-05"},{"id":"[0.1.9] - 2022-07-27","anchor":"0-1-9-2022-07-27"},{"id":"[0.1.7] - 2022-06-24","anchor":"0-1-7-2022-06-24"},{"id":"[0.1.6] - 2022-06-07","anchor":"0-1-6-2022-06-07"}]}],"tasks":[{"id":"Mix.Tasks.Lightning.GenEncryptionKey","group":"","title":"mix lightning.gen_encryption_key","sections":[]},{"id":"Mix.Tasks.Lightning.InstallRuntime","group":"","title":"mix lightning.install_runtime","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"packages/0","title":"packages()","anchor":"packages/0"},{"id":"run/1","title":"run(_)","anchor":"run/1"}],"key":"functions"}]},{"id":"Mix.Tasks.Lightning.InstallSchemas","group":"","title":"mix lightning.install_schemas","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"body/0","title":"body()","anchor":"t:body/0"},{"id":"headers/0","title":"headers()","anchor":"t:headers/0"},{"id":"method/0","title":"method()","anchor":"t:method/0"},{"id":"options/0","title":"options()","anchor":"t:options/0"},{"id":"params/0","title":"params()","anchor":"t:params/0"},{"id":"request/0","title":"request()","anchor":"t:request/0"},{"id":"url/0","title":"url()","anchor":"t:url/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"delete/3","title":"delete(url, headers \\\\ [], options \\\\ [])","anchor":"delete/3"},{"id":"delete!/3","title":"delete!(url, headers \\\\ [], options \\\\ [])","anchor":"delete!/3"},{"id":"fetch_schemas/2","title":"fetch_schemas(excluded \\\\ [], fun)","anchor":"fetch_schemas/2"},{"id":"get/3","title":"get(url, headers \\\\ [], options \\\\ [])","anchor":"get/3"},{"id":"get!/3","title":"get!(url, headers \\\\ [], options \\\\ [])","anchor":"get!/3"},{"id":"head/3","title":"head(url, headers \\\\ [], options \\\\ [])","anchor":"head/3"},{"id":"head!/3","title":"head!(url, headers \\\\ [], options \\\\ [])","anchor":"head!/3"},{"id":"options/3","title":"options(url, headers \\\\ [], options \\\\ [])","anchor":"options/3"},{"id":"options!/3","title":"options!(url, headers \\\\ [], options \\\\ [])","anchor":"options!/3"},{"id":"parse_excluded/1","title":"parse_excluded(args)","anchor":"parse_excluded/1"},{"id":"patch/4","title":"patch(url, body, headers \\\\ [], options \\\\ [])","anchor":"patch/4"},{"id":"patch!/4","title":"patch!(url, body, headers \\\\ [], options \\\\ [])","anchor":"patch!/4"},{"id":"persist_schema/2","title":"persist_schema(dir, package_name)","anchor":"persist_schema/2"},{"id":"post/4","title":"post(url, body, headers \\\\ [], options \\\\ [])","anchor":"post/4"},{"id":"post!/4","title":"post!(url, body, headers \\\\ [], options \\\\ [])","anchor":"post!/4"},{"id":"process_headers/1","title":"process_headers(headers)","anchor":"process_headers/1"},{"id":"process_request_body/1","title":"process_request_body(body)","anchor":"process_request_body/1"},{"id":"process_request_headers/1","title":"process_request_headers(headers)","anchor":"process_request_headers/1"},{"id":"process_request_options/1","title":"process_request_options(options)","anchor":"process_request_options/1"},{"id":"process_request_params/1","title":"process_request_params(params)","anchor":"process_request_params/1"},{"id":"process_request_url/1","title":"process_request_url(url)","anchor":"process_request_url/1"},{"id":"process_response/1","title":"process_response(response)","anchor":"process_response/1"},{"id":"process_response_body/1","title":"process_response_body(body)","anchor":"process_response_body/1"},{"id":"process_response_chunk/1","title":"process_response_chunk(chunk)","anchor":"process_response_chunk/1"},{"id":"process_response_headers/1","title":"process_response_headers(headers)","anchor":"process_response_headers/1"},{"id":"process_response_status_code/1","title":"process_response_status_code(status_code)","anchor":"process_response_status_code/1"},{"id":"process_status_code/1","title":"process_status_code(status_code)","anchor":"process_status_code/1"},{"id":"process_url/1","title":"process_url(url)","anchor":"process_url/1"},{"id":"put/4","title":"put(url, body \\\\ \"\", headers \\\\ [], options \\\\ [])","anchor":"put/4"},{"id":"put!/4","title":"put!(url, body \\\\ \"\", headers \\\\ [], options \\\\ [])","anchor":"put!/4"},{"id":"request/1","title":"request(request)","anchor":"request/1"},{"id":"request/5","title":"request(method, url, body \\\\ \"\", headers \\\\ [], options \\\\ [])","anchor":"request/5"},{"id":"request!/5","title":"request!(method, url, body \\\\ \"\", headers \\\\ [], options \\\\ [])","anchor":"request!/5"},{"id":"run/1","title":"run(args)","anchor":"run/1"},{"id":"start/0","title":"start()","anchor":"start/0"},{"id":"stream_next/1","title":"stream_next(resp)","anchor":"stream_next/1"},{"id":"write_schema/3","title":"write_schema(dir, package_name, data)","anchor":"write_schema/3"}],"key":"functions"}]}]} \ No newline at end of file diff --git a/provisioning.html b/provisioning.html index 5514430e73..bcc5f15738 100644 --- a/provisioning.html +++ b/provisioning.html @@ -13,7 +13,7 @@ - + diff --git a/readme.html b/readme.html index fd6d9c320a..f749396be4 100644 --- a/readme.html +++ b/readme.html @@ -13,7 +13,7 @@ - + @@ -335,7 +335,7 @@

Problems with Debian

If you're getting this error on debian

==> earmark_parser
-Compiling 1 file (.yrl)
+Compiling 1 file (.yrl)
 /usr/lib/erlang/lib/parsetools-2.3.1/include/yeccpre.hrl: no such file or directory
 could not compile dependency :earmark_parser, "mix compile" failed. You can recompile this dependency with "mix deps.compile earmark_parser", update it with "mix deps.update earmark_parser" or clean it with "mix deps.clean earmark_parser"

You need to install erlang development environment sudo apt install erlang-dev refer to this issue

@@ -361,8 +361,8 @@

Versions

The build may not work on old versions of Docker and Docker lib/mix/tasks/compile.rambo.ex:89: Mix.Tasks.Compile.Rambo.compile!/0 lib/mix/tasks/compile.rambo.ex:51: Mix.Tasks.Compile.Rambo.run/1 - (mix 1.14.2) lib/mix/task.ex:421: anonymous fn/3 in Mix.Task.run_task/4 - (mix 1.14.2) lib/mix/cli.ex:84: Mix.CLI.run_task/2

You can resolve this error by installing the Rust compiler using Homebrew. Run + (mix 1.14.2) lib/mix/task.ex:421: anonymous fn/3 in Mix.Task.run_task/4 + (mix 1.14.2) lib/mix/cli.ex:84: Mix.CLI.run_task/2

You can resolve this error by installing the Rust compiler using Homebrew. Run the following command in your terminal: brew install rust

If you have already compiled Rambo explicitly via mix compile.rambo, and you are still seeing the following error:

sh: /path_to_directory/Lightning/_build/dev/lib/rambo/priv/rambo: No such file or directory
 sh: line 0: exec: /path_to_directory/Lightning/_build/dev/lib/rambo/priv/rambo: cannot execute: No such file or directory

You can try renaming deps/rambo/priv/rambo-mac to deps/rambo/priv/rambo.

If neither of the approaches above work, please raise an issue.

Starting from scratch

If you're actively working with docker, you start experiencing issues, and you diff --git a/search.html b/search.html index 6338bd7850..7416e783ec 100644 --- a/search.html +++ b/search.html @@ -13,7 +13,7 @@ - + @@ -107,7 +107,7 @@

- +