packages feed

gitlab-haskell 1.3.0.0 → 1.4.0.0

raw patch · 27 files changed

+840/−244 lines, 27 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

- GitLab.SystemHooks.Types: GroupRemove :: Text -> Text -> Text -> Text -> Maybe Text -> Maybe Text -> Text -> Int -> GroupRemove
- GitLab.SystemHooks.Types: [groupRemove_created_at] :: GroupRemove -> Text
- GitLab.SystemHooks.Types: [groupRemove_event_name] :: GroupRemove -> Text
- GitLab.SystemHooks.Types: [groupRemove_group_id] :: GroupRemove -> Int
- GitLab.SystemHooks.Types: [groupRemove_name] :: GroupRemove -> Text
- GitLab.SystemHooks.Types: [groupRemove_owner_email] :: GroupRemove -> Maybe Text
- GitLab.SystemHooks.Types: [groupRemove_owner_name] :: GroupRemove -> Maybe Text
- GitLab.SystemHooks.Types: [groupRemove_path] :: GroupRemove -> Text
- GitLab.SystemHooks.Types: [groupRemove_updated_at] :: GroupRemove -> Text
- GitLab.SystemHooks.Types: [objectAttributes_action] :: MergeRequestObjectAttributes -> Maybe Text
- GitLab.SystemHooks.Types: [objectAttributes_assignee_id] :: MergeRequestObjectAttributes -> Maybe Int
- GitLab.SystemHooks.Types: [objectAttributes_assignee_ids] :: MergeRequestObjectAttributes -> Maybe [Int]
- GitLab.SystemHooks.Types: [objectAttributes_author_id] :: MergeRequestObjectAttributes -> Maybe Int
- GitLab.SystemHooks.Types: [objectAttributes_created_at] :: MergeRequestObjectAttributes -> Text
- GitLab.SystemHooks.Types: [objectAttributes_deleted_at] :: MergeRequestObjectAttributes -> Maybe Text
- GitLab.SystemHooks.Types: [objectAttributes_description] :: MergeRequestObjectAttributes -> Text
- GitLab.SystemHooks.Types: [objectAttributes_head_pipeline_id] :: MergeRequestObjectAttributes -> Maybe Int
- GitLab.SystemHooks.Types: [objectAttributes_human_time_estimate] :: MergeRequestObjectAttributes -> Maybe Int
- GitLab.SystemHooks.Types: [objectAttributes_human_total_time_spent] :: MergeRequestObjectAttributes -> Maybe Int
- GitLab.SystemHooks.Types: [objectAttributes_id] :: MergeRequestObjectAttributes -> Int
- GitLab.SystemHooks.Types: [objectAttributes_iid] :: MergeRequestObjectAttributes -> Int
- GitLab.SystemHooks.Types: [objectAttributes_in_progress_merge_commit_sha] :: MergeRequestObjectAttributes -> Maybe Text
- GitLab.SystemHooks.Types: [objectAttributes_last_commit] :: MergeRequestObjectAttributes -> CommitEvent
- GitLab.SystemHooks.Types: [objectAttributes_last_edited_at] :: MergeRequestObjectAttributes -> Maybe Text
- GitLab.SystemHooks.Types: [objectAttributes_last_edited_by_id] :: MergeRequestObjectAttributes -> Maybe Int
- GitLab.SystemHooks.Types: [objectAttributes_lock_version] :: MergeRequestObjectAttributes -> Maybe Int
- GitLab.SystemHooks.Types: [objectAttributes_merge_commit_sha] :: MergeRequestObjectAttributes -> Maybe Text
- GitLab.SystemHooks.Types: [objectAttributes_merge_error] :: MergeRequestObjectAttributes -> Maybe Text
- GitLab.SystemHooks.Types: [objectAttributes_merge_jid] :: MergeRequestObjectAttributes -> Maybe Int
- GitLab.SystemHooks.Types: [objectAttributes_merge_params] :: MergeRequestObjectAttributes -> Maybe MergeParams
- GitLab.SystemHooks.Types: [objectAttributes_merge_status] :: MergeRequestObjectAttributes -> Text
- GitLab.SystemHooks.Types: [objectAttributes_merge_user_id] :: MergeRequestObjectAttributes -> Maybe Int
- GitLab.SystemHooks.Types: [objectAttributes_merge_when_pipeline_succeeds] :: MergeRequestObjectAttributes -> Maybe Bool
- GitLab.SystemHooks.Types: [objectAttributes_milestone_id] :: MergeRequestObjectAttributes -> Maybe Int
- GitLab.SystemHooks.Types: [objectAttributes_ref_fetched] :: MergeRequestObjectAttributes -> Maybe Bool
- GitLab.SystemHooks.Types: [objectAttributes_source] :: MergeRequestObjectAttributes -> ProjectEvent
- GitLab.SystemHooks.Types: [objectAttributes_source_branch] :: MergeRequestObjectAttributes -> Text
- GitLab.SystemHooks.Types: [objectAttributes_source_project_id] :: MergeRequestObjectAttributes -> Int
- GitLab.SystemHooks.Types: [objectAttributes_state] :: MergeRequestObjectAttributes -> Text
- GitLab.SystemHooks.Types: [objectAttributes_state_id] :: MergeRequestObjectAttributes -> Maybe Int
- GitLab.SystemHooks.Types: [objectAttributes_target] :: MergeRequestObjectAttributes -> ProjectEvent
- GitLab.SystemHooks.Types: [objectAttributes_target_branch] :: MergeRequestObjectAttributes -> Text
- GitLab.SystemHooks.Types: [objectAttributes_target_project_id] :: MergeRequestObjectAttributes -> Int
- GitLab.SystemHooks.Types: [objectAttributes_time_estimate] :: MergeRequestObjectAttributes -> Maybe Int
- GitLab.SystemHooks.Types: [objectAttributes_title] :: MergeRequestObjectAttributes -> Text
- GitLab.SystemHooks.Types: [objectAttributes_total_time_spent] :: MergeRequestObjectAttributes -> Maybe Int
- GitLab.SystemHooks.Types: [objectAttributes_updated_at] :: MergeRequestObjectAttributes -> Text
- GitLab.SystemHooks.Types: [objectAttributes_updated_by_id] :: MergeRequestObjectAttributes -> Maybe Int
- GitLab.SystemHooks.Types: [objectAttributes_work_in_progress] :: MergeRequestObjectAttributes -> Bool
- GitLab.SystemHooks.Types: data GroupRemove
- GitLab.SystemHooks.Types: instance Data.Aeson.Types.FromJSON.FromJSON GitLab.SystemHooks.Types.GroupRemove
- GitLab.SystemHooks.Types: instance GHC.Classes.Eq GitLab.SystemHooks.Types.GroupRemove
- GitLab.SystemHooks.Types: instance GHC.Show.Show GitLab.SystemHooks.Types.GroupRemove
- GitLab.SystemHooks.Types: instance GitLab.SystemHooks.Types.SystemHook GitLab.SystemHooks.Types.GroupRemove
+ GitLab.API.Pipelines: PipelineCanceled :: PipelineStatus
+ GitLab.API.Pipelines: PipelineCreated :: PipelineStatus
+ GitLab.API.Pipelines: PipelineFailed :: PipelineStatus
+ GitLab.API.Pipelines: PipelineManual :: PipelineStatus
+ GitLab.API.Pipelines: PipelineOrderById :: PipelineOrderBy
+ GitLab.API.Pipelines: PipelineOrderByRef :: PipelineOrderBy
+ GitLab.API.Pipelines: PipelineOrderByStatus :: PipelineOrderBy
+ GitLab.API.Pipelines: PipelineOrderByUpdatedAt :: PipelineOrderBy
+ GitLab.API.Pipelines: PipelineOrderByUserId :: PipelineOrderBy
+ GitLab.API.Pipelines: PipelinePending :: PipelineStatus
+ GitLab.API.Pipelines: PipelinePreparing :: PipelineStatus
+ GitLab.API.Pipelines: PipelineRunning :: PipelineStatus
+ GitLab.API.Pipelines: PipelineScheduled :: PipelineStatus
+ GitLab.API.Pipelines: PipelineScopeBranches :: PipelineScope
+ GitLab.API.Pipelines: PipelineScopeFinished :: PipelineScope
+ GitLab.API.Pipelines: PipelineScopePending :: PipelineScope
+ GitLab.API.Pipelines: PipelineScopeRunning :: PipelineScope
+ GitLab.API.Pipelines: PipelineScopeTags :: PipelineScope
+ GitLab.API.Pipelines: PipelineSearchAttrs :: Maybe Text -> Maybe PipelineOrderBy -> Maybe Text -> Maybe PipelineScope -> Maybe Text -> Maybe SortBy -> Maybe Text -> Maybe PipelineStatus -> Maybe UTCTime -> Maybe UTCTime -> Maybe UTCTime -> Maybe UTCTime -> Maybe Text -> Maybe Bool -> PipelineSearchAttrs
+ GitLab.API.Pipelines: PipelineSkipped :: PipelineStatus
+ GitLab.API.Pipelines: PipelineSuccess :: PipelineStatus
+ GitLab.API.Pipelines: PipelineWaitingForResource :: PipelineStatus
+ GitLab.API.Pipelines: [pipelineSearchFilter_created_after] :: PipelineSearchAttrs -> Maybe UTCTime
+ GitLab.API.Pipelines: [pipelineSearchFilter_created_before] :: PipelineSearchAttrs -> Maybe UTCTime
+ GitLab.API.Pipelines: [pipelineSearchFilter_name] :: PipelineSearchAttrs -> Maybe Text
+ GitLab.API.Pipelines: [pipelineSearchFilter_order_by] :: PipelineSearchAttrs -> Maybe PipelineOrderBy
+ GitLab.API.Pipelines: [pipelineSearchFilter_ref] :: PipelineSearchAttrs -> Maybe Text
+ GitLab.API.Pipelines: [pipelineSearchFilter_scope] :: PipelineSearchAttrs -> Maybe PipelineScope
+ GitLab.API.Pipelines: [pipelineSearchFilter_sha] :: PipelineSearchAttrs -> Maybe Text
+ GitLab.API.Pipelines: [pipelineSearchFilter_sort] :: PipelineSearchAttrs -> Maybe SortBy
+ GitLab.API.Pipelines: [pipelineSearchFilter_source] :: PipelineSearchAttrs -> Maybe Text
+ GitLab.API.Pipelines: [pipelineSearchFilter_status] :: PipelineSearchAttrs -> Maybe PipelineStatus
+ GitLab.API.Pipelines: [pipelineSearchFilter_updated_after] :: PipelineSearchAttrs -> Maybe UTCTime
+ GitLab.API.Pipelines: [pipelineSearchFilter_updated_before] :: PipelineSearchAttrs -> Maybe UTCTime
+ GitLab.API.Pipelines: [pipelineSearchFilter_username] :: PipelineSearchAttrs -> Maybe Text
+ GitLab.API.Pipelines: [pipelineSearchFilter_yaml_errors] :: PipelineSearchAttrs -> Maybe Bool
+ GitLab.API.Pipelines: data PipelineOrderBy
+ GitLab.API.Pipelines: data PipelineScope
+ GitLab.API.Pipelines: data PipelineSearchAttrs
+ GitLab.API.Pipelines: data PipelineStatus
+ GitLab.API.Pipelines: instance Data.Default.Internal.Default GitLab.API.Pipelines.PipelineSearchAttrs
+ GitLab.API.Pipelines: instance GHC.Show.Show GitLab.API.Pipelines.PipelineOrderBy
+ GitLab.API.Pipelines: instance GHC.Show.Show GitLab.API.Pipelines.PipelineScope
+ GitLab.API.Pipelines: instance GHC.Show.Show GitLab.API.Pipelines.PipelineStatus
+ GitLab.SystemHooks.Types: DeploymentEvent :: Text -> Maybe Text -> Int -> Int -> Text -> Text -> Text -> Text -> Maybe Text -> ProjectEvent -> Text -> User -> Text -> Text -> Text -> Text -> DeploymentEvent
+ GitLab.SystemHooks.Types: GroupDestroyEvent :: Text -> Text -> Text -> Maybe Text -> Maybe Text -> Text -> Int -> GroupDestroyEvent
+ GitLab.SystemHooks.Types: MilestoneAttributes :: Int -> Int -> Text -> Text -> Text -> Text -> Text -> Text -> Text -> Int -> MilestoneAttributes
+ GitLab.SystemHooks.Types: MilestoneEvent :: ProjectEvent -> Maybe Text -> MilestoneAttributes -> Text -> MilestoneEvent
+ GitLab.SystemHooks.Types: [deployment_event_commit_title] :: DeploymentEvent -> Text
+ GitLab.SystemHooks.Types: [deployment_event_commit_url] :: DeploymentEvent -> Text
+ GitLab.SystemHooks.Types: [deployment_event_deployable_id] :: DeploymentEvent -> Int
+ GitLab.SystemHooks.Types: [deployment_event_deployable_url] :: DeploymentEvent -> Text
+ GitLab.SystemHooks.Types: [deployment_event_deployment_id] :: DeploymentEvent -> Int
+ GitLab.SystemHooks.Types: [deployment_event_environment] :: DeploymentEvent -> Text
+ GitLab.SystemHooks.Types: [deployment_event_environment_external_url] :: DeploymentEvent -> Maybe Text
+ GitLab.SystemHooks.Types: [deployment_event_environment_slug] :: DeploymentEvent -> Text
+ GitLab.SystemHooks.Types: [deployment_event_environment_tier] :: DeploymentEvent -> Text
+ GitLab.SystemHooks.Types: [deployment_event_project] :: DeploymentEvent -> ProjectEvent
+ GitLab.SystemHooks.Types: [deployment_event_ref] :: DeploymentEvent -> Text
+ GitLab.SystemHooks.Types: [deployment_event_short_sha] :: DeploymentEvent -> Text
+ GitLab.SystemHooks.Types: [deployment_event_status] :: DeploymentEvent -> Text
+ GitLab.SystemHooks.Types: [deployment_event_status_changed_at] :: DeploymentEvent -> Maybe Text
+ GitLab.SystemHooks.Types: [deployment_event_user] :: DeploymentEvent -> User
+ GitLab.SystemHooks.Types: [deployment_event_user_url] :: DeploymentEvent -> Text
+ GitLab.SystemHooks.Types: [group_destroy_event_created_at] :: GroupDestroyEvent -> Text
+ GitLab.SystemHooks.Types: [group_destroy_event_group_id] :: GroupDestroyEvent -> Int
+ GitLab.SystemHooks.Types: [group_destroy_event_name] :: GroupDestroyEvent -> Text
+ GitLab.SystemHooks.Types: [group_destroy_event_owner_email] :: GroupDestroyEvent -> Maybe Text
+ GitLab.SystemHooks.Types: [group_destroy_event_owner_name] :: GroupDestroyEvent -> Maybe Text
+ GitLab.SystemHooks.Types: [group_destroy_event_path] :: GroupDestroyEvent -> Text
+ GitLab.SystemHooks.Types: [group_destroy_event_updated_at] :: GroupDestroyEvent -> Text
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_action] :: MergeRequestObjectAttributes -> Maybe Text
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_assignee_id] :: MergeRequestObjectAttributes -> Maybe Int
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_assignee_ids] :: MergeRequestObjectAttributes -> Maybe [Int]
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_author_id] :: MergeRequestObjectAttributes -> Maybe Int
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_created_at] :: MergeRequestObjectAttributes -> Maybe Text
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_deleted_at] :: MergeRequestObjectAttributes -> Maybe Text
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_description] :: MergeRequestObjectAttributes -> Maybe Text
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_head_pipeline_id] :: MergeRequestObjectAttributes -> Maybe Int
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_human_time_estimate] :: MergeRequestObjectAttributes -> Maybe Int
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_human_total_time_spent] :: MergeRequestObjectAttributes -> Maybe Int
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_id] :: MergeRequestObjectAttributes -> Int
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_iid] :: MergeRequestObjectAttributes -> Int
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_in_progress_merge_commit_sha] :: MergeRequestObjectAttributes -> Maybe Text
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_last_commit] :: MergeRequestObjectAttributes -> Maybe CommitEvent
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_last_edited_at] :: MergeRequestObjectAttributes -> Maybe Text
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_last_edited_by_id] :: MergeRequestObjectAttributes -> Maybe Int
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_lock_version] :: MergeRequestObjectAttributes -> Maybe Int
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_merge_commit_sha] :: MergeRequestObjectAttributes -> Maybe Text
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_merge_error] :: MergeRequestObjectAttributes -> Maybe Text
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_merge_jid] :: MergeRequestObjectAttributes -> Maybe Int
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_merge_params] :: MergeRequestObjectAttributes -> Maybe MergeParams
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_merge_status] :: MergeRequestObjectAttributes -> Text
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_merge_user_id] :: MergeRequestObjectAttributes -> Maybe Int
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_merge_when_pipeline_succeeds] :: MergeRequestObjectAttributes -> Maybe Bool
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_milestone_id] :: MergeRequestObjectAttributes -> Maybe Int
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_ref_fetched] :: MergeRequestObjectAttributes -> Maybe Bool
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_source] :: MergeRequestObjectAttributes -> Maybe ProjectEvent
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_source_branch] :: MergeRequestObjectAttributes -> Text
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_source_project_id] :: MergeRequestObjectAttributes -> Int
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_state] :: MergeRequestObjectAttributes -> Text
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_state_id] :: MergeRequestObjectAttributes -> Maybe Int
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_target] :: MergeRequestObjectAttributes -> Maybe ProjectEvent
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_target_branch] :: MergeRequestObjectAttributes -> Text
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_target_project_id] :: MergeRequestObjectAttributes -> Int
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_time_estimate] :: MergeRequestObjectAttributes -> Maybe Int
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_title] :: MergeRequestObjectAttributes -> Text
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_total_time_spent] :: MergeRequestObjectAttributes -> Maybe Int
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_updated_at] :: MergeRequestObjectAttributes -> Maybe Text
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_updated_by_id] :: MergeRequestObjectAttributes -> Maybe Int
+ GitLab.SystemHooks.Types: [merge_request_object_attributes_work_in_progress] :: MergeRequestObjectAttributes -> Maybe Bool
+ GitLab.SystemHooks.Types: [milestone_attributes_created_at] :: MilestoneAttributes -> Text
+ GitLab.SystemHooks.Types: [milestone_attributes_description] :: MilestoneAttributes -> Text
+ GitLab.SystemHooks.Types: [milestone_attributes_due_date] :: MilestoneAttributes -> Text
+ GitLab.SystemHooks.Types: [milestone_attributes_id] :: MilestoneAttributes -> Int
+ GitLab.SystemHooks.Types: [milestone_attributes_iid] :: MilestoneAttributes -> Int
+ GitLab.SystemHooks.Types: [milestone_attributes_project_id] :: MilestoneAttributes -> Int
+ GitLab.SystemHooks.Types: [milestone_attributes_start_date] :: MilestoneAttributes -> Text
+ GitLab.SystemHooks.Types: [milestone_attributes_state] :: MilestoneAttributes -> Text
+ GitLab.SystemHooks.Types: [milestone_attributes_title] :: MilestoneAttributes -> Text
+ GitLab.SystemHooks.Types: [milestone_attributes_updated_at] :: MilestoneAttributes -> Text
+ GitLab.SystemHooks.Types: [milestone_event_action] :: MilestoneEvent -> Text
+ GitLab.SystemHooks.Types: [milestone_event_group] :: MilestoneEvent -> Maybe Text
+ GitLab.SystemHooks.Types: [milestone_event_object_attributes] :: MilestoneEvent -> MilestoneAttributes
+ GitLab.SystemHooks.Types: [milestone_event_project] :: MilestoneEvent -> ProjectEvent
+ GitLab.SystemHooks.Types: data DeploymentEvent
+ GitLab.SystemHooks.Types: data GroupDestroyEvent
+ GitLab.SystemHooks.Types: data MilestoneAttributes
+ GitLab.SystemHooks.Types: data MilestoneEvent
+ GitLab.SystemHooks.Types: instance Data.Aeson.Types.FromJSON.FromJSON GitLab.SystemHooks.Types.DeploymentEvent
+ GitLab.SystemHooks.Types: instance Data.Aeson.Types.FromJSON.FromJSON GitLab.SystemHooks.Types.GroupDestroyEvent
+ GitLab.SystemHooks.Types: instance Data.Aeson.Types.FromJSON.FromJSON GitLab.SystemHooks.Types.MilestoneAttributes
+ GitLab.SystemHooks.Types: instance Data.Aeson.Types.FromJSON.FromJSON GitLab.SystemHooks.Types.MilestoneEvent
+ GitLab.SystemHooks.Types: instance GHC.Classes.Eq GitLab.SystemHooks.Types.DeploymentEvent
+ GitLab.SystemHooks.Types: instance GHC.Classes.Eq GitLab.SystemHooks.Types.GroupDestroyEvent
+ GitLab.SystemHooks.Types: instance GHC.Classes.Eq GitLab.SystemHooks.Types.MilestoneAttributes
+ GitLab.SystemHooks.Types: instance GHC.Classes.Eq GitLab.SystemHooks.Types.MilestoneEvent
+ GitLab.SystemHooks.Types: instance GHC.Generics.Generic GitLab.SystemHooks.Types.DeploymentEvent
+ GitLab.SystemHooks.Types: instance GHC.Generics.Generic GitLab.SystemHooks.Types.MilestoneAttributes
+ GitLab.SystemHooks.Types: instance GHC.Generics.Generic GitLab.SystemHooks.Types.MilestoneEvent
+ GitLab.SystemHooks.Types: instance GHC.Show.Show GitLab.SystemHooks.Types.DeploymentEvent
+ GitLab.SystemHooks.Types: instance GHC.Show.Show GitLab.SystemHooks.Types.GroupDestroyEvent
+ GitLab.SystemHooks.Types: instance GHC.Show.Show GitLab.SystemHooks.Types.MilestoneAttributes
+ GitLab.SystemHooks.Types: instance GHC.Show.Show GitLab.SystemHooks.Types.MilestoneEvent
+ GitLab.SystemHooks.Types: instance GitLab.SystemHooks.Types.SystemHook GitLab.SystemHooks.Types.DeploymentEvent
+ GitLab.SystemHooks.Types: instance GitLab.SystemHooks.Types.SystemHook GitLab.SystemHooks.Types.GroupDestroyEvent
+ GitLab.SystemHooks.Types: instance GitLab.SystemHooks.Types.SystemHook GitLab.SystemHooks.Types.MilestoneEvent
+ GitLab.Types: GitLabHttpError :: HttpResponseError -> GitLabError
+ GitLab.Types: HttpResponseError :: Text -> Status -> ResponseHeaders -> HttpResponseError
+ GitLab.Types: [delayBetweenRetries] :: GitLabServerConfig -> Int
+ GitLab.Types: [httpErrorContext] :: HttpResponseError -> Text
+ GitLab.Types: [httpErrorHeaders] :: HttpResponseError -> ResponseHeaders
+ GitLab.Types: [httpErrorStatus] :: HttpResponseError -> Status
+ GitLab.Types: data HttpResponseError
+ GitLab.Types: instance GHC.Show.Show GitLab.Types.HttpResponseError
- GitLab.API.Pipelines: pipelines :: Project -> GitLab (Maybe [Pipeline])
+ GitLab.API.Pipelines: pipelines :: Project -> PipelineSearchAttrs -> GitLab (Maybe [Pipeline])
- GitLab.SystemHooks.Types: MergeRequestObjectAttributes :: Int -> Text -> Text -> Int -> Maybe Int -> Maybe Int -> Maybe [Int] -> Text -> Text -> Text -> Maybe Int -> Text -> Maybe Int -> Text -> Int -> Int -> Text -> Maybe Int -> Maybe Text -> Maybe MergeParams -> Maybe Bool -> Maybe Int -> Maybe Text -> Maybe Text -> Maybe Text -> Maybe Int -> Maybe Int -> Maybe Text -> Maybe Int -> Maybe Int -> Maybe Bool -> Maybe Int -> ProjectEvent -> ProjectEvent -> CommitEvent -> Bool -> Maybe Int -> Maybe Int -> Maybe Int -> Maybe Text -> MergeRequestObjectAttributes
+ GitLab.SystemHooks.Types: MergeRequestObjectAttributes :: Int -> Text -> Text -> Int -> Maybe Int -> Maybe Int -> Maybe [Int] -> Text -> Maybe Text -> Maybe Text -> Maybe Int -> Text -> Maybe Int -> Text -> Int -> Int -> Maybe Text -> Maybe Int -> Maybe Text -> Maybe MergeParams -> Maybe Bool -> Maybe Int -> Maybe Text -> Maybe Text -> Maybe Text -> Maybe Int -> Maybe Int -> Maybe Text -> Maybe Int -> Maybe Int -> Maybe Bool -> Maybe Int -> Maybe ProjectEvent -> Maybe ProjectEvent -> Maybe CommitEvent -> Maybe Bool -> Maybe Int -> Maybe Int -> Maybe Int -> Maybe Text -> MergeRequestObjectAttributes
- GitLab.SystemHooks.Types: PipelineEvent :: Text -> PipelineObjectAttributes -> Maybe Text -> User -> BuildProject -> CommitEvent -> [PipelineBuild] -> PipelineEvent
+ GitLab.SystemHooks.Types: PipelineEvent :: Text -> PipelineObjectAttributes -> Maybe MergeRequestObjectAttributes -> User -> BuildProject -> CommitEvent -> [PipelineBuild] -> PipelineEvent
- GitLab.SystemHooks.Types: [pipeline_event_merge_request] :: PipelineEvent -> Maybe Text
+ GitLab.SystemHooks.Types: [pipeline_event_merge_request] :: PipelineEvent -> Maybe MergeRequestObjectAttributes
- GitLab.Types: GitLabServerConfig :: Text -> AuthMethod -> Int -> Maybe DebugSystemHooks -> GitLabServerConfig
+ GitLab.Types: GitLabServerConfig :: Text -> AuthMethod -> Int -> Int -> Maybe DebugSystemHooks -> GitLabServerConfig

Files

+ data/system-hooks/deployment1.json view
@@ -0,0 +1,42 @@+{+  "object_kind": "deployment",+  "status": "running",+  "status_changed_at": "2026-03-16 03:09:32 +0000",+  "deployment_id": 56,+  "deployable_id": 106120,+  "deployable_url": "https://example.com/joe1/proj-name/-/jobs/106120",+  "environment": "production",+  "environment_tier": "production",+  "environment_slug": "production",+  "environment_external_url": null,+  "project": {+    "id": 47800,+    "name": "proj-name",+    "description": null,+    "web_url": "https://example.com/joe1/proj-name",+    "avatar_url": null,+    "git_ssh_url": "git@example.com:joe1/proj-name.git",+    "git_http_url": "https://example.com/joe1/proj-name.git",+    "namespace": "Joe Bloggs",+    "visibility_level": 0,+    "path_with_namespace": "joe1/proj-name",+    "default_branch": "main",+    "ci_config_path": "",+    "homepage": "https://example.com/joe1/proj-name",+    "url": "git@example.com:joe1/proj-name.git",+    "ssh_url": "git@example.com:joe1/proj-name.git",+    "http_url": "https://example.com/joe1/proj-name.git"+  },+  "short_sha": "abc1",+  "user": {+    "id": 414,+    "name": "Joe Bloggs",+    "username": "joe1",+    "avatar_url": "https://secure.gravatar.com/avatar/abc1?s=80&d=identicon",+    "email": "[REDACTED]"+  },+  "user_url": "https://example.com/joe1",+  "commit_url": "https://example.com/joe1/proj-name/-/commit/abc1",+  "commit_title": "Commit title",+  "ref": "main"+}
+ data/system-hooks/deployment2.json view
@@ -0,0 +1,42 @@+{+  "object_kind": "deployment",+  "status": "success",+  "status_changed_at": "2026-03-16 03:09:34 +0000",+  "deployment_id": 56,+  "deployable_id": 106120,+  "deployable_url": "https://example.com/joe1/proj-name/-/jobs/106120",+  "environment": "production",+  "environment_tier": "production",+  "environment_slug": "production",+  "environment_external_url": null,+  "project": {+    "id": 47800,+    "name": "proj-name",+    "description": null,+    "web_url": "https://example.com/joe1/proj-name",+    "avatar_url": null,+    "git_ssh_url": "git@example.com:joe1/proj-name.git",+    "git_http_url": "https://example.com/joe1/proj-name.git",+    "namespace": "Joe Bloggs",+    "visibility_level": 0,+    "path_with_namespace": "joe1/proj-name",+    "default_branch": "main",+    "ci_config_path": "",+    "homepage": "https://example.com/joe1/proj-name",+    "url": "git@example.com:joe1/proj-name.git",+    "ssh_url": "git@example.com:joe1/proj-name.git",+    "http_url": "https://example.com/joe1/proj-name.git"+  },+  "short_sha": "abc1",+  "user": {+    "id": 414,+    "name": "Joe Bloggs",+    "username": "joe1",+    "avatar_url": "https://secure.gravatar.com/avatar/abc1?s=80&d=identicon",+    "email": "[REDACTED]"+  },+  "user_url": "https://example.com/joe1",+  "commit_url": "https://example.com/joe1/proj-name/-/commit/abc1",+  "commit_title": "Commit title",+  "ref": "main"+}
+ data/system-hooks/group-destroy2.json view
@@ -0,0 +1,9 @@+{+  "created_at": "2026-03-24T00:44:28Z",+  "updated_at": "2026-03-24T12:27:38Z",+  "event_name": "group_destroy",+  "name": "proj-deletion_scheduled-57112",+  "path": "proj-deletion_scheduled-57112",+  "full_path": "proj-deletion_scheduled-57112",+  "group_id": 57112+}
+ data/system-hooks/group-destroy3.json view
@@ -0,0 +1,10 @@+{+   "created_at": "2012-07-21T07:30:54Z",+   "updated_at": "2012-07-21T07:38:22Z",+   "event_name": "group_destroy",+         "name": "StoreCloud",+  "owner_email": null,+   "owner_name": null,+         "path": "storecloud",+     "group_id": 78+}
− data/system-hooks/group-removed.json
@@ -1,10 +0,0 @@-{-   "created_at": "2012-07-21T07:30:54Z",-   "updated_at": "2012-07-21T07:38:22Z",-   "event_name": "group_destroy",-         "name": "StoreCloud",-  "owner_email": null,-   "owner_name": null,-         "path": "storecloud",-     "group_id": 78-}
data/system-hooks/milestone1.json view
@@ -3,28 +3,28 @@   "event_type": "milestone",   "project": {     "id": 48355,-    "name": "Coursework 1",+    "name": "proj name",     "description": null,-    "web_url": "https://gitlab-student.macs.hw.ac.uk/f27wd-group-23/coursework-1",+    "web_url": "https://example.com/group1/proj-name",     "avatar_url": null,-    "git_ssh_url": "git@gitlab-student.macs.hw.ac.uk:f27wd-group-23/coursework-1.git",-    "git_http_url": "https://gitlab-student.macs.hw.ac.uk/f27wd-group-23/coursework-1.git",-    "namespace": "F27WD Group 23",+    "git_ssh_url": "git@example.com:group1/proj-name.git",+    "git_http_url": "https://example.com/group1/proj-name.git",+    "namespace": "project namespace",     "visibility_level": 0,-    "path_with_namespace": "f27wd-group-23/coursework-1",+    "path_with_namespace": "group1/proj-name",     "default_branch": "main",     "ci_config_path": "",-    "homepage": "https://gitlab-student.macs.hw.ac.uk/f27wd-group-23/coursework-1",-    "url": "git@gitlab-student.macs.hw.ac.uk:f27wd-group-23/coursework-1.git",-    "ssh_url": "git@gitlab-student.macs.hw.ac.uk:f27wd-group-23/coursework-1.git",-    "http_url": "https://gitlab-student.macs.hw.ac.uk/f27wd-group-23/coursework-1.git"+    "homepage": "https://example.com/group1/proj-name",+    "url": "git@example.com:group1/proj-name.git",+    "ssh_url": "git@example.com:group1/proj-name.git",+    "http_url": "https://example.com/group1/proj-name.git"   },   "group": null,   "object_attributes": {     "id": 115,     "iid": 1,-    "title": "Redesign and Implement Vortex",-    "description": "This is to track the completion of CW1 against the marking scheme.\r\n\r\n| Criterion | Description | Marks |\r\n|-----------|-------------|-------|\r\n|  |  |  |\r\n|  |  |  |\r\n|  |  |  |\r\n\r\n",+    "title": "Milestone title",+    "description": "Milestone description",     "state": "active",     "created_at": "2026-02-12 12:35:59 UTC",     "updated_at": "2026-02-12 12:35:59 UTC",
+ data/system-hooks/pipeline7.json view
@@ -0,0 +1,69 @@+{+  "object_kind": "pipeline",+  "object_attributes": {+    "id": 76289,+    "iid": 4,+    "name": null,+    "ref": "the-ref",+    "tag": false,+    "sha": "abc123",+    "before_sha": "0000000000000000000000000000000000000000",+    "source": "merge_request_event",+    "status": "failed",+    "detailed_status": "failed",+    "stages": [],+    "created_at": "2026-04-05 17:37:55 UTC",+    "finished_at": "2026-04-05 17:37:55 UTC",+    "duration": null,+    "queued_duration": null,+    "protected_ref": false,+    "variables": [],+    "url": "http://www.example.com/joe1/proj-name/-/pipelines/76289"+  },+  "merge_request": {+    "id": 3252,+    "iid": 2,+    "title": "merge request title",+    "source_branch": "the-ref",+    "source_project_id": 51828,+    "target_branch": "main",+    "target_project_id": 51828,+    "state": "opened",+    "merge_status": "checking",+    "detailed_merge_status": "preparing",+    "url": "http://www.example.com/joe1/proj-name/-/merge_requests/2"+  },+  "user": {+    "id": 4273,+    "name": "Joe Bloggs",+    "username": "joe1",+    "avatar_url": "https://secure.gravatar.com/avatar/abc123",+    "email": "[REDACTED]"+  },+  "project": {+    "id": 51828,+    "name": "project name",+    "description": null,+    "web_url": "http://www.example.com/joe1/proj-name",+    "avatar_url": null,+    "git_ssh_url": "git@example.com:joe1/proj-name.git",+    "git_http_url": "http://www.example.com/joe1/proj-name.git",+    "namespace": "Joe Bloggs",+    "visibility_level": 0,+    "path_with_namespace": "joe1/proj-name",+    "default_branch": "main",+    "ci_config_path": ""+  },+  "commit": {+    "id": "abc123",+    "message": "merge request title",+    "title": "merge request title",+    "timestamp": "2026-04-05T17:37:48+00:00",+    "url": "http://www.example.com/joe1/proj-name/-/commit/abc123",+    "author": {+      "name": "Joe Bloggs",+      "email": "joe1@example.com"+    }+  },+  "builds": []+}
data/system-hooks/tag-push3.json view
@@ -1,46 +1,46 @@ {   "object_kind": "tag_push",   "event_name": "tag_push",-  "before": "6860fc562566df969ed0e59d5b71232b0bf201fb",+  "before": "abc1234",   "after": "0000000000000000000000000000000000000000",   "ref": "refs/tags/v1",   "ref_protected": false,   "checkout_sha": null,   "message": null,   "user_id": 3887,-  "user_name": "Wing To Wong",-  "user_username": "wtw4000",+  "user_name": "Joe Bloggs",+  "user_username": "joe1",   "user_email": "",-  "user_avatar": "https://secure.gravatar.com/avatar/7aaf2666b1f7488c41ff5f9c0dad237c3d5abbc5cd205f800b80053027274e6b?s=80&d=identicon",+  "user_avatar": "https://secure.gravatar.com/avatar/abc?s=80&d=identicon",   "project_id": 48175,   "project": {     "id": 48175,-    "name": "f28hs-cw1",+    "name": "proj-name",     "description": null,-    "web_url": "https://gitlab-student.macs.hw.ac.uk/wtw4000/f28hs-cw1",+    "web_url": "https://example.com/joe1/proj-name",     "avatar_url": null,-    "git_ssh_url": "git@gitlab-student.macs.hw.ac.uk:wtw4000/f28hs-cw1.git",-    "git_http_url": "https://gitlab-student.macs.hw.ac.uk/wtw4000/f28hs-cw1.git",-    "namespace": "Wing To Wong",+    "git_ssh_url": "git@example.com:joe1/proj-name.git",+    "git_http_url": "https://example.com/joe1/proj-name.git",+    "namespace": "Joe Bloggs",     "visibility_level": 0,-    "path_with_namespace": "wtw4000/f28hs-cw1",+    "path_with_namespace": "joe1/proj-name",     "default_branch": "master",     "ci_config_path": "",-    "homepage": "https://gitlab-student.macs.hw.ac.uk/wtw4000/f28hs-cw1",-    "url": "git@gitlab-student.macs.hw.ac.uk:wtw4000/f28hs-cw1.git",-    "ssh_url": "git@gitlab-student.macs.hw.ac.uk:wtw4000/f28hs-cw1.git",-    "http_url": "https://gitlab-student.macs.hw.ac.uk/wtw4000/f28hs-cw1.git"+    "homepage": "https://example.com/joe1/proj-name",+    "url": "git@example.com:joe1/proj-name.git",+    "ssh_url": "git@example.com:joe1/proj-name.git",+    "http_url": "https://example.com/joe1/proj-name.git"   },   "commits": [],   "total_commits_count": 0,   "push_options": {},   "repository": {-    "name": "f28hs-cw1",-    "url": "git@gitlab-student.macs.hw.ac.uk:wtw4000/f28hs-cw1.git",+    "name": "proj-name",+    "url": "git@example.com:joe1/proj-name.git",     "description": null,-    "homepage": "https://gitlab-student.macs.hw.ac.uk/wtw4000/f28hs-cw1",-    "git_http_url": "https://gitlab-student.macs.hw.ac.uk/wtw4000/f28hs-cw1.git",-    "git_ssh_url": "git@gitlab-student.macs.hw.ac.uk:wtw4000/f28hs-cw1.git",+    "homepage": "https://example.com/joe1/proj-name",+    "git_http_url": "https://example.com/joe1/proj-name.git",+    "git_ssh_url": "git@example.com:joe1/proj-name.git",     "visibility_level": 0   } }
gitlab-haskell.cabal view
@@ -1,7 +1,7 @@ cabal-version: 3.0 name:           gitlab-haskell category:       Git-version:        1.3.0.0+version:        1.4.0.0 synopsis:       A Haskell library for the GitLab web API description:             This library lifts the GitLab REST API into Haskell: <https://docs.gitlab.com/ee/api/>@@ -11,7 +11,7 @@ bug-reports:    https://gitlab.com/robstewart57/gitlab-haskell/issues author:         Rob Stewart maintainer:     robstewart57@gmail.com-copyright:      2025 Rob Stewart, Heriot-Watt University+copyright:      2026 Rob Stewart, Heriot-Watt University license:        BSD-3-Clause license-file:   LICENSE data-files:     data/system-hooks/*.json
src/GitLab.hs view
@@ -123,7 +123,7 @@         let (GitLabT versionCheck) = gitlabVersion         tokenTest <- runExceptT (runReaderT versionCheck (GitLabState cfg manager))         case tokenTest of-          Left (GitLabError t) -> return (Left (GitLabError t))+          Left err -> return (Left err)           Right (Left response) ->             case responseStatus response of               (Status 401 "Unauthorized") -> return $ Left (GitLabError "access token not accepted.")@@ -142,5 +142,5 @@ runGitLabDbg (GitLabT action) = do   liftIO $ hSetBuffering stdout LineBuffering   manager <- liftIO $ newManager (mkManagerSettings def Nothing)-  let cfg = GitLabServerConfig {url = "", authMethod = AuthMethodToken "", retries = 1, debugSystemHooks = Nothing}+  let cfg = GitLabServerConfig {url = "", authMethod = AuthMethodToken "", retries = 1, delayBetweenRetries = 1, debugSystemHooks = Nothing}   runExceptT (runReaderT action (GitLabState cfg manager))
src/GitLab/API/Branches.hs view
@@ -37,7 +37,7 @@     gitlabGetMany,     gitlabGetOne,     gitlabPost,-    responseErrorText,+    httpResponseError,   ) import Network.HTTP.Client @@ -47,7 +47,7 @@ branches project = do   result <- branches' (project_id project)   case result of-    Left er -> throwError (GitLabError ("branches error: " <> responseErrorText er))+    Left er -> throwError (httpResponseError "branches" er)     Right x -> return x  -- | Get a list of repository branches from a project given its@@ -75,7 +75,7 @@ branch project branchName = do   result <- branch' (project_id project) branchName   case result of-    Left er -> throwError (GitLabError ("branch error: " <> responseErrorText er))+    Left er -> throwError (httpResponseError "branch" er)     Right x -> return x  -- | Get a single project repository branch.
src/GitLab/API/Commits.hs view
@@ -104,7 +104,7 @@         ("actions", Just (T.encodeUtf8 (T.pack (show actions))))       ]   case result of-    Left resp -> throwError (GitLabError ("createCommitMultipleFilesActions: " <> responseErrorText resp))+    Left resp -> throwError (httpResponseError "createCommitMultipleFilesActions" resp)     Right x -> return x   where     commitsAddr :: Int -> Text
src/GitLab/API/Events.hs view
@@ -76,7 +76,7 @@ currentUserEvents attrs = do   result <- gitlabGetMany "/events" (eventFilters attrs)   case result of-    Left er -> throwError (GitLabError ("currentUserEvents error: " <> responseErrorText er))+    Left er -> throwError (httpResponseError "currentUserEvents" er)     Right xs -> return xs  -- | Get events for a specific user.@@ -91,7 +91,7 @@ userEvents usr attrs = do   result <- userEvents' (user_id usr) attrs   case result of-    Left er -> throwError (GitLabError ("userEvents error: " <> responseErrorText er))+    Left er -> throwError (httpResponseError "userEvents" er)     Right xs -> return xs  -- | Get events for a specific user by ID.@@ -124,7 +124,7 @@ projectEvents proj attrs = do   result <- projectEvents' (project_id proj) attrs   case result of-    Left er -> throwError (GitLabError ("projectEvents error: " <> responseErrorText er))+    Left er -> throwError (httpResponseError "projectEvents" er)     Right xs -> return xs  -- | Get events for a project by ID.@@ -157,7 +157,7 @@ groupEvents grp attrs = do   result <- groupEvents' (group_id grp) attrs   case result of-    Left er -> throwError (GitLabError ("groupEvents error: " <> responseErrorText er))+    Left er -> throwError (httpResponseError "groupEvents" er)     Right xs -> return xs  -- | Get events for a group by ID.
src/GitLab/API/Groups.hs view
@@ -69,7 +69,7 @@ groups attrs = do   result <- gitlabGetMany "/groups" (listGroupsAttrs attrs)   case result of-    Left er -> throwError (GitLabError ("groups error: " <> responseErrorText er))+    Left er -> throwError (httpResponseError "groups" er)     Right x -> return x  -- | Get a list of visible direct subgroups in this group.@@ -83,7 +83,7 @@       )       (listGroupsAttrs attrs)   case result of-    Left er -> throwError (GitLabError ("subGroups error: " <> responseErrorText er))+    Left er -> throwError (httpResponseError "subGroups" er)     Right x -> return x  -- | Get a list of visible descendant groups of this group.@@ -97,7 +97,7 @@       )       (listGroupsAttrs attrs)   case result of-    Left er -> throwError (GitLabError ("descendantGroups error: " <> responseErrorText er))+    Left er -> throwError (httpResponseError "descendantGroups" er)     Right x -> return x  -- | Get a list of projects in this group.@@ -111,7 +111,7 @@       )       (groupProjectAttrs attrs)   case result of-    Left er -> throwError (GitLabError ("groupProjects error: " <> responseErrorText er))+    Left er -> throwError (httpResponseError "groupProjects" er)     Right x -> return x  -- | Get a list of projects in this group.@@ -125,7 +125,7 @@       )       (groupProjectAttrs attrs)   case result of-    Left er -> throwError (GitLabError ("groupSharedProjects error: " <> responseErrorText er))+    Left er -> throwError (httpResponseError "groupSharedProjects" er)     Right x -> return x  -- | Get all details of a group.@@ -217,7 +217,7 @@ searchGroup searchTxt = do   result <- gitlabGetMany "/groups" [("search", Just (T.encodeUtf8 searchTxt))]   case result of-    Left er -> throwError (GitLabError ("searchGroups error: " <> responseErrorText er))+    Left er -> throwError (httpResponseError "searchGroups" er)     Right x -> return x  -- | Attributes related to a group
src/GitLab/API/Issues.hs view
@@ -110,7 +110,7 @@ groupIssues grp attrs = do   result <- gitlabGetMany urlPath (issueFilters attrs)   case result of-    Left er -> throwError (GitLabError ("groupIssues error: " <> responseErrorText er))+    Left er -> throwError (httpResponseError "groupIssues" er)     Right x -> return x   where     urlPath =@@ -130,7 +130,7 @@ projectIssues p filters = do   result <- projectIssues' (project_id p) filters   case result of-    Left er -> throwError (GitLabError ("projectIssues error: " <> responseErrorText er))+    Left er -> throwError (httpResponseError "projectIssues" er)     Right x -> return x  -- | Get a list of a project’s issues@@ -171,7 +171,7 @@ userIssues usr = do   result <- gitlabGetMany addr params   case result of-    Left er -> throwError (GitLabError ("userIssues error: " <> responseErrorText er))+    Left er -> throwError (httpResponseError "userIssues" er)     Right x -> return x   where     addr = "/issues"@@ -498,7 +498,7 @@ issueStatisticsGroup group filters = do   result <- issueStatisticsGroup' (group_id group) filters   case result of-    Left er -> throwError (GitLabError ("issueStatisticsGroup error: " <> responseErrorText er))+    Left er -> throwError (httpResponseError "issueStatisticsGroup" er)     Right Nothing -> throwError (GitLabError "issueStatisticsGroup error")     Right (Just stats) -> return stats @@ -530,7 +530,7 @@ issueStatisticsProject proj filters = do   result <- issueStatisticsProject' (project_id proj) filters   case result of-    Left er -> throwError (GitLabError ("issueStatisticsProject error: " <> responseErrorText er))+    Left er -> throwError (httpResponseError "issueStatisticsProject" er)     Right Nothing -> throwError (GitLabError "issueStatisticsProject error")     Right (Just stats) -> return stats 
src/GitLab/API/Jobs.hs view
@@ -49,7 +49,7 @@ jobs project = do   result <- jobs' (project_id project)   case result of-    Left er -> throwError (GitLabError ("jobs error: " <> responseErrorText er))+    Left er -> throwError (httpResponseError "jobs" er)     Right answer -> return answer  -- | Get a list of jobs in a project. Jobs are sorted in descending
src/GitLab/API/Members.hs view
@@ -76,7 +76,7 @@ membersOfProject prj = do   result <- gitlabGetMany addr []   case result of-    Left er -> throwError (GitLabError ("membersOfProject error: " <> responseErrorText er))+    Left er -> throwError (httpResponseError "membersOfProject" er)     Right x -> return x   where     addr =
src/GitLab/API/MergeRequests.hs view
@@ -108,7 +108,7 @@ mergeRequests p = do   result <- mergeRequests' (project_id p)   case result of-    Left er -> throwError (GitLabError ("mergeRequests error: " <> responseErrorText er))+    Left er -> throwError (httpResponseError "mergeRequests" er)     Right x -> return x  -- | returns the merge requests for a project given its project ID.@@ -141,7 +141,7 @@ mergeRequestsWith p attrs = do   result <- mergeRequestsWith' (project_id p) attrs   case result of-    Left er -> throwError (GitLabError ("mergeRequests error: " <> responseErrorText er))+    Left er -> throwError (httpResponseError "mergeRequests" er)     Right x -> return x  -- | returns the merge requests for a project given its project ID and@@ -176,7 +176,7 @@ mergeRequestCommits p mr = do   result <- mergeRequestCommits' (project_id p) (merge_request_iid mr)   case result of-    Left er -> throwError (GitLabError ("mergeRequestCommits error: " <> responseErrorText er))+    Left er -> throwError (httpResponseError "mergeRequestCommits" er)     Right x -> return x  mergeRequestCommits' ::
src/GitLab/API/Pipelines.hs view
@@ -28,13 +28,22 @@      -- * Delete a pipeline     deletePipeline,++    -- * Querying pipelines+    PipelineSearchAttrs (..),+    PipelineOrderBy (..),+    PipelineScope (..),+    PipelineStatus (..),   ) where  import qualified Data.ByteString.Lazy as BSL+import Data.Default+import Data.Maybe import Data.Text (Text) import qualified Data.Text as T import qualified Data.Text.Encoding as T+import Data.Time.Clock import GitLab.Types import GitLab.WebRequests.GitLabWebCalls import Network.HTTP.Client@@ -45,23 +54,29 @@ pipelines ::   -- | the project   Project ->+  -- | pipeline filters+  PipelineSearchAttrs ->   GitLab (Maybe [Pipeline])-pipelines p = do-  result <- pipelines' (project_id p)+pipelines p attrs = do+  result <- pipelines' (project_id p) attrs   case result of     Right ps -> return (Just ps)-    Left _err -> return Nothing+    Left _err -> return Nothing -- perhaps throwError (GitLabError ..)  -- | returns the pipelines for a project given its project ID. pipelines' ::   -- | the project ID   Int ->+  -- | pipeline filters+  PipelineSearchAttrs ->   GitLab (Either (Response BSL.ByteString) [Pipeline])-pipelines' projectId =+pipelines' projectId attrs =   gitlabGetMany     addr-    [("sort", Just "desc")] -- most recent first+    (pipelineSearchAttrsParams attrs)   where+    -- <> [("sort", Just "desc")] is most recent first+     addr =       "/projects/"         <> T.pack (show projectId)@@ -177,3 +192,123 @@         <> T.pack (show (project_id prj))         <> "/pipelines/"         <> T.pack (show pipelineId)++data PipelineSearchAttrs = PipelineSearchAttrs+  { -- | Return pipelines with the specified name.+    pipelineSearchFilter_name :: Maybe Text,+    -- | Order pipelines by id, status, ref, updated_at or user_id (default: id)+    pipelineSearchFilter_order_by :: Maybe PipelineOrderBy,+    -- | The ref of pipelines.+    pipelineSearchFilter_ref :: Maybe Text,+    -- | The scope of pipelines, one of: running, pending, finished, branches, tags.+    pipelineSearchFilter_scope :: Maybe PipelineScope,+    -- | The SHA of pipelines.+    pipelineSearchFilter_sha :: Maybe Text,+    -- | Sort pipelines in asc or desc order (default: desc).+    pipelineSearchFilter_sort :: Maybe SortBy,+    -- | The pipeline source.+    pipelineSearchFilter_source :: Maybe Text,+    -- | The status of pipelines, one of: created, waiting_for_resource,+    -- | preparing, pending, running, success, failed, canceled, skipped,+    -- | manual, scheduled.+    pipelineSearchFilter_status :: Maybe PipelineStatus,+    -- | Return pipelines updated after the specified date. Expected in ISO 8601+    -- | format (2019-03-15T08:00:00Z).+    pipelineSearchFilter_updated_after :: Maybe UTCTime,+    -- | Return pipelines updated before the specified date. Expected in ISO+    -- | 8601 format (2019-03-15T08:00:00Z).+    pipelineSearchFilter_updated_before :: Maybe UTCTime,+    -- | Return pipelines created after the specified date. Expected in ISO 8601+    -- | format (2019-03-15T08:00:00Z).+    pipelineSearchFilter_created_after :: Maybe UTCTime,+    -- | Return pipelines created before the specified date. Expected in ISO+    -- | 8601 format (2019-03-15T08:00:00Z).+    pipelineSearchFilter_created_before :: Maybe UTCTime,+    -- | The username of the user who triggered pipelines.+    pipelineSearchFilter_username :: Maybe Text,+    -- | Returns pipelines with invalid configurations.+    pipelineSearchFilter_yaml_errors :: Maybe Bool+  }++data PipelineOrderBy+  = PipelineOrderById+  | PipelineOrderByStatus+  | PipelineOrderByRef+  | PipelineOrderByUpdatedAt+  | PipelineOrderByUserId++instance Show PipelineOrderBy where+  show PipelineOrderById = "id"+  show PipelineOrderByStatus = "status"+  show PipelineOrderByRef = "ref"+  show PipelineOrderByUpdatedAt = "updated_at"+  show PipelineOrderByUserId = "user_id"++data PipelineScope+  = PipelineScopeRunning+  | PipelineScopePending+  | PipelineScopeFinished+  | PipelineScopeBranches+  | PipelineScopeTags++instance Show PipelineScope where+  show PipelineScopeRunning = "running"+  show PipelineScopePending = "pending"+  show PipelineScopeFinished = "finished"+  show PipelineScopeBranches = "branches"+  show PipelineScopeTags = "tags"++data PipelineStatus+  = PipelineCreated+  | PipelineWaitingForResource+  | PipelinePreparing+  | PipelinePending+  | PipelineRunning+  | PipelineSuccess+  | PipelineFailed+  | PipelineCanceled+  | PipelineSkipped+  | PipelineManual+  | PipelineScheduled++instance Show PipelineStatus where+  show PipelineCreated = "created"+  show PipelineWaitingForResource = "waiting_for_resource"+  show PipelinePreparing = "preparing"+  show PipelinePending = "pending"+  show PipelineRunning = "running"+  show PipelineSuccess = "success"+  show PipelineFailed = "failed"+  show PipelineCanceled = "canceled"+  show PipelineSkipped = "skipped"+  show PipelineManual = "manual"+  show PipelineScheduled = "scheduled"++pipelineSearchAttrsParams :: PipelineSearchAttrs -> [GitLabParam]+pipelineSearchAttrsParams filters =+  catMaybes+    [ (\t -> Just ("name", textToBS t)) =<< pipelineSearchFilter_name filters,+      (\x -> Just ("order_by", textToBS (T.pack (show x)))) =<< pipelineSearchFilter_order_by filters,+      (\t -> Just ("ref", textToBS t)) =<< pipelineSearchFilter_ref filters,+      (\x -> Just ("scope", textToBS (T.pack (show x)))) =<< pipelineSearchFilter_scope filters,+      (\t -> Just ("sha", textToBS t)) =<< pipelineSearchFilter_sha filters,+      (\x -> Just ("sort", textToBS (T.pack (show x)))) =<< pipelineSearchFilter_sort filters,+      (\t -> Just ("source", textToBS t)) =<< pipelineSearchFilter_source filters,+      (\x -> Just ("status", textToBS (T.pack (show x)))) =<< pipelineSearchFilter_status filters,+      (\d -> Just ("updated_after", textToBS (T.pack (show d)))) =<< pipelineSearchFilter_updated_after filters,+      (\d -> Just ("updated_before", textToBS (T.pack (show d)))) =<< pipelineSearchFilter_updated_before filters,+      (\d -> Just ("created_after", textToBS (T.pack (show d)))) =<< pipelineSearchFilter_created_after filters,+      (\d -> Just ("created_before", textToBS (T.pack (show d)))) =<< pipelineSearchFilter_created_before filters,+      (\t -> Just ("username", textToBS t)) =<< pipelineSearchFilter_username filters,+      (\b -> Just ("yaml_errors", textToBS (showBool b))) =<< pipelineSearchFilter_yaml_errors filters+    ]+  where+    textToBS = Just . T.encodeUtf8+    showBool :: Bool -> Text+    showBool True = "true"+    showBool False = "false"++-- | A default set of project searc filters where no project filters+-- are applied, thereby returning all projects.+instance Default PipelineSearchAttrs where+  def = PipelineSearchAttrs Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing
src/GitLab/API/Projects.hs view
@@ -129,7 +129,7 @@ projects attrs = do   result <- gitlabGetMany "/projects" (projectSearchAttrsParams attrs)   case result of-    Left er -> throwError (GitLabError ("projects error: " <> responseErrorText er))+    Left er -> throwError (httpResponseError "projects" er)     Right x -> return x  -- | Get a specific project. This endpoint can be accessed without@@ -177,7 +177,7 @@           (urlPath (user_id usr))           (projectSearchAttrsParams attrs)       case result of-        Left er -> throwError (GitLabError ("userProjects' error: " <> responseErrorText er))+        Left er -> throwError (httpResponseError "userProjects'" er)         Right projs -> return (Just projs)   where     urlPath usrId = "/users/" <> T.pack (show usrId) <> "/projects"@@ -203,7 +203,7 @@       )       (projectSearchAttrsParams attrs)   case result of-    Left er -> throwError (GitLabError ("starredProjects error: " <> responseErrorText er))+    Left er -> throwError (httpResponseError "starredProjects" er)     Right x -> return x  -- | Get a list of ancestor groups for this project.@@ -512,7 +512,7 @@ projectsWithName projectName = do   result <- gitlabGetMany "/projects" [("search", Just (T.encodeUtf8 projectName))]   case result of-    Left er -> throwError (GitLabError ("projectsWithName error: " <> responseErrorText er))+    Left er -> throwError (httpResponseError "projectsWithName" er)     Right foundProjects -> do       return $         filter (\prj -> projectName == project_path prj) foundProjects@@ -616,7 +616,7 @@     Just prId -> do       result <- project prId       case result of-        Left er -> throwError (GitLabError ("projectOfIssue error: " <> responseErrorText er))+        Left er -> throwError (httpResponseError "projectOfIssue" er)         Right Nothing -> throwError (GitLabError "projectOfIssue error")         Right (Just proj) -> return proj @@ -1102,7 +1102,7 @@   Project ->   GitLab Bool projectCISuccess prj = do-  pipes <- pipelines prj+  pipes <- pipelines prj def   case pipes of     Nothing -> return False     Just [] -> return False
src/GitLab/API/Repositories.hs view
@@ -44,7 +44,7 @@ repositoryTree project = do   result <- repositories' (project_id project)   case result of-    Left er -> throwError (GitLabError ("repositories error: " <> responseErrorText er))+    Left er -> throwError (httpResponseError "repositories" er)     Right x -> return x  -- | returns a list of repository files and directories in a project@@ -151,7 +151,7 @@ contributors prj order sort = do   result <- gitlabGetMany addr params   case result of-    Left er -> throwError (GitLabError ("contributors error: " <> responseErrorText er))+    Left er -> throwError (httpResponseError "contributors" er)     Right x -> return x   where     addr =
src/GitLab/API/Users.hs view
@@ -111,7 +111,7 @@   let pathUser = "/users"   result <- gitlabGetMany pathUser []   case result of-    Left er -> throwError (GitLabError ("allUsers error: " <> responseErrorText er))+    Left er -> throwError (httpResponseError "allUsers" er)     Right usrs -> return usrs  -- | Get a single user.@@ -248,7 +248,7 @@ currentUser = do   result <- gitlabGetOne pathUser []   case result of-    Left er -> throwError (GitLabError ("currentUser error: " <> responseErrorText er))+    Left er -> throwError (httpResponseError "currentUser" er)     Right Nothing -> throwError (GitLabError "currentUser error")     Right (Just usr) -> return usr   where@@ -260,7 +260,7 @@ currentUserStatus = do   result <- gitlabGetOne pathUser []   case result of-    Left er -> throwError (GitLabError ("currentUserStatus error: " <> responseErrorText er))+    Left er -> throwError (httpResponseError "currentUserStatus" er)     Right Nothing -> throwError (GitLabError "currentUserStatus error")     Right (Just x) -> return x   where@@ -275,7 +275,7 @@ userStatus usr = do   result <- gitlabGetOne pathUser []   case result of-    Left er -> throwError (GitLabError ("userStatus error: " <> responseErrorText er))+    Left er -> throwError (httpResponseError "userStatus" er)     Right Nothing -> throwError (GitLabError ("userStatus error"))     Right (Just st) -> return st   where@@ -290,7 +290,7 @@ userPreferences = do   result <- gitlabGetOne pathUser []   case result of-    Left er -> throwError (GitLabError ("userPreferences error: " <> responseErrorText er))+    Left er -> throwError (httpResponseError "userPreferences" er)     Right Nothing -> throwError (GitLabError ("userPreferences error"))     Right (Just prefs) -> return prefs   where@@ -334,7 +334,7 @@ currentUserCounts = do   result <- gitlabGetOne pathUser []   case result of-    Left er -> throwError (GitLabError ("currentUserCounts error: " <> responseErrorText er))+    Left er -> throwError (httpResponseError "currentUserCounts" er)     Right Nothing -> throwError (GitLabError ("currentUserCounts error"))     Right (Just counts) -> return counts   where@@ -346,7 +346,7 @@ currentUserSshKeys = do   result <- gitlabGetOne pathUser []   case result of-    Left er -> throwError (GitLabError ("currentUserSshKeys error: " <> responseErrorText er))+    Left er -> throwError (httpResponseError "currentUserSshKeys" er)     Right Nothing -> throwError (GitLabError ("currentUserSshKeys error"))     Right (Just k) -> return k   where@@ -361,7 +361,7 @@ userSshKeys usr = do   result <- gitlabGetOne pathUser []   case result of-    Left er -> throwError (GitLabError ("userSshKeys error: " <> responseErrorText er))+    Left er -> throwError (httpResponseError "userSshKeys" er)     Right Nothing -> throwError (GitLabError ("userSshKeys error"))     Right (Just k) -> return k   where@@ -448,7 +448,7 @@   let pathUser = "/user/emails/"   result <- gitlabGetMany pathUser []   case result of-    Left er -> throwError (GitLabError ("emails error: " <> responseErrorText er))+    Left er -> throwError (httpResponseError "emails" er)     Right x -> return x  -- | Get a list of currently authenticated user’s emails.@@ -463,7 +463,7 @@           <> "/emails/"   result <- gitlabGetMany pathUser []   case result of-    Left er -> throwError (GitLabError ("emailsCurrentUser error: " <> responseErrorText er))+    Left er -> throwError (httpResponseError "emailsCurrentUser" er)     Right emls -> return emls  -- | Used internally by the following functions@@ -478,7 +478,7 @@ userAction action _funcName usr = do   result <- gitlabPost userAddr []   case result of-    Left er -> throwError (GitLabError ("userAction error: " <> responseErrorText er))+    Left er -> throwError (httpResponseError "userAction" er)     Right x -> return x   where     userAddr :: Text
src/GitLab/SystemHooks/GitLabSystemHooks.hs view
@@ -47,7 +47,10 @@   -- fire the rules   didFire <-     mapM (fire eventContent) rules-      `catchError` \(GitLabError e) -> do+      `catchError` \err -> do+        let e = case err of+              GitLabError t -> t+              GitLabHttpError httpErr -> T.pack (show httpErr)         liftIO $ do           fpath <- writeSystemTempFile "gitlab-system-hook-exception-" (T.unpack e)           void $ setFileMode fpath otherReadMode@@ -171,8 +174,8 @@       (parseEvent contents :: Maybe GroupCreate)     `orElse` fireIf'       (Just (\_ -> return True))-      (cast f :: Maybe (GroupRemove -> GitLab ()))-      (parseEvent contents :: Maybe GroupRemove)+      (cast f :: Maybe (GroupDestroyEvent -> GitLab ()))+      (parseEvent contents :: Maybe GroupDestroyEvent)     `orElse` fireIf'       (Just (\_ -> return True))       (cast f :: Maybe (GroupRenameEvent -> GitLab ()))@@ -237,6 +240,14 @@       (Just (\_ -> return True))       (cast f :: Maybe (AccessTokenEvent -> GitLab ()))       (parseEvent contents :: Maybe AccessTokenEvent)+    `orElse` fireIf'+      (Just (\_ -> return True))+      (cast f :: Maybe (DeploymentEvent -> GitLab ()))+      (parseEvent contents :: Maybe DeploymentEvent)+    `orElse` fireIf'+      (Just (\_ -> return True))+      (cast f :: Maybe (MilestoneEvent -> GitLab ()))+      (parseEvent contents :: Maybe MilestoneEvent) tryFire contents (MatchIf _ predF f) = do   fireIf'     (cast predF :: Maybe (ProjectCreate -> GitLab Bool))@@ -303,9 +314,9 @@       (cast f :: Maybe (GroupCreate -> GitLab ()))       (parseEvent contents :: Maybe GroupCreate)     `orElse` fireIf'-      (cast predF :: Maybe (GroupRemove -> GitLab Bool))-      (cast f :: Maybe (GroupRemove -> GitLab ()))-      (parseEvent contents :: Maybe GroupRemove)+      (cast predF :: Maybe (GroupDestroyEvent -> GitLab Bool))+      (cast f :: Maybe (GroupDestroyEvent -> GitLab ()))+      (parseEvent contents :: Maybe GroupDestroyEvent)     `orElse` fireIf'       (cast predF :: Maybe (GroupRenameEvent -> GitLab Bool))       (cast f :: Maybe (GroupRenameEvent -> GitLab ()))@@ -370,6 +381,14 @@       (cast predF :: Maybe (AccessTokenEvent -> GitLab Bool))       (cast f :: Maybe (AccessTokenEvent -> GitLab ()))       (parseEvent contents :: Maybe AccessTokenEvent)+    `orElse` fireIf'+      (cast predF :: Maybe (DeploymentEvent -> GitLab Bool))+      (cast f :: Maybe (DeploymentEvent -> GitLab ()))+      (parseEvent contents :: Maybe DeploymentEvent)+    `orElse` fireIf'+      (cast predF :: Maybe (MilestoneEvent -> GitLab Bool))+      (cast f :: Maybe (MilestoneEvent -> GitLab ()))+      (parseEvent contents :: Maybe MilestoneEvent)  fireIf' :: (Typeable a, Show a) => Maybe (a -> GitLab Bool) -> Maybe (a -> GitLab ()) -> Maybe a -> GitLab Bool fireIf' castPred castF parsed = do@@ -441,7 +460,7 @@                                                               case parseEvent contents :: Maybe GroupCreate of                                                                 Just _ -> True                                                                 Nothing ->-                                                                  case parseEvent contents :: Maybe GroupRemove of+                                                                  case parseEvent contents :: Maybe GroupDestroyEvent of                                                                     Just _ -> True                                                                     Nothing ->                                                                       case parseEvent contents :: Maybe GroupRenameEvent of@@ -488,4 +507,10 @@                                                                                                                             Nothing ->                                                                                                                               case parseEvent contents :: Maybe AccessTokenEvent of                                                                                                                                 Just _ -> True-                                                                                                                                Nothing -> False+                                                                                                                                Nothing ->+                                                                                                                                  case parseEvent contents :: Maybe DeploymentEvent of+                                                                                                                                    Just _ -> True+                                                                                                                                    Nothing ->+                                                                                                                                      case parseEvent contents :: Maybe MilestoneEvent of+                                                                                                                                        Just _ -> True+                                                                                                                                        Nothing -> False
src/GitLab/SystemHooks/Types.hs view
@@ -33,7 +33,7 @@     KeyCreate (..),     KeyRemove (..),     GroupCreate (..),-    GroupRemove (..),+    GroupDestroyEvent (..),     GroupRenameEvent (..),     NewGroupMember (..),     GroupMemberRemove (..),@@ -88,6 +88,9 @@     EmojiObjectAttributes (..),     AccessTokenEvent (..),     AccessTokenObjectAttributes (..),+    DeploymentEvent (..),+    MilestoneEvent (..),+    MilestoneAttributes (..),     parseEvent,   ) where@@ -393,20 +396,19 @@   }   deriving (Typeable, Show, Eq) -instance SystemHook GroupRemove where+instance SystemHook GroupDestroyEvent where   match = Match   matchIf = MatchIf  -- | A group has been removed.-data GroupRemove = GroupRemove-  { groupRemove_created_at :: Text, -- todo improve: date-    groupRemove_updated_at :: Text, -- todo improve: date-    groupRemove_event_name :: Text,-    groupRemove_name :: Text,-    groupRemove_owner_email :: Maybe Text,-    groupRemove_owner_name :: Maybe Text,-    groupRemove_path :: Text,-    groupRemove_group_id :: Int+data GroupDestroyEvent = GroupDestroyEvent+  { group_destroy_event_created_at :: Text, -- todo improve: date+    group_destroy_event_updated_at :: Text, -- todo improve: date+    group_destroy_event_name :: Text,+    group_destroy_event_owner_email :: Maybe Text,+    group_destroy_event_owner_name :: Maybe Text,+    group_destroy_event_path :: Text,+    group_destroy_event_group_id :: Int   }   deriving (Typeable, Show, Eq) @@ -674,46 +676,46 @@  -- | Attributes associated with a merge request data MergeRequestObjectAttributes = MergeRequestObjectAttributes-  { objectAttributes_id :: Int,-    objectAttributes_target_branch :: Text,-    objectAttributes_source_branch :: Text,-    objectAttributes_source_project_id :: Int,-    objectAttributes_author_id :: Maybe Int,-    objectAttributes_assignee_id :: Maybe Int,-    objectAttributes_assignee_ids :: Maybe [Int],-    objectAttributes_title :: Text,-    objectAttributes_created_at :: Text,-    objectAttributes_updated_at :: Text,-    objectAttributes_milestone_id :: Maybe Int,-    objectAttributes_state :: Text,-    objectAttributes_state_id :: Maybe Int,-    objectAttributes_merge_status :: Text,-    objectAttributes_target_project_id :: Int,-    objectAttributes_iid :: Int,-    objectAttributes_description :: Text,-    objectAttributes_updated_by_id :: Maybe Int,-    objectAttributes_merge_error :: Maybe Text,-    objectAttributes_merge_params :: Maybe MergeParams,-    objectAttributes_merge_when_pipeline_succeeds :: Maybe Bool,-    objectAttributes_merge_user_id :: Maybe Int,-    objectAttributes_merge_commit_sha :: Maybe Text,-    objectAttributes_deleted_at :: Maybe Text,-    objectAttributes_in_progress_merge_commit_sha :: Maybe Text,-    objectAttributes_lock_version :: Maybe Int,-    objectAttributes_time_estimate :: Maybe Int,-    objectAttributes_last_edited_at :: Maybe Text,-    objectAttributes_last_edited_by_id :: Maybe Int,-    objectAttributes_head_pipeline_id :: Maybe Int,-    objectAttributes_ref_fetched :: Maybe Bool,-    objectAttributes_merge_jid :: Maybe Int,-    objectAttributes_source :: ProjectEvent,-    objectAttributes_target :: ProjectEvent,-    objectAttributes_last_commit :: CommitEvent,-    objectAttributes_work_in_progress :: Bool,-    objectAttributes_total_time_spent :: Maybe Int,-    objectAttributes_human_total_time_spent :: Maybe Int,-    objectAttributes_human_time_estimate :: Maybe Int,-    objectAttributes_action :: Maybe Text+  { merge_request_object_attributes_id :: Int,+    merge_request_object_attributes_target_branch :: Text,+    merge_request_object_attributes_source_branch :: Text,+    merge_request_object_attributes_source_project_id :: Int,+    merge_request_object_attributes_author_id :: Maybe Int,+    merge_request_object_attributes_assignee_id :: Maybe Int,+    merge_request_object_attributes_assignee_ids :: Maybe [Int],+    merge_request_object_attributes_title :: Text,+    merge_request_object_attributes_created_at :: Maybe Text,+    merge_request_object_attributes_updated_at :: Maybe Text,+    merge_request_object_attributes_milestone_id :: Maybe Int,+    merge_request_object_attributes_state :: Text,+    merge_request_object_attributes_state_id :: Maybe Int,+    merge_request_object_attributes_merge_status :: Text,+    merge_request_object_attributes_target_project_id :: Int,+    merge_request_object_attributes_iid :: Int,+    merge_request_object_attributes_description :: Maybe Text,+    merge_request_object_attributes_updated_by_id :: Maybe Int,+    merge_request_object_attributes_merge_error :: Maybe Text,+    merge_request_object_attributes_merge_params :: Maybe MergeParams,+    merge_request_object_attributes_merge_when_pipeline_succeeds :: Maybe Bool,+    merge_request_object_attributes_merge_user_id :: Maybe Int,+    merge_request_object_attributes_merge_commit_sha :: Maybe Text,+    merge_request_object_attributes_deleted_at :: Maybe Text,+    merge_request_object_attributes_in_progress_merge_commit_sha :: Maybe Text,+    merge_request_object_attributes_lock_version :: Maybe Int,+    merge_request_object_attributes_time_estimate :: Maybe Int,+    merge_request_object_attributes_last_edited_at :: Maybe Text,+    merge_request_object_attributes_last_edited_by_id :: Maybe Int,+    merge_request_object_attributes_head_pipeline_id :: Maybe Int,+    merge_request_object_attributes_ref_fetched :: Maybe Bool,+    merge_request_object_attributes_merge_jid :: Maybe Int,+    merge_request_object_attributes_source :: Maybe ProjectEvent,+    merge_request_object_attributes_target :: Maybe ProjectEvent,+    merge_request_object_attributes_last_commit :: Maybe CommitEvent,+    merge_request_object_attributes_work_in_progress :: Maybe Bool,+    merge_request_object_attributes_total_time_spent :: Maybe Int,+    merge_request_object_attributes_human_total_time_spent :: Maybe Int,+    merge_request_object_attributes_human_time_estimate :: Maybe Int,+    merge_request_object_attributes_action :: Maybe Text   }   deriving (Typeable, Show, Eq, Generic) @@ -749,7 +751,7 @@   | KeyCreated   | KeyRemoved   | GroupCreated-  | GroupRemoved+  | GroupDestroyed   | GroupRenamed   | GroupMemberAdded   | GroupMemberRemoved@@ -765,6 +767,8 @@   | WorkItemed   | Emojid   | AccessTokened+  | Deploymented+  | Milestoned   deriving (Show, Eq)  -- | CI build@@ -846,7 +850,7 @@ data PipelineEvent = PipelineEvent   { pipeline_event_object_kind :: Text,     pipeline_event_object_attributes :: PipelineObjectAttributes,-    pipeline_event_merge_request :: Maybe Text,+    pipeline_event_merge_request :: Maybe MergeRequestObjectAttributes,     pipeline_event_user :: User,     pipeline_event_project :: BuildProject,     pipeline_event_commit :: CommitEvent,@@ -1278,6 +1282,56 @@   match = Match   matchIf = MatchIf +data DeploymentEvent = DeploymentEvent+  { deployment_event_status :: Text, -- "running"+    deployment_event_status_changed_at :: Maybe Text, -- TODO change to date type "2026-03-16 03:09:32 +0000"+    deployment_event_deployment_id :: Int,+    deployment_event_deployable_id :: Int,+    deployment_event_deployable_url :: Text, -- TODO change to URL type+    deployment_event_environment :: Text, -- "production"+    deployment_event_environment_tier :: Text, -- "production"+    deployment_event_environment_slug :: Text, -- "production"+    deployment_event_environment_external_url :: Maybe Text, -- TODO change to URL type+    deployment_event_project :: ProjectEvent,+    deployment_event_short_sha :: Text,+    deployment_event_user :: User,+    deployment_event_user_url :: Text, -- TODO change to URL type+    deployment_event_commit_url :: Text, -- TODO change to URL type+    deployment_event_commit_title :: Text,+    deployment_event_ref :: Text+  }+  deriving (Typeable, Show, Eq, Generic)++instance SystemHook DeploymentEvent where+  match = Match+  matchIf = MatchIf++data MilestoneEvent = MilestoneEvent+  { milestone_event_project :: ProjectEvent,+    milestone_event_group :: Maybe Text,+    milestone_event_object_attributes :: MilestoneAttributes,+    milestone_event_action :: Text -- "create"+  }+  deriving (Typeable, Show, Eq, Generic)++data MilestoneAttributes = MilestoneAttributes+  { milestone_attributes_id :: Int,+    milestone_attributes_iid :: Int,+    milestone_attributes_title :: Text,+    milestone_attributes_description :: Text,+    milestone_attributes_state :: Text, -- "active"+    milestone_attributes_created_at :: Text, -- TODO change to date type "2026-02-12 12:35:59 UTC"+    milestone_attributes_updated_at :: Text, -- TODO change to date type "2026-02-12 12:35:59 UTC"+    milestone_attributes_due_date :: Text, -- TODO change to date type "2026-02-23"+    milestone_attributes_start_date :: Text, -- TODO change to date type "2026-01-26"+    milestone_attributes_project_id :: Int+  }+  deriving (Typeable, Show, Eq, Generic)++instance SystemHook MilestoneEvent where+  match = Match+  matchIf = MatchIf+ instance FromJSON ProjectCreate where   parseJSON =     withObject "ProjectCreate" $ \v -> do@@ -1599,25 +1653,24 @@             _unexpected -> fail "group_create parsing failed"         _unexpected -> fail "group_create parsing failed" -instance FromJSON GroupRemove where+instance FromJSON GroupDestroyEvent where   parseJSON =     withObject "GroupRemove" $ \v -> do       isProjectEvent <- v .:? "event_name"       case isProjectEvent of         Just theEvent ->           case theEvent of-            GroupRemoved ->-              GroupRemove+            GroupDestroyed ->+              GroupDestroyEvent                 <$> v .: "created_at"                 <*> v .: "updated_at"-                <*> v .: "event_name"                 <*> v .: "name"-                <*> v .: "owner_email"-                <*> v .: "owner_name"+                <*> v .:? "owner_email"+                <*> v .:? "owner_name"                 <*> v .: "path"                 <*> v .: "group_id"-            _unexpected -> fail "group_remove parsing failed"-        _unexpected -> fail "group_remove parsing failed"+            _unexpected -> fail "group_destroy parsing failed"+        _unexpected -> fail "group_destroy parsing failed"  instance FromJSON GroupRenameEvent where   parseJSON =@@ -1982,46 +2035,46 @@ bodyNoPrefix "userEvent_name" = "name" bodyNoPrefix "userEvent_username" = "username" bodyNoPrefix "userEvent_avatar_url" = "avatar_url"-bodyNoPrefix "objectAttributes_id" = "id"-bodyNoPrefix "objectAttributes_target_branch" = "target_branch"-bodyNoPrefix "objectAttributes_source_branch" = "source_branch"-bodyNoPrefix "objectAttributes_source_project_id" = "source_project_id"-bodyNoPrefix "objectAttributes_author_id" = "author_id"-bodyNoPrefix "objectAttributes_assignee_id" = "assignee_id"-bodyNoPrefix "objectAttributes_assignee_ids" = "assignee_ids"-bodyNoPrefix "objectAttributes_title" = "title"-bodyNoPrefix "objectAttributes_created_at" = "created_at"-bodyNoPrefix "objectAttributes_updated_at" = "updated_at"-bodyNoPrefix "objectAttributes_milestone_id" = "milestone_id"-bodyNoPrefix "objectAttributes_state" = "state"-bodyNoPrefix "objectAttributes_state_id" = "state_id"-bodyNoPrefix "objectAttributes_merge_status" = "merge_status"-bodyNoPrefix "objectAttributes_target_project_id" = "target_project_id"-bodyNoPrefix "objectAttributes_iid" = "iid"-bodyNoPrefix "objectAttributes_description" = "description"-bodyNoPrefix "objectAttributes_updated_by_id" = "updated_by_id"-bodyNoPrefix "objectAttributes_merge_error" = "merge_error"-bodyNoPrefix "objectAttributes_merge_params" = "merge_params"-bodyNoPrefix "objectAttributes_merge_when_pipeline_succeeds" = "merge_when_pipeline_succeeds"-bodyNoPrefix "objectAttributes_merge_user_id" = "merge_user_id"-bodyNoPrefix "objectAttributes_merge_commit_sha" = "merge_commit_sha"-bodyNoPrefix "objectAttributes_deleted_at" = "deleted_at"-bodyNoPrefix "objectAttributes_in_progress_merge_commit_sha" = "in_progress_merge_commit_sha"-bodyNoPrefix "objectAttributes_lock_version" = "lock_version"-bodyNoPrefix "objectAttributes_time_estimate" = "time_estimate"-bodyNoPrefix "objectAttributes_last_edited_at" = "last_edited_at"-bodyNoPrefix "objectAttributes_last_edited_by_id" = "last_edited_by_id"-bodyNoPrefix "objectAttributes_head_pipeline_id" = "head_pipeline_id"-bodyNoPrefix "objectAttributes_ref_fetched" = "ref_fetched"-bodyNoPrefix "objectAttributes_merge_jid" = "merge_jid"-bodyNoPrefix "objectAttributes_source" = "source"-bodyNoPrefix "objectAttributes_target" = "target"-bodyNoPrefix "objectAttributes_last_commit" = "last_commit"-bodyNoPrefix "objectAttributes_work_in_progress" = "work_in_progress"-bodyNoPrefix "objectAttributes_total_time_spent" = "total_time_spent"-bodyNoPrefix "objectAttributes_human_total_time_spent" = "human_total_time_spent"-bodyNoPrefix "objectAttributes_human_time_estimate" = "human_time_estimate"-bodyNoPrefix "objectAttributes_action" = "action"+bodyNoPrefix "merge_request_object_attributes_id" = "id"+bodyNoPrefix "merge_request_object_attributes_target_branch" = "target_branch"+bodyNoPrefix "merge_request_object_attributes_source_branch" = "source_branch"+bodyNoPrefix "merge_request_object_attributes_source_project_id" = "source_project_id"+bodyNoPrefix "merge_request_object_attributes_author_id" = "author_id"+bodyNoPrefix "merge_request_object_attributes_assignee_id" = "assignee_id"+bodyNoPrefix "merge_request_object_attributes_assignee_ids" = "assignee_ids"+bodyNoPrefix "merge_request_object_attributes_title" = "title"+bodyNoPrefix "merge_request_object_attributes_created_at" = "created_at"+bodyNoPrefix "merge_request_object_attributes_updated_at" = "updated_at"+bodyNoPrefix "merge_request_object_attributes_milestone_id" = "milestone_id"+bodyNoPrefix "merge_request_object_attributes_state" = "state"+bodyNoPrefix "merge_request_object_attributes_state_id" = "state_id"+bodyNoPrefix "merge_request_object_attributes_merge_status" = "merge_status"+bodyNoPrefix "merge_request_object_attributes_target_project_id" = "target_project_id"+bodyNoPrefix "merge_request_object_attributes_iid" = "iid"+bodyNoPrefix "merge_request_object_attributes_description" = "description"+bodyNoPrefix "merge_request_object_attributes_updated_by_id" = "updated_by_id"+bodyNoPrefix "merge_request_object_attributes_merge_error" = "merge_error"+bodyNoPrefix "merge_request_object_attributes_merge_params" = "merge_params"+bodyNoPrefix "merge_request_object_attributes_merge_when_pipeline_succeeds" = "merge_when_pipeline_succeeds"+bodyNoPrefix "merge_request_object_attributes_merge_user_id" = "merge_user_id"+bodyNoPrefix "merge_request_object_attributes_merge_commit_sha" = "merge_commit_sha"+bodyNoPrefix "merge_request_object_attributes_deleted_at" = "deleted_at"+bodyNoPrefix "merge_request_object_attributes_in_progress_merge_commit_sha" = "in_progress_merge_commit_sha"+bodyNoPrefix "merge_request_object_attributes_lock_version" = "lock_version"+bodyNoPrefix "merge_request_object_attributes_time_estimate" = "time_estimate"+bodyNoPrefix "merge_request_object_attributes_last_edited_at" = "last_edited_at"+bodyNoPrefix "merge_request_object_attributes_last_edited_by_id" = "last_edited_by_id"+bodyNoPrefix "merge_request_object_attributes_head_pipeline_id" = "head_pipeline_id"+bodyNoPrefix "merge_request_object_attributes_ref_fetched" = "ref_fetched"+bodyNoPrefix "merge_request_object_attributes_merge_jid" = "merge_jid"+bodyNoPrefix "merge_request_object_attributes_source" = "source"+bodyNoPrefix "merge_request_object_attributes_target" = "target"+bodyNoPrefix "merge_request_object_attributes_last_commit" = "last_commit"+bodyNoPrefix "merge_request_object_attributes_work_in_progress" = "work_in_progress"+bodyNoPrefix "merge_request_object_attributes_total_time_spent" = "total_time_spent"+bodyNoPrefix "merge_request_object_attributes_human_total_time_spent" = "human_total_time_spent"+bodyNoPrefix "merge_request_object_attributes_human_time_estimate" = "human_time_estimate"+bodyNoPrefix "merge_request_object_attributes_action" = "action" bodyNoPrefix "mergeRequestChanges_author_id" = "author_id" bodyNoPrefix "mergeRequestChanges_created_at" = "created_at" bodyNoPrefix "mergeRequestChanges_description" = "description"@@ -2286,6 +2339,16 @@ bodyNoPrefix "environment_name" = "name" bodyNoPrefix "environment_action" = "action" bodyNoPrefix "environment_deployment_tier" = "deployment_tier"+bodyNoPrefix "milestone_attributes_id" = "id"+bodyNoPrefix "milestone_attributes_iid" = "iid"+bodyNoPrefix "milestone_attributes_title" = "title"+bodyNoPrefix "milestone_attributes_description" = "description"+bodyNoPrefix "milestone_attributes_state" = "state"+bodyNoPrefix "milestone_attributes_created_at" = "created_at"+bodyNoPrefix "milestone_attributes_updated_at" = "updated_at"+bodyNoPrefix "milestone_attributes_due_date" = "due_date"+bodyNoPrefix "milestone_attributes_start_date" = "start_date"+bodyNoPrefix "milestone_attributes_project_id" = "project_id" bodyNoPrefix s = fail ("uexpected JSON field prefix: " <> s)  instance FromJSON ProjectEvent where@@ -2634,6 +2697,58 @@             _unexpected -> fail "acess_token parsing failed"         _unexpected -> fail "acess_token parsing failed" +instance FromJSON DeploymentEvent where+  parseJSON =+    withObject "DeploymentEvent" $ \v -> do+      isDeploymentEvent <- v .:? "object_kind"+      case isDeploymentEvent of+        Just theEvent ->+          case theEvent of+            Deploymented ->+              DeploymentEvent+                <$> v .: "status"+                <*> v .: "status_changed_at"+                <*> v .: "deployment_id"+                <*> v .: "deployable_id"+                <*> v .: "deployable_url"+                <*> v .: "environment"+                <*> v .: "environment_tier"+                <*> v .: "environment_slug"+                <*> v .: "environment_external_url"+                <*> v .: "project"+                <*> v .: "short_sha"+                <*> v .: "user"+                <*> v .: "user_url"+                <*> v .: "commit_url"+                <*> v .: "commit_title"+                <*> v .: "ref"+            _unexpected -> fail "deployment parsing failed"+        _unexpected -> fail "deployment parsing failed"++instance FromJSON MilestoneEvent where+  parseJSON =+    withObject "MilestoneEvent" $ \v -> do+      isMilestoneEvent <- v .:? "object_kind"+      case isMilestoneEvent of+        Just theEvent ->+          case theEvent of+            Milestoned ->+              MilestoneEvent+                <$> v .: "project"+                <*> v .: "group"+                <*> v .: "object_attributes"+                <*> v .: "action"+            _unexpected -> fail "deployment parsing failed"+        _unexpected -> fail "deployment parsing failed"++instance FromJSON MilestoneAttributes where+  parseJSON =+    genericParseJSON+      ( defaultOptions+          { fieldLabelModifier = bodyNoPrefix+          }+      )+ instance FromJSON ProjectAction where   parseJSON (String "project_create") = return ProjectCreated   parseJSON (String "project_destroy") = return ProjectDestroyed@@ -2650,7 +2765,7 @@   parseJSON (String "key_create") = return KeyCreated   parseJSON (String "key_destroy") = return KeyRemoved   parseJSON (String "group_create") = return GroupCreated-  parseJSON (String "group_destroy") = return GroupRemoved+  parseJSON (String "group_destroy") = return GroupDestroyed   parseJSON (String "group_rename") = return GroupRenamed   parseJSON (String "user_add_to_group") = return GroupMemberAdded   parseJSON (String "user_remove_from_group") = return GroupMemberRemoved@@ -2666,4 +2781,6 @@   parseJSON (String "work_item") = return WorkItemed   parseJSON (String "emoji") = return Emojid   parseJSON (String "access_token") = return AccessTokened+  parseJSON (String "deployment") = return Deploymented+  parseJSON (String "milestone") = return Milestoned   parseJSON s = fail ("unexpected system hook event: " <> show s)
src/GitLab/Types.hs view
@@ -19,6 +19,7 @@     GitLabState (..),     GitLabServerConfig (..),     GitLabError (..),+    HttpResponseError (..),     AuthMethod (..),     ArchiveFormat (..),     AccessLevel (..),@@ -123,6 +124,8 @@ import qualified Data.Text as T import Data.Time.Clock import Network.HTTP.Conduit+import Network.HTTP.Types.Header (ResponseHeaders)+import Network.HTTP.Types.Status (Status)  -- | The monad in which the GitLab operations can be run. -- Contains the 'GitLabState' to run the requests with.@@ -137,9 +140,25 @@ instance (MIO.MonadIO m) => MIO.MonadIO (GitLabT m) where   liftIO = GitLabT . MIO.liftIO -data GitLabError = GitLabError Text+data GitLabError+  = -- | A general error, e.g. a JSON parsing failure.+    GitLabError Text+  | -- | A non-success HTTP response from the GitLab server, including response+    -- headers.+    GitLabHttpError HttpResponseError   deriving (Show) +-- | Details of a non-success HTTP response from the GitLab server.+data HttpResponseError = HttpResponseError+  { -- | The API operation that produced the error, e.g. @\"userEvents\"@.+    httpErrorContext :: Text,+    -- | The HTTP status of the response.+    httpErrorStatus :: Status,+    -- | The response headers.+    httpErrorHeaders :: ResponseHeaders+  }+  deriving (Show)+ -- | Utility type which uses 'IO' as underlying monad type GitLab a = GitLabT (ExceptT GitLabError IO) a @@ -155,6 +174,8 @@     authMethod :: AuthMethod,     -- | how many times to retry a HTTP request before giving up and returning an error.     retries :: Int,+    -- | delay between HTTP request retries in seconds+    delayBetweenRetries :: Int,     -- | write system hook events to files in the system temporary directory.     debugSystemHooks :: Maybe DebugSystemHooks   }@@ -170,7 +191,7 @@  -- | default settings are https://gitlab.com with 'AuthMethodNone', the 'url' and 'authMethod' values may need to be overwritten. instance Default GitLabServerConfig where-  def = GitLabServerConfig {url = "https://gitlab.com", authMethod = AuthMethodNone, retries = 5, debugSystemHooks = Nothing}+  def = GitLabServerConfig {url = "https://gitlab.com", authMethod = AuthMethodNone, retries = 5, delayBetweenRetries = 1, debugSystemHooks = Nothing}  -- | personal access token, see <https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html> data AuthMethod
src/GitLab/WebRequests/GitLabWebCalls.hs view
@@ -12,9 +12,11 @@     gitlabUnsafe,     gitlabGetByteStringResponse,     responseErrorText,+    httpResponseError,   ) where +import Control.Concurrent (threadDelay) import qualified Control.Exception as Exception import Control.Monad.Except import Control.Monad.IO.Class@@ -164,6 +166,20 @@     <> " "     <> T.decodeUtf8 (statusMessage (responseStatus resp)) +-- | Build a structured 'GitLabHttpError' from a failed HTTP response, tagging+-- it with the API operation that produced it (e.g. @\"userEvents\"@).+--+-- The response status and headers are retained, so callers can inspect them+-- (for example, to honour rate-limit headers such as @Retry-After@).+httpResponseError :: Text -> Response payload -> GitLabError+httpResponseError context resp =+  GitLabHttpError+    HttpResponseError+      { httpErrorContext = context,+        httpErrorStatus = responseStatus resp,+        httpErrorHeaders = responseHeaders resp+      }+ --------------------- -- internal functions @@ -197,7 +213,7 @@                    ],             requestBody = RequestBodyBS (renderQuery False contentParams)           }-  liftIO $ tryGitLab 0 request (retries cfg) manager Nothing+  liftIO $ tryGitLab 0 request (retries cfg) (delayBetweenRetries cfg) manager Nothing  gitlabHTTPOne ::   (FromJSON a) =>@@ -297,16 +313,18 @@   Request ->   -- | maximum number of retries permitted   Int ->+  -- | delay between retries in seconds+  Int ->   -- | HTTP manager   Manager ->   -- | the exception to report if maximum retries met   Maybe HttpException ->   IO (Response BSL.ByteString)-tryGitLab i request maxRetries manager lastException+tryGitLab i request maxRetries delaySeconds manager lastException   | i == maxRetries = error (show lastException)   | otherwise =       httpLbs request manager-        `Exception.catch` \ex -> tryGitLab (i + 1) request maxRetries manager (Just ex)+        `Exception.catch` \ex -> threadDelay delaySeconds >> tryGitLab (i + 1) request maxRetries delaySeconds manager (Just ex)  parseOne :: (FromJSON a) => BSL.ByteString -> Maybe a parseOne bs =
tests/SystemHookTests.hs view
@@ -106,11 +106,21 @@             >>= \eventJson -> parseEvent eventJson @?= Just groupCreated2Haskell         ),       testCase-        "group-removed-event"-        ( TIO.readFile "data/system-hooks/group-removed.json"-            >>= \eventJson -> parseEvent eventJson @?= Just groupRemovedHaskell+        "group-destroy-event1"+        ( TIO.readFile "data/system-hooks/group-destroy1.json"+            >>= \eventJson -> parseEvent eventJson @?= Just groupDestroy1Haskell         ),       testCase+        "group-destroy-event2"+        ( TIO.readFile "data/system-hooks/group-destroy2.json"+            >>= \eventJson -> parseEvent eventJson @?= Just groupDestroy2Haskell+        ),+      testCase+        "group-destroy-event3"+        ( TIO.readFile "data/system-hooks/group-destroy3.json"+            >>= \eventJson -> parseEvent eventJson @?= Just groupDestroy3Haskell+        ),+      testCase         "group-renamed1"         ( TIO.readFile "data/system-hooks/group-renamed1.json"             >>= \eventJson -> parseEvent eventJson @?= Just groupRenamed1Haskell@@ -156,6 +166,11 @@             >>= \eventJson -> parseEvent eventJson @?= Just tagPush2Haskell         ),       testCase+        "tag-push-event3"+        ( TIO.readFile "data/system-hooks/tag-push3.json"+            >>= \eventJson -> parseEvent eventJson @?= Just tagPush3Haskell+        ),+      testCase         "merge-request-event"         ( TIO.readFile "data/system-hooks/merge-request.json"             >>= \eventJson -> parseEvent eventJson @?= Just mergeRequestHaskell@@ -221,6 +236,11 @@             >>= \eventJson -> parseEvent eventJson @?= Just pipeline6Haskell         ),       testCase+        "pipeline7"+        ( TIO.readFile "data/system-hooks/pipeline7.json"+            >>= \eventJson -> parseEvent eventJson @?= Just pipeline7Haskell+        ),+      testCase         "issue1"         ( TIO.readFile "data/system-hooks/issue1.json"             >>= \eventJson -> parseEvent eventJson @?= Just issue1Haskell@@ -304,6 +324,21 @@         "access-token4"         ( TIO.readFile "data/system-hooks/access-token4.json"             >>= \eventJson -> parseEvent eventJson @?= Just accessToken4Haskell+        ),+      testCase+        "deployment1"+        ( TIO.readFile "data/system-hooks/deployment1.json"+            >>= \eventJson -> parseEvent eventJson @?= Just deployment1Haskell+        ),+      testCase+        "deployment2"+        ( TIO.readFile "data/system-hooks/deployment2.json"+            >>= \eventJson -> parseEvent eventJson @?= Just deployment2Haskell+        ),+      testCase+        "milestone1"+        ( TIO.readFile "data/system-hooks/milestone1.json"+            >>= \eventJson -> parseEvent eventJson @?= Just milestone1Haskell         )     ] @@ -390,7 +425,7 @@       <> matchTest "key-create" "key-added.json" keyCreateRule "project-created.json" projectCreateRule       <> matchTest "key-remove" "key-removed.json" keyRemoveRule "project-created.json" projectCreateRule       <> matchTest "group-create" "group-created.json" groupCreateRule "project-created.json" projectCreateRule-      <> matchTest "group-remove" "group-removed.json" groupRemoveRule "project-created.json" projectCreateRule+      <> matchTest "group-destroy" "group-destroy3.json" groupDestroyRule "project-created.json" projectCreateRule       <> matchTest "group-rename" "group-renamed1.json" groupRenameRule "project-created.json" projectCreateRule       <> matchTest "new-group-member" "new-group-member.json" newGroupMemberRule "project-created.json" projectCreateRule       <> matchTest "group-member-remove" "group-member-removed.json" groupMemberRemoveRule "project-created.json" projectCreateRule@@ -407,6 +442,8 @@       <> matchTest "work-item" "work-item1.json" workItemRule "project-created.json" projectCreateRule       <> matchTest "emoji" "emoji1.json" emojiRule "project-created.json" projectCreateRule       <> matchTest "access-token" "access-token1.json" accessTokenRule "project-created.json" projectCreateRule+      <> matchTest "deployment" "deployment1.json" deploymentRule "project-created.json" projectCreateRule+      <> matchTest "milestone" "milestone1.json" milestoneRule "project-created.json" projectCreateRule  matchIfTests :: TestTree matchIfTests =@@ -426,7 +463,7 @@       <> matchIfTest "key-create" "key-added.json" keyCreateIfRuleYes keyCreateIfRuleNo       <> matchIfTest "key-remove" "key-removed.json" keyRemoveIfRuleYes keyRemoveIfRuleNo       <> matchIfTest "group-create" "group-created.json" groupCreateIfRuleYes groupCreateIfRuleNo-      <> matchIfTest "group-remove" "group-removed.json" groupRemoveIfRuleYes groupRemoveIfRuleNo+      <> matchIfTest "group-destroy" "group-destroy3.json" groupDestroyIfRuleYes groupDestroyIfRuleNo       <> matchIfTest "group-rename" "group-renamed1.json" groupRenameIfRuleYes groupRenameIfRuleNo       <> matchIfTest "new-group-member" "new-group-member.json" newGroupMemberIfRuleYes newGroupMemberIfRuleNo       <> matchIfTest "group-member-remove" "group-member-removed.json" groupMemberRemoveIfRuleYes groupMemberRemoveIfRuleNo@@ -443,6 +480,8 @@       <> matchIfTest "work-item" "work-item1.json" workItemIfRuleYes workItemIfRuleNo       <> matchIfTest "emoji" "emoji1.json" emojiIfRuleYes emojiIfRuleNo       <> matchIfTest "access-token" "access-token1.json" accessTokenIfRuleYes accessTokenIfRuleNo+      <> matchIfTest "deployment" "deployment1.json" deploymentIfRuleYes deploymentIfRuleNo+      <> matchIfTest "milestone" "milestone1.json" milestoneIfRuleYes milestoneIfRuleNo  receiveTests :: TestTree receiveTests =@@ -1047,39 +1086,39 @@         return ()     ) -groupRemoveRule :: Rule-groupRemoveRule =+groupDestroyRule :: Rule+groupDestroyRule =   match-    "groupRemove rule"-    ( \GroupRemove {} -> do+    "group-destroy rule"+    ( \GroupDestroyEvent {} -> do         return ()     ) -groupRemoveIfRuleYes :: Rule-groupRemoveIfRuleYes =+groupDestroyIfRuleYes :: Rule+groupDestroyIfRuleYes =   matchIf-    "groupRemove rule-if yes"-    ( \event@GroupRemove {} -> do+    "group-destroy rule-if yes"+    ( \event@GroupDestroyEvent {} -> do         return-          ( groupRemove_name event+          ( group_destroy_event_name event               == "StoreCloud"           )     )-    ( \GroupRemove {} -> do+    ( \GroupDestroyEvent {} -> do         return ()     ) -groupRemoveIfRuleNo :: Rule-groupRemoveIfRuleNo =+groupDestroyIfRuleNo :: Rule+groupDestroyIfRuleNo =   matchIf-    "groupRemove rule-if no"-    ( \event@GroupRemove {} -> do+    "group-destroy rule-if no"+    ( \event@GroupDestroyEvent {} -> do         return-          ( groupRemove_name event+          ( group_destroy_event_name event               == ""           )     )-    ( \GroupRemove {} -> do+    ( \GroupDestroyEvent {} -> do         return ()     ) @@ -1551,6 +1590,66 @@         return ()     ) +deploymentRule :: Rule+deploymentRule =+  match+    "deployment rule"+    ( \DeploymentEvent {} -> do+        return ()+    )++deploymentIfRuleYes :: Rule+deploymentIfRuleYes =+  matchIf+    "deployment rule-if yes"+    ( \event@DeploymentEvent {} -> do+        return (deployment_event_environment event == "production")+    )+    ( \DeploymentEvent {} -> do+        return ()+    )++deploymentIfRuleNo :: Rule+deploymentIfRuleNo =+  matchIf+    "deployment rule-if no"+    ( \event@DeploymentEvent {} -> do+        return (deployment_event_environment event == "not production")+    )+    ( \DeploymentEvent {} -> do+        return ()+    )++milestoneRule :: Rule+milestoneRule =+  match+    "milestone rule"+    ( \MilestoneEvent {} -> do+        return ()+    )++milestoneIfRuleYes :: Rule+milestoneIfRuleYes =+  matchIf+    "milestone rule-if yes"+    ( \event@MilestoneEvent {} -> do+        return (milestone_event_action event == "create")+    )+    ( \MilestoneEvent {} -> do+        return ()+    )++milestoneIfRuleNo :: Rule+milestoneIfRuleNo =+  matchIf+    "milestone rule-if no"+    ( \event@MilestoneEvent {} -> do+        return (milestone_event_action event == "not create")+    )+    ( \MilestoneEvent {} -> do+        return ()+    )+ projectCreatedHaskell :: ProjectCreate projectCreatedHaskell =   ProjectCreate@@ -1786,19 +1885,18 @@ groupCreated2Haskell =   GroupCreate {groupCreate_created_at = "2024-11-22T12:03:34Z", groupCreate_updated_at = "2024-11-22T12:03:34Z", groupCreate_event_name = "group_create", groupCreate_name = "the-name", groupCreate_owner_email = Nothing, groupCreate_owner_name = Nothing, groupCreate_path = "the-path", groupCreate_group_id = 31780} -groupRemovedHaskell :: GroupRemove-groupRemovedHaskell =-  GroupRemove-    { groupRemove_created_at = "2012-07-21T07:30:54Z",-      groupRemove_updated_at = "2012-07-21T07:38:22Z",-      groupRemove_event_name = "group_destroy",-      groupRemove_name = "StoreCloud",-      groupRemove_owner_email = Nothing,-      groupRemove_owner_name = Nothing,-      groupRemove_path = "storecloud",-      groupRemove_group_id = 78-    }+groupDestroy1Haskell :: GroupDestroyEvent+groupDestroy1Haskell =+  GroupDestroyEvent {group_destroy_event_created_at = "2026-02-03T12:11:25Z", group_destroy_event_updated_at = "2026-02-11T21:51:07Z", group_destroy_event_name = "Dataguru-deletion_scheduled-54084", group_destroy_event_owner_email = Nothing, group_destroy_event_owner_name = Nothing, group_destroy_event_path = "dataguru-deletion_scheduled-54084", group_destroy_event_group_id = 54084} +groupDestroy2Haskell :: GroupDestroyEvent+groupDestroy2Haskell =+  GroupDestroyEvent {group_destroy_event_created_at = "2026-03-24T00:44:28Z", group_destroy_event_updated_at = "2026-03-24T12:27:38Z", group_destroy_event_name = "proj-deletion_scheduled-57112", group_destroy_event_owner_email = Nothing, group_destroy_event_owner_name = Nothing, group_destroy_event_path = "proj-deletion_scheduled-57112", group_destroy_event_group_id = 57112}++groupDestroy3Haskell :: GroupDestroyEvent+groupDestroy3Haskell =+  GroupDestroyEvent {group_destroy_event_created_at = "2012-07-21T07:30:54Z", group_destroy_event_updated_at = "2012-07-21T07:38:22Z", group_destroy_event_name = "StoreCloud", group_destroy_event_owner_email = Nothing, group_destroy_event_owner_name = Nothing, group_destroy_event_path = "storecloud", group_destroy_event_group_id = 78}+ groupRenamed1Haskell :: GroupRenameEvent groupRenamed1Haskell =   GroupRenameEvent@@ -1895,23 +1993,27 @@ tagPush2Haskell =   TagPush {tagPush_event_name = "tag_push", tagPush_before = "abc123", tagPush_after = "0000000000000000000000000000000000000000", tagPush_ref = "refs/tags/tag1", tagPush_checkout_sha = Nothing, tagPush_user_id = 123, tagPush_user_name = "Joe", tagPush_user_avatar = "https://secure.gravatar.com/avatar/abc123?s=80&d=identicon", tagPush_project_id = 48363, tagPush_project = ProjectEvent {projectEvent_id = Just 48363, projectEvent_name = "proj-name", projectEvent_description = Nothing, projectEvent_web_url = "https://example.com/joe1/proj-name", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@example.com:joe1/proj-name.git", projectEvent_git_http_url = "https://example.com/joe1/proj-name.git", projectEvent_namespace = "Joe", projectEvent_visibility_level = Private, projectEvent_path_with_namespace = "joe1/proj-name", projectEvent_default_branch = "main", projectEvent_homepage = Just "https://example.com/joe1/proj-name", projectEvent_url = "git@example.com:joe1/proj-name.git", projectEvent_ssh_url = "git@example.com:joe1/proj-name.git", projectEvent_http_url = "https://example.com/joe1/proj-name.git"}, tagPush_repository = RepositoryEvent {repositoryEvent_name = "proj-name", repositoryEvent_url = "git@example.com:joe1/proj-name.git", repositoryEvent_description = Nothing, repositoryEvent_homepage = Just "https://example.com/joe1/proj-name", repositoryEvent_git_http_url = Just "https://example.com/joe1/proj-name.git", repositoryEvent_git_ssh_url = Just "git@example.com:joe1/proj-name.git", repositoryEvent_visibility_level = Just Private}, tagPush_commits = [], tagPush_total_commits_count = 0} +tagPush3Haskell :: TagPush+tagPush3Haskell =+  TagPush {tagPush_event_name = "tag_push", tagPush_before = "abc1234", tagPush_after = "0000000000000000000000000000000000000000", tagPush_ref = "refs/tags/v1", tagPush_checkout_sha = Nothing, tagPush_user_id = 3887, tagPush_user_name = "Joe Bloggs", tagPush_user_avatar = "https://secure.gravatar.com/avatar/abc?s=80&d=identicon", tagPush_project_id = 48175, tagPush_project = ProjectEvent {projectEvent_id = Just 48175, projectEvent_name = "proj-name", projectEvent_description = Nothing, projectEvent_web_url = "https://example.com/joe1/proj-name", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@example.com:joe1/proj-name.git", projectEvent_git_http_url = "https://example.com/joe1/proj-name.git", projectEvent_namespace = "Joe Bloggs", projectEvent_visibility_level = Private, projectEvent_path_with_namespace = "joe1/proj-name", projectEvent_default_branch = "master", projectEvent_homepage = Just "https://example.com/joe1/proj-name", projectEvent_url = "git@example.com:joe1/proj-name.git", projectEvent_ssh_url = "git@example.com:joe1/proj-name.git", projectEvent_http_url = "https://example.com/joe1/proj-name.git"}, tagPush_repository = RepositoryEvent {repositoryEvent_name = "proj-name", repositoryEvent_url = "git@example.com:joe1/proj-name.git", repositoryEvent_description = Nothing, repositoryEvent_homepage = Just "https://example.com/joe1/proj-name", repositoryEvent_git_http_url = Just "https://example.com/joe1/proj-name.git", repositoryEvent_git_ssh_url = Just "git@example.com:joe1/proj-name.git", repositoryEvent_visibility_level = Just Private}, tagPush_commits = [], tagPush_total_commits_count = 0}+ repositoryUpdateHaskell :: RepositoryUpdate repositoryUpdateHaskell =   RepositoryUpdate {repositoryUpdate_event_name = "repository_update", repositoryUpdate_user_id = 1, repositoryUpdate_user_name = "John Smith", repositoryUpdate_user_email = "admin@example.com", repositoryUpdate_user_avatar = "https://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=8://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=80", repositoryUpdate_project_id = 1, repositoryUpdate_project = ProjectEvent {projectEvent_id = Nothing, projectEvent_name = "Example", projectEvent_description = Just "", projectEvent_web_url = "http://example.com/jsmith/example", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@example.com:jsmith/example.git", projectEvent_git_http_url = "http://example.com/jsmith/example.git", projectEvent_namespace = "Jsmith", projectEvent_visibility_level = Private, projectEvent_path_with_namespace = "jsmith/example", projectEvent_default_branch = "master", projectEvent_homepage = Just "http://example.com/jsmith/example", projectEvent_url = "git@example.com:jsmith/example.git", projectEvent_ssh_url = "git@example.com:jsmith/example.git", projectEvent_http_url = "http://example.com/jsmith/example.git"}, repositoryUpdate_changes = [ProjectChanges {projectChanges_before = "8205ea8d81ce0c6b90fbe8280d118cc9fdad6130", projectChanges_after = "4045ea7a3df38697b3730a20fb73c8bed8a3e69e", projectChanges_ref = "refs/heads/master"}], repositoryUpdate_refs = ["refs/heads/master"]}  mergeRequestHaskell :: MergeRequestEvent mergeRequestHaskell =-  MergeRequestEvent {mergeRequest_object_kind = "merge_request", mergeRequest_event_type = "merge_request", mergeRequest_user = UserEvent {userEvent_id = Nothing, userEvent_name = "Administrator", userEvent_username = "root", userEvent_avatar_url = "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40&d=identicon", userEvent_email = Nothing}, mergeRequest_project = ProjectEvent {projectEvent_id = Just 1, projectEvent_name = "Gitlab Test", projectEvent_description = Just "Aut reprehenderit ut est.", projectEvent_web_url = "http://example.com/gitlabhq/gitlab-test", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@example.com:gitlabhq/gitlab-test.git", projectEvent_git_http_url = "http://example.com/gitlabhq/gitlab-test.git", projectEvent_namespace = "GitlabHQ", projectEvent_visibility_level = Public, projectEvent_path_with_namespace = "gitlabhq/gitlab-test", projectEvent_default_branch = "master", projectEvent_homepage = Just "http://example.com/gitlabhq/gitlab-test", projectEvent_url = "http://example.com/gitlabhq/gitlab-test.git", projectEvent_ssh_url = "git@example.com:gitlabhq/gitlab-test.git", projectEvent_http_url = "http://example.com/gitlabhq/gitlab-test.git"}, mergeRequest_object_attributes = MergeRequestObjectAttributes {objectAttributes_id = 99, objectAttributes_target_branch = "master", objectAttributes_source_branch = "ms-viewport", objectAttributes_source_project_id = 14, objectAttributes_author_id = Just 51, objectAttributes_assignee_id = Just 6, objectAttributes_assignee_ids = Nothing, objectAttributes_title = "MS-Viewport", objectAttributes_created_at = "2013-12-03T17:23:34Z", objectAttributes_updated_at = "2013-12-03T17:23:34Z", objectAttributes_milestone_id = Nothing, objectAttributes_state = "opened", objectAttributes_state_id = Nothing, objectAttributes_merge_status = "unchecked", objectAttributes_target_project_id = 14, objectAttributes_iid = 1, objectAttributes_description = "", objectAttributes_updated_by_id = Nothing, objectAttributes_merge_error = Nothing, objectAttributes_merge_params = Nothing, objectAttributes_merge_when_pipeline_succeeds = Nothing, objectAttributes_merge_user_id = Nothing, objectAttributes_merge_commit_sha = Nothing, objectAttributes_deleted_at = Nothing, objectAttributes_in_progress_merge_commit_sha = Nothing, objectAttributes_lock_version = Nothing, objectAttributes_time_estimate = Nothing, objectAttributes_last_edited_at = Nothing, objectAttributes_last_edited_by_id = Nothing, objectAttributes_head_pipeline_id = Nothing, objectAttributes_ref_fetched = Nothing, objectAttributes_merge_jid = Nothing, objectAttributes_source = ProjectEvent {projectEvent_id = Nothing, projectEvent_name = "Awesome Project", projectEvent_description = Just "Aut reprehenderit ut est.", projectEvent_web_url = "http://example.com/awesome_space/awesome_project", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@example.com:awesome_space/awesome_project.git", projectEvent_git_http_url = "http://example.com/awesome_space/awesome_project.git", projectEvent_namespace = "Awesome Space", projectEvent_visibility_level = Public, projectEvent_path_with_namespace = "awesome_space/awesome_project", projectEvent_default_branch = "master", projectEvent_homepage = Just "http://example.com/awesome_space/awesome_project", projectEvent_url = "http://example.com/awesome_space/awesome_project.git", projectEvent_ssh_url = "git@example.com:awesome_space/awesome_project.git", projectEvent_http_url = "http://example.com/awesome_space/awesome_project.git"}, objectAttributes_target = ProjectEvent {projectEvent_id = Nothing, projectEvent_name = "Awesome Project", projectEvent_description = Just "Aut reprehenderit ut est.", projectEvent_web_url = "http://example.com/awesome_space/awesome_project", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@example.com:awesome_space/awesome_project.git", projectEvent_git_http_url = "http://example.com/awesome_space/awesome_project.git", projectEvent_namespace = "Awesome Space", projectEvent_visibility_level = Public, projectEvent_path_with_namespace = "awesome_space/awesome_project", projectEvent_default_branch = "master", projectEvent_homepage = Just "http://example.com/awesome_space/awesome_project", projectEvent_url = "http://example.com/awesome_space/awesome_project.git", projectEvent_ssh_url = "git@example.com:awesome_space/awesome_project.git", projectEvent_http_url = "http://example.com/awesome_space/awesome_project.git"}, objectAttributes_last_commit = CommitEvent {commitEvent_id = "da1560886d4f094c3e6c9ef40349f7d38b5d27d7", commitEvent_message = "fixed readme", commitEvent_timestamp = "2012-01-03T23:36:29+02:00", commitEvent_url = "http://example.com/awesome_space/awesome_project/commits/da1560886d4f094c3e6c9ef40349f7d38b5d27d7", commitEvent_author = CommitAuthorEvent {commitAuthorEvent_name = "GitLab dev user", commitAuthorEvent_email = "gitlabdev@dv6700.(none)"}}, objectAttributes_work_in_progress = False, objectAttributes_total_time_spent = Nothing, objectAttributes_human_total_time_spent = Nothing, objectAttributes_human_time_estimate = Nothing, objectAttributes_action = Just "open"}, mergeRequest_labels = Just [Label {label_id = Just 206, label_title = Just "API", label_color = Just "#ffffff", label_project_id = Just 14, label_created_at = Just "2013-12-03T17:15:43Z", label_updated_at = Just "2013-12-03T17:15:43Z", label_template = Just False, label_description = Just "API related issues", label_type = Just "ProjectLabel", label_group_id = Just 41}], mergeRequest_changes = MergeRequestChanges {mergeRequestChanges_author_id = Nothing, mergeRequestChanges_created_at = Nothing, mergeRequestChanges_description = Nothing, mergeRequestChanges_id = Nothing, mergeRequestChanges_iid = Nothing, mergeRequestChanges_source_branch = Nothing, mergeRequestChanges_source_project_id = Nothing, mergeRequestChanges_target_branch = Nothing, mergeRequestChanges_target_project_id = Nothing, mergeRequestChanges_title = Nothing, mergeRequestChanges_updated_at = Just (MergeRequestChange {mergeRequestChange_previous = Just "2017-09-15 16:50:55 UTC", mergeRequestChange_current = Just "2017-09-15 16:52:00 UTC"})}, mergeRequest_repository = RepositoryEvent {repositoryEvent_name = "Gitlab Test", repositoryEvent_url = "http://example.com/gitlabhq/gitlab-test.git", repositoryEvent_description = Just "Aut reprehenderit ut est.", repositoryEvent_homepage = Just "http://example.com/gitlabhq/gitlab-test", repositoryEvent_git_http_url = Nothing, repositoryEvent_git_ssh_url = Nothing, repositoryEvent_visibility_level = Nothing}}+  MergeRequestEvent {mergeRequest_object_kind = "merge_request", mergeRequest_event_type = "merge_request", mergeRequest_user = UserEvent {userEvent_id = Nothing, userEvent_name = "Administrator", userEvent_username = "root", userEvent_avatar_url = "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40&d=identicon", userEvent_email = Nothing}, mergeRequest_project = ProjectEvent {projectEvent_id = Just 1, projectEvent_name = "Gitlab Test", projectEvent_description = Just "Aut reprehenderit ut est.", projectEvent_web_url = "http://example.com/gitlabhq/gitlab-test", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@example.com:gitlabhq/gitlab-test.git", projectEvent_git_http_url = "http://example.com/gitlabhq/gitlab-test.git", projectEvent_namespace = "GitlabHQ", projectEvent_visibility_level = Public, projectEvent_path_with_namespace = "gitlabhq/gitlab-test", projectEvent_default_branch = "master", projectEvent_homepage = Just "http://example.com/gitlabhq/gitlab-test", projectEvent_url = "http://example.com/gitlabhq/gitlab-test.git", projectEvent_ssh_url = "git@example.com:gitlabhq/gitlab-test.git", projectEvent_http_url = "http://example.com/gitlabhq/gitlab-test.git"}, mergeRequest_object_attributes = MergeRequestObjectAttributes {merge_request_object_attributes_id = 99, merge_request_object_attributes_target_branch = "master", merge_request_object_attributes_source_branch = "ms-viewport", merge_request_object_attributes_source_project_id = 14, merge_request_object_attributes_author_id = Just 51, merge_request_object_attributes_assignee_id = Just 6, merge_request_object_attributes_assignee_ids = Nothing, merge_request_object_attributes_title = "MS-Viewport", merge_request_object_attributes_created_at = Just "2013-12-03T17:23:34Z", merge_request_object_attributes_updated_at = Just "2013-12-03T17:23:34Z", merge_request_object_attributes_milestone_id = Nothing, merge_request_object_attributes_state = "opened", merge_request_object_attributes_state_id = Nothing, merge_request_object_attributes_merge_status = "unchecked", merge_request_object_attributes_target_project_id = 14, merge_request_object_attributes_iid = 1, merge_request_object_attributes_description = Just "", merge_request_object_attributes_updated_by_id = Nothing, merge_request_object_attributes_merge_error = Nothing, merge_request_object_attributes_merge_params = Nothing, merge_request_object_attributes_merge_when_pipeline_succeeds = Nothing, merge_request_object_attributes_merge_user_id = Nothing, merge_request_object_attributes_merge_commit_sha = Nothing, merge_request_object_attributes_deleted_at = Nothing, merge_request_object_attributes_in_progress_merge_commit_sha = Nothing, merge_request_object_attributes_lock_version = Nothing, merge_request_object_attributes_time_estimate = Nothing, merge_request_object_attributes_last_edited_at = Nothing, merge_request_object_attributes_last_edited_by_id = Nothing, merge_request_object_attributes_head_pipeline_id = Nothing, merge_request_object_attributes_ref_fetched = Nothing, merge_request_object_attributes_merge_jid = Nothing, merge_request_object_attributes_source = Just $ ProjectEvent {projectEvent_id = Nothing, projectEvent_name = "Awesome Project", projectEvent_description = Just "Aut reprehenderit ut est.", projectEvent_web_url = "http://example.com/awesome_space/awesome_project", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@example.com:awesome_space/awesome_project.git", projectEvent_git_http_url = "http://example.com/awesome_space/awesome_project.git", projectEvent_namespace = "Awesome Space", projectEvent_visibility_level = Public, projectEvent_path_with_namespace = "awesome_space/awesome_project", projectEvent_default_branch = "master", projectEvent_homepage = Just "http://example.com/awesome_space/awesome_project", projectEvent_url = "http://example.com/awesome_space/awesome_project.git", projectEvent_ssh_url = "git@example.com:awesome_space/awesome_project.git", projectEvent_http_url = "http://example.com/awesome_space/awesome_project.git"}, merge_request_object_attributes_target = Just $ ProjectEvent {projectEvent_id = Nothing, projectEvent_name = "Awesome Project", projectEvent_description = Just "Aut reprehenderit ut est.", projectEvent_web_url = "http://example.com/awesome_space/awesome_project", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@example.com:awesome_space/awesome_project.git", projectEvent_git_http_url = "http://example.com/awesome_space/awesome_project.git", projectEvent_namespace = "Awesome Space", projectEvent_visibility_level = Public, projectEvent_path_with_namespace = "awesome_space/awesome_project", projectEvent_default_branch = "master", projectEvent_homepage = Just "http://example.com/awesome_space/awesome_project", projectEvent_url = "http://example.com/awesome_space/awesome_project.git", projectEvent_ssh_url = "git@example.com:awesome_space/awesome_project.git", projectEvent_http_url = "http://example.com/awesome_space/awesome_project.git"}, merge_request_object_attributes_last_commit = Just $ CommitEvent {commitEvent_id = "da1560886d4f094c3e6c9ef40349f7d38b5d27d7", commitEvent_message = "fixed readme", commitEvent_timestamp = "2012-01-03T23:36:29+02:00", commitEvent_url = "http://example.com/awesome_space/awesome_project/commits/da1560886d4f094c3e6c9ef40349f7d38b5d27d7", commitEvent_author = CommitAuthorEvent {commitAuthorEvent_name = "GitLab dev user", commitAuthorEvent_email = "gitlabdev@dv6700.(none)"}}, merge_request_object_attributes_work_in_progress = Just False, merge_request_object_attributes_total_time_spent = Nothing, merge_request_object_attributes_human_total_time_spent = Nothing, merge_request_object_attributes_human_time_estimate = Nothing, merge_request_object_attributes_action = Just "open"}, mergeRequest_labels = Just [Label {label_id = Just 206, label_title = Just "API", label_color = Just "#ffffff", label_project_id = Just 14, label_created_at = Just "2013-12-03T17:15:43Z", label_updated_at = Just "2013-12-03T17:15:43Z", label_template = Just False, label_description = Just "API related issues", label_type = Just "ProjectLabel", label_group_id = Just 41}], mergeRequest_changes = MergeRequestChanges {mergeRequestChanges_author_id = Nothing, mergeRequestChanges_created_at = Nothing, mergeRequestChanges_description = Nothing, mergeRequestChanges_id = Nothing, mergeRequestChanges_iid = Nothing, mergeRequestChanges_source_branch = Nothing, mergeRequestChanges_source_project_id = Nothing, mergeRequestChanges_target_branch = Nothing, mergeRequestChanges_target_project_id = Nothing, mergeRequestChanges_title = Nothing, mergeRequestChanges_updated_at = Just (MergeRequestChange {mergeRequestChange_previous = Just "2017-09-15 16:50:55 UTC", mergeRequestChange_current = Just "2017-09-15 16:52:00 UTC"})}, mergeRequest_repository = RepositoryEvent {repositoryEvent_name = "Gitlab Test", repositoryEvent_url = "http://example.com/gitlabhq/gitlab-test.git", repositoryEvent_description = Just "Aut reprehenderit ut est.", repositoryEvent_homepage = Just "http://example.com/gitlabhq/gitlab-test", repositoryEvent_git_http_url = Nothing, repositoryEvent_git_ssh_url = Nothing, repositoryEvent_visibility_level = Nothing}}  mergeRequestGitLab_15_5_0_Haskell :: MergeRequestEvent mergeRequestGitLab_15_5_0_Haskell =-  MergeRequestEvent {mergeRequest_object_kind = "merge_request", mergeRequest_event_type = "merge_request", mergeRequest_user = UserEvent {userEvent_id = Nothing, userEvent_name = "Joe Bloggs", userEvent_username = "joe", userEvent_avatar_url = "https://gitlab.example.com/uploads/-/system/user/avatar/5/avatar.png", userEvent_email = Nothing}, mergeRequest_project = ProjectEvent {projectEvent_id = Just 7926, projectEvent_name = "test-ci-project", projectEvent_description = Just "", projectEvent_web_url = "https://gitlab.example.com/joe/test-ci-project", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@gitlab.example.com:joe/test-ci-project.git", projectEvent_git_http_url = "https://gitlab.example.com/joe/test-ci-project.git", projectEvent_namespace = "Joe Bloggs", projectEvent_visibility_level = Private, projectEvent_path_with_namespace = "joe/test-ci-project", projectEvent_default_branch = "master", projectEvent_homepage = Just "https://gitlab.example.com/joe/test-ci-project", projectEvent_url = "git@gitlab.example.com:joe/test-ci-project.git", projectEvent_ssh_url = "git@gitlab.example.com:joe/test-ci-project.git", projectEvent_http_url = "https://gitlab.example.com/joe/test-ci-project.git"}, mergeRequest_object_attributes = MergeRequestObjectAttributes {objectAttributes_id = 3448, objectAttributes_target_branch = "master", objectAttributes_source_branch = "another-branch", objectAttributes_source_project_id = 7926, objectAttributes_author_id = Just 5, objectAttributes_assignee_id = Nothing, objectAttributes_assignee_ids = Just [], objectAttributes_title = "A change", objectAttributes_created_at = "2022-10-24 22:11:46 UTC", objectAttributes_updated_at = "2022-10-24 22:11:46 UTC", objectAttributes_milestone_id = Nothing, objectAttributes_state = "opened", objectAttributes_state_id = Just 1, objectAttributes_merge_status = "preparing", objectAttributes_target_project_id = 7926, objectAttributes_iid = 1, objectAttributes_description = "To test the merge request event.", objectAttributes_updated_by_id = Nothing, objectAttributes_merge_error = Nothing, objectAttributes_merge_params = Just (MergeParams {mergeParams_force_remove_source_branch = Just "1"}), objectAttributes_merge_when_pipeline_succeeds = Just False, objectAttributes_merge_user_id = Nothing, objectAttributes_merge_commit_sha = Nothing, objectAttributes_deleted_at = Nothing, objectAttributes_in_progress_merge_commit_sha = Nothing, objectAttributes_lock_version = Nothing, objectAttributes_time_estimate = Just 0, objectAttributes_last_edited_at = Nothing, objectAttributes_last_edited_by_id = Nothing, objectAttributes_head_pipeline_id = Nothing, objectAttributes_ref_fetched = Nothing, objectAttributes_merge_jid = Nothing, objectAttributes_source = ProjectEvent {projectEvent_id = Just 7926, projectEvent_name = "test-ci-project", projectEvent_description = Just "", projectEvent_web_url = "https://gitlab.example.com/joe/test-ci-project", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@gitlab.example.com:joe/test-ci-project.git", projectEvent_git_http_url = "https://gitlab.example.com/joe/test-ci-project.git", projectEvent_namespace = "Joe Bloggs", projectEvent_visibility_level = Private, projectEvent_path_with_namespace = "joe/test-ci-project", projectEvent_default_branch = "master", projectEvent_homepage = Just "https://gitlab.example.com/joe/test-ci-project", projectEvent_url = "git@gitlab.example.com:joe/test-ci-project.git", projectEvent_ssh_url = "git@gitlab.example.com:joe/test-ci-project.git", projectEvent_http_url = "https://gitlab.example.com/joe/test-ci-project.git"}, objectAttributes_target = ProjectEvent {projectEvent_id = Just 7926, projectEvent_name = "test-ci-project", projectEvent_description = Just "", projectEvent_web_url = "https://gitlab.example.com/joe/test-ci-project", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@gitlab.example.com:joe/test-ci-project.git", projectEvent_git_http_url = "https://gitlab.example.com/joe/test-ci-project.git", projectEvent_namespace = "Joe Bloggs", projectEvent_visibility_level = Private, projectEvent_path_with_namespace = "joe/test-ci-project", projectEvent_default_branch = "master", projectEvent_homepage = Just "https://gitlab.example.com/joe/test-ci-project", projectEvent_url = "git@gitlab.example.com:joe/test-ci-project.git", projectEvent_ssh_url = "git@gitlab.example.com:joe/test-ci-project.git", projectEvent_http_url = "https://gitlab.example.com/joe/test-ci-project.git"}, objectAttributes_last_commit = CommitEvent {commitEvent_id = "83c2d70f8ecb1376d1d4f1e52b7a18c560a7b95c", commitEvent_message = "A change\n", commitEvent_timestamp = "2022-10-24T23:10:03+01:00", commitEvent_url = "https://gitlab.example.com/joe/test-ci-project/-/commit/83c2d70f8ecb1376d1d4f1e52b7a18c560a7b95c", commitEvent_author = CommitAuthorEvent {commitAuthorEvent_name = "Joe Bloggs", commitAuthorEvent_email = "robstewart57@gmail.com"}}, objectAttributes_work_in_progress = False, objectAttributes_total_time_spent = Just 0, objectAttributes_human_total_time_spent = Nothing, objectAttributes_human_time_estimate = Nothing, objectAttributes_action = Just "open"}, mergeRequest_labels = Just [], mergeRequest_changes = MergeRequestChanges {mergeRequestChanges_author_id = Nothing, mergeRequestChanges_created_at = Nothing, mergeRequestChanges_description = Nothing, mergeRequestChanges_id = Nothing, mergeRequestChanges_iid = Nothing, mergeRequestChanges_source_branch = Nothing, mergeRequestChanges_source_project_id = Nothing, mergeRequestChanges_target_branch = Nothing, mergeRequestChanges_target_project_id = Nothing, mergeRequestChanges_title = Nothing, mergeRequestChanges_updated_at = Nothing}, mergeRequest_repository = RepositoryEvent {repositoryEvent_name = "test-ci-project", repositoryEvent_url = "git@gitlab.example.com:joe/test-ci-project.git", repositoryEvent_description = Just "", repositoryEvent_homepage = Just "https://gitlab.example.com/joe/test-ci-project", repositoryEvent_git_http_url = Nothing, repositoryEvent_git_ssh_url = Nothing, repositoryEvent_visibility_level = Nothing}}+  MergeRequestEvent {mergeRequest_object_kind = "merge_request", mergeRequest_event_type = "merge_request", mergeRequest_user = UserEvent {userEvent_id = Nothing, userEvent_name = "Joe Bloggs", userEvent_username = "joe", userEvent_avatar_url = "https://gitlab.example.com/uploads/-/system/user/avatar/5/avatar.png", userEvent_email = Nothing}, mergeRequest_project = ProjectEvent {projectEvent_id = Just 7926, projectEvent_name = "test-ci-project", projectEvent_description = Just "", projectEvent_web_url = "https://gitlab.example.com/joe/test-ci-project", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@gitlab.example.com:joe/test-ci-project.git", projectEvent_git_http_url = "https://gitlab.example.com/joe/test-ci-project.git", projectEvent_namespace = "Joe Bloggs", projectEvent_visibility_level = Private, projectEvent_path_with_namespace = "joe/test-ci-project", projectEvent_default_branch = "master", projectEvent_homepage = Just "https://gitlab.example.com/joe/test-ci-project", projectEvent_url = "git@gitlab.example.com:joe/test-ci-project.git", projectEvent_ssh_url = "git@gitlab.example.com:joe/test-ci-project.git", projectEvent_http_url = "https://gitlab.example.com/joe/test-ci-project.git"}, mergeRequest_object_attributes = MergeRequestObjectAttributes {merge_request_object_attributes_id = 3448, merge_request_object_attributes_target_branch = "master", merge_request_object_attributes_source_branch = "another-branch", merge_request_object_attributes_source_project_id = 7926, merge_request_object_attributes_author_id = Just 5, merge_request_object_attributes_assignee_id = Nothing, merge_request_object_attributes_assignee_ids = Just [], merge_request_object_attributes_title = "A change", merge_request_object_attributes_created_at = Just "2022-10-24 22:11:46 UTC", merge_request_object_attributes_updated_at = Just "2022-10-24 22:11:46 UTC", merge_request_object_attributes_milestone_id = Nothing, merge_request_object_attributes_state = "opened", merge_request_object_attributes_state_id = Just 1, merge_request_object_attributes_merge_status = "preparing", merge_request_object_attributes_target_project_id = 7926, merge_request_object_attributes_iid = 1, merge_request_object_attributes_description = Just "To test the merge request event.", merge_request_object_attributes_updated_by_id = Nothing, merge_request_object_attributes_merge_error = Nothing, merge_request_object_attributes_merge_params = Just (MergeParams {mergeParams_force_remove_source_branch = Just "1"}), merge_request_object_attributes_merge_when_pipeline_succeeds = Just False, merge_request_object_attributes_merge_user_id = Nothing, merge_request_object_attributes_merge_commit_sha = Nothing, merge_request_object_attributes_deleted_at = Nothing, merge_request_object_attributes_in_progress_merge_commit_sha = Nothing, merge_request_object_attributes_lock_version = Nothing, merge_request_object_attributes_time_estimate = Just 0, merge_request_object_attributes_last_edited_at = Nothing, merge_request_object_attributes_last_edited_by_id = Nothing, merge_request_object_attributes_head_pipeline_id = Nothing, merge_request_object_attributes_ref_fetched = Nothing, merge_request_object_attributes_merge_jid = Nothing, merge_request_object_attributes_source = Just $ ProjectEvent {projectEvent_id = Just 7926, projectEvent_name = "test-ci-project", projectEvent_description = Just "", projectEvent_web_url = "https://gitlab.example.com/joe/test-ci-project", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@gitlab.example.com:joe/test-ci-project.git", projectEvent_git_http_url = "https://gitlab.example.com/joe/test-ci-project.git", projectEvent_namespace = "Joe Bloggs", projectEvent_visibility_level = Private, projectEvent_path_with_namespace = "joe/test-ci-project", projectEvent_default_branch = "master", projectEvent_homepage = Just "https://gitlab.example.com/joe/test-ci-project", projectEvent_url = "git@gitlab.example.com:joe/test-ci-project.git", projectEvent_ssh_url = "git@gitlab.example.com:joe/test-ci-project.git", projectEvent_http_url = "https://gitlab.example.com/joe/test-ci-project.git"}, merge_request_object_attributes_target = Just $ ProjectEvent {projectEvent_id = Just 7926, projectEvent_name = "test-ci-project", projectEvent_description = Just "", projectEvent_web_url = "https://gitlab.example.com/joe/test-ci-project", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@gitlab.example.com:joe/test-ci-project.git", projectEvent_git_http_url = "https://gitlab.example.com/joe/test-ci-project.git", projectEvent_namespace = "Joe Bloggs", projectEvent_visibility_level = Private, projectEvent_path_with_namespace = "joe/test-ci-project", projectEvent_default_branch = "master", projectEvent_homepage = Just "https://gitlab.example.com/joe/test-ci-project", projectEvent_url = "git@gitlab.example.com:joe/test-ci-project.git", projectEvent_ssh_url = "git@gitlab.example.com:joe/test-ci-project.git", projectEvent_http_url = "https://gitlab.example.com/joe/test-ci-project.git"}, merge_request_object_attributes_last_commit = Just $ CommitEvent {commitEvent_id = "83c2d70f8ecb1376d1d4f1e52b7a18c560a7b95c", commitEvent_message = "A change\n", commitEvent_timestamp = "2022-10-24T23:10:03+01:00", commitEvent_url = "https://gitlab.example.com/joe/test-ci-project/-/commit/83c2d70f8ecb1376d1d4f1e52b7a18c560a7b95c", commitEvent_author = CommitAuthorEvent {commitAuthorEvent_name = "Joe Bloggs", commitAuthorEvent_email = "robstewart57@gmail.com"}}, merge_request_object_attributes_work_in_progress = Just False, merge_request_object_attributes_total_time_spent = Just 0, merge_request_object_attributes_human_total_time_spent = Nothing, merge_request_object_attributes_human_time_estimate = Nothing, merge_request_object_attributes_action = Just "open"}, mergeRequest_labels = Just [], mergeRequest_changes = MergeRequestChanges {mergeRequestChanges_author_id = Nothing, mergeRequestChanges_created_at = Nothing, mergeRequestChanges_description = Nothing, mergeRequestChanges_id = Nothing, mergeRequestChanges_iid = Nothing, mergeRequestChanges_source_branch = Nothing, mergeRequestChanges_source_project_id = Nothing, mergeRequestChanges_target_branch = Nothing, mergeRequestChanges_target_project_id = Nothing, mergeRequestChanges_title = Nothing, mergeRequestChanges_updated_at = Nothing}, mergeRequest_repository = RepositoryEvent {repositoryEvent_name = "test-ci-project", repositoryEvent_url = "git@gitlab.example.com:joe/test-ci-project.git", repositoryEvent_description = Just "", repositoryEvent_homepage = Just "https://gitlab.example.com/joe/test-ci-project", repositoryEvent_git_http_url = Nothing, repositoryEvent_git_ssh_url = Nothing, repositoryEvent_visibility_level = Nothing}}  -- | tests that this fix works: -- https://gitlab.com/robstewart57/gitlab-haskell/-/commit/d1ca1037944616ac940284c5f8e49b5d9bcbf83c mergeRequestGitLab_15_5_0_maybe_descriptions_Haskell :: MergeRequestEvent mergeRequestGitLab_15_5_0_maybe_descriptions_Haskell =-  MergeRequestEvent {mergeRequest_object_kind = "merge_request", mergeRequest_event_type = "merge_request", mergeRequest_user = UserEvent {userEvent_id = Nothing, userEvent_name = "Bloggs, Joe", userEvent_username = "joe123", userEvent_avatar_url = "https://secure.gravatar.com/avatar/df1b70b1fd7d7eaaa5f9a41f5f5093c0?s=80&d=identicon", userEvent_email = Nothing}, mergeRequest_project = ProjectEvent {projectEvent_id = Just 43593, projectEvent_name = "proj1", projectEvent_description = Nothing, projectEvent_web_url = "https://gitlab.example.com/grp1/grp2/proj1", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@gitlab.example.com:grp1/grp2/proj1.git", projectEvent_git_http_url = "https://gitlab.example.com/grp1/grp2/proj1.git", projectEvent_namespace = "grp2", projectEvent_visibility_level = Private, projectEvent_path_with_namespace = "grp1/grp2/proj1", projectEvent_default_branch = "main", projectEvent_homepage = Just "https://gitlab.example.com/grp1/grp2/proj1", projectEvent_url = "git@gitlab.example.com:grp1/grp2/proj1.git", projectEvent_ssh_url = "git@gitlab.example.com:grp1/grp2/proj1.git", projectEvent_http_url = "https://gitlab.example.com/grp1/grp2/proj1.git"}, mergeRequest_object_attributes = MergeRequestObjectAttributes {objectAttributes_id = 3461, objectAttributes_target_branch = "main", objectAttributes_source_branch = "main", objectAttributes_source_project_id = 49668, objectAttributes_author_id = Just 2312, objectAttributes_assignee_id = Nothing, objectAttributes_assignee_ids = Just [], objectAttributes_title = "the MR title", objectAttributes_created_at = "2022-10-25 18:51:48 UTC", objectAttributes_updated_at = "2022-10-25 18:51:48 UTC", objectAttributes_milestone_id = Nothing, objectAttributes_state = "opened", objectAttributes_state_id = Just 1, objectAttributes_merge_status = "preparing", objectAttributes_target_project_id = 43593, objectAttributes_iid = 14, objectAttributes_description = "", objectAttributes_updated_by_id = Nothing, objectAttributes_merge_error = Nothing, objectAttributes_merge_params = Just (MergeParams {mergeParams_force_remove_source_branch = Nothing}), objectAttributes_merge_when_pipeline_succeeds = Just False, objectAttributes_merge_user_id = Nothing, objectAttributes_merge_commit_sha = Nothing, objectAttributes_deleted_at = Nothing, objectAttributes_in_progress_merge_commit_sha = Nothing, objectAttributes_lock_version = Nothing, objectAttributes_time_estimate = Just 0, objectAttributes_last_edited_at = Nothing, objectAttributes_last_edited_by_id = Nothing, objectAttributes_head_pipeline_id = Nothing, objectAttributes_ref_fetched = Nothing, objectAttributes_merge_jid = Nothing, objectAttributes_source = ProjectEvent {projectEvent_id = Just 49668, projectEvent_name = "proj1", projectEvent_description = Nothing, projectEvent_web_url = "https://gitlab.example.com/joe123/proj1", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@gitlab.example.com:joe123/proj1.git", projectEvent_git_http_url = "https://gitlab.example.com/joe123/proj1.git", projectEvent_namespace = "Bloggs, Joe", projectEvent_visibility_level = Private, projectEvent_path_with_namespace = "joe123/proj1", projectEvent_default_branch = "main", projectEvent_homepage = Just "https://gitlab.example.com/joe123/proj1", projectEvent_url = "git@gitlab.example.com:joe123/proj1.git", projectEvent_ssh_url = "git@gitlab.example.com:joe123/proj1.git", projectEvent_http_url = "https://gitlab.example.com/joe123/proj1.git"}, objectAttributes_target = ProjectEvent {projectEvent_id = Just 43593, projectEvent_name = "proj1", projectEvent_description = Nothing, projectEvent_web_url = "https://gitlab.example.com/grp1/grp2/proj1", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@gitlab.example.com:grp1/grp2/proj1.git", projectEvent_git_http_url = "https://gitlab.example.com/grp1/grp2/proj1.git", projectEvent_namespace = "grp2", projectEvent_visibility_level = Private, projectEvent_path_with_namespace = "grp1/grp2/proj1", projectEvent_default_branch = "main", projectEvent_homepage = Just "https://gitlab.example.com/grp1/grp2/proj1", projectEvent_url = "git@gitlab.example.com:grp1/grp2/proj1.git", projectEvent_ssh_url = "git@gitlab.example.com:grp1/grp2/proj1.git", projectEvent_http_url = "https://gitlab.example.com/grp1/grp2/proj1.git"}, objectAttributes_last_commit = CommitEvent {commitEvent_id = "249d94fdc92825a2ca22c4fa74c511ec5f03e086", commitEvent_message = "Updated README\n", commitEvent_timestamp = "2022-10-08T10:37:28+01:00", commitEvent_url = "https://gitlab.example.com/grp1/grp2/proj1/-/commit/249d94fdc92825a2ca22c4fa74c511ec5f03e086", commitEvent_author = CommitAuthorEvent {commitAuthorEvent_name = "Hill, Harry", commitAuthorEvent_email = "harry@gmail.com"}}, objectAttributes_work_in_progress = True, objectAttributes_total_time_spent = Just 0, objectAttributes_human_total_time_spent = Nothing, objectAttributes_human_time_estimate = Nothing, objectAttributes_action = Just "open"}, mergeRequest_labels = Just [], mergeRequest_changes = MergeRequestChanges {mergeRequestChanges_author_id = Nothing, mergeRequestChanges_created_at = Nothing, mergeRequestChanges_description = Nothing, mergeRequestChanges_id = Nothing, mergeRequestChanges_iid = Nothing, mergeRequestChanges_source_branch = Nothing, mergeRequestChanges_source_project_id = Nothing, mergeRequestChanges_target_branch = Nothing, mergeRequestChanges_target_project_id = Nothing, mergeRequestChanges_title = Nothing, mergeRequestChanges_updated_at = Nothing}, mergeRequest_repository = RepositoryEvent {repositoryEvent_name = "proj1", repositoryEvent_url = "git@gitlab.example.com:grp1/grp2/proj1.git", repositoryEvent_description = Nothing, repositoryEvent_homepage = Just "https://gitlab.example.com/grp1/grp2/proj1", repositoryEvent_git_http_url = Nothing, repositoryEvent_git_ssh_url = Nothing, repositoryEvent_visibility_level = Nothing}}+  MergeRequestEvent {mergeRequest_object_kind = "merge_request", mergeRequest_event_type = "merge_request", mergeRequest_user = UserEvent {userEvent_id = Nothing, userEvent_name = "Bloggs, Joe", userEvent_username = "joe123", userEvent_avatar_url = "https://secure.gravatar.com/avatar/df1b70b1fd7d7eaaa5f9a41f5f5093c0?s=80&d=identicon", userEvent_email = Nothing}, mergeRequest_project = ProjectEvent {projectEvent_id = Just 43593, projectEvent_name = "proj1", projectEvent_description = Nothing, projectEvent_web_url = "https://gitlab.example.com/grp1/grp2/proj1", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@gitlab.example.com:grp1/grp2/proj1.git", projectEvent_git_http_url = "https://gitlab.example.com/grp1/grp2/proj1.git", projectEvent_namespace = "grp2", projectEvent_visibility_level = Private, projectEvent_path_with_namespace = "grp1/grp2/proj1", projectEvent_default_branch = "main", projectEvent_homepage = Just "https://gitlab.example.com/grp1/grp2/proj1", projectEvent_url = "git@gitlab.example.com:grp1/grp2/proj1.git", projectEvent_ssh_url = "git@gitlab.example.com:grp1/grp2/proj1.git", projectEvent_http_url = "https://gitlab.example.com/grp1/grp2/proj1.git"}, mergeRequest_object_attributes = MergeRequestObjectAttributes {merge_request_object_attributes_id = 3461, merge_request_object_attributes_target_branch = "main", merge_request_object_attributes_source_branch = "main", merge_request_object_attributes_source_project_id = 49668, merge_request_object_attributes_author_id = Just 2312, merge_request_object_attributes_assignee_id = Nothing, merge_request_object_attributes_assignee_ids = Just [], merge_request_object_attributes_title = "the MR title", merge_request_object_attributes_created_at = Just "2022-10-25 18:51:48 UTC", merge_request_object_attributes_updated_at = Just "2022-10-25 18:51:48 UTC", merge_request_object_attributes_milestone_id = Nothing, merge_request_object_attributes_state = "opened", merge_request_object_attributes_state_id = Just 1, merge_request_object_attributes_merge_status = "preparing", merge_request_object_attributes_target_project_id = 43593, merge_request_object_attributes_iid = 14, merge_request_object_attributes_description = Just "", merge_request_object_attributes_updated_by_id = Nothing, merge_request_object_attributes_merge_error = Nothing, merge_request_object_attributes_merge_params = Just (MergeParams {mergeParams_force_remove_source_branch = Nothing}), merge_request_object_attributes_merge_when_pipeline_succeeds = Just False, merge_request_object_attributes_merge_user_id = Nothing, merge_request_object_attributes_merge_commit_sha = Nothing, merge_request_object_attributes_deleted_at = Nothing, merge_request_object_attributes_in_progress_merge_commit_sha = Nothing, merge_request_object_attributes_lock_version = Nothing, merge_request_object_attributes_time_estimate = Just 0, merge_request_object_attributes_last_edited_at = Nothing, merge_request_object_attributes_last_edited_by_id = Nothing, merge_request_object_attributes_head_pipeline_id = Nothing, merge_request_object_attributes_ref_fetched = Nothing, merge_request_object_attributes_merge_jid = Nothing, merge_request_object_attributes_source = Just $ ProjectEvent {projectEvent_id = Just 49668, projectEvent_name = "proj1", projectEvent_description = Nothing, projectEvent_web_url = "https://gitlab.example.com/joe123/proj1", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@gitlab.example.com:joe123/proj1.git", projectEvent_git_http_url = "https://gitlab.example.com/joe123/proj1.git", projectEvent_namespace = "Bloggs, Joe", projectEvent_visibility_level = Private, projectEvent_path_with_namespace = "joe123/proj1", projectEvent_default_branch = "main", projectEvent_homepage = Just "https://gitlab.example.com/joe123/proj1", projectEvent_url = "git@gitlab.example.com:joe123/proj1.git", projectEvent_ssh_url = "git@gitlab.example.com:joe123/proj1.git", projectEvent_http_url = "https://gitlab.example.com/joe123/proj1.git"}, merge_request_object_attributes_target = Just $ ProjectEvent {projectEvent_id = Just 43593, projectEvent_name = "proj1", projectEvent_description = Nothing, projectEvent_web_url = "https://gitlab.example.com/grp1/grp2/proj1", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@gitlab.example.com:grp1/grp2/proj1.git", projectEvent_git_http_url = "https://gitlab.example.com/grp1/grp2/proj1.git", projectEvent_namespace = "grp2", projectEvent_visibility_level = Private, projectEvent_path_with_namespace = "grp1/grp2/proj1", projectEvent_default_branch = "main", projectEvent_homepage = Just "https://gitlab.example.com/grp1/grp2/proj1", projectEvent_url = "git@gitlab.example.com:grp1/grp2/proj1.git", projectEvent_ssh_url = "git@gitlab.example.com:grp1/grp2/proj1.git", projectEvent_http_url = "https://gitlab.example.com/grp1/grp2/proj1.git"}, merge_request_object_attributes_last_commit = Just $ CommitEvent {commitEvent_id = "249d94fdc92825a2ca22c4fa74c511ec5f03e086", commitEvent_message = "Updated README\n", commitEvent_timestamp = "2022-10-08T10:37:28+01:00", commitEvent_url = "https://gitlab.example.com/grp1/grp2/proj1/-/commit/249d94fdc92825a2ca22c4fa74c511ec5f03e086", commitEvent_author = CommitAuthorEvent {commitAuthorEvent_name = "Hill, Harry", commitAuthorEvent_email = "harry@gmail.com"}}, merge_request_object_attributes_work_in_progress = Just True, merge_request_object_attributes_total_time_spent = Just 0, merge_request_object_attributes_human_total_time_spent = Nothing, merge_request_object_attributes_human_time_estimate = Nothing, merge_request_object_attributes_action = Just "open"}, mergeRequest_labels = Just [], mergeRequest_changes = MergeRequestChanges {mergeRequestChanges_author_id = Nothing, mergeRequestChanges_created_at = Nothing, mergeRequestChanges_description = Nothing, mergeRequestChanges_id = Nothing, mergeRequestChanges_iid = Nothing, mergeRequestChanges_source_branch = Nothing, mergeRequestChanges_source_project_id = Nothing, mergeRequestChanges_target_branch = Nothing, mergeRequestChanges_target_project_id = Nothing, mergeRequestChanges_title = Nothing, mergeRequestChanges_updated_at = Nothing}, mergeRequest_repository = RepositoryEvent {repositoryEvent_name = "proj1", repositoryEvent_url = "git@gitlab.example.com:grp1/grp2/proj1.git", repositoryEvent_description = Nothing, repositoryEvent_homepage = Just "https://gitlab.example.com/grp1/grp2/proj1", repositoryEvent_git_http_url = Nothing, repositoryEvent_git_ssh_url = Nothing, repositoryEvent_visibility_level = Nothing}}  build1Haskell :: BuildEvent build1Haskell =@@ -1949,6 +2051,10 @@ pipeline6Haskell =   PipelineEvent {pipeline_event_object_kind = "pipeline", pipeline_event_object_attributes = PipelineObjectAttributes {pipeline_object_attributes_id = 74974, pipeline_object_attributes_iid = 1, pipeline_object_attributes_name = Nothing, pipeline_object_attributes_ref = "main", pipeline_object_attributes_tag = False, pipeline_object_attributes_sha = "abc1", pipeline_object_attributes_before_sha = "aaa1", pipeline_object_attributes_source = "push", pipeline_object_attributes_status = "pending", pipeline_object_attributes_detailed_status = "pending", pipeline_object_attributes_stages = ["build", "test", "deploy"], pipeline_object_attributes_created_at = "2026-02-07 02:47:56 UTC", pipeline_object_attributes_finished_at = Nothing, pipeline_object_attributes_duration = Nothing, pipeline_object_attributes_queued_duration = Nothing, pipeline_object_attributes_variables = [], pipeline_object_attributes_url = "https://example.com/joe1/proj1/-/pipelines/74974"}, pipeline_event_merge_request = Nothing, pipeline_event_user = User {user_id = 414, user_username = "joe1", user_bio = Nothing, user_two_factor_enabled = Nothing, user_last_sign_in_at = Nothing, user_current_sign_in_at = Nothing, user_last_activity_on = Nothing, user_skype = Nothing, user_twitter = Nothing, user_website_url = Nothing, user_theme_id = Nothing, user_color_scheme_id = Nothing, user_external = Nothing, user_private_profile = Nothing, user_projects_limit = Nothing, user_can_create_group = Nothing, user_can_create_project = Nothing, user_public_email = Nothing, user_organization = Nothing, user_job_title = Nothing, user_pronouns = Nothing, user_linkedin = Nothing, user_confirmed_at = Nothing, user_identities = Nothing, user_name = "Joe Bloggs", user_email = Just "[REDACTED]", user_followers = Nothing, user_bot = Nothing, user_following = Nothing, user_state = Nothing, user_avatar_url = Just "https://secure.gravatar.com/avatar/aaa1?s=80&d=identicon", user_web_url = Nothing, user_location = Nothing, user_extern_uid = Nothing, user_group_id_for_saml = Nothing, user_discussion_locked = Nothing, user_created_at = Nothing, user_note = Nothing, user_password = Nothing, user_force_random_password = Nothing, user_providor = Nothing, user_reset_password = Nothing, user_skip_confirmation = Nothing, user_view_diffs_file_by_file = Nothing}, pipeline_event_project = BuildProject {build_project_project_id = 47461, build_project_project_name = "proj1", build_project_description = Nothing, build_project_web_url = "https://example.com/joe1/proj1", build_project_avatar_url = Nothing, build_project_git_ssh_url = "git@example.com:joe1/proj1.git", build_project_git_http_url = "https://example.com/joe1/proj1.git", build_project_namespace = "Joe Bloggs", build_project_visibility_level = 0, build_project_path_with_namespace = "joe1/proj1", build_project_default_branch = "main", build_project_ci_config_path = Just ""}, pipeline_event_commit = CommitEvent {commitEvent_id = "abc1", commitEvent_message = "commit message", commitEvent_timestamp = "2026-02-07T02:47:55+00:00", commitEvent_url = "https://example.com/joe1/proj1/-/commit/abc1", commitEvent_author = CommitAuthorEvent {commitAuthorEvent_name = "Joe Bloggs", commitAuthorEvent_email = "joe1@example.com"}}, pipeline_event_builds = [PipelineBuild {pipeline_build_id = 103996, pipeline_build_stage = "build", pipeline_build_name = "build-job", pipeline_build_status = "pending", pipeline_build_created_at = "2026-02-07 02:47:56 UTC", pipeline_build_started_at = Nothing, pipeline_build_finished_at = Nothing, pipeline_build_duration = Nothing, pipeline_build_queued_duration = Just 0.486474635, pipeline_build_failure_reason = Nothing, pipeline_build_when = "on_success", pipeline_build_manual = False, pipeline_build_allow_failure = False, pipeline_build_user = UserEvent {userEvent_id = Nothing, userEvent_name = "Joe Bloggs", userEvent_username = "joe1", userEvent_avatar_url = "https://secure.gravatar.com/avatar/aaa1?s=80&d=identicon", userEvent_email = Nothing}, pipeline_build_runner = Nothing, pipeline_build_artifacts_file = ArtifactsFile {artifacts_file_filename = Nothing, artifacts_file_size = Nothing}, pipeline_build_environment = Nothing}, PipelineBuild {pipeline_build_id = 103997, pipeline_build_stage = "test", pipeline_build_name = "test", pipeline_build_status = "created", pipeline_build_created_at = "2026-02-07 02:47:56 UTC", pipeline_build_started_at = Nothing, pipeline_build_finished_at = Nothing, pipeline_build_duration = Nothing, pipeline_build_queued_duration = Nothing, pipeline_build_failure_reason = Nothing, pipeline_build_when = "on_success", pipeline_build_manual = False, pipeline_build_allow_failure = False, pipeline_build_user = UserEvent {userEvent_id = Nothing, userEvent_name = "Joe Bloggs", userEvent_username = "joe1", userEvent_avatar_url = "https://secure.gravatar.com/avatar/aaa1?s=80&d=identicon", userEvent_email = Nothing}, pipeline_build_runner = Nothing, pipeline_build_artifacts_file = ArtifactsFile {artifacts_file_filename = Nothing, artifacts_file_size = Nothing}, pipeline_build_environment = Nothing}, PipelineBuild {pipeline_build_id = 103998, pipeline_build_stage = "test", pipeline_build_name = "test job", pipeline_build_status = "created", pipeline_build_created_at = "2026-02-07 02:47:56 UTC", pipeline_build_started_at = Nothing, pipeline_build_finished_at = Nothing, pipeline_build_duration = Nothing, pipeline_build_queued_duration = Nothing, pipeline_build_failure_reason = Nothing, pipeline_build_when = "on_success", pipeline_build_manual = False, pipeline_build_allow_failure = False, pipeline_build_user = UserEvent {userEvent_id = Nothing, userEvent_name = "Joe Bloggs", userEvent_username = "joe1", userEvent_avatar_url = "https://secure.gravatar.com/avatar/aaa1?s=80&d=identicon", userEvent_email = Nothing}, pipeline_build_runner = Nothing, pipeline_build_artifacts_file = ArtifactsFile {artifacts_file_filename = Nothing, artifacts_file_size = Nothing}, pipeline_build_environment = Nothing}, PipelineBuild {pipeline_build_id = 103999, pipeline_build_stage = "deploy", pipeline_build_name = "deploy-job", pipeline_build_status = "created", pipeline_build_created_at = "2026-02-07 02:47:56 UTC", pipeline_build_started_at = Nothing, pipeline_build_finished_at = Nothing, pipeline_build_duration = Nothing, pipeline_build_queued_duration = Nothing, pipeline_build_failure_reason = Nothing, pipeline_build_when = "on_success", pipeline_build_manual = False, pipeline_build_allow_failure = False, pipeline_build_user = UserEvent {userEvent_id = Nothing, userEvent_name = "Joe Bloggs", userEvent_username = "joe1", userEvent_avatar_url = "https://secure.gravatar.com/avatar/aaa1?s=80&d=identicon", userEvent_email = Nothing}, pipeline_build_runner = Nothing, pipeline_build_artifacts_file = ArtifactsFile {artifacts_file_filename = Nothing, artifacts_file_size = Nothing}, pipeline_build_environment = Just (Environment {environment_name = "production", environment_action = "start", environment_deployment_tier = Just "production"})}]} +pipeline7Haskell :: PipelineEvent+pipeline7Haskell =+  PipelineEvent {pipeline_event_object_kind = "pipeline", pipeline_event_object_attributes = PipelineObjectAttributes {pipeline_object_attributes_id = 76289, pipeline_object_attributes_iid = 4, pipeline_object_attributes_name = Nothing, pipeline_object_attributes_ref = "the-ref", pipeline_object_attributes_tag = False, pipeline_object_attributes_sha = "abc123", pipeline_object_attributes_before_sha = "0000000000000000000000000000000000000000", pipeline_object_attributes_source = "merge_request_event", pipeline_object_attributes_status = "failed", pipeline_object_attributes_detailed_status = "failed", pipeline_object_attributes_stages = [], pipeline_object_attributes_created_at = "2026-04-05 17:37:55 UTC", pipeline_object_attributes_finished_at = Just "2026-04-05 17:37:55 UTC", pipeline_object_attributes_duration = Nothing, pipeline_object_attributes_queued_duration = Nothing, pipeline_object_attributes_variables = [], pipeline_object_attributes_url = "http://www.example.com/joe1/proj-name/-/pipelines/76289"}, pipeline_event_merge_request = Just (MergeRequestObjectAttributes {merge_request_object_attributes_id = 3252, merge_request_object_attributes_target_branch = "main", merge_request_object_attributes_source_branch = "the-ref", merge_request_object_attributes_source_project_id = 51828, merge_request_object_attributes_author_id = Nothing, merge_request_object_attributes_assignee_id = Nothing, merge_request_object_attributes_assignee_ids = Nothing, merge_request_object_attributes_title = "merge request title", merge_request_object_attributes_created_at = Nothing, merge_request_object_attributes_updated_at = Nothing, merge_request_object_attributes_milestone_id = Nothing, merge_request_object_attributes_state = "opened", merge_request_object_attributes_state_id = Nothing, merge_request_object_attributes_merge_status = "checking", merge_request_object_attributes_target_project_id = 51828, merge_request_object_attributes_iid = 2, merge_request_object_attributes_description = Nothing, merge_request_object_attributes_updated_by_id = Nothing, merge_request_object_attributes_merge_error = Nothing, merge_request_object_attributes_merge_params = Nothing, merge_request_object_attributes_merge_when_pipeline_succeeds = Nothing, merge_request_object_attributes_merge_user_id = Nothing, merge_request_object_attributes_merge_commit_sha = Nothing, merge_request_object_attributes_deleted_at = Nothing, merge_request_object_attributes_in_progress_merge_commit_sha = Nothing, merge_request_object_attributes_lock_version = Nothing, merge_request_object_attributes_time_estimate = Nothing, merge_request_object_attributes_last_edited_at = Nothing, merge_request_object_attributes_last_edited_by_id = Nothing, merge_request_object_attributes_head_pipeline_id = Nothing, merge_request_object_attributes_ref_fetched = Nothing, merge_request_object_attributes_merge_jid = Nothing, merge_request_object_attributes_source = Nothing, merge_request_object_attributes_target = Nothing, merge_request_object_attributes_last_commit = Nothing, merge_request_object_attributes_work_in_progress = Nothing, merge_request_object_attributes_total_time_spent = Nothing, merge_request_object_attributes_human_total_time_spent = Nothing, merge_request_object_attributes_human_time_estimate = Nothing, merge_request_object_attributes_action = Nothing}), pipeline_event_user = User {user_id = 4273, user_username = "joe1", user_bio = Nothing, user_two_factor_enabled = Nothing, user_last_sign_in_at = Nothing, user_current_sign_in_at = Nothing, user_last_activity_on = Nothing, user_skype = Nothing, user_twitter = Nothing, user_website_url = Nothing, user_theme_id = Nothing, user_color_scheme_id = Nothing, user_external = Nothing, user_private_profile = Nothing, user_projects_limit = Nothing, user_can_create_group = Nothing, user_can_create_project = Nothing, user_public_email = Nothing, user_organization = Nothing, user_job_title = Nothing, user_pronouns = Nothing, user_linkedin = Nothing, user_confirmed_at = Nothing, user_identities = Nothing, user_name = "Joe Bloggs", user_email = Just "[REDACTED]", user_followers = Nothing, user_bot = Nothing, user_following = Nothing, user_state = Nothing, user_avatar_url = Just "https://secure.gravatar.com/avatar/abc123", user_web_url = Nothing, user_location = Nothing, user_extern_uid = Nothing, user_group_id_for_saml = Nothing, user_discussion_locked = Nothing, user_created_at = Nothing, user_note = Nothing, user_password = Nothing, user_force_random_password = Nothing, user_providor = Nothing, user_reset_password = Nothing, user_skip_confirmation = Nothing, user_view_diffs_file_by_file = Nothing}, pipeline_event_project = BuildProject {build_project_project_id = 51828, build_project_project_name = "project name", build_project_description = Nothing, build_project_web_url = "http://www.example.com/joe1/proj-name", build_project_avatar_url = Nothing, build_project_git_ssh_url = "git@example.com:joe1/proj-name.git", build_project_git_http_url = "http://www.example.com/joe1/proj-name.git", build_project_namespace = "Joe Bloggs", build_project_visibility_level = 0, build_project_path_with_namespace = "joe1/proj-name", build_project_default_branch = "main", build_project_ci_config_path = Just ""}, pipeline_event_commit = CommitEvent {commitEvent_id = "abc123", commitEvent_message = "merge request title", commitEvent_timestamp = "2026-04-05T17:37:48+00:00", commitEvent_url = "http://www.example.com/joe1/proj-name/-/commit/abc123", commitEvent_author = CommitAuthorEvent {commitAuthorEvent_name = "Joe Bloggs", commitAuthorEvent_email = "joe1@example.com"}}, pipeline_event_builds = []}+ issue1Haskell :: IssueEvent issue1Haskell =   IssueEvent {issue_event_event_type = "issue", issue_event_user = Just (UserEvent {userEvent_id = Nothing, userEvent_name = "Joe", userEvent_username = "ma2305", userEvent_avatar_url = "https://secure.gravatar.com/avatar/abcde", userEvent_email = Nothing}), issue_event_project = Just (ProjectEvent {projectEvent_id = Just 19102, projectEvent_name = "proj-name", projectEvent_description = Just "", projectEvent_web_url = "https://example.com/joe123/proj-name", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@example.com:joe123/proj-name.git", projectEvent_git_http_url = "https://example.com/joe123/proj-name.git", projectEvent_namespace = "Joe", projectEvent_visibility_level = Private, projectEvent_path_with_namespace = "joe123/proj-name", projectEvent_default_branch = "master", projectEvent_homepage = Just "https://example.com/joe123/proj-name", projectEvent_url = "git@example.com:joe123/proj-name.git", projectEvent_ssh_url = "git@example.com:joe123/proj-name.git", projectEvent_http_url = "https://example.com/joe123/proj-name.git"}), issue_event_object_attributes = Just (IssueEventObjectAttributes {issue_event_object_attributes_author_id = 2052, issue_event_object_attributes_closed_at = Just "2024-11-02 19:47:16 UTC", issue_event_object_attributes_confidential = False, issue_event_object_attributes_created_at = "2024-11-02 05:45:09 UTC", issue_event_object_attributes_description = Just "", issue_event_object_attributes_discussion_locked = Nothing, issue_event_object_attributes_due_date = Nothing, issue_event_object_attributes_id = 2183, issue_event_object_attributes_iid = 40, issue_event_object_attributes_last_edited_at = Nothing, issue_event_object_attributes_last_edited_by_id = Nothing, issue_event_object_attributes_milestone_id = Nothing, issue_event_object_attributes_move_to_id = Nothing, issue_event_object_attributes_duplicated_to_id = Nothing, issue_event_object_attributes_project_id = 19102, issue_event_object_attributes_relative_position = Just 20520, issue_event_object_attributes_state_id = 2, issue_event_object_attributes_time_estimate = 0, issue_event_object_attributes_title = "Issue title", issue_event_object_attributes_updated_at = "2024-11-02 19:47:17 UTC", issue_event_object_attributes_updated_by_id = Nothing, issue_event_object_attributes_type = "Issue", issue_event_object_attributes_url = "https://example.com/joe123/proj-name/-/issues/40", issue_event_object_attributes_total_time_spent = 0, issue_event_object_attributes_time_change = 0, issue_event_object_attributes_human_total_time_spent = Nothing, issue_event_object_attributes_human_time_change = Nothing, issue_event_object_attributes_human_time_estimate = Nothing}), issue_event_labels = Just [Label {label_id = Just 385, label_title = Just "Stage 3", label_color = Just "#cd5b45", label_project_id = Just 19102, label_created_at = Just "2024-11-02 05:42:30 UTC", label_updated_at = Just "2024-11-02 05:42:30 UTC", label_template = Just False, label_description = Nothing, label_type = Just "ProjectLabel", label_group_id = Nothing}], issue_event_changes = Just (IssueEventChanges {issue_event_changes_author_id = Nothing, issue_event_changes_created_at = Nothing, issue_event_changes_description = Nothing, issue_event_changes_id = Nothing, issue_event_changes_iid = Nothing, issue_event_changes_project_id = Nothing, issue_event_changes_title = Nothing, issue_event_changes_closed_at = Just (IssueChangesClosedAt {issue_event_closed_at_previous = Nothing, issue_event_closed_at_current = Just "2024-11-02 19:47:16 UTC"}), issue_event_changes_state_id = Just (IssueChangesStateId {issue_event_state_id_previous = Just 1, issue_event_state_id_current = 2}), issue_event_changes_updated_at = Just (IssueChangesUpdatedAt {issue_event_updated_at_previous = Just "2024-11-02 05:45:09 UTC", issue_event_updated_at_current = "2024-11-02 19:47:17 UTC"})}), issue_event_repository = Just (RepositoryEvent {repositoryEvent_name = "proj-name", repositoryEvent_url = "git@example.com:joe123/proj-name.git", repositoryEvent_description = Just "", repositoryEvent_homepage = Just "https://example.com/joe123/proj-name", repositoryEvent_git_http_url = Nothing, repositoryEvent_git_ssh_url = Nothing, repositoryEvent_visibility_level = Nothing}), issue_event_assignees = Just [UserEvent {userEvent_id = Nothing, userEvent_name = "Joe", userEvent_username = "joe123", userEvent_avatar_url = "https://secure.gravatar.com/avatar/abcde", userEvent_email = Nothing}]}@@ -2016,3 +2122,15 @@ accessToken4Haskell :: AccessTokenEvent accessToken4Haskell =   AccessTokenEvent {access_token_event_project = EmojiProject {emoji_project_id = 28294, emoji_project_name = "proj-name", emoji_project_description = Nothing, emoji_project_web_url = "https://example.com/aaa1/proj-name", emoji_project_avatar_url = Nothing, emoji_project_git_ssh_url = "git@example.com:aaa1/proj-name.git", emoji_project_git_http_url = "https://example.com/aaa1/proj-name.git", emoji_project_namespace = "Joe Bloggs", emoji_project_visibility_level = 0, emoji_project_path_with_namespace = "aaa1/proj-name", emoji_project_default_branch = "main", emoji_project_ci_config_path = Nothing, emoji_project_homepage = "https://example.com/aaa1/proj-name", emoji_project_url = "git@example.com:aaa1/proj-name.git", emoji_project_ssh_url = "git@example.com:aaa1/proj-name.git", emoji_project_http_url = "https://example.com/aaa1/proj-name.git"}, access_token_event_object_attributes = AccessTokenObjectAttributes {access_token_object_user_id = 3401, access_token_object_created_at = "2024-11-25 08:12:01 UTC", access_token_object_id = 1470, access_token_object_name = "aaa1", access_token_object_expires_at = Just "2025-11-25"}, access_token_event_event_name = "expiring_access_token", access_token_event_interval = "seven_days"}++deployment1Haskell :: DeploymentEvent+deployment1Haskell =+  DeploymentEvent {deployment_event_status = "running", deployment_event_status_changed_at = Just "2026-03-16 03:09:32 +0000", deployment_event_deployment_id = 56, deployment_event_deployable_id = 106120, deployment_event_deployable_url = "https://example.com/joe1/proj-name/-/jobs/106120", deployment_event_environment = "production", deployment_event_environment_tier = "production", deployment_event_environment_slug = "production", deployment_event_environment_external_url = Nothing, deployment_event_project = ProjectEvent {projectEvent_id = Just 47800, projectEvent_name = "proj-name", projectEvent_description = Nothing, projectEvent_web_url = "https://example.com/joe1/proj-name", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@example.com:joe1/proj-name.git", projectEvent_git_http_url = "https://example.com/joe1/proj-name.git", projectEvent_namespace = "Joe Bloggs", projectEvent_visibility_level = Private, projectEvent_path_with_namespace = "joe1/proj-name", projectEvent_default_branch = "main", projectEvent_homepage = Just "https://example.com/joe1/proj-name", projectEvent_url = "git@example.com:joe1/proj-name.git", projectEvent_ssh_url = "git@example.com:joe1/proj-name.git", projectEvent_http_url = "https://example.com/joe1/proj-name.git"}, deployment_event_short_sha = "abc1", deployment_event_user = User {user_id = 414, user_username = "joe1", user_bio = Nothing, user_two_factor_enabled = Nothing, user_last_sign_in_at = Nothing, user_current_sign_in_at = Nothing, user_last_activity_on = Nothing, user_skype = Nothing, user_twitter = Nothing, user_website_url = Nothing, user_theme_id = Nothing, user_color_scheme_id = Nothing, user_external = Nothing, user_private_profile = Nothing, user_projects_limit = Nothing, user_can_create_group = Nothing, user_can_create_project = Nothing, user_public_email = Nothing, user_organization = Nothing, user_job_title = Nothing, user_pronouns = Nothing, user_linkedin = Nothing, user_confirmed_at = Nothing, user_identities = Nothing, user_name = "Joe Bloggs", user_email = Just "[REDACTED]", user_followers = Nothing, user_bot = Nothing, user_following = Nothing, user_state = Nothing, user_avatar_url = Just "https://secure.gravatar.com/avatar/abc1?s=80&d=identicon", user_web_url = Nothing, user_location = Nothing, user_extern_uid = Nothing, user_group_id_for_saml = Nothing, user_discussion_locked = Nothing, user_created_at = Nothing, user_note = Nothing, user_password = Nothing, user_force_random_password = Nothing, user_providor = Nothing, user_reset_password = Nothing, user_skip_confirmation = Nothing, user_view_diffs_file_by_file = Nothing}, deployment_event_user_url = "https://example.com/joe1", deployment_event_commit_url = "https://example.com/joe1/proj-name/-/commit/abc1", deployment_event_commit_title = "Commit title", deployment_event_ref = "main"}++deployment2Haskell :: DeploymentEvent+deployment2Haskell =+  DeploymentEvent {deployment_event_status = "success", deployment_event_status_changed_at = Just "2026-03-16 03:09:34 +0000", deployment_event_deployment_id = 56, deployment_event_deployable_id = 106120, deployment_event_deployable_url = "https://example.com/joe1/proj-name/-/jobs/106120", deployment_event_environment = "production", deployment_event_environment_tier = "production", deployment_event_environment_slug = "production", deployment_event_environment_external_url = Nothing, deployment_event_project = ProjectEvent {projectEvent_id = Just 47800, projectEvent_name = "proj-name", projectEvent_description = Nothing, projectEvent_web_url = "https://example.com/joe1/proj-name", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@example.com:joe1/proj-name.git", projectEvent_git_http_url = "https://example.com/joe1/proj-name.git", projectEvent_namespace = "Joe Bloggs", projectEvent_visibility_level = Private, projectEvent_path_with_namespace = "joe1/proj-name", projectEvent_default_branch = "main", projectEvent_homepage = Just "https://example.com/joe1/proj-name", projectEvent_url = "git@example.com:joe1/proj-name.git", projectEvent_ssh_url = "git@example.com:joe1/proj-name.git", projectEvent_http_url = "https://example.com/joe1/proj-name.git"}, deployment_event_short_sha = "abc1", deployment_event_user = User {user_id = 414, user_username = "joe1", user_bio = Nothing, user_two_factor_enabled = Nothing, user_last_sign_in_at = Nothing, user_current_sign_in_at = Nothing, user_last_activity_on = Nothing, user_skype = Nothing, user_twitter = Nothing, user_website_url = Nothing, user_theme_id = Nothing, user_color_scheme_id = Nothing, user_external = Nothing, user_private_profile = Nothing, user_projects_limit = Nothing, user_can_create_group = Nothing, user_can_create_project = Nothing, user_public_email = Nothing, user_organization = Nothing, user_job_title = Nothing, user_pronouns = Nothing, user_linkedin = Nothing, user_confirmed_at = Nothing, user_identities = Nothing, user_name = "Joe Bloggs", user_email = Just "[REDACTED]", user_followers = Nothing, user_bot = Nothing, user_following = Nothing, user_state = Nothing, user_avatar_url = Just "https://secure.gravatar.com/avatar/abc1?s=80&d=identicon", user_web_url = Nothing, user_location = Nothing, user_extern_uid = Nothing, user_group_id_for_saml = Nothing, user_discussion_locked = Nothing, user_created_at = Nothing, user_note = Nothing, user_password = Nothing, user_force_random_password = Nothing, user_providor = Nothing, user_reset_password = Nothing, user_skip_confirmation = Nothing, user_view_diffs_file_by_file = Nothing}, deployment_event_user_url = "https://example.com/joe1", deployment_event_commit_url = "https://example.com/joe1/proj-name/-/commit/abc1", deployment_event_commit_title = "Commit title", deployment_event_ref = "main"}++milestone1Haskell :: MilestoneEvent+milestone1Haskell =+  MilestoneEvent {milestone_event_project = ProjectEvent {projectEvent_id = Just 48355, projectEvent_name = "proj name", projectEvent_description = Nothing, projectEvent_web_url = "https://example.com/group1/proj-name", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@example.com:group1/proj-name.git", projectEvent_git_http_url = "https://example.com/group1/proj-name.git", projectEvent_namespace = "project namespace", projectEvent_visibility_level = Private, projectEvent_path_with_namespace = "group1/proj-name", projectEvent_default_branch = "main", projectEvent_homepage = Just "https://example.com/group1/proj-name", projectEvent_url = "git@example.com:group1/proj-name.git", projectEvent_ssh_url = "git@example.com:group1/proj-name.git", projectEvent_http_url = "https://example.com/group1/proj-name.git"}, milestone_event_group = Nothing, milestone_event_object_attributes = MilestoneAttributes {milestone_attributes_id = 115, milestone_attributes_iid = 1, milestone_attributes_title = "Milestone title", milestone_attributes_description = "Milestone description", milestone_attributes_state = "active", milestone_attributes_created_at = "2026-02-12 12:35:59 UTC", milestone_attributes_updated_at = "2026-02-12 12:35:59 UTC", milestone_attributes_due_date = "2026-02-23", milestone_attributes_start_date = "2026-01-26", milestone_attributes_project_id = 48355}, milestone_event_action = "create"}