From bc3774ecf3cf642081faa846e7d73fbf5bae516c Mon Sep 17 00:00:00 2001 From: sinkcup Date: Mon, 18 Oct 2021 15:35:37 +0800 Subject: [PATCH 01/21] feat: #73 coding sdk create issue --- app/Coding/Issue.php | 22 ++++ tests/Unit/CodingIssueTest.php | 46 ++++++++ tests/data/coding/CreateIssueResponse.json | 124 +++++++++++++++++++++ 3 files changed, 192 insertions(+) create mode 100644 app/Coding/Issue.php create mode 100644 tests/Unit/CodingIssueTest.php create mode 100644 tests/data/coding/CreateIssueResponse.json diff --git a/app/Coding/Issue.php b/app/Coding/Issue.php new file mode 100644 index 0000000..48ec48b --- /dev/null +++ b/app/Coding/Issue.php @@ -0,0 +1,22 @@ +client->request('POST', 'https://e.coding.net/open-api', [ + 'headers' => [ + 'Accept' => 'application/json', + 'Authorization' => "token ${token}", + 'Content-Type' => 'application/json' + ], + 'json' => array_merge([ + 'Action' => 'CreateIssue', + 'ProjectName' => $projectName, + ], $data), + ]); + return json_decode($response->getBody(), true)['Response']['Issue']; + } +} diff --git a/tests/Unit/CodingIssueTest.php b/tests/Unit/CodingIssueTest.php new file mode 100644 index 0000000..6ed8704 --- /dev/null +++ b/tests/Unit/CodingIssueTest.php @@ -0,0 +1,46 @@ +dataDir . 'coding/CreateIssueResponse.json'); + $codingToken = $this->faker->md5; + $codingProjectUri = $this->faker->slug; + $data = [ + 'Type' => 'REQUIREMENT', + 'Name' => $this->faker->title, + 'Priority' => $this->faker->randomElement([0, 1, 2, 3]), + ]; + + $clientMock = $this->getMockBuilder(Client::class)->getMock(); + $clientMock->expects($this->once()) + ->method('request') + ->with( + 'POST', + 'https://e.coding.net/open-api', + [ + 'headers' => [ + 'Accept' => 'application/json', + 'Authorization' => "token ${codingToken}", + 'Content-Type' => 'application/json' + ], + 'json' => array_merge([ + 'Action' => 'CreateIssue', + 'ProjectName' => $codingProjectUri, + ], $data) + ] + ) + ->willReturn(new Response(200, [], $responseBody)); + $coding = new Issue($clientMock); + $result = $coding->create($codingToken, $codingProjectUri, $data); + $this->assertEquals(json_decode($responseBody, true)['Response']['Issue'], $result); + } +} diff --git a/tests/data/coding/CreateIssueResponse.json b/tests/data/coding/CreateIssueResponse.json new file mode 100644 index 0000000..4e31528 --- /dev/null +++ b/tests/data/coding/CreateIssueResponse.json @@ -0,0 +1,124 @@ +{ + "Response" : { + "Issue" : { + "Assignee" : { + "Avatar" : "", + "Email" : "", + "GlobalKey" : "", + "Id" : 0, + "Name" : "", + "Phone" : "", + "Status" : 0, + "TeamGlobalKey" : "", + "TeamId" : 0 + }, + "Code" : 2742, + "CompletedAt" : 0, + "CreatedAt" : 1634541907501, + "Creator" : { + "Avatar" : "https://coding-net-production-static-ci.codehub.cn/2cb665a3-bebc-4b09-aa00-2b6df3e33edc.jpg?imageMogr2/auto-orient/format/jpeg/cut/400x400x0x0", + "Email" : "", + "GlobalKey" : "", + "Id" : 183478, + "Name" : "sinkcup", + "Phone" : "", + "Status" : 1, + "TeamGlobalKey" : "", + "TeamId" : 0 + }, + "CustomFields" : [], + "DefectType" : { + "IconUrl" : "", + "Id" : 0, + "Name" : "" + }, + "Description" : "", + "DueDate" : 0, + "Epic" : { + "Assignee" : { + "Avatar" : "", + "Email" : "", + "GlobalKey" : "", + "Id" : 0, + "Name" : "", + "Phone" : "", + "Status" : 0, + "TeamGlobalKey" : "", + "TeamId" : 0 + }, + "Code" : 0, + "IssueStatusId" : 0, + "IssueStatusName" : "", + "Name" : "", + "Priority" : "", + "Type" : "" + }, + "Files" : [], + "IssueStatusId" : 1227034, + "IssueStatusName" : "未开始", + "IssueStatusType" : "TODO", + "IssueTypeDetail" : { + "Description" : "需求是指用户解决某一个问题或达到某一目标所需的软件功能。", + "Id" : 213219, + "IsSystem" : true, + "IssueType" : "REQUIREMENT", + "Name" : "需求" + }, + "IssueTypeId" : 213219, + "Iteration" : { + "Code" : 0, + "Name" : "", + "Status" : "" + }, + "IterationId" : 0, + "Labels" : [], + "Name" : "issue by curl", + "Parent" : { + "Assignee" : { + "Avatar" : "", + "Email" : "", + "GlobalKey" : "", + "Id" : 0, + "Name" : "", + "Phone" : "", + "Status" : 0, + "TeamGlobalKey" : "", + "TeamId" : 0 + }, + "Code" : 0, + "IssueStatusId" : 0, + "IssueStatusName" : "", + "IssueStatusType" : "", + "IssueTypeDetail" : { + "Description" : "", + "Id" : 0, + "IsSystem" : false, + "IssueType" : "", + "Name" : "" + }, + "Name" : "", + "Priority" : "", + "Type" : "" + }, + "ParentType" : "REQUIREMENT", + "Priority" : "0", + "ProjectModule" : { + "Id" : 0, + "Name" : "" + }, + "RequirementType" : { + "Id" : 0, + "Name" : "" + }, + "StartDate" : 0, + "StoryPoint" : "", + "SubTasks" : [], + "ThirdLinks" : [], + "Type" : "REQUIREMENT", + "UpdatedAt" : 1634541907501, + "Watchers" : [], + "WorkingHours" : 0 + }, + "RequestId" : "5b7bae01-f26f-16d7-0d61-c8fa67ea0472" + } +} \ No newline at end of file From 2c1373ac8a6fa5ea967ae387e745f3bdee2b96b8 Mon Sep 17 00:00:00 2001 From: sinkcup Date: Tue, 19 Oct 2021 11:15:48 +0800 Subject: [PATCH 02/21] feat: #73 create issue failed --- app/Coding/Issue.php | 8 +++- tests/Unit/CodingIssueTest.php | 37 ++++++++++++++++++- .../coding/CreateIssueFailedResponse.json | 9 +++++ 3 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 tests/data/coding/CreateIssueFailedResponse.json diff --git a/app/Coding/Issue.php b/app/Coding/Issue.php index 48ec48b..b37ef64 100644 --- a/app/Coding/Issue.php +++ b/app/Coding/Issue.php @@ -2,6 +2,8 @@ namespace App\Coding; +use Exception; + class Issue extends Base { public function create($token, $projectName, $data) @@ -17,6 +19,10 @@ public function create($token, $projectName, $data) 'ProjectName' => $projectName, ], $data), ]); - return json_decode($response->getBody(), true)['Response']['Issue']; + $result = json_decode($response->getBody(), true); + if (isset($result['Response']['Error']['Message'])) { + throw new Exception($result['Response']['Error']['Message']); + } + return $result['Response']['Issue']; } } diff --git a/tests/Unit/CodingIssueTest.php b/tests/Unit/CodingIssueTest.php index 6ed8704..861fe1b 100644 --- a/tests/Unit/CodingIssueTest.php +++ b/tests/Unit/CodingIssueTest.php @@ -9,7 +9,7 @@ class CodingIssueTest extends TestCase { - public function testCreate() + public function testCreateSuccess() { $responseBody = file_get_contents($this->dataDir . 'coding/CreateIssueResponse.json'); $codingToken = $this->faker->md5; @@ -43,4 +43,39 @@ public function testCreate() $result = $coding->create($codingToken, $codingProjectUri, $data); $this->assertEquals(json_decode($responseBody, true)['Response']['Issue'], $result); } + + public function testCreateFailed() + { + $responseBody = file_get_contents($this->dataDir . 'coding/CreateIssueFailedResponse.json'); + $codingToken = $this->faker->md5; + $codingProjectUri = $this->faker->slug; + $data = [ + 'Type' => 'REQUIREMENT', + 'Name' => $this->faker->title, + 'Priority' => $this->faker->randomElement([0, 1, 2, 3]), + ]; + + $clientMock = $this->getMockBuilder(Client::class)->getMock(); + $clientMock->expects($this->once()) + ->method('request') + ->with( + 'POST', + 'https://e.coding.net/open-api', + [ + 'headers' => [ + 'Accept' => 'application/json', + 'Authorization' => "token ${codingToken}", + 'Content-Type' => 'application/json' + ], + 'json' => array_merge([ + 'Action' => 'CreateIssue', + 'ProjectName' => $codingProjectUri, + ], $data) + ] + ) + ->willReturn(new Response(200, [], $responseBody)); + $coding = new Issue($clientMock); + $this->expectException(\Exception::class); + $coding->create($codingToken, $codingProjectUri, $data); + } } diff --git a/tests/data/coding/CreateIssueFailedResponse.json b/tests/data/coding/CreateIssueFailedResponse.json new file mode 100644 index 0000000..e236145 --- /dev/null +++ b/tests/data/coding/CreateIssueFailedResponse.json @@ -0,0 +1,9 @@ +{ + "Response" : { + "Error" : { + "Code" : "FailedOperation", + "Message" : "issue_custom_field_required" + }, + "RequestId" : "504114e3-bcb7-5b51-6ff7-7bb5cb04f121" + } +} From 8e8a09249ff7f44f2424b45593fac77ff77e3018 Mon Sep 17 00:00:00 2001 From: sinkcup Date: Tue, 19 Oct 2021 11:16:31 +0800 Subject: [PATCH 03/21] feat: #73 cli create issue --- app/Commands/IssueCreateCommand.php | 67 ++++++++++++++++++++++++ tests/Feature/IssueCreateCommandTest.php | 59 +++++++++++++++++++++ 2 files changed, 126 insertions(+) create mode 100644 app/Commands/IssueCreateCommand.php create mode 100755 tests/Feature/IssueCreateCommandTest.php diff --git a/app/Commands/IssueCreateCommand.php b/app/Commands/IssueCreateCommand.php new file mode 100644 index 0000000..7a0ba7c --- /dev/null +++ b/app/Commands/IssueCreateCommand.php @@ -0,0 +1,67 @@ +setCodingApi(); + + $data = []; + $data['Type'] = $this->option('type') ?? $this->choice( + '类型:', + ['DEFECT', 'REQUIREMENT', 'MISSION', 'EPIC', 'SUB_TASK'], + 0 + ); + $data['Name'] = $this->option('name') ?? $this->ask('标题:'); + $data['Priority'] = $this->option('priority') ?? $this->choice( + '优先级:', + ['0', '1', '2', '3'], + 0 + ); + + try { + $result = $codingIssue->create($this->codingToken, $this->codingProjectUri, $data); + } catch (\Exception $e) { + $this->error('Error: ' . $e->getMessage()); + return 1; + } + + $this->info('创建成功'); + $this->info("https://{$this->codingTeamDomain}.coding.net/p/{$this->codingProjectUri}" . + "/all/issues/${result['Code']}"); + + return 0; + } +} diff --git a/tests/Feature/IssueCreateCommandTest.php b/tests/Feature/IssueCreateCommandTest.php new file mode 100755 index 0000000..fb43c9f --- /dev/null +++ b/tests/Feature/IssueCreateCommandTest.php @@ -0,0 +1,59 @@ +codingToken = $this->faker->md5; + config(['coding.token' => $this->codingToken]); + $this->codingTeamDomain = $this->faker->domainWord; + config(['coding.team_domain' => $this->codingTeamDomain]); + $this->codingProjectUri = $this->faker->slug; + config(['coding.project_uri' => $this->codingProjectUri]); + } + + public function testCreateSuccess() + { + $mock = \Mockery::mock(Issue::class, [])->makePartial(); + $this->instance(Issue::class, $mock); + + $mock->shouldReceive('create')->times(1)->andReturn(json_decode( + file_get_contents($this->dataDir . 'coding/' . 'CreateIssueResponse.json'), + true + )['Response']['Issue']); + + $this->artisan('issue:create') + ->expectsQuestion('类型:', 'REQUIREMENT') + ->expectsQuestion('标题:', $this->faker->title) + ->expectsOutput('创建成功') + ->expectsOutput("https://$this->codingTeamDomain.coding.net/p/$this->codingProjectUri/all/issues/2742") + ->assertExitCode(0); + } + + public function testCreateFailed() + { + $mock = \Mockery::mock(Issue::class, [])->makePartial(); + $this->instance(Issue::class, $mock); + + $mock->shouldReceive('create')->times(1)->andThrow(\Exception::class, json_decode( + file_get_contents($this->dataDir . 'coding/' . 'CreateIssueFailedResponse.json'), + true + )['Response']['Error']['Message']); + + $this->artisan('issue:create') + ->expectsQuestion('类型:', 'REQUIREMENT') + ->expectsQuestion('标题:', $this->faker->title) + ->expectsOutput('Error: issue_custom_field_required') + ->assertExitCode(1); + } +} From 1cfb571c500f1e13756c1c8bc1079a8c546bfe0d Mon Sep 17 00:00:00 2001 From: sinkcup Date: Tue, 19 Oct 2021 17:20:45 +0800 Subject: [PATCH 04/21] feat: #75 get project issue types --- app/Coding/Project.php | 25 +++++++++ tests/Unit/CodingProjectTest.php | 41 +++++++++++++++ .../DescribeProjectIssueTypeListResponse.json | 52 +++++++++++++++++++ 3 files changed, 118 insertions(+) create mode 100644 app/Coding/Project.php create mode 100644 tests/Unit/CodingProjectTest.php create mode 100644 tests/data/coding/DescribeProjectIssueTypeListResponse.json diff --git a/app/Coding/Project.php b/app/Coding/Project.php new file mode 100644 index 0000000..42b46a6 --- /dev/null +++ b/app/Coding/Project.php @@ -0,0 +1,25 @@ +client->request('POST', 'https://e.coding.net/open-api', [ + 'headers' => [ + 'Accept' => 'application/json', + 'Authorization' => "token ${token}", + 'Content-Type' => 'application/json' + ], + 'json' => array_merge([ + 'Action' => 'DescribeProjectIssueTypeList', + 'ProjectName' => $projectName, + ]), + ]); + $result = json_decode($response->getBody(), true); + return $result['Response']['IssueTypes']; + } +} diff --git a/tests/Unit/CodingProjectTest.php b/tests/Unit/CodingProjectTest.php new file mode 100644 index 0000000..5052483 --- /dev/null +++ b/tests/Unit/CodingProjectTest.php @@ -0,0 +1,41 @@ +dataDir . 'coding/DescribeProjectIssueTypeListResponse.json'); + $codingToken = $this->faker->md5; + $codingProjectUri = $this->faker->slug; + + $clientMock = $this->getMockBuilder(Client::class)->getMock(); + $clientMock->expects($this->once()) + ->method('request') + ->with( + 'POST', + 'https://e.coding.net/open-api', + [ + 'headers' => [ + 'Accept' => 'application/json', + 'Authorization' => "token ${codingToken}", + 'Content-Type' => 'application/json' + ], + 'json' => array_merge([ + 'Action' => 'DescribeProjectIssueTypeList', + 'ProjectName' => $codingProjectUri, + ]) + ] + ) + ->willReturn(new Response(200, [], $responseBody)); + $coding = new Project($clientMock); + $result = $coding->getIssueTypes($codingToken, $codingProjectUri); + $this->assertEquals(json_decode($responseBody, true)['Response']['IssueTypes'], $result); + } +} diff --git a/tests/data/coding/DescribeProjectIssueTypeListResponse.json b/tests/data/coding/DescribeProjectIssueTypeListResponse.json new file mode 100644 index 0000000..d18c46c --- /dev/null +++ b/tests/data/coding/DescribeProjectIssueTypeListResponse.json @@ -0,0 +1,52 @@ +{ + "Response" : { + "IssueTypes" : [ + { + "Description" : "史诗是一个较大的功能或特性,可以分解为多个较小的需求或任务。通常其需要分多次迭代才可完成。", + "Id" : 213217, + "IsSystem" : true, + "IssueType" : "EPIC", + "Name" : "史诗", + "SplitTargetIssueTypeId" : [], + "SplitType" : "UNSPLITTABLE" + }, + { + "Description" : "用户故事是敏捷框架中最小的工作单元,是从用户角度描述软件如何为其带来特定的价值。", + "Id" : 213218, + "IsSystem" : true, + "IssueType" : "REQUIREMENT", + "Name" : "用户故事", + "SplitTargetIssueTypeId" : [], + "SplitType" : "ALL_REQUIREMENT" + }, + { + "Description" : "任务是指为实现某个目标或需求所进行的具体活动。", + "Id" : 213220, + "IsSystem" : true, + "IssueType" : "MISSION", + "Name" : "任务", + "SplitTargetIssueTypeId" : [], + "SplitType" : "UNSPLITTABLE" + }, + { + "Description" : "缺陷是指软件不符合最初定义的业务需求的现象,缺陷管理用于跟踪这些问题和错误。", + "Id" : 213221, + "IsSystem" : true, + "IssueType" : "DEFECT", + "Name" : "缺陷", + "SplitTargetIssueTypeId" : [], + "SplitType" : "UNSPLITTABLE" + }, + { + "Description" : "在敏捷模式下,将一个事项拆分成更小的块。", + "Id" : 213222, + "IsSystem" : true, + "IssueType" : "SUB_TASK", + "Name" : "子工作项", + "SplitTargetIssueTypeId" : [], + "SplitType" : "UNSPLITTABLE" + } + ], + "RequestId" : "9f7e8405-943d-fb02-96bf-3ee3c63e0fe6" + } +} From aa8e0fafb7e956fc18a2bb165693c98356beed07 Mon Sep 17 00:00:00 2001 From: sinkcup Date: Tue, 19 Oct 2021 17:21:51 +0800 Subject: [PATCH 05/21] feat: #75 cli get project issue types --- app/Commands/ProjectGetIssueTypesCommand.php | 47 +++++++++++++++++++ .../ProjectGetIssueTypesCommandTest.php | 39 +++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 app/Commands/ProjectGetIssueTypesCommand.php create mode 100755 tests/Feature/ProjectGetIssueTypesCommandTest.php diff --git a/app/Commands/ProjectGetIssueTypesCommand.php b/app/Commands/ProjectGetIssueTypesCommand.php new file mode 100644 index 0000000..011b3e8 --- /dev/null +++ b/app/Commands/ProjectGetIssueTypesCommand.php @@ -0,0 +1,47 @@ +setCodingApi(); + + $result = $codingProject->getIssueTypes($this->codingToken, $this->codingProjectUri); + + foreach ($result as $item) { + $this->info($item['Id'] . ' ' . $item['Name']); + } + + return 0; + } +} diff --git a/tests/Feature/ProjectGetIssueTypesCommandTest.php b/tests/Feature/ProjectGetIssueTypesCommandTest.php new file mode 100755 index 0000000..1e8b18f --- /dev/null +++ b/tests/Feature/ProjectGetIssueTypesCommandTest.php @@ -0,0 +1,39 @@ +faker->md5; + config(['coding.token' => $codingToken]); + $codingTeamDomain = $this->faker->domainWord; + config(['coding.team_domain' => $codingTeamDomain]); + $codingProjectUri = $this->faker->slug; + config(['coding.project_uri' => $codingProjectUri]); + } + + public function testCreateSuccess() + { + $mock = \Mockery::mock(Project::class, [])->makePartial(); + $this->instance(Project::class, $mock); + + $mock->shouldReceive('getIssueTypes')->times(1)->andReturn(json_decode( + file_get_contents($this->dataDir . 'coding/' . 'DescribeProjectIssueTypeListResponse.json'), + true + )['Response']['IssueTypes']); + + $this->artisan('project:get-issue-types') + ->expectsOutput('213217 史诗') + ->expectsOutput('213218 用户故事') + ->expectsOutput('213220 任务') + ->expectsOutput('213221 缺陷') + ->expectsOutput('213222 子工作项') + ->assertExitCode(0); + } +} From aab39f7c27cf285303827b369ade76837539700b Mon Sep 17 00:00:00 2001 From: sinkcup Date: Wed, 20 Oct 2021 10:48:15 +0800 Subject: [PATCH 06/21] style: clear code --- app/Coding/Project.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app/Coding/Project.php b/app/Coding/Project.php index 42b46a6..49eebc0 100644 --- a/app/Coding/Project.php +++ b/app/Coding/Project.php @@ -2,8 +2,6 @@ namespace App\Coding; -use Exception; - class Project extends Base { public function getIssueTypes($token, $projectName) @@ -14,10 +12,10 @@ public function getIssueTypes($token, $projectName) 'Authorization' => "token ${token}", 'Content-Type' => 'application/json' ], - 'json' => array_merge([ + 'json' => [ 'Action' => 'DescribeProjectIssueTypeList', 'ProjectName' => $projectName, - ]), + ], ]); $result = json_decode($response->getBody(), true); return $result['Response']['IssueTypes']; From b2b1de467e4349b8c2d78b5dc3b6a8f41d750c7c Mon Sep 17 00:00:00 2001 From: sinkcup Date: Wed, 20 Oct 2021 10:50:44 +0800 Subject: [PATCH 07/21] style: clear code --- tests/Feature/WikiImportCommandTest.php | 2 +- tests/Unit/CodingWikiTest.php | 4 ++-- ...ploadTokenResponse.json => CreateUploadTokenResponse.json} | 0 .../{createWikiResponse.json => CreateWikiResponse.json} | 0 4 files changed, 3 insertions(+), 3 deletions(-) rename tests/data/coding/{createUploadTokenResponse.json => CreateUploadTokenResponse.json} (100%) rename tests/data/coding/{createWikiResponse.json => CreateWikiResponse.json} (100%) diff --git a/tests/Feature/WikiImportCommandTest.php b/tests/Feature/WikiImportCommandTest.php index 3b01fc6..5486c5f 100755 --- a/tests/Feature/WikiImportCommandTest.php +++ b/tests/Feature/WikiImportCommandTest.php @@ -17,7 +17,7 @@ protected function setUp(): void { parent::setUp(); $this->createWikiResponse = json_decode( - file_get_contents($this->dataDir . 'coding/createWikiResponse.json'), + file_get_contents($this->dataDir . 'coding/CreateWikiResponse.json'), true )['Response']['Data']; } diff --git a/tests/Unit/CodingWikiTest.php b/tests/Unit/CodingWikiTest.php index 84bc55c..90d035c 100644 --- a/tests/Unit/CodingWikiTest.php +++ b/tests/Unit/CodingWikiTest.php @@ -39,7 +39,7 @@ protected function setUp(): void public function testCreateWiki() { - $responseBody = file_get_contents($this->dataDir . 'coding/createWikiResponse.json'); + $responseBody = file_get_contents($this->dataDir . 'coding/CreateWikiResponse.json'); $codingToken = $this->faker->md5; $codingProjectUri = $this->faker->slug; $article = [ @@ -74,7 +74,7 @@ public function testCreateWiki() public function testCreateUploadToken() { - $responseBody = file_get_contents($this->dataDir . 'coding/createUploadTokenResponse.json'); + $responseBody = file_get_contents($this->dataDir . 'coding/CreateUploadTokenResponse.json'); $codingToken = $this->faker->md5; $codingProjectUri = $this->faker->slug; $fileName = $this->faker->word; diff --git a/tests/data/coding/createUploadTokenResponse.json b/tests/data/coding/CreateUploadTokenResponse.json similarity index 100% rename from tests/data/coding/createUploadTokenResponse.json rename to tests/data/coding/CreateUploadTokenResponse.json diff --git a/tests/data/coding/createWikiResponse.json b/tests/data/coding/CreateWikiResponse.json similarity index 100% rename from tests/data/coding/createWikiResponse.json rename to tests/data/coding/CreateWikiResponse.json From 240f90bf25bfb82c309e2c45e2574a4121691376 Mon Sep 17 00:00:00 2001 From: sinkcup Date: Wed, 20 Oct 2021 10:51:34 +0800 Subject: [PATCH 08/21] feat: #78 create iteration --- app/Coding/Iteration.php | 23 ++++++++++ tests/Unit/CodingIterationTest.php | 45 +++++++++++++++++++ .../data/coding/CreateIterationResponse.json | 24 ++++++++++ 3 files changed, 92 insertions(+) create mode 100644 app/Coding/Iteration.php create mode 100644 tests/Unit/CodingIterationTest.php create mode 100644 tests/data/coding/CreateIterationResponse.json diff --git a/app/Coding/Iteration.php b/app/Coding/Iteration.php new file mode 100644 index 0000000..a51ca34 --- /dev/null +++ b/app/Coding/Iteration.php @@ -0,0 +1,23 @@ +client->request('POST', 'https://e.coding.net/open-api', [ + 'headers' => [ + 'Accept' => 'application/json', + 'Authorization' => "token ${token}", + 'Content-Type' => 'application/json' + ], + 'json' => array_merge([ + 'Action' => 'CreateIteration', + 'ProjectName' => $projectName, + ], $data), + ]); + $result = json_decode($response->getBody(), true); + return $result['Response']['Iteration']; + } +} diff --git a/tests/Unit/CodingIterationTest.php b/tests/Unit/CodingIterationTest.php new file mode 100644 index 0000000..fd0786a --- /dev/null +++ b/tests/Unit/CodingIterationTest.php @@ -0,0 +1,45 @@ +dataDir . 'coding/CreateIterationResponse.json'); + $codingToken = $this->faker->md5; + $codingProjectUri = $this->faker->slug; + $data = [ + 'Name' => $this->faker->title, + ]; + + $clientMock = $this->getMockBuilder(Client::class)->getMock(); + $clientMock->expects($this->once()) + ->method('request') + ->with( + 'POST', + 'https://e.coding.net/open-api', + [ + 'headers' => [ + 'Accept' => 'application/json', + 'Authorization' => "token ${codingToken}", + 'Content-Type' => 'application/json' + ], + 'json' => array_merge([ + 'Action' => 'CreateIteration', + 'ProjectName' => $codingProjectUri, + ], $data) + ] + ) + ->willReturn(new Response(200, [], $responseBody)); + $coding = new Iteration($clientMock); + $result = $coding->create($codingToken, $codingProjectUri, $data); + $this->assertEquals(json_decode($responseBody, true)['Response']['Iteration'], $result); + } +} diff --git a/tests/data/coding/CreateIterationResponse.json b/tests/data/coding/CreateIterationResponse.json new file mode 100644 index 0000000..a73f9c8 --- /dev/null +++ b/tests/data/coding/CreateIterationResponse.json @@ -0,0 +1,24 @@ +{ + "Response" : { + "Iteration" : { + "Assignee" : 0, + "Code" : 2746, + "CompletedCount" : 0, + "CompletedPercent" : 0, + "Completer" : 0, + "CreatedAt" : 1634697259529, + "Creator" : 183478, + "Deleter" : 0, + "EndAt" : -28800000, + "Goal" : "", + "Name" : "it by cli", + "ProcessingCount" : 0, + "StartAt" : -28800000, + "Starter" : 0, + "Status" : "WAIT_PROCESS", + "UpdatedAt" : 1634697259529, + "WaitProcessCount" : 0 + }, + "RequestId" : "58777aa6-e6e4-155a-c99f-415a33615ca6" + } +} From 38a4ca45efa25b7f8aefe1ecdd2a7b6a5e27a88c Mon Sep 17 00:00:00 2001 From: sinkcup Date: Wed, 20 Oct 2021 12:03:09 +0800 Subject: [PATCH 09/21] feat: #78 cli create iteration --- app/Coding/Iteration.php | 8 +++ app/Commands/IterationCreateCommand.php | 64 ++++++++++++++++++++ composer.json | 1 + composer.lock | 19 +++--- tests/Feature/IterationCreateCommandTest.php | 48 +++++++++++++++ tests/Unit/CodingIterationTest.php | 14 +++++ 6 files changed, 145 insertions(+), 9 deletions(-) create mode 100644 app/Commands/IterationCreateCommand.php create mode 100755 tests/Feature/IterationCreateCommandTest.php diff --git a/app/Coding/Iteration.php b/app/Coding/Iteration.php index a51ca34..e315698 100644 --- a/app/Coding/Iteration.php +++ b/app/Coding/Iteration.php @@ -2,6 +2,8 @@ namespace App\Coding; +use Carbon\Carbon; + class Iteration extends Base { public function create($token, $projectName, $data) @@ -20,4 +22,10 @@ public function create($token, $projectName, $data) $result = json_decode($response->getBody(), true); return $result['Response']['Iteration']; } + + public static function generateName(Carbon $startAt, Carbon $endAt): string + { + $endFormat = $startAt->year == $endAt->year ? 'm/d' : 'Y/m/d'; + return $startAt->format('Y/m/d') . '-' . $endAt->format($endFormat) . ' 迭代'; + } } diff --git a/app/Commands/IterationCreateCommand.php b/app/Commands/IterationCreateCommand.php new file mode 100644 index 0000000..80d79ed --- /dev/null +++ b/app/Commands/IterationCreateCommand.php @@ -0,0 +1,64 @@ +setCodingApi(); + + $data = []; + $startAt = Carbon::parse($this->option('start_at') ?? $this->ask('开始时间:', Carbon::today()->toDateString())); + $data['StartAt'] = $startAt->toDateString(); + $endAt = Carbon::parse($this->option('end_at') ?? $this->ask( + '结束时间:', + Carbon::today()->addDays(14)->toDateString() + )); + $data['EndAt'] = $endAt->toDateString(); + $data['Name'] = $this->option('name') ?? $this->ask('标题:', Iteration::generateName($startAt, $endAt)); + $data['Goal'] = $this->option('goal'); + $data['Assignee'] = $this->option('assignee'); + + $result = $iteration->create($this->codingToken, $this->codingProjectUri, $data); + + $this->info('创建成功'); + $this->info("https://{$this->codingTeamDomain}.coding.net/p/{$this->codingProjectUri}" . + "/iterations/${result['Code']}/issues"); + + return 0; + } +} diff --git a/composer.json b/composer.json index 02ffd15..e886ce7 100644 --- a/composer.json +++ b/composer.json @@ -26,6 +26,7 @@ "laravel-fans/confluence": "^0.1.1", "laravel-zero/framework": "^8.8", "league/html-to-markdown": "^5.0", + "nesbot/carbon": "^2.53", "sinkcup/laravel-filesystem-cos-updated": "^4.0" }, "require-dev": { diff --git a/composer.lock b/composer.lock index 48a5dda..383dc9c 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "b78aa1fa10887f82b88b1e7290803200", + "content-hash": "dd8f6ba7fb2903f0485d7037e87d122a", "packages": [ { "name": "brick/math", @@ -2185,27 +2185,28 @@ }, { "name": "nesbot/carbon", - "version": "2.50.0", + "version": "2.53.1", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "f47f17d17602b2243414a44ad53d9f8b9ada5fdb" + "reference": "f4655858a784988f880c1b8c7feabbf02dfdf045" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/f47f17d17602b2243414a44ad53d9f8b9ada5fdb", - "reference": "f47f17d17602b2243414a44ad53d9f8b9ada5fdb", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/f4655858a784988f880c1b8c7feabbf02dfdf045", + "reference": "f4655858a784988f880c1b8c7feabbf02dfdf045", "shasum": "" }, "require": { "ext-json": "*", "php": "^7.1.8 || ^8.0", "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", "symfony/translation": "^3.4 || ^4.0 || ^5.0" }, "require-dev": { "doctrine/orm": "^2.7", - "friendsofphp/php-cs-fixer": "^2.14 || ^3.0", + "friendsofphp/php-cs-fixer": "^3.0", "kylekatarnls/multi-tester": "^2.0", "phpmd/phpmd": "^2.9", "phpstan/extension-installer": "^1.0", @@ -2219,8 +2220,8 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.x-dev", - "dev-3.x": "3.x-dev" + "dev-3.x": "3.x-dev", + "dev-master": "2.x-dev" }, "laravel": { "providers": [ @@ -2274,7 +2275,7 @@ "type": "tidelift" } ], - "time": "2021-06-28T22:38:45+00:00" + "time": "2021-09-06T09:29:23+00:00" }, { "name": "nunomaduro/collision", diff --git a/tests/Feature/IterationCreateCommandTest.php b/tests/Feature/IterationCreateCommandTest.php new file mode 100755 index 0000000..b7746e6 --- /dev/null +++ b/tests/Feature/IterationCreateCommandTest.php @@ -0,0 +1,48 @@ +faker->md5; + config(['coding.token' => $codingToken]); + $this->teamDomain = $this->faker->domainWord; + config(['coding.team_domain' => $this->teamDomain]); + $this->projectUri = $this->faker->slug; + config(['coding.project_uri' => $this->projectUri]); + } + + public function testCreateSuccess() + { + $mock = \Mockery::mock(Iteration::class, [])->makePartial(); + $this->instance(Iteration::class, $mock); + + $mock->shouldReceive('create')->times(1)->andReturn(json_decode( + file_get_contents($this->dataDir . 'coding/' . 'CreateIterationResponse.json'), + true + )['Response']['Iteration']); + + $startAt = $this->faker->date(); + $endAt = Carbon::parse($startAt)->addDays($this->faker->randomNumber())->toDateString(); + $this->artisan('iteration:create', [ + '--goal' => $this->faker->text(), + '--assignee' => $this->faker->randomNumber(), + ]) + ->expectsQuestion('开始时间:', $startAt) + ->expectsQuestion('结束时间:', $endAt) + ->expectsQuestion('标题:', $startAt . '~' . $endAt . ' 迭代') + ->expectsOutput('创建成功') + ->expectsOutput("https://$this->teamDomain.coding.net/p/$this->projectUri/iterations/2746/issues") + ->assertExitCode(0); + } +} diff --git a/tests/Unit/CodingIterationTest.php b/tests/Unit/CodingIterationTest.php index fd0786a..b0cdb5b 100644 --- a/tests/Unit/CodingIterationTest.php +++ b/tests/Unit/CodingIterationTest.php @@ -4,6 +4,7 @@ use App\Coding\Issue; use App\Coding\Iteration; +use Carbon\Carbon; use GuzzleHttp\Client; use GuzzleHttp\Psr7\Response; use Tests\TestCase; @@ -42,4 +43,17 @@ public function testCreateSuccess() $result = $coding->create($codingToken, $codingProjectUri, $data); $this->assertEquals(json_decode($responseBody, true)['Response']['Iteration'], $result); } + + public function testGenerateName() + { + $startAt = Carbon::parse('2021-10-20'); + $endAt = Carbon::parse('2021-10-30'); + $result = Iteration::generateName($startAt, $endAt); + $this->assertEquals("2021/10/20-10/30 迭代", $result); + + $startAt = Carbon::parse('2021-12-27'); + $endAt = Carbon::parse('2022-01-07'); + $result = Iteration::generateName($startAt, $endAt); + $this->assertEquals("2021/12/27-2022/01/07 迭代", $result); + } } From 5b5375f0cf0d226b9ce8c5dec3656e728671524f Mon Sep 17 00:00:00 2001 From: sinkcup Date: Tue, 19 Oct 2021 19:04:06 +0800 Subject: [PATCH 10/21] feat: #72 cli import issues --- .gitignore | 1 + app/Commands/IssueImportCommand.php | 74 + app/Imports/IssuesImport.php | 14 + app/Models/Issue.php | 29 + composer.json | 6 +- composer.lock | 2769 ++++++++++++++++------ config/app.php | 3 + config/database.php | 147 ++ storage/framework/.gitignore | 2 + tests/Feature/IssueImportCommandTest.php | 57 + tests/data/coding/scrum-issues.csv | 32 + 11 files changed, 2450 insertions(+), 684 deletions(-) create mode 100644 app/Commands/IssueImportCommand.php create mode 100644 app/Imports/IssuesImport.php create mode 100644 app/Models/Issue.php create mode 100644 config/database.php create mode 100644 storage/framework/.gitignore create mode 100755 tests/Feature/IssueImportCommandTest.php create mode 100644 tests/data/coding/scrum-issues.csv diff --git a/.gitignore b/.gitignore index 0c56c8f..58f5e38 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ /.vscode /.vagrant .phpunit.result.cache +/database/database.sqlite diff --git a/app/Commands/IssueImportCommand.php b/app/Commands/IssueImportCommand.php new file mode 100644 index 0000000..f86e206 --- /dev/null +++ b/app/Commands/IssueImportCommand.php @@ -0,0 +1,74 @@ +setCodingApi(); + + $filePath = $this->argument('file'); + if (!file_exists($filePath)) { + $this->error("文件不存在:$filePath"); + return 1; + } + + $result = $codingProject->getIssueTypes($this->codingToken, $this->codingProjectUri); + $issueTypes = []; + foreach ($result as $item) { + $issueTypes[$item['Name']] = $item; + } + $rows = Excel::toArray(new IssuesImport(), $filePath)[0]; + foreach ($rows as $row) { + $data = [ + 'Type' => $issueTypes[$row['事项类型']]['IssueType'], + 'IssueTypeId' => $issueTypes[$row['事项类型']]['Id'], + 'Name' => $row['标题'], + 'Priority' => \App\Models\Issue::PRIORITY_MAP[$row['优先级']], + ]; + try { + $result = $codingIssue->create($this->codingToken, $this->codingProjectUri, $data); + } catch (\Exception $e) { + $this->error('Error: ' . $e->getMessage()); + return 1; + } + $this->info("https://{$this->codingTeamDomain}.coding.net/p/{$this->codingProjectUri}" . + "/all/issues/${result['Code']}"); + } + + return 0; + } +} diff --git a/app/Imports/IssuesImport.php b/app/Imports/IssuesImport.php new file mode 100644 index 0000000..2327dda --- /dev/null +++ b/app/Imports/IssuesImport.php @@ -0,0 +1,14 @@ + '0', + '中' => '1', + '高' => '2', + '紧急' => '3', + ]; +} diff --git a/composer.json b/composer.json index e886ce7..6ff245f 100644 --- a/composer.json +++ b/composer.json @@ -22,15 +22,19 @@ "ext-json": "*", "ext-libxml": "*", "ext-zip": "*", + "illuminate/database": "^8.40", "illuminate/log": "^8.0", + "illuminate/translation": "^8.64", + "illuminate/validation": "^8.64", "laravel-fans/confluence": "^0.1.1", "laravel-zero/framework": "^8.8", "league/html-to-markdown": "^5.0", + "maatwebsite/excel": "^3.1", "nesbot/carbon": "^2.53", "sinkcup/laravel-filesystem-cos-updated": "^4.0" }, "require-dev": { - "fakerphp/faker": "^1.14", + "fakerphp/faker": "^1.9.1", "mockery/mockery": "^1.4.3", "phpmd/phpmd": "^2.10", "phpunit/phpunit": "^9.5", diff --git a/composer.lock b/composer.lock index 383dc9c..0e20dfd 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,20 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "dd8f6ba7fb2903f0485d7037e87d122a", + "content-hash": "74f169787f16958ec6aed5b803208cb0", "packages": [ { "name": "brick/math", - "version": "0.9.2", + "version": "0.9.3", "source": { "type": "git", "url": "https://github.com/brick/math.git", - "reference": "dff976c2f3487d42c1db75a3b180e2b9f0e72ce0" + "reference": "ca57d18f028f84f777b2168cd1911b0dee2343ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/dff976c2f3487d42c1db75a3b180e2b9f0e72ce0", - "reference": "dff976c2f3487d42c1db75a3b180e2b9f0e72ce0", + "url": "https://api.github.com/repos/brick/math/zipball/ca57d18f028f84f777b2168cd1911b0dee2343ae", + "reference": "ca57d18f028f84f777b2168cd1911b0dee2343ae", "shasum": "" }, "require": { @@ -27,7 +27,7 @@ "require-dev": { "php-coveralls/php-coveralls": "^2.2", "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.0", - "vimeo/psalm": "4.3.2" + "vimeo/psalm": "4.9.2" }, "type": "library", "autoload": { @@ -52,15 +52,19 @@ ], "support": { "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.9.2" + "source": "https://github.com/brick/math/tree/0.9.3" }, "funding": [ + { + "url": "https://github.com/BenMorel", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/brick/math", "type": "tidelift" } ], - "time": "2021-01-20T22:51:39+00:00" + "time": "2021-08-15T20:50:18+00:00" }, { "name": "doctrine/inflector", @@ -157,6 +161,86 @@ ], "time": "2020-05-29T15:13:26+00:00" }, + { + "name": "doctrine/lexer", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "phpstan/phpstan": "^0.11.8", + "phpunit/phpunit": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/1.2.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2020-05-25T17:44:05+00:00" + }, { "name": "dragonmantank/cron-expression", "version": "v3.1.0", @@ -218,6 +302,128 @@ ], "time": "2020-11-24T19:55:57+00:00" }, + { + "name": "egulias/email-validator", + "version": "2.1.25", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/0dbf5d78455d4d6a41d186da50adc1122ec066f4", + "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^1.0.1", + "php": ">=5.5", + "symfony/polyfill-intl-idn": "^1.10" + }, + "require-dev": { + "dominicsayers/isemail": "^3.0.7", + "phpunit/phpunit": "^4.8.36|^7.5.15", + "satooshi/php-coveralls": "^1.0.1" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/2.1.25" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2020-12-29T14:50:06+00:00" + }, + { + "name": "ezyang/htmlpurifier", + "version": "v4.13.0", + "source": { + "type": "git", + "url": "https://github.com/ezyang/htmlpurifier.git", + "reference": "08e27c97e4c6ed02f37c5b2b20488046c8d90d75" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/08e27c97e4c6ed02f37c5b2b20488046c8d90d75", + "reference": "08e27c97e4c6ed02f37c5b2b20488046c8d90d75", + "shasum": "" + }, + "require": { + "php": ">=5.2" + }, + "require-dev": { + "simpletest/simpletest": "dev-master#72de02a7b80c6bb8864ef9bf66d41d2f58f826bd" + }, + "type": "library", + "autoload": { + "psr-0": { + "HTMLPurifier": "library/" + }, + "files": [ + "library/HTMLPurifier.composer.php" + ], + "exclude-from-classmap": [ + "/library/HTMLPurifier/Language/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Edward Z. Yang", + "email": "admin@htmlpurifier.org", + "homepage": "http://ezyang.com" + } + ], + "description": "Standards compliant HTML filter written in PHP", + "homepage": "http://htmlpurifier.org/", + "keywords": [ + "html" + ], + "support": { + "issues": "https://github.com/ezyang/htmlpurifier/issues", + "source": "https://github.com/ezyang/htmlpurifier/tree/master" + }, + "time": "2020-06-29T00:56:53+00:00" + }, { "name": "facade/ignition-contracts", "version": "1.0.2", @@ -273,21 +479,21 @@ }, { "name": "filp/whoops", - "version": "2.13.0", + "version": "2.14.4", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "2edbc73a4687d9085c8f20f398eebade844e8424" + "reference": "f056f1fe935d9ed86e698905a957334029899895" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/2edbc73a4687d9085c8f20f398eebade844e8424", - "reference": "2edbc73a4687d9085c8f20f398eebade844e8424", + "url": "https://api.github.com/repos/filp/whoops/zipball/f056f1fe935d9ed86e698905a957334029899895", + "reference": "f056f1fe935d9ed86e698905a957334029899895", "shasum": "" }, "require": { "php": "^5.5.9 || ^7.0 || ^8.0", - "psr/log": "^1.0.1" + "psr/log": "^1.0.1 || ^2.0 || ^3.0" }, "require-dev": { "mockery/mockery": "^0.9 || ^1.0", @@ -332,7 +538,7 @@ ], "support": { "issues": "https://github.com/filp/whoops/issues", - "source": "https://github.com/filp/whoops/tree/2.13.0" + "source": "https://github.com/filp/whoops/tree/2.14.4" }, "funding": [ { @@ -340,35 +546,30 @@ "type": "github" } ], - "time": "2021-06-04T12:00:00+00:00" + "time": "2021-10-03T12:00:00+00:00" }, { "name": "graham-campbell/result-type", - "version": "v1.0.1", + "version": "v1.0.3", "source": { "type": "git", "url": "https://github.com/GrahamCampbell/Result-Type.git", - "reference": "7e279d2cd5d7fbb156ce46daada972355cea27bb" + "reference": "296c015dc30ec4322168c5ad3ee5cc11dae827ac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/7e279d2cd5d7fbb156ce46daada972355cea27bb", - "reference": "7e279d2cd5d7fbb156ce46daada972355cea27bb", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/296c015dc30ec4322168c5ad3ee5cc11dae827ac", + "reference": "296c015dc30ec4322168c5ad3ee5cc11dae827ac", "shasum": "" }, "require": { - "php": "^7.0|^8.0", - "phpoption/phpoption": "^1.7.3" + "php": "^7.0 || ^8.0", + "phpoption/phpoption": "^1.8" }, "require-dev": { - "phpunit/phpunit": "^6.5|^7.5|^8.5|^9.0" + "phpunit/phpunit": "^6.5.14 || ^7.5.20 || ^8.5.19 || ^9.5.8" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, "autoload": { "psr-4": { "GrahamCampbell\\ResultType\\": "src/" @@ -381,7 +582,7 @@ "authors": [ { "name": "Graham Campbell", - "email": "graham@alt-three.com" + "email": "hello@gjcampbell.co.uk" } ], "description": "An Implementation Of The Result Type", @@ -394,7 +595,7 @@ ], "support": { "issues": "https://github.com/GrahamCampbell/Result-Type/issues", - "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.0.1" + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.0.3" }, "funding": [ { @@ -406,35 +607,35 @@ "type": "tidelift" } ], - "time": "2020-04-13T13:17:36+00:00" + "time": "2021-10-17T19:48:54+00:00" }, { "name": "guzzlehttp/command", - "version": "1.1.0", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/guzzle/command.git", - "reference": "713b58dc242a96eb4c463413d628b2df59f69595" + "reference": "04b06e7f5ef37d814aeb3f4b6015b65a9d4412c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/command/zipball/713b58dc242a96eb4c463413d628b2df59f69595", - "reference": "713b58dc242a96eb4c463413d628b2df59f69595", + "url": "https://api.github.com/repos/guzzle/command/zipball/04b06e7f5ef37d814aeb3f4b6015b65a9d4412c5", + "reference": "04b06e7f5ef37d814aeb3f4b6015b65a9d4412c5", "shasum": "" }, "require": { - "guzzlehttp/guzzle": "^7.0.1", - "guzzlehttp/promises": "~1.3", - "guzzlehttp/psr7": "~1.0", - "php": ">=7.2.5" + "guzzlehttp/guzzle": "^7.3", + "guzzlehttp/promises": "^1.3", + "guzzlehttp/psr7": "^1.7 || ^2.0", + "php": "^7.2.5 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^8.5.5" + "phpunit/phpunit": "^8.5.19" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "0.9-dev" + "dev-master": "1.2-dev" } }, "autoload": { @@ -447,6 +648,11 @@ "MIT" ], "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, { "name": "Michael Dowling", "email": "mtdowling@gmail.com", @@ -456,35 +662,55 @@ "name": "Jeremy Lindblom", "email": "jeremeamia@gmail.com", "homepage": "https://github.com/jeremeamia" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" } ], "description": "Provides the foundation for building command-based web service clients", "support": { "issues": "https://github.com/guzzle/command/issues", - "source": "https://github.com/guzzle/command/tree/1.1.0" + "source": "https://github.com/guzzle/command/tree/1.2.1" }, - "time": "2020-09-28T21:43:57+00:00" + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/command", + "type": "tidelift" + } + ], + "time": "2021-09-05T19:12:19+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "7.3.0", + "version": "7.4.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "7008573787b430c1c1f650e3722d9bba59967628" + "reference": "868b3571a039f0ebc11ac8f344f4080babe2cb94" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/7008573787b430c1c1f650e3722d9bba59967628", - "reference": "7008573787b430c1c1f650e3722d9bba59967628", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/868b3571a039f0ebc11ac8f344f4080babe2cb94", + "reference": "868b3571a039f0ebc11ac8f344f4080babe2cb94", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.4", - "guzzlehttp/psr7": "^1.7 || ^2.0", + "guzzlehttp/promises": "^1.5", + "guzzlehttp/psr7": "^1.8.3 || ^2.1", "php": "^7.2.5 || ^8.0", - "psr/http-client": "^1.0" + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2" }, "provide": { "psr/http-client-implementation": "1.0" @@ -494,7 +720,7 @@ "ext-curl": "*", "php-http/client-integration-tests": "^3.0", "phpunit/phpunit": "^8.5.5 || ^9.3.5", - "psr/log": "^1.1" + "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { "ext-curl": "Required for CURL handler support", @@ -504,7 +730,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "7.3-dev" + "dev-master": "7.4-dev" } }, "autoload": { @@ -520,19 +746,43 @@ "MIT" ], "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, { "name": "Michael Dowling", "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, { "name": "Márk Sági-Kazár", "email": "mark.sagikazar@gmail.com", - "homepage": "https://sagikazarmark.hu" + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" } ], "description": "Guzzle is a PHP HTTP client library", - "homepage": "http://guzzlephp.org/", "keywords": [ "client", "curl", @@ -546,7 +796,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.3.0" + "source": "https://github.com/guzzle/guzzle/tree/7.4.0" }, "funding": [ { @@ -558,38 +808,35 @@ "type": "github" }, { - "url": "https://github.com/alexeyshockov", - "type": "github" - }, - { - "url": "https://github.com/gmponos", - "type": "github" + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" } ], - "time": "2021-03-23T11:33:13+00:00" + "time": "2021-10-18T09:52:00+00:00" }, { "name": "guzzlehttp/guzzle-services", - "version": "1.2.0", + "version": "1.3.1", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle-services.git", - "reference": "21e931a4784a132fa78ea7c37abf0e806b053c23" + "reference": "3731f120ce6856f4c71fff7cb2a27e263fe69f84" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle-services/zipball/21e931a4784a132fa78ea7c37abf0e806b053c23", - "reference": "21e931a4784a132fa78ea7c37abf0e806b053c23", + "url": "https://api.github.com/repos/guzzle/guzzle-services/zipball/3731f120ce6856f4c71fff7cb2a27e263fe69f84", + "reference": "3731f120ce6856f4c71fff7cb2a27e263fe69f84", "shasum": "" }, "require": { - "guzzlehttp/command": "^1.1.0", - "guzzlehttp/guzzle": "^7.0.1", - "guzzlehttp/uri-template": "^0.2.0", - "php": ">=7.3" + "guzzlehttp/command": "^1.2", + "guzzlehttp/guzzle": "^7.3", + "guzzlehttp/psr7": "^1.7 || ^2.0", + "guzzlehttp/uri-template": "^0.2 || ^1.0", + "php": "^7.2.5 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "~9.0" + "phpunit/phpunit": "^8.5.19 || ^9.5.8" }, "suggest": { "gimler/guzzle-description-loader": "^0.0.4" @@ -597,7 +844,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.3-dev" } }, "autoload": { @@ -610,41 +857,60 @@ "MIT" ], "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, { "name": "Michael Dowling", "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" }, - { - "name": "Jeremy Lindblom", - "email": "jeremeamia@gmail.com", - "homepage": "https://github.com/jeremeamia" - }, { "name": "Stefano Kowalke", "email": "blueduck@mail.org", - "homepage": "https://github.com/konafets" + "homepage": "https://github.com/Konafets" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" } ], "description": "Provides an implementation of the Guzzle Command library that uses Guzzle service descriptions to describe web services, serialize requests, and parse responses into easy to use model structures.", "support": { "issues": "https://github.com/guzzle/guzzle-services/issues", - "source": "https://github.com/guzzle/guzzle-services/tree/1.2.0" + "source": "https://github.com/guzzle/guzzle-services/tree/1.3.1" }, - "time": "2020-11-13T22:17:22+00:00" + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle-services", + "type": "tidelift" + } + ], + "time": "2021-10-07T13:01:35+00:00" }, { "name": "guzzlehttp/promises", - "version": "1.4.1", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d" + "reference": "136a635e2b4a49b9d79e9c8fee267ffb257fdba0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/8e7d04f1f6450fef59366c399cfad4b9383aa30d", - "reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d", + "url": "https://api.github.com/repos/guzzle/promises/zipball/136a635e2b4a49b9d79e9c8fee267ffb257fdba0", + "reference": "136a635e2b4a49b9d79e9c8fee267ffb257fdba0", "shasum": "" }, "require": { @@ -656,7 +922,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.4-dev" + "dev-master": "1.5-dev" } }, "autoload": { @@ -672,10 +938,25 @@ "MIT" ], "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, { "name": "Michael Dowling", "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" } ], "description": "Guzzle promises library", @@ -684,35 +965,52 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/1.4.1" + "source": "https://github.com/guzzle/promises/tree/1.5.0" }, - "time": "2021-03-07T09:25:29+00:00" + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2021-10-07T13:05:22+00:00" }, { "name": "guzzlehttp/psr7", - "version": "1.8.2", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "dc960a912984efb74d0a90222870c72c87f10c91" + "reference": "089edd38f5b8abba6cb01567c2a8aaa47cec4c72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/dc960a912984efb74d0a90222870c72c87f10c91", - "reference": "dc960a912984efb74d0a90222870c72c87f10c91", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/089edd38f5b8abba6cb01567c2a8aaa47cec4c72", + "reference": "089edd38f5b8abba6cb01567c2a8aaa47cec4c72", "shasum": "" }, "require": { - "php": ">=5.4.0", - "psr/http-message": "~1.0", - "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0", + "ralouphie/getallheaders": "^3.0" }, "provide": { + "psr/http-factory-implementation": "1.0", "psr/http-message-implementation": "1.0" }, "require-dev": { - "ext-zlib": "*", - "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10" + "bamarni/composer-bin-plugin": "^1.4.1", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.8 || ^9.3.10" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" @@ -720,16 +1018,13 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.7-dev" + "dev-master": "2.1-dev" } }, "autoload": { "psr-4": { "GuzzleHttp\\Psr7\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -737,13 +1032,39 @@ ], "authors": [ { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, { "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" } ], "description": "PSR-7 message implementation that also provides common utility methods", @@ -759,30 +1080,44 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/1.8.2" + "source": "https://github.com/guzzle/psr7/tree/2.1.0" }, - "time": "2021-04-26T09:17:50+00:00" + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2021-10-06T17:43:30+00:00" }, { "name": "guzzlehttp/uri-template", - "version": "v0.2.0", + "version": "v1.0.1", "source": { "type": "git", "url": "https://github.com/guzzle/uri-template.git", - "reference": "db46525d6d8fee71033b73cc07160f3e5271a8ce" + "reference": "b945d74a55a25a949158444f09ec0d3c120d69e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/uri-template/zipball/db46525d6d8fee71033b73cc07160f3e5271a8ce", - "reference": "db46525d6d8fee71033b73cc07160f3e5271a8ce", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/b945d74a55a25a949158444f09ec0d3c120d69e2", + "reference": "b945d74a55a25a949158444f09ec0d3c120d69e2", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0", + "php": "^7.2.5 || ^8.0", "symfony/polyfill-php80": "^1.17" }, "require-dev": { - "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.3", + "phpunit/phpunit": "^8.5.19 || ^9.5.8", "uri-template/tests": "1.0.0" }, "type": "library", @@ -801,22 +1136,35 @@ "MIT" ], "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, { "name": "George Mponos", "email": "gmponos@gmail.com", - "homepage": "https://github.com/gmponos", - "role": "Developer" + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" } ], "description": "A polyfill class for uri_template of PHP", - "homepage": "https://github.com/guzzlehttp/uri-template", "keywords": [ "guzzlehttp", "uri-template" ], "support": { "issues": "https://github.com/guzzle/uri-template/issues", - "source": "https://github.com/guzzle/uri-template/tree/master" + "source": "https://github.com/guzzle/uri-template/tree/v1.0.1" }, "funding": [ { @@ -824,24 +1172,28 @@ "type": "github" }, { - "url": "https://github.com/gmponos", + "url": "https://github.com/Nyholm", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/uri-template", + "type": "tidelift" } ], - "time": "2020-07-21T13:45:09+00:00" + "time": "2021-10-07T12:57:01+00:00" }, { "name": "illuminate/bus", - "version": "v8.49.2", + "version": "v8.65.0", "source": { "type": "git", "url": "https://github.com/illuminate/bus.git", - "reference": "8d91162f22338e70f27f9d9dea9b6f88f14dc5a6" + "reference": "a222094903c473b6b0ade0b0b0e20b83ae1472b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/bus/zipball/8d91162f22338e70f27f9d9dea9b6f88f14dc5a6", - "reference": "8d91162f22338e70f27f9d9dea9b6f88f14dc5a6", + "url": "https://api.github.com/repos/illuminate/bus/zipball/a222094903c473b6b0ade0b0b0e20b83ae1472b6", + "reference": "a222094903c473b6b0ade0b0b0e20b83ae1472b6", "shasum": "" }, "require": { @@ -881,20 +1233,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2021-06-28T13:56:26+00:00" + "time": "2021-09-15T14:32:50+00:00" }, { "name": "illuminate/cache", - "version": "v8.49.2", + "version": "v8.65.0", "source": { "type": "git", "url": "https://github.com/illuminate/cache.git", - "reference": "6f496f435e832fc15926677f7eac7213120a302e" + "reference": "f4dda85d48e8dc6000432db16176f2c9fa0ff08e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/cache/zipball/6f496f435e832fc15926677f7eac7213120a302e", - "reference": "6f496f435e832fc15926677f7eac7213120a302e", + "url": "https://api.github.com/repos/illuminate/cache/zipball/f4dda85d48e8dc6000432db16176f2c9fa0ff08e", + "reference": "f4dda85d48e8dc6000432db16176f2c9fa0ff08e", "shasum": "" }, "require": { @@ -904,6 +1256,9 @@ "illuminate/support": "^8.0", "php": "^7.3|^8.0" }, + "provide": { + "psr/simple-cache-implementation": "1.0" + }, "suggest": { "ext-memcached": "Required to use the memcache cache driver.", "illuminate/database": "Required to use the database cache driver (^8.0).", @@ -938,20 +1293,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2021-06-24T22:01:18+00:00" + "time": "2021-09-15T14:32:50+00:00" }, { "name": "illuminate/collections", - "version": "v8.49.2", + "version": "v8.65.0", "source": { "type": "git", "url": "https://github.com/illuminate/collections.git", - "reference": "f9311a35779750f38bed47456c031c4dc4962274" + "reference": "dca614ef58d05d01c5610ae9c91536f4afe6f695" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/collections/zipball/f9311a35779750f38bed47456c031c4dc4962274", - "reference": "f9311a35779750f38bed47456c031c4dc4962274", + "url": "https://api.github.com/repos/illuminate/collections/zipball/dca614ef58d05d01c5610ae9c91536f4afe6f695", + "reference": "dca614ef58d05d01c5610ae9c91536f4afe6f695", "shasum": "" }, "require": { @@ -992,20 +1347,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2021-06-28T13:56:26+00:00" + "time": "2021-10-14T15:27:26+00:00" }, { "name": "illuminate/config", - "version": "v8.49.2", + "version": "v8.65.0", "source": { "type": "git", "url": "https://github.com/illuminate/config.git", - "reference": "8441c542312b4d57220b1f942b947b6517c05008" + "reference": "70973cbbe0cb524658b6eeaa2386dd5b71de4b02" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/config/zipball/8441c542312b4d57220b1f942b947b6517c05008", - "reference": "8441c542312b4d57220b1f942b947b6517c05008", + "url": "https://api.github.com/repos/illuminate/config/zipball/70973cbbe0cb524658b6eeaa2386dd5b71de4b02", + "reference": "70973cbbe0cb524658b6eeaa2386dd5b71de4b02", "shasum": "" }, "require": { @@ -1040,20 +1395,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2020-10-27T15:20:30+00:00" + "time": "2021-08-03T13:42:24+00:00" }, { "name": "illuminate/console", - "version": "v8.49.2", + "version": "v8.65.0", "source": { "type": "git", "url": "https://github.com/illuminate/console.git", - "reference": "1f1ff88a2efbfc85f87ea7d8283acbefc5b56191" + "reference": "9d450507e8106002ec948c7108075cc0a72e5216" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/console/zipball/1f1ff88a2efbfc85f87ea7d8283acbefc5b56191", - "reference": "1f1ff88a2efbfc85f87ea7d8283acbefc5b56191", + "url": "https://api.github.com/repos/illuminate/console/zipball/9d450507e8106002ec948c7108075cc0a72e5216", + "reference": "9d450507e8106002ec948c7108075cc0a72e5216", "shasum": "" }, "require": { @@ -1100,20 +1455,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2021-06-04T13:29:57+00:00" + "time": "2021-10-14T18:05:05+00:00" }, { "name": "illuminate/container", - "version": "v8.49.2", + "version": "v8.65.0", "source": { "type": "git", "url": "https://github.com/illuminate/container.git", - "reference": "382959676d85583f0e8fdd248bceb4b8762dc1ed" + "reference": "ef73feb5216ef97ab7023cf59c0c8dbbd5505a9d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/container/zipball/382959676d85583f0e8fdd248bceb4b8762dc1ed", - "reference": "382959676d85583f0e8fdd248bceb4b8762dc1ed", + "url": "https://api.github.com/repos/illuminate/container/zipball/ef73feb5216ef97ab7023cf59c0c8dbbd5505a9d", + "reference": "ef73feb5216ef97ab7023cf59c0c8dbbd5505a9d", "shasum": "" }, "require": { @@ -1151,20 +1506,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2021-06-08T14:08:11+00:00" + "time": "2021-09-15T14:32:50+00:00" }, { "name": "illuminate/contracts", - "version": "v8.49.2", + "version": "v8.65.0", "source": { "type": "git", "url": "https://github.com/illuminate/contracts.git", - "reference": "199fcedc161ba4a0b83feaddc4629f395dbf1641" + "reference": "ab4bb4ec3b36905ccf972c84f9aaa2bdd1153913" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/contracts/zipball/199fcedc161ba4a0b83feaddc4629f395dbf1641", - "reference": "199fcedc161ba4a0b83feaddc4629f395dbf1641", + "url": "https://api.github.com/repos/illuminate/contracts/zipball/ab4bb4ec3b36905ccf972c84f9aaa2bdd1153913", + "reference": "ab4bb4ec3b36905ccf972c84f9aaa2bdd1153913", "shasum": "" }, "require": { @@ -1199,20 +1554,88 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2021-06-01T14:53:38+00:00" + "time": "2021-09-08T12:09:40+00:00" + }, + { + "name": "illuminate/database", + "version": "v8.65.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/database.git", + "reference": "95820976fb4ae693664dc656d77de0bd9df36e73" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/database/zipball/95820976fb4ae693664dc656d77de0bd9df36e73", + "reference": "95820976fb4ae693664dc656d77de0bd9df36e73", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/collections": "^8.0", + "illuminate/container": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0", + "symfony/console": "^5.1.4" + }, + "suggest": { + "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.13.3|^3.1.2).", + "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", + "illuminate/console": "Required to use the database commands (^8.0).", + "illuminate/events": "Required to use the observers with Eloquent (^8.0).", + "illuminate/filesystem": "Required to use the migrations (^8.0).", + "illuminate/pagination": "Required to paginate the result set (^8.0).", + "symfony/finder": "Required to use Eloquent model factories (^5.1.4)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Database\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Database package.", + "homepage": "https://laravel.com", + "keywords": [ + "database", + "laravel", + "orm", + "sql" + ], + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-10-19T13:59:31+00:00" }, { "name": "illuminate/events", - "version": "v8.49.2", + "version": "v8.65.0", "source": { "type": "git", "url": "https://github.com/illuminate/events.git", - "reference": "bd2941d4d55f5d357b203dc2ed81ac5c138593dc" + "reference": "b7f06cafb6c09581617f2ca05d69e9b159e5a35d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/events/zipball/bd2941d4d55f5d357b203dc2ed81ac5c138593dc", - "reference": "bd2941d4d55f5d357b203dc2ed81ac5c138593dc", + "url": "https://api.github.com/repos/illuminate/events/zipball/b7f06cafb6c09581617f2ca05d69e9b159e5a35d", + "reference": "b7f06cafb6c09581617f2ca05d69e9b159e5a35d", "shasum": "" }, "require": { @@ -1254,20 +1677,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2021-04-06T19:21:57+00:00" + "time": "2021-09-15T14:32:50+00:00" }, { "name": "illuminate/filesystem", - "version": "v8.49.2", + "version": "v8.65.0", "source": { "type": "git", "url": "https://github.com/illuminate/filesystem.git", - "reference": "ae8d9051bc50c9551e6a251147b8dcdafcb60d32" + "reference": "f33219e5550f8f280169e933b91a95250920de06" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/filesystem/zipball/ae8d9051bc50c9551e6a251147b8dcdafcb60d32", - "reference": "ae8d9051bc50c9551e6a251147b8dcdafcb60d32", + "url": "https://api.github.com/repos/illuminate/filesystem/zipball/f33219e5550f8f280169e933b91a95250920de06", + "reference": "f33219e5550f8f280169e933b91a95250920de06", "shasum": "" }, "require": { @@ -1316,20 +1739,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2021-06-18T15:48:00+00:00" + "time": "2021-07-20T13:46:01+00:00" }, { "name": "illuminate/log", - "version": "v8.54.0", + "version": "v8.65.0", "source": { "type": "git", "url": "https://github.com/illuminate/log.git", - "reference": "d21261c49095b49124f7ac8391fb6385621bd0c1" + "reference": "56d0383bcd8f7c3ba2ff9868e47459998953f4d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/log/zipball/d21261c49095b49124f7ac8391fb6385621bd0c1", - "reference": "d21261c49095b49124f7ac8391fb6385621bd0c1", + "url": "https://api.github.com/repos/illuminate/log/zipball/56d0383bcd8f7c3ba2ff9868e47459998953f4d7", + "reference": "56d0383bcd8f7c3ba2ff9868e47459998953f4d7", "shasum": "" }, "require": { @@ -1365,11 +1788,11 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2021-06-28T14:05:06+00:00" + "time": "2021-10-05T16:21:49+00:00" }, { "name": "illuminate/macroable", - "version": "v8.49.2", + "version": "v8.65.0", "source": { "type": "git", "url": "https://github.com/illuminate/macroable.git", @@ -1415,7 +1838,7 @@ }, { "name": "illuminate/pipeline", - "version": "v8.49.1", + "version": "v8.65.0", "source": { "type": "git", "url": "https://github.com/illuminate/pipeline.git", @@ -1463,16 +1886,16 @@ }, { "name": "illuminate/support", - "version": "v8.49.1", + "version": "v8.65.0", "source": { "type": "git", "url": "https://github.com/illuminate/support.git", - "reference": "0ecdbb8e61919e972c120c0956fb1c0a3b085967" + "reference": "066058e2f017d818cf6fe37ae7b103ed1312f76a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/support/zipball/0ecdbb8e61919e972c120c0956fb1c0a3b085967", - "reference": "0ecdbb8e61919e972c120c0956fb1c0a3b085967", + "url": "https://api.github.com/repos/illuminate/support/zipball/066058e2f017d818cf6fe37ae7b103ed1312f76a", + "reference": "066058e2f017d818cf6fe37ae7b103ed1312f76a", "shasum": "" }, "require": { @@ -1491,8 +1914,8 @@ }, "suggest": { "illuminate/filesystem": "Required to use the composer class (^8.0).", - "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^1.3).", - "ramsey/uuid": "Required to use Str::uuid() (^4.0).", + "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^1.3|^2.0.2).", + "ramsey/uuid": "Required to use Str::uuid() (^4.2.2).", "symfony/process": "Required to use the composer class (^5.1.4).", "symfony/var-dumper": "Required to use the dd function (^5.1.4).", "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.2)." @@ -1527,20 +1950,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2021-07-02T16:40:19+00:00" + "time": "2021-10-18T13:43:07+00:00" }, { "name": "illuminate/testing", - "version": "v8.49.2", + "version": "v8.65.0", "source": { "type": "git", "url": "https://github.com/illuminate/testing.git", - "reference": "12271f68f49bb1063754f7d9d168af1e719b251a" + "reference": "be26a610573fafa9ca893e465aaea3c6e4a35779" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/testing/zipball/12271f68f49bb1063754f7d9d168af1e719b251a", - "reference": "12271f68f49bb1063754f7d9d168af1e719b251a", + "url": "https://api.github.com/repos/illuminate/testing/zipball/be26a610573fafa9ca893e465aaea3c6e4a35779", + "reference": "be26a610573fafa9ca893e465aaea3c6e4a35779", "shasum": "" }, "require": { @@ -1555,8 +1978,8 @@ "illuminate/console": "Required to assert console commands (^8.0).", "illuminate/database": "Required to assert databases (^8.0).", "illuminate/http": "Required to assert responses (^8.0).", - "mockery/mockery": "Required to use mocking (^1.4.2).", - "phpunit/phpunit": "Required to use assertions and run tests (^8.5.8|^9.3.3)." + "mockery/mockery": "Required to use mocking (^1.4.4).", + "phpunit/phpunit": "Required to use assertions and run tests (^8.5.19|^9.5.8)." }, "type": "library", "extra": { @@ -1585,7 +2008,118 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2021-07-04T10:19:03+00:00" + "time": "2021-10-18T13:37:32+00:00" + }, + { + "name": "illuminate/translation", + "version": "v8.65.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/translation.git", + "reference": "28219a6b98b2f1de529c3a821c4efe494f4247d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/translation/zipball/28219a6b98b2f1de529c3a821c4efe494f4247d3", + "reference": "28219a6b98b2f1de529c3a821c4efe494f4247d3", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/collections": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/filesystem": "^8.0", + "illuminate/macroable": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Translation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Translation package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-09-15T14:32:50+00:00" + }, + { + "name": "illuminate/validation", + "version": "v8.65.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/validation.git", + "reference": "221e63001f0c698b5df2300224aae6409267d2b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/validation/zipball/221e63001f0c698b5df2300224aae6409267d2b9", + "reference": "221e63001f0c698b5df2300224aae6409267d2b9", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10", + "ext-json": "*", + "illuminate/collections": "^8.0", + "illuminate/container": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "illuminate/support": "^8.0", + "illuminate/translation": "^8.0", + "php": "^7.3|^8.0", + "symfony/http-foundation": "^5.1.4", + "symfony/mime": "^5.1.4" + }, + "suggest": { + "illuminate/database": "Required to use the database presence verifier (^8.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Validation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Validation package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-10-13T13:37:38+00:00" }, { "name": "jolicode/jolinotif", @@ -1714,16 +2248,16 @@ }, { "name": "laravel-zero/foundation", - "version": "v8.49.2", + "version": "v8.62.0", "source": { "type": "git", "url": "https://github.com/laravel-zero/foundation.git", - "reference": "c2b68f71867899cf6acf0a4215f30be939d11481" + "reference": "717c8e4cf37fe5cea63941860b1dd08840ebbe80" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel-zero/foundation/zipball/c2b68f71867899cf6acf0a4215f30be939d11481", - "reference": "c2b68f71867899cf6acf0a4215f30be939d11481", + "url": "https://api.github.com/repos/laravel-zero/foundation/zipball/717c8e4cf37fe5cea63941860b1dd08840ebbe80", + "reference": "717c8e4cf37fe5cea63941860b1dd08840ebbe80", "shasum": "" }, "require": { @@ -1753,9 +2287,9 @@ "laravel" ], "support": { - "source": "https://github.com/laravel-zero/foundation/tree/v8.49.2" + "source": "https://github.com/laravel-zero/foundation/tree/v8.62.0" }, - "time": "2021-07-07T09:37:38+00:00" + "time": "2021-10-01T14:32:32+00:00" }, { "name": "laravel-zero/framework", @@ -1850,16 +2384,16 @@ }, { "name": "league/flysystem", - "version": "1.1.4", + "version": "1.1.5", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "f3ad69181b8afed2c9edf7be5a2918144ff4ea32" + "reference": "18634df356bfd4119fe3d6156bdb990c414c14ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/f3ad69181b8afed2c9edf7be5a2918144ff4ea32", - "reference": "f3ad69181b8afed2c9edf7be5a2918144ff4ea32", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/18634df356bfd4119fe3d6156bdb990c414c14ea", + "reference": "18634df356bfd4119fe3d6156bdb990c414c14ea", "shasum": "" }, "require": { @@ -1932,7 +2466,7 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/1.1.4" + "source": "https://github.com/thephpleague/flysystem/tree/1.1.5" }, "funding": [ { @@ -1940,20 +2474,20 @@ "type": "other" } ], - "time": "2021-06-23T21:56:05+00:00" + "time": "2021-08-17T13:49:42+00:00" }, { "name": "league/html-to-markdown", - "version": "5.0.0", + "version": "5.0.1", "source": { "type": "git", "url": "https://github.com/thephpleague/html-to-markdown.git", - "reference": "c4dbebbebe0fe454b6b38e6c683a977615bd7dc2" + "reference": "e5600a2c5ce7b7571b16732c7086940f56f7abec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/html-to-markdown/zipball/c4dbebbebe0fe454b6b38e6c683a977615bd7dc2", - "reference": "c4dbebbebe0fe454b6b38e6c683a977615bd7dc2", + "url": "https://api.github.com/repos/thephpleague/html-to-markdown/zipball/e5600a2c5ce7b7571b16732c7086940f56f7abec", + "reference": "e5600a2c5ce7b7571b16732c7086940f56f7abec", "shasum": "" }, "require": { @@ -2009,7 +2543,7 @@ ], "support": { "issues": "https://github.com/thephpleague/html-to-markdown/issues", - "source": "https://github.com/thephpleague/html-to-markdown/tree/5.0.0" + "source": "https://github.com/thephpleague/html-to-markdown/tree/5.0.1" }, "funding": [ { @@ -2025,24 +2559,24 @@ "type": "github" }, { - "url": "https://www.patreon.com/colinodell", - "type": "patreon" + "url": "https://tidelift.com/funding/github/packagist/league/html-to-markdown", + "type": "tidelift" } ], - "time": "2021-03-29T01:29:08+00:00" + "time": "2021-09-17T20:00:27+00:00" }, { "name": "league/mime-type-detection", - "version": "1.7.0", + "version": "1.8.0", "source": { "type": "git", "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "3b9dff8aaf7323590c1d2e443db701eb1f9aa0d3" + "reference": "b38b25d7b372e9fddb00335400467b223349fd7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/3b9dff8aaf7323590c1d2e443db701eb1f9aa0d3", - "reference": "3b9dff8aaf7323590c1d2e443db701eb1f9aa0d3", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/b38b25d7b372e9fddb00335400467b223349fd7e", + "reference": "b38b25d7b372e9fddb00335400467b223349fd7e", "shasum": "" }, "require": { @@ -2073,7 +2607,7 @@ "description": "Mime-type detection for Flysystem", "support": { "issues": "https://github.com/thephpleague/mime-type-detection/issues", - "source": "https://github.com/thephpleague/mime-type-detection/tree/1.7.0" + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.8.0" }, "funding": [ { @@ -2085,68 +2619,46 @@ "type": "tidelift" } ], - "time": "2021-01-18T20:58:21+00:00" + "time": "2021-09-25T08:23:19+00:00" }, { - "name": "monolog/monolog", - "version": "2.3.2", + "name": "maatwebsite/excel", + "version": "3.1.33", "source": { "type": "git", - "url": "https://github.com/Seldaek/monolog.git", - "reference": "71312564759a7db5b789296369c1a264efc43aad" + "url": "https://github.com/Maatwebsite/Laravel-Excel.git", + "reference": "b2de5ba92c5c1ad9415f0eb7c72838fb3eaaa5b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/71312564759a7db5b789296369c1a264efc43aad", - "reference": "71312564759a7db5b789296369c1a264efc43aad", + "url": "https://api.github.com/repos/Maatwebsite/Laravel-Excel/zipball/b2de5ba92c5c1ad9415f0eb7c72838fb3eaaa5b8", + "reference": "b2de5ba92c5c1ad9415f0eb7c72838fb3eaaa5b8", "shasum": "" }, "require": { - "php": ">=7.2", - "psr/log": "^1.0.1" - }, - "provide": { - "psr/log-implementation": "1.0.0" + "ext-json": "*", + "illuminate/support": "5.8.*|^6.0|^7.0|^8.0", + "php": "^7.0|^8.0", + "phpoffice/phpspreadsheet": "^1.18" }, "require-dev": { - "aws/aws-sdk-php": "^2.4.9 || ^3.0", - "doctrine/couchdb": "~1.0@dev", - "elasticsearch/elasticsearch": "^7", - "graylog2/gelf-php": "^1.4.2", - "mongodb/mongodb": "^1.8", - "php-amqplib/php-amqplib": "~2.4", - "php-console/php-console": "^3.1.3", - "phpspec/prophecy": "^1.6.1", - "phpstan/phpstan": "^0.12.91", - "phpunit/phpunit": "^8.5", - "predis/predis": "^1.1", - "rollbar/rollbar": "^1.3", - "ruflin/elastica": ">=0.90 <7.0.1", - "swiftmailer/swiftmailer": "^5.3|^6.0" - }, - "suggest": { - "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", - "doctrine/couchdb": "Allow sending log messages to a CouchDB server", - "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", - "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", - "ext-mbstring": "Allow to work properly with unicode symbols", - "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", - "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", - "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", - "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", - "php-console/php-console": "Allow sending log messages to Google Chrome", - "rollbar/rollbar": "Allow sending log messages to Rollbar", - "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + "orchestra/testbench": "^6.0", + "predis/predis": "^1.1" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "2.x-dev" + "laravel": { + "providers": [ + "Maatwebsite\\Excel\\ExcelServiceProvider" + ], + "aliases": { + "Excel": "Maatwebsite\\Excel\\Facades\\Excel" + } } }, "autoload": { "psr-4": { - "Monolog\\": "src/Monolog" + "Maatwebsite\\Excel\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2155,40 +2667,443 @@ ], "authors": [ { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "https://seld.be" + "name": "Patrick Brouwers", + "email": "patrick@maatwebsite.nl" } ], - "description": "Sends your logs to files, sockets, inboxes, databases and various web services", - "homepage": "https://github.com/Seldaek/monolog", + "description": "Supercharged Excel exports and imports in Laravel", "keywords": [ - "log", - "logging", - "psr-3" + "PHPExcel", + "batch", + "csv", + "excel", + "export", + "import", + "laravel", + "php", + "phpspreadsheet" ], "support": { - "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/2.3.2" + "issues": "https://github.com/Maatwebsite/Laravel-Excel/issues", + "source": "https://github.com/Maatwebsite/Laravel-Excel/tree/3.1.33" }, "funding": [ { - "url": "https://github.com/Seldaek", - "type": "github" + "url": "https://laravel-excel.com/commercial-support", + "type": "custom" }, { - "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", - "type": "tidelift" + "url": "https://github.com/patrickbrouwers", + "type": "github" } ], - "time": "2021-07-23T07:42:52+00:00" + "time": "2021-08-12T15:52:25+00:00" }, { - "name": "nesbot/carbon", - "version": "2.53.1", + "name": "maennchen/zipstream-php", + "version": "2.1.0", "source": { "type": "git", - "url": "https://github.com/briannesbitt/Carbon.git", + "url": "https://github.com/maennchen/ZipStream-PHP.git", + "reference": "c4c5803cc1f93df3d2448478ef79394a5981cc58" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/c4c5803cc1f93df3d2448478ef79394a5981cc58", + "reference": "c4c5803cc1f93df3d2448478ef79394a5981cc58", + "shasum": "" + }, + "require": { + "myclabs/php-enum": "^1.5", + "php": ">= 7.1", + "psr/http-message": "^1.0", + "symfony/polyfill-mbstring": "^1.0" + }, + "require-dev": { + "ext-zip": "*", + "guzzlehttp/guzzle": ">= 6.3", + "mikey179/vfsstream": "^1.6", + "phpunit/phpunit": ">= 7.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZipStream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paul Duncan", + "email": "pabs@pablotron.org" + }, + { + "name": "Jonatan Männchen", + "email": "jonatan@maennchen.ch" + }, + { + "name": "Jesse Donat", + "email": "donatj@gmail.com" + }, + { + "name": "András Kolesár", + "email": "kolesar@kolesar.hu" + } + ], + "description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.", + "keywords": [ + "stream", + "zip" + ], + "support": { + "issues": "https://github.com/maennchen/ZipStream-PHP/issues", + "source": "https://github.com/maennchen/ZipStream-PHP/tree/master" + }, + "funding": [ + { + "url": "https://opencollective.com/zipstream", + "type": "open_collective" + } + ], + "time": "2020-05-30T13:11:16+00:00" + }, + { + "name": "markbaker/complex", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPComplex.git", + "reference": "6f724d7e04606fd8adaa4e3bb381c3e9db09c946" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/6f724d7e04606fd8adaa4e3bb381c3e9db09c946", + "reference": "6f724d7e04606fd8adaa4e3bb381c3e9db09c946", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "phpcompatibility/php-compatibility": "^9.0", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.3", + "squizlabs/php_codesniffer": "^3.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Complex\\": "classes/src/" + }, + "files": [ + "classes/src/functions/abs.php", + "classes/src/functions/acos.php", + "classes/src/functions/acosh.php", + "classes/src/functions/acot.php", + "classes/src/functions/acoth.php", + "classes/src/functions/acsc.php", + "classes/src/functions/acsch.php", + "classes/src/functions/argument.php", + "classes/src/functions/asec.php", + "classes/src/functions/asech.php", + "classes/src/functions/asin.php", + "classes/src/functions/asinh.php", + "classes/src/functions/atan.php", + "classes/src/functions/atanh.php", + "classes/src/functions/conjugate.php", + "classes/src/functions/cos.php", + "classes/src/functions/cosh.php", + "classes/src/functions/cot.php", + "classes/src/functions/coth.php", + "classes/src/functions/csc.php", + "classes/src/functions/csch.php", + "classes/src/functions/exp.php", + "classes/src/functions/inverse.php", + "classes/src/functions/ln.php", + "classes/src/functions/log2.php", + "classes/src/functions/log10.php", + "classes/src/functions/negative.php", + "classes/src/functions/pow.php", + "classes/src/functions/rho.php", + "classes/src/functions/sec.php", + "classes/src/functions/sech.php", + "classes/src/functions/sin.php", + "classes/src/functions/sinh.php", + "classes/src/functions/sqrt.php", + "classes/src/functions/tan.php", + "classes/src/functions/tanh.php", + "classes/src/functions/theta.php", + "classes/src/operations/add.php", + "classes/src/operations/subtract.php", + "classes/src/operations/multiply.php", + "classes/src/operations/divideby.php", + "classes/src/operations/divideinto.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@lange.demon.co.uk" + } + ], + "description": "PHP Class for working with complex numbers", + "homepage": "https://github.com/MarkBaker/PHPComplex", + "keywords": [ + "complex", + "mathematics" + ], + "support": { + "issues": "https://github.com/MarkBaker/PHPComplex/issues", + "source": "https://github.com/MarkBaker/PHPComplex/tree/2.0.3" + }, + "time": "2021-06-02T09:44:11+00:00" + }, + { + "name": "markbaker/matrix", + "version": "2.1.3", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPMatrix.git", + "reference": "174395a901b5ba0925f1d790fa91bab531074b61" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/174395a901b5ba0925f1d790fa91bab531074b61", + "reference": "174395a901b5ba0925f1d790fa91bab531074b61", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "phpcompatibility/php-compatibility": "^9.0", + "phpdocumentor/phpdocumentor": "2.*", + "phploc/phploc": "^4.0", + "phpmd/phpmd": "2.*", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.3", + "sebastian/phpcpd": "^4.0", + "squizlabs/php_codesniffer": "^3.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Matrix\\": "classes/src/" + }, + "files": [ + "classes/src/Functions/adjoint.php", + "classes/src/Functions/antidiagonal.php", + "classes/src/Functions/cofactors.php", + "classes/src/Functions/determinant.php", + "classes/src/Functions/diagonal.php", + "classes/src/Functions/identity.php", + "classes/src/Functions/inverse.php", + "classes/src/Functions/minors.php", + "classes/src/Functions/trace.php", + "classes/src/Functions/transpose.php", + "classes/src/Operations/add.php", + "classes/src/Operations/directsum.php", + "classes/src/Operations/subtract.php", + "classes/src/Operations/multiply.php", + "classes/src/Operations/divideby.php", + "classes/src/Operations/divideinto.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@demon-angel.eu" + } + ], + "description": "PHP Class for working with matrices", + "homepage": "https://github.com/MarkBaker/PHPMatrix", + "keywords": [ + "mathematics", + "matrix", + "vector" + ], + "support": { + "issues": "https://github.com/MarkBaker/PHPMatrix/issues", + "source": "https://github.com/MarkBaker/PHPMatrix/tree/2.1.3" + }, + "time": "2021-05-25T15:42:17+00:00" + }, + { + "name": "monolog/monolog", + "version": "2.3.5", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "fd4380d6fc37626e2f799f29d91195040137eba9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/fd4380d6fc37626e2f799f29d91195040137eba9", + "reference": "fd4380d6fc37626e2f799f29d91195040137eba9", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7", + "graylog2/gelf-php": "^1.4.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "php-console/php-console": "^3.1.3", + "phpspec/prophecy": "^1.6.1", + "phpstan/phpstan": "^0.12.91", + "phpunit/phpunit": "^8.5", + "predis/predis": "^1.1", + "rollbar/rollbar": "^1.3", + "ruflin/elastica": ">=0.90@dev", + "swiftmailer/swiftmailer": "^5.3|^6.0" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "php-console/php-console": "Allow sending log messages to Google Chrome", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/2.3.5" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2021-10-01T21:08:31+00:00" + }, + { + "name": "myclabs/php-enum", + "version": "1.8.3", + "source": { + "type": "git", + "url": "https://github.com/myclabs/php-enum.git", + "reference": "b942d263c641ddb5190929ff840c68f78713e937" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/php-enum/zipball/b942d263c641ddb5190929ff840c68f78713e937", + "reference": "b942d263c641ddb5190929ff840c68f78713e937", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "1.*", + "vimeo/psalm": "^4.6.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "MyCLabs\\Enum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP Enum contributors", + "homepage": "https://github.com/myclabs/php-enum/graphs/contributors" + } + ], + "description": "PHP Enum implementation", + "homepage": "http://github.com/myclabs/php-enum", + "keywords": [ + "enum" + ], + "support": { + "issues": "https://github.com/myclabs/php-enum/issues", + "source": "https://github.com/myclabs/php-enum/tree/1.8.3" + }, + "funding": [ + { + "url": "https://github.com/mnapoli", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/php-enum", + "type": "tidelift" + } + ], + "time": "2021-07-05T08:18:36+00:00" + }, + { + "name": "nesbot/carbon", + "version": "2.53.1", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", "reference": "f4655858a784988f880c1b8c7feabbf02dfdf045" }, "dist": { @@ -2279,33 +3194,32 @@ }, { "name": "nunomaduro/collision", - "version": "v5.5.0", + "version": "v5.10.0", "source": { "type": "git", "url": "https://github.com/nunomaduro/collision.git", - "reference": "b5cb36122f1c142c3c3ee20a0ae778439ef0244b" + "reference": "3004cfa49c022183395eabc6d0e5207dfe498d00" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/b5cb36122f1c142c3c3ee20a0ae778439ef0244b", - "reference": "b5cb36122f1c142c3c3ee20a0ae778439ef0244b", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/3004cfa49c022183395eabc6d0e5207dfe498d00", + "reference": "3004cfa49c022183395eabc6d0e5207dfe498d00", "shasum": "" }, "require": { "facade/ignition-contracts": "^1.0", - "filp/whoops": "^2.7.2", + "filp/whoops": "^2.14.3", "php": "^7.3 || ^8.0", "symfony/console": "^5.0" }, "require-dev": { "brianium/paratest": "^6.1", "fideloper/proxy": "^4.4.1", - "friendsofphp/php-cs-fixer": "^2.17.3", "fruitcake/laravel-cors": "^2.0.3", - "laravel/framework": "^9.0", + "laravel/framework": "8.x-dev", "nunomaduro/larastan": "^0.6.2", "nunomaduro/mock-final-classes": "^1.0", - "orchestra/testbench": "^7.0", + "orchestra/testbench": "^6.0", "phpstan/phpstan": "^0.12.64", "phpunit/phpunit": "^9.5.0" }, @@ -2363,7 +3277,7 @@ "type": "patreon" } ], - "time": "2021-06-22T20:47:22+00:00" + "time": "2021-09-20T15:06:32+00:00" }, { "name": "nunomaduro/laravel-console-summary", @@ -2426,16 +3340,16 @@ }, { "name": "nunomaduro/laravel-console-task", - "version": "v1.6.0", + "version": "v1.6.1", "source": { "type": "git", "url": "https://github.com/nunomaduro/laravel-console-task.git", - "reference": "c49ffbb33d9a750e60a1f8649f2f6dcc4114990a" + "reference": "de3062d80caa61be1dfde4ec3b84232871ef7f73" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/laravel-console-task/zipball/c49ffbb33d9a750e60a1f8649f2f6dcc4114990a", - "reference": "c49ffbb33d9a750e60a1f8649f2f6dcc4114990a", + "url": "https://api.github.com/repos/nunomaduro/laravel-console-task/zipball/de3062d80caa61be1dfde4ec3b84232871ef7f73", + "reference": "de3062d80caa61be1dfde4ec3b84232871ef7f73", "shasum": "" }, "require": { @@ -2444,7 +3358,7 @@ "php": "^7.2.5|^8.0" }, "require-dev": { - "phpunit/phpunit": "^8.5.8|^9.0" + "phpunit/phpunit": "^8.5.21|^9.5.10" }, "type": "library", "extra": { @@ -2484,7 +3398,7 @@ "issues": "https://github.com/nunomaduro/laravel-console-task/issues", "source": "https://github.com/nunomaduro/laravel-console-task" }, - "time": "2020-10-30T14:47:00+00:00" + "time": "2021-10-19T11:33:38+00:00" }, { "name": "nunomaduro/laravel-desktop-notifier", @@ -2557,32 +3471,136 @@ "time": "2020-10-30T15:41:03+00:00" }, { - "name": "phpoption/phpoption", - "version": "1.7.5", + "name": "phpoffice/phpspreadsheet", + "version": "1.18.0", "source": { "type": "git", - "url": "https://github.com/schmittjoh/php-option.git", - "reference": "994ecccd8f3283ecf5ac33254543eb0ac946d525" + "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", + "reference": "418cd304e8e6b417ea79c3b29126a25dc4b1170c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/994ecccd8f3283ecf5ac33254543eb0ac946d525", - "reference": "994ecccd8f3283ecf5ac33254543eb0ac946d525", + "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/418cd304e8e6b417ea79c3b29126a25dc4b1170c", + "reference": "418cd304e8e6b417ea79c3b29126a25dc4b1170c", "shasum": "" }, "require": { - "php": "^5.5.9 || ^7.0 || ^8.0" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", - "phpunit/phpunit": "^4.8.35 || ^5.7.27 || ^6.5.6 || ^7.0 || ^8.0 || ^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.7-dev" - } - }, + "ext-ctype": "*", + "ext-dom": "*", + "ext-fileinfo": "*", + "ext-gd": "*", + "ext-iconv": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-simplexml": "*", + "ext-xml": "*", + "ext-xmlreader": "*", + "ext-xmlwriter": "*", + "ext-zip": "*", + "ext-zlib": "*", + "ezyang/htmlpurifier": "^4.13", + "maennchen/zipstream-php": "^2.1", + "markbaker/complex": "^2.0", + "markbaker/matrix": "^2.0", + "php": "^7.2 || ^8.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/simple-cache": "^1.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "dev-master", + "dompdf/dompdf": "^1.0", + "friendsofphp/php-cs-fixer": "^2.18", + "jpgraph/jpgraph": "^4.0", + "mpdf/mpdf": "^8.0", + "phpcompatibility/php-compatibility": "^9.3", + "phpstan/phpstan": "^0.12.82", + "phpstan/phpstan-phpunit": "^0.12.18", + "phpunit/phpunit": "^8.5", + "squizlabs/php_codesniffer": "^3.5", + "tecnickcom/tcpdf": "^6.3" + }, + "suggest": { + "dompdf/dompdf": "Option for rendering PDF with PDF Writer (doesn't yet support PHP8)", + "jpgraph/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers", + "mpdf/mpdf": "Option for rendering PDF with PDF Writer", + "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer (doesn't yet support PHP8)" + }, + "type": "library", + "autoload": { + "psr-4": { + "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Maarten Balliauw", + "homepage": "https://blog.maartenballiauw.be" + }, + { + "name": "Mark Baker", + "homepage": "https://markbakeruk.net" + }, + { + "name": "Franck Lefevre", + "homepage": "https://rootslabs.net" + }, + { + "name": "Erik Tilt" + }, + { + "name": "Adrien Crivelli" + } + ], + "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine", + "homepage": "https://github.com/PHPOffice/PhpSpreadsheet", + "keywords": [ + "OpenXML", + "excel", + "gnumeric", + "ods", + "php", + "spreadsheet", + "xls", + "xlsx" + ], + "support": { + "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues", + "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.18.0" + }, + "time": "2021-05-31T18:21:15+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.8.0", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "5455cb38aed4523f99977c4a12ef19da4bfe2a28" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/5455cb38aed4523f99977c4a12ef19da4bfe2a28", + "reference": "5455cb38aed4523f99977c4a12ef19da4bfe2a28", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "phpunit/phpunit": "^6.5.14 || ^7.0.20 || ^8.5.19 || ^9.5.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, "autoload": { "psr-4": { "PhpOption\\": "src/PhpOption/" @@ -2599,7 +3617,7 @@ }, { "name": "Graham Campbell", - "email": "graham@alt-three.com" + "email": "hello@gjcampbell.co.uk" } ], "description": "Option Type for PHP", @@ -2611,7 +3629,7 @@ ], "support": { "issues": "https://github.com/schmittjoh/php-option/issues", - "source": "https://github.com/schmittjoh/php-option/tree/1.7.5" + "source": "https://github.com/schmittjoh/php-option/tree/1.8.0" }, "funding": [ { @@ -2623,7 +3641,7 @@ "type": "tidelift" } ], - "time": "2020-07-20T17:29:33+00:00" + "time": "2021-08-28T21:27:29+00:00" }, { "name": "psr/container", @@ -2725,6 +3743,61 @@ }, "time": "2020-06-29T06:28:15+00:00" }, + { + "name": "psr/http-factory", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory/tree/master" + }, + "time": "2019-04-30T12:38:16+00:00" + }, { "name": "psr/http-message", "version": "1.0.1", @@ -2925,20 +3998,21 @@ }, { "name": "ramsey/collection", - "version": "1.1.3", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/ramsey/collection.git", - "reference": "28a5c4ab2f5111db6a60b2b4ec84057e0f43b9c1" + "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/collection/zipball/28a5c4ab2f5111db6a60b2b4ec84057e0f43b9c1", - "reference": "28a5c4ab2f5111db6a60b2b4ec84057e0f43b9c1", + "url": "https://api.github.com/repos/ramsey/collection/zipball/cccc74ee5e328031b15640b51056ee8d3bb66c0a", + "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a", "shasum": "" }, "require": { - "php": "^7.2 || ^8" + "php": "^7.3 || ^8", + "symfony/polyfill-php81": "^1.23" }, "require-dev": { "captainhook/captainhook": "^5.3", @@ -2948,6 +4022,7 @@ "hamcrest/hamcrest-php": "^2", "jangregor/phpstan-prophecy": "^0.8", "mockery/mockery": "^1.3", + "phpspec/prophecy-phpunit": "^2.0", "phpstan/extension-installer": "^1", "phpstan/phpstan": "^0.12.32", "phpstan/phpstan-mockery": "^0.12.5", @@ -2975,7 +4050,7 @@ "homepage": "https://benramsey.com" } ], - "description": "A PHP 7.2+ library for representing and manipulating collections.", + "description": "A PHP library for representing and manipulating collections.", "keywords": [ "array", "collection", @@ -2986,7 +4061,7 @@ ], "support": { "issues": "https://github.com/ramsey/collection/issues", - "source": "https://github.com/ramsey/collection/tree/1.1.3" + "source": "https://github.com/ramsey/collection/tree/1.2.2" }, "funding": [ { @@ -2998,53 +4073,54 @@ "type": "tidelift" } ], - "time": "2021-01-21T17:40:04+00:00" + "time": "2021-10-10T03:01:02+00:00" }, { "name": "ramsey/uuid", - "version": "4.1.1", + "version": "4.2.3", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "cd4032040a750077205918c86049aa0f43d22947" + "reference": "fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/cd4032040a750077205918c86049aa0f43d22947", - "reference": "cd4032040a750077205918c86049aa0f43d22947", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df", + "reference": "fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df", "shasum": "" }, "require": { "brick/math": "^0.8 || ^0.9", "ext-json": "*", - "php": "^7.2 || ^8", + "php": "^7.2 || ^8.0", "ramsey/collection": "^1.0", - "symfony/polyfill-ctype": "^1.8" + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-php80": "^1.14" }, "replace": { "rhumsaa/uuid": "self.version" }, "require-dev": { - "codeception/aspect-mock": "^3", - "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7.0", + "captainhook/captainhook": "^5.10", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", "doctrine/annotations": "^1.8", - "goaop/framework": "^2", + "ergebnis/composer-normalize": "^2.15", "mockery/mockery": "^1.3", "moontoast/math": "^1.1", "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.2", "php-mock/php-mock-mockery": "^1.3", - "php-mock/php-mock-phpunit": "^2.5", "php-parallel-lint/php-parallel-lint": "^1.1", - "phpbench/phpbench": "^0.17.1", + "phpbench/phpbench": "^1.0", "phpstan/extension-installer": "^1.0", "phpstan/phpstan": "^0.12", "phpstan/phpstan-mockery": "^0.12", "phpstan/phpstan-phpunit": "^0.12", - "phpunit/phpunit": "^8.5", - "psy/psysh": "^0.10.0", - "slevomat/coding-standard": "^6.0", + "phpunit/phpunit": "^8.5 || ^9", + "slevomat/coding-standard": "^7.0", "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "3.9.4" + "vimeo/psalm": "^4.9" }, "suggest": { "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", @@ -3057,7 +4133,10 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.x-dev" + "dev-main": "4.x-dev" + }, + "captainhook": { + "force-install": true } }, "autoload": { @@ -3073,7 +4152,6 @@ "MIT" ], "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", - "homepage": "https://github.com/ramsey/uuid", "keywords": [ "guid", "identifier", @@ -3081,16 +4159,19 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "rss": "https://github.com/ramsey/uuid/releases.atom", - "source": "https://github.com/ramsey/uuid" + "source": "https://github.com/ramsey/uuid/tree/4.2.3" }, "funding": [ { "url": "https://github.com/ramsey", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", + "type": "tidelift" } ], - "time": "2020-08-18T17:17:46+00:00" + "time": "2021-09-25T23:10:38+00:00" }, { "name": "sinkcup/confluence-sdk-php", @@ -3243,16 +4324,16 @@ }, { "name": "symfony/console", - "version": "v5.3.2", + "version": "v5.3.7", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "649730483885ff2ca99ca0560ef0e5f6b03f2ac1" + "reference": "8b1008344647462ae6ec57559da166c2bfa5e16a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/649730483885ff2ca99ca0560ef0e5f6b03f2ac1", - "reference": "649730483885ff2ca99ca0560ef0e5f6b03f2ac1", + "url": "https://api.github.com/repos/symfony/console/zipball/8b1008344647462ae6ec57559da166c2bfa5e16a", + "reference": "8b1008344647462ae6ec57559da166c2bfa5e16a", "shasum": "" }, "require": { @@ -3260,11 +4341,12 @@ "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-php73": "^1.8", - "symfony/polyfill-php80": "^1.15", + "symfony/polyfill-php80": "^1.16", "symfony/service-contracts": "^1.1|^2", "symfony/string": "^5.1" }, "conflict": { + "psr/log": ">=3", "symfony/dependency-injection": "<4.4", "symfony/dotenv": "<5.1", "symfony/event-dispatcher": "<4.4", @@ -3272,10 +4354,10 @@ "symfony/process": "<4.4" }, "provide": { - "psr/log-implementation": "1.0" + "psr/log-implementation": "1.0|2.0" }, "require-dev": { - "psr/log": "~1.0", + "psr/log": "^1|^2", "symfony/config": "^4.4|^5.0", "symfony/dependency-injection": "^4.4|^5.0", "symfony/event-dispatcher": "^4.4|^5.0", @@ -3321,7 +4403,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.3.2" + "source": "https://github.com/symfony/console/tree/v5.3.7" }, "funding": [ { @@ -3337,7 +4419,7 @@ "type": "tidelift" } ], - "time": "2021-06-12T09:42:48+00:00" + "time": "2021-08-25T20:02:16+00:00" }, { "name": "symfony/deprecation-contracts", @@ -3408,22 +4490,21 @@ }, { "name": "symfony/error-handler", - "version": "v5.3.3", + "version": "v5.3.7", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "43323e79c80719e8a4674e33484bca98270d223f" + "reference": "3bc60d0fba00ae8d1eaa9eb5ab11a2bbdd1fc321" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/43323e79c80719e8a4674e33484bca98270d223f", - "reference": "43323e79c80719e8a4674e33484bca98270d223f", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/3bc60d0fba00ae8d1eaa9eb5ab11a2bbdd1fc321", + "reference": "3bc60d0fba00ae8d1eaa9eb5ab11a2bbdd1fc321", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/log": "^1.0", - "symfony/polyfill-php80": "^1.15", + "psr/log": "^1|^2|^3", "symfony/var-dumper": "^4.4|^5.0" }, "require-dev": { @@ -3454,10 +4535,388 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Provides tools to manage errors and ease debugging PHP code", + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v5.3.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-08-28T15:07:08+00:00" + }, + { + "name": "symfony/finder", + "version": "v5.3.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v5.3.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-08-04T21:20:46+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v5.3.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "e36c8e5502b4f3f0190c675f1c1f1248a64f04e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e36c8e5502b4f3f0190c675f1c1f1248a64f04e5", + "reference": "e36c8e5502b4f3f0190c675f1c1f1248a64f04e5", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "predis/predis": "~1.0", + "symfony/cache": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0" + }, + "suggest": { + "symfony/mime": "To use the file extension guesser" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v5.3.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-08-27T11:20:35+00:00" + }, + { + "name": "symfony/mime", + "version": "v5.3.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "a756033d0a7e53db389618653ae991eba5a19a11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/a756033d0a7e53db389618653ae991eba5a19a11", + "reference": "a756033d0a7e53db389618653ae991eba5a19a11", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<4.4" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/property-access": "^4.4|^5.1", + "symfony/property-info": "^4.4|^5.1", + "symfony/serializer": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v5.3.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-09-10T12:30:38+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "16880ba9c5ebe3642d1995ab866db29270b36535" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/16880ba9c5ebe3642d1995ab866db29270b36535", + "reference": "16880ba9c5ebe3642d1995ab866db29270b36535", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], "support": { - "source": "https://github.com/symfony/error-handler/tree/v5.3.3" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.1" }, "funding": [ { @@ -3473,32 +4932,46 @@ "type": "tidelift" } ], - "time": "2021-06-24T08:13:00+00:00" + "time": "2021-05-27T12:26:48+00:00" }, { - "name": "symfony/finder", - "version": "v5.3.0", + "name": "symfony/polyfill-intl-idn", + "version": "v1.23.0", "source": { "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "0ae3f047bed4edff6fd35b26a9a6bfdc92c953c6" + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/0ae3f047bed4edff6fd35b26a9a6bfdc92c953c6", - "reference": "0ae3f047bed4edff6fd35b26a9a6bfdc92c953c6", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/65bd267525e82759e7d8c4e8ceea44f398838e65", + "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65", "shasum": "" }, "require": { - "php": ">=7.2.5" + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, "autoload": { "psr-4": { - "Symfony\\Component\\Finder\\": "" + "Symfony\\Polyfill\\Intl\\Idn\\": "" }, - "exclude-from-classmap": [ - "/Tests/" + "files": [ + "bootstrap.php" ] }, "notification-url": "https://packagist.org/downloads/", @@ -3507,18 +4980,30 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Finds files and directories via an intuitive fluent interface", + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], "support": { - "source": "https://github.com/symfony/finder/tree/v5.3.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.23.0" }, "funding": [ { @@ -3534,27 +5019,27 @@ "type": "tidelift" } ], - "time": "2021-05-26T12:52:38+00:00" + "time": "2021-05-27T09:27:20+00:00" }, { - "name": "symfony/polyfill-ctype", + "name": "symfony/polyfill-intl-normalizer", "version": "v1.23.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", "shasum": "" }, "require": { "php": ">=7.1" }, "suggest": { - "ext-ctype": "For best performance" + "ext-intl": "For best performance" }, "type": "library", "extra": { @@ -3568,10 +5053,13 @@ }, "autoload": { "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" }, "files": [ "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", @@ -3580,24 +5068,26 @@ ], "authors": [ { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for ctype functions", + "description": "Symfony polyfill for intl's Normalizer class and related functions", "homepage": "https://symfony.com", "keywords": [ "compatibility", - "ctype", + "intl", + "normalizer", "polyfill", - "portable" + "portable", + "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" }, "funding": [ { @@ -3616,24 +5106,24 @@ "time": "2021-02-19T12:13:01+00:00" }, { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.23.0", + "name": "symfony/polyfill-mbstring", + "version": "v1.23.1", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "24b72c6baa32c746a4d0840147c9715e42bb68ab" + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/24b72c6baa32c746a4d0840147c9715e42bb68ab", - "reference": "24b72c6baa32c746a4d0840147c9715e42bb68ab", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", "shasum": "" }, "require": { "php": ">=7.1" }, "suggest": { - "ext-intl": "For best performance" + "ext-mbstring": "For best performance" }, "type": "library", "extra": { @@ -3647,7 +5137,7 @@ }, "autoload": { "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + "Symfony\\Polyfill\\Mbstring\\": "" }, "files": [ "bootstrap.php" @@ -3667,18 +5157,17 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for intl's grapheme_* functions", + "description": "Symfony polyfill for the Mbstring extension", "homepage": "https://symfony.com", "keywords": [ "compatibility", - "grapheme", - "intl", + "mbstring", "polyfill", "portable", "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" }, "funding": [ { @@ -3694,28 +5183,25 @@ "type": "tidelift" } ], - "time": "2021-05-27T09:17:38+00:00" + "time": "2021-05-27T12:26:48+00:00" }, { - "name": "symfony/polyfill-intl-normalizer", + "name": "symfony/polyfill-php72", "version": "v1.23.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976", + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976", "shasum": "" }, "require": { "php": ">=7.1" }, - "suggest": { - "ext-intl": "For best performance" - }, "type": "library", "extra": { "branch-alias": { @@ -3728,13 +5214,10 @@ }, "autoload": { "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + "Symfony\\Polyfill\\Php72\\": "" }, "files": [ "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", @@ -3751,18 +5234,16 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", - "intl", - "normalizer", "polyfill", "portable", "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.23.0" }, "funding": [ { @@ -3778,28 +5259,25 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2021-05-27T09:17:38+00:00" }, { - "name": "symfony/polyfill-mbstring", + "name": "symfony/polyfill-php73", "version": "v1.23.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1" + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/2df51500adbaebdc4c38dea4c89a2e131c45c8a1", - "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", "shasum": "" }, "require": { "php": ">=7.1" }, - "suggest": { - "ext-mbstring": "For best performance" - }, "type": "library", "extra": { "branch-alias": { @@ -3812,10 +5290,13 @@ }, "autoload": { "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" + "Symfony\\Polyfill\\Php73\\": "" }, "files": [ "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", @@ -3832,17 +5313,16 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for the Mbstring extension", + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", - "mbstring", "polyfill", "portable", "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" }, "funding": [ { @@ -3858,20 +5338,20 @@ "type": "tidelift" } ], - "time": "2021-05-27T09:27:20+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { - "name": "symfony/polyfill-php73", - "version": "v1.23.0", + "name": "symfony/polyfill-php80", + "version": "v1.23.1", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", "shasum": "" }, "require": { @@ -3889,7 +5369,7 @@ }, "autoload": { "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" + "Symfony\\Polyfill\\Php80\\": "" }, "files": [ "bootstrap.php" @@ -3903,6 +5383,10 @@ "MIT" ], "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, { "name": "Nicolas Grekas", "email": "p@tchwork.com" @@ -3912,7 +5396,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -3921,7 +5405,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" }, "funding": [ { @@ -3937,20 +5421,20 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2021-07-28T13:41:28+00:00" }, { - "name": "symfony/polyfill-php80", + "name": "symfony/polyfill-php81", "version": "v1.23.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0" + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "e66119f3de95efc359483f810c4c3e6436279436" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/eca0bf41ed421bed1b57c4958bab16aa86b757d0", - "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/e66119f3de95efc359483f810c4c3e6436279436", + "reference": "e66119f3de95efc359483f810c4c3e6436279436", "shasum": "" }, "require": { @@ -3968,7 +5452,7 @@ }, "autoload": { "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" + "Symfony\\Polyfill\\Php81\\": "" }, "files": [ "bootstrap.php" @@ -3982,10 +5466,6 @@ "MIT" ], "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, { "name": "Nicolas Grekas", "email": "p@tchwork.com" @@ -3995,7 +5475,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -4004,7 +5484,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.23.0" }, "funding": [ { @@ -4020,25 +5500,25 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2021-05-21T13:25:03+00:00" }, { "name": "symfony/process", - "version": "v5.3.2", + "version": "v5.3.7", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "714b47f9196de61a196d86c4bad5f09201b307df" + "reference": "38f26c7d6ed535217ea393e05634cb0b244a1967" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/714b47f9196de61a196d86c4bad5f09201b307df", - "reference": "714b47f9196de61a196d86c4bad5f09201b307df", + "url": "https://api.github.com/repos/symfony/process/zipball/38f26c7d6ed535217ea393e05634cb0b244a1967", + "reference": "38f26c7d6ed535217ea393e05634cb0b244a1967", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { @@ -4066,7 +5546,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.3.2" + "source": "https://github.com/symfony/process/tree/v5.3.7" }, "funding": [ { @@ -4082,7 +5562,7 @@ "type": "tidelift" } ], - "time": "2021-06-12T10:15:01+00:00" + "time": "2021-08-04T21:20:46+00:00" }, { "name": "symfony/service-contracts", @@ -4165,16 +5645,16 @@ }, { "name": "symfony/string", - "version": "v5.3.3", + "version": "v5.3.7", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "bd53358e3eccec6a670b5f33ab680d8dbe1d4ae1" + "reference": "8d224396e28d30f81969f083a58763b8b9ceb0a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/bd53358e3eccec6a670b5f33ab680d8dbe1d4ae1", - "reference": "bd53358e3eccec6a670b5f33ab680d8dbe1d4ae1", + "url": "https://api.github.com/repos/symfony/string/zipball/8d224396e28d30f81969f083a58763b8b9ceb0a5", + "reference": "8d224396e28d30f81969f083a58763b8b9ceb0a5", "shasum": "" }, "require": { @@ -4228,7 +5708,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.3.3" + "source": "https://github.com/symfony/string/tree/v5.3.7" }, "funding": [ { @@ -4244,27 +5724,27 @@ "type": "tidelift" } ], - "time": "2021-06-27T11:44:38+00:00" + "time": "2021-08-26T08:00:08+00:00" }, { "name": "symfony/translation", - "version": "v5.3.3", + "version": "v5.3.9", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "380b8c9e944d0e364b25f28e8e555241eb49c01c" + "reference": "6e69f3551c1a3356cf6ea8d019bf039a0f8b6886" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/380b8c9e944d0e364b25f28e8e555241eb49c01c", - "reference": "380b8c9e944d0e364b25f28e8e555241eb49c01c", + "url": "https://api.github.com/repos/symfony/translation/zipball/6e69f3551c1a3356cf6ea8d019bf039a0f8b6886", + "reference": "6e69f3551c1a3356cf6ea8d019bf039a0f8b6886", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.15", + "symfony/polyfill-php80": "^1.16", "symfony/translation-contracts": "^2.3" }, "conflict": { @@ -4278,7 +5758,7 @@ "symfony/translation-implementation": "2.3" }, "require-dev": { - "psr/log": "~1.0", + "psr/log": "^1|^2|^3", "symfony/config": "^4.4|^5.0", "symfony/console": "^4.4|^5.0", "symfony/dependency-injection": "^5.0", @@ -4323,7 +5803,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v5.3.3" + "source": "https://github.com/symfony/translation/tree/v5.3.9" }, "funding": [ { @@ -4339,7 +5819,7 @@ "type": "tidelift" } ], - "time": "2021-06-27T12:22:47+00:00" + "time": "2021-08-26T08:22:53+00:00" }, { "name": "symfony/translation-contracts", @@ -4421,22 +5901,22 @@ }, { "name": "symfony/var-dumper", - "version": "v5.3.3", + "version": "v5.3.8", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "46aa709affb9ad3355bd7a810f9662d71025c384" + "reference": "eaaea4098be1c90c8285543e1356a09c8aa5c8da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/46aa709affb9ad3355bd7a810f9662d71025c384", - "reference": "46aa709affb9ad3355bd7a810f9662d71025c384", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/eaaea4098be1c90c8285543e1356a09c8aa5c8da", + "reference": "eaaea4098be1c90c8285543e1356a09c8aa5c8da", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "conflict": { "phpunit/phpunit": "<5.4.3", @@ -4489,7 +5969,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.3.3" + "source": "https://github.com/symfony/var-dumper/tree/v5.3.8" }, "funding": [ { @@ -4505,35 +5985,35 @@ "type": "tidelift" } ], - "time": "2021-06-24T08:13:00+00:00" + "time": "2021-09-24T15:59:58+00:00" }, { "name": "vlucas/phpdotenv", - "version": "v5.3.0", + "version": "v5.3.1", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "b3eac5c7ac896e52deab4a99068e3f4ab12d9e56" + "reference": "accaddf133651d4b5cf81a119f25296736ffc850" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/b3eac5c7ac896e52deab4a99068e3f4ab12d9e56", - "reference": "b3eac5c7ac896e52deab4a99068e3f4ab12d9e56", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/accaddf133651d4b5cf81a119f25296736ffc850", + "reference": "accaddf133651d4b5cf81a119f25296736ffc850", "shasum": "" }, "require": { "ext-pcre": "*", - "graham-campbell/result-type": "^1.0.1", + "graham-campbell/result-type": "^1.0.2", "php": "^7.1.3 || ^8.0", - "phpoption/phpoption": "^1.7.4", - "symfony/polyfill-ctype": "^1.17", - "symfony/polyfill-mbstring": "^1.17", - "symfony/polyfill-php80": "^1.17" + "phpoption/phpoption": "^1.8", + "symfony/polyfill-ctype": "^1.23", + "symfony/polyfill-mbstring": "^1.23.1", + "symfony/polyfill-php80": "^1.23.1" }, "require-dev": { "bamarni/composer-bin-plugin": "^1.4.1", "ext-filter": "*", - "phpunit/phpunit": "^7.5.20 || ^8.5.14 || ^9.5.1" + "phpunit/phpunit": "^7.5.20 || ^8.5.21 || ^9.5.10" }, "suggest": { "ext-filter": "Required to use the boolean validator." @@ -4556,13 +6036,11 @@ "authors": [ { "name": "Graham Campbell", - "email": "graham@alt-three.com", - "homepage": "https://gjcampbell.co.uk/" + "email": "hello@gjcampbell.co.uk" }, { "name": "Vance Lucas", - "email": "vance@vancelucas.com", - "homepage": "https://vancelucas.com/" + "email": "vance@vancelucas.com" } ], "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", @@ -4573,7 +6051,7 @@ ], "support": { "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v5.3.0" + "source": "https://github.com/vlucas/phpdotenv/tree/v5.3.1" }, "funding": [ { @@ -4585,7 +6063,7 @@ "type": "tidelift" } ], - "time": "2021-01-20T15:23:13+00:00" + "time": "2021-10-02T19:24:42+00:00" }, { "name": "voku/portable-ascii", @@ -4723,21 +6201,21 @@ "packages-dev": [ { "name": "composer/xdebug-handler", - "version": "2.0.1", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/composer/xdebug-handler.git", - "reference": "964adcdd3a28bf9ed5d9ac6450064e0d71ed7496" + "reference": "84674dd3a7575ba617f5a76d7e9e29a7d3891339" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/964adcdd3a28bf9ed5d9ac6450064e0d71ed7496", - "reference": "964adcdd3a28bf9ed5d9ac6450064e0d71ed7496", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/84674dd3a7575ba617f5a76d7e9e29a7d3891339", + "reference": "84674dd3a7575ba617f5a76d7e9e29a7d3891339", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1.0" + "psr/log": "^1 || ^2 || ^3" }, "require-dev": { "phpstan/phpstan": "^0.12.55", @@ -4767,7 +6245,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/xdebug-handler/issues", - "source": "https://github.com/composer/xdebug-handler/tree/2.0.1" + "source": "https://github.com/composer/xdebug-handler/tree/2.0.2" }, "funding": [ { @@ -4783,7 +6261,7 @@ "type": "tidelift" } ], - "time": "2021-05-05T19:37:51+00:00" + "time": "2021-07-31T17:03:58+00:00" }, { "name": "doctrine/instantiator", @@ -4856,21 +6334,21 @@ }, { "name": "fakerphp/faker", - "version": "v1.15.0", + "version": "v1.16.0", "source": { "type": "git", "url": "https://github.com/FakerPHP/Faker.git", - "reference": "89c6201c74db25fa759ff16e78a4d8f32547770e" + "reference": "271d384d216e5e5c468a6b28feedf95d49f83b35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/89c6201c74db25fa759ff16e78a4d8f32547770e", - "reference": "89c6201c74db25fa759ff16e78a4d8f32547770e", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/271d384d216e5e5c468a6b28feedf95d49f83b35", + "reference": "271d384d216e5e5c468a6b28feedf95d49f83b35", "shasum": "" }, "require": { "php": "^7.1 || ^8.0", - "psr/container": "^1.0", + "psr/container": "^1.0 || ^2.0", "symfony/deprecation-contracts": "^2.2" }, "conflict": { @@ -4890,7 +6368,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "v1.15-dev" + "dev-main": "v1.16-dev" } }, "autoload": { @@ -4915,9 +6393,9 @@ ], "support": { "issues": "https://github.com/FakerPHP/Faker/issues", - "source": "https://github.com/FakerPHP/Faker/tree/v1.15.0" + "source": "https://github.com/FakerPHP/Faker/tree/v1.16.0" }, - "time": "2021-07-06T20:39:40+00:00" + "time": "2021-09-06T14:53:37+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -4972,16 +6450,16 @@ }, { "name": "mockery/mockery", - "version": "1.4.3", + "version": "1.4.4", "source": { "type": "git", "url": "https://github.com/mockery/mockery.git", - "reference": "d1339f64479af1bee0e82a0413813fe5345a54ea" + "reference": "e01123a0e847d52d186c5eb4b9bf58b0c6d00346" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/d1339f64479af1bee0e82a0413813fe5345a54ea", - "reference": "d1339f64479af1bee0e82a0413813fe5345a54ea", + "url": "https://api.github.com/repos/mockery/mockery/zipball/e01123a0e847d52d186c5eb4b9bf58b0c6d00346", + "reference": "e01123a0e847d52d186c5eb4b9bf58b0c6d00346", "shasum": "" }, "require": { @@ -5038,9 +6516,9 @@ ], "support": { "issues": "https://github.com/mockery/mockery/issues", - "source": "https://github.com/mockery/mockery/tree/1.4.3" + "source": "https://github.com/mockery/mockery/tree/1.4.4" }, - "time": "2021-02-24T09:51:49+00:00" + "time": "2021-09-13T15:28:59+00:00" }, { "name": "myclabs/deep-copy", @@ -5102,16 +6580,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.11.0", + "version": "v4.13.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "fe14cf3672a149364fb66dfe11bf6549af899f94" + "reference": "50953a2691a922aa1769461637869a0a2faa3f53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/fe14cf3672a149364fb66dfe11bf6549af899f94", - "reference": "fe14cf3672a149364fb66dfe11bf6549af899f94", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/50953a2691a922aa1769461637869a0a2faa3f53", + "reference": "50953a2691a922aa1769461637869a0a2faa3f53", "shasum": "" }, "require": { @@ -5152,22 +6630,22 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.11.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.13.0" }, - "time": "2021-07-03T13:36:55+00:00" + "time": "2021-09-20T12:20:58+00:00" }, { "name": "pdepend/pdepend", - "version": "2.9.1", + "version": "2.10.1", "source": { "type": "git", "url": "https://github.com/pdepend/pdepend.git", - "reference": "1632f0cee84512ffd6dde71e58536b3b06528c41" + "reference": "30452fdabb3dfca89f4bf977abc44adc5391e062" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pdepend/pdepend/zipball/1632f0cee84512ffd6dde71e58536b3b06528c41", - "reference": "1632f0cee84512ffd6dde71e58536b3b06528c41", + "url": "https://api.github.com/repos/pdepend/pdepend/zipball/30452fdabb3dfca89f4bf977abc44adc5391e062", + "reference": "30452fdabb3dfca89f4bf977abc44adc5391e062", "shasum": "" }, "require": { @@ -5203,7 +6681,7 @@ "description": "Official version of pdepend to be handled with Composer", "support": { "issues": "https://github.com/pdepend/pdepend/issues", - "source": "https://github.com/pdepend/pdepend/tree/2.9.1" + "source": "https://github.com/pdepend/pdepend/tree/2.10.1" }, "funding": [ { @@ -5211,20 +6689,20 @@ "type": "tidelift" } ], - "time": "2021-04-15T21:36:28+00:00" + "time": "2021-10-11T12:15:18+00:00" }, { "name": "phar-io/manifest", - "version": "2.0.1", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/phar-io/manifest.git", - "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133" + "reference": "97803eca37d319dfa7826cc2437fc020857acb53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/85265efd3af7ba3ca4b2a2c34dbfc5788dd29133", - "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53", "shasum": "" }, "require": { @@ -5269,9 +6747,9 @@ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", "support": { "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/master" + "source": "https://github.com/phar-io/manifest/tree/2.0.3" }, - "time": "2020-06-27T14:33:11+00:00" + "time": "2021-07-20T11:28:43+00:00" }, { "name": "phar-io/version", @@ -5379,16 +6857,16 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "5.2.2", + "version": "5.3.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556" + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556", - "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", "shasum": "" }, "require": { @@ -5399,7 +6877,8 @@ "webmozart/assert": "^1.9.1" }, "require-dev": { - "mockery/mockery": "~1.3.2" + "mockery/mockery": "~1.3.2", + "psalm/phar": "^4.8" }, "type": "library", "extra": { @@ -5429,22 +6908,22 @@ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", "support": { "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/master" + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" }, - "time": "2020-09-03T19:13:55+00:00" + "time": "2021-10-19T17:43:47+00:00" }, { "name": "phpdocumentor/type-resolver", - "version": "1.4.0", + "version": "1.5.1", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0" + "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", - "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/a12f7e301eb7258bb68acd89d4aefa05c2906cae", + "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae", "shasum": "" }, "require": { @@ -5452,7 +6931,8 @@ "phpdocumentor/reflection-common": "^2.0" }, "require-dev": { - "ext-tokenizer": "*" + "ext-tokenizer": "*", + "psalm/phar": "^4.8" }, "type": "library", "extra": { @@ -5478,28 +6958,28 @@ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "support": { "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.4.0" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.5.1" }, - "time": "2020-09-17T18:55:26+00:00" + "time": "2021-10-02T14:08:47+00:00" }, { "name": "phpmd/phpmd", - "version": "2.10.1", + "version": "2.10.2", "source": { "type": "git", "url": "https://github.com/phpmd/phpmd.git", - "reference": "bd5ef43d1dcaf7272605027c959c1c5ff3761f7a" + "reference": "1bc74db7cf834662d83abebae265be11bb2eec3a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpmd/phpmd/zipball/bd5ef43d1dcaf7272605027c959c1c5ff3761f7a", - "reference": "bd5ef43d1dcaf7272605027c959c1c5ff3761f7a", + "url": "https://api.github.com/repos/phpmd/phpmd/zipball/1bc74db7cf834662d83abebae265be11bb2eec3a", + "reference": "1bc74db7cf834662d83abebae265be11bb2eec3a", "shasum": "" }, "require": { "composer/xdebug-handler": "^1.0 || ^2.0", "ext-xml": "*", - "pdepend/pdepend": "^2.9.1", + "pdepend/pdepend": "^2.10.0", "php": ">=5.3.9" }, "require-dev": { @@ -5555,7 +7035,7 @@ "support": { "irc": "irc://irc.freenode.org/phpmd", "issues": "https://github.com/phpmd/phpmd/issues", - "source": "https://github.com/phpmd/phpmd/tree/2.10.1" + "source": "https://github.com/phpmd/phpmd/tree/2.10.2" }, "funding": [ { @@ -5563,37 +7043,37 @@ "type": "tidelift" } ], - "time": "2021-05-11T17:16:16+00:00" + "time": "2021-07-22T09:56:23+00:00" }, { "name": "phpspec/prophecy", - "version": "1.13.0", + "version": "1.14.0", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea" + "reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/be1996ed8adc35c3fd795488a653f4b518be70ea", - "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e", + "reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e", "shasum": "" }, "require": { "doctrine/instantiator": "^1.2", - "php": "^7.2 || ~8.0, <8.1", + "php": "^7.2 || ~8.0, <8.2", "phpdocumentor/reflection-docblock": "^5.2", "sebastian/comparator": "^3.0 || ^4.0", "sebastian/recursion-context": "^3.0 || ^4.0" }, "require-dev": { - "phpspec/phpspec": "^6.0", + "phpspec/phpspec": "^6.0 || ^7.0", "phpunit/phpunit": "^8.0 || ^9.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.11.x-dev" + "dev-master": "1.x-dev" } }, "autoload": { @@ -5628,29 +7108,29 @@ ], "support": { "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/1.13.0" + "source": "https://github.com/phpspec/prophecy/tree/1.14.0" }, - "time": "2021-03-17T13:42:18+00:00" + "time": "2021-09-10T09:02:12+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.6", + "version": "9.2.7", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "f6293e1b30a2354e8428e004689671b83871edde" + "reference": "d4c798ed8d51506800b441f7a13ecb0f76f12218" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f6293e1b30a2354e8428e004689671b83871edde", - "reference": "f6293e1b30a2354e8428e004689671b83871edde", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/d4c798ed8d51506800b441f7a13ecb0f76f12218", + "reference": "d4c798ed8d51506800b441f7a13ecb0f76f12218", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.10.2", + "nikic/php-parser": "^4.12.0", "php": ">=7.3", "phpunit/php-file-iterator": "^3.0.3", "phpunit/php-text-template": "^2.0.2", @@ -5699,7 +7179,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.6" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.7" }, "funding": [ { @@ -5707,7 +7187,7 @@ "type": "github" } ], - "time": "2021-03-28T07:26:59+00:00" + "time": "2021-09-17T05:39:03+00:00" }, { "name": "phpunit/php-file-iterator", @@ -5952,16 +7432,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.5.6", + "version": "9.5.10", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "fb9b8333f14e3dce976a60ef6a7e05c7c7ed8bfb" + "reference": "c814a05837f2edb0d1471d6e3f4ab3501ca3899a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/fb9b8333f14e3dce976a60ef6a7e05c7c7ed8bfb", - "reference": "fb9b8333f14e3dce976a60ef6a7e05c7c7ed8bfb", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c814a05837f2edb0d1471d6e3f4ab3501ca3899a", + "reference": "c814a05837f2edb0d1471d6e3f4ab3501ca3899a", "shasum": "" }, "require": { @@ -5973,11 +7453,11 @@ "ext-xml": "*", "ext-xmlwriter": "*", "myclabs/deep-copy": "^1.10.1", - "phar-io/manifest": "^2.0.1", + "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", "php": ">=7.3", "phpspec/prophecy": "^1.12.1", - "phpunit/php-code-coverage": "^9.2.3", + "phpunit/php-code-coverage": "^9.2.7", "phpunit/php-file-iterator": "^3.0.5", "phpunit/php-invoker": "^3.1.1", "phpunit/php-text-template": "^2.0.3", @@ -6039,7 +7519,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.6" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.10" }, "funding": [ { @@ -6051,7 +7531,7 @@ "type": "github" } ], - "time": "2021-06-23T05:14:38+00:00" + "time": "2021-09-25T07:38:51+00:00" }, { "name": "sebastian/cli-parser", @@ -6906,6 +8386,7 @@ "type": "github" } ], + "abandoned": true, "time": "2020-09-28T06:45:17+00:00" }, { @@ -7019,16 +8500,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.6.0", + "version": "3.6.1", "source": { "type": "git", "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "ffced0d2c8fa8e6cdc4d695a743271fab6c38625" + "reference": "f268ca40d54617c6e06757f83f699775c9b3ff2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/ffced0d2c8fa8e6cdc4d695a743271fab6c38625", - "reference": "ffced0d2c8fa8e6cdc4d695a743271fab6c38625", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/f268ca40d54617c6e06757f83f699775c9b3ff2e", + "reference": "f268ca40d54617c6e06757f83f699775c9b3ff2e", "shasum": "" }, "require": { @@ -7071,20 +8552,20 @@ "source": "https://github.com/squizlabs/PHP_CodeSniffer", "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" }, - "time": "2021-04-09T00:54:41+00:00" + "time": "2021-10-11T04:00:11+00:00" }, { "name": "symfony/config", - "version": "v5.3.3", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "a69e0c55528b47df88d3c4067ddedf32d485d662" + "reference": "4268f3059c904c61636275182707f81645517a37" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/a69e0c55528b47df88d3c4067ddedf32d485d662", - "reference": "a69e0c55528b47df88d3c4067ddedf32d485d662", + "url": "https://api.github.com/repos/symfony/config/zipball/4268f3059c904c61636275182707f81645517a37", + "reference": "4268f3059c904c61636275182707f81645517a37", "shasum": "" }, "require": { @@ -7092,7 +8573,7 @@ "symfony/deprecation-contracts": "^2.1", "symfony/filesystem": "^4.4|^5.0", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-php80": "^1.15", + "symfony/polyfill-php80": "^1.16", "symfony/polyfill-php81": "^1.22" }, "conflict": { @@ -7134,7 +8615,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v5.3.3" + "source": "https://github.com/symfony/config/tree/v5.3.4" }, "funding": [ { @@ -7150,27 +8631,27 @@ "type": "tidelift" } ], - "time": "2021-06-24T08:13:00+00:00" + "time": "2021-07-21T12:40:44+00:00" }, { "name": "symfony/dependency-injection", - "version": "v5.3.3", + "version": "v5.3.8", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "e421c4f161848740ad1fcf09b12391ddca168d95" + "reference": "e39c344e06a3ceab531ebeb6c077e6652c4a0829" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/e421c4f161848740ad1fcf09b12391ddca168d95", - "reference": "e421c4f161848740ad1fcf09b12391ddca168d95", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/e39c344e06a3ceab531ebeb6c077e6652c4a0829", + "reference": "e39c344e06a3ceab531ebeb6c077e6652c4a0829", "shasum": "" }, "require": { "php": ">=7.2.5", "psr/container": "^1.1.1", "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php80": "^1.15", + "symfony/polyfill-php80": "^1.16", "symfony/service-contracts": "^1.1.6|^2" }, "conflict": { @@ -7222,7 +8703,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v5.3.3" + "source": "https://github.com/symfony/dependency-injection/tree/v5.3.8" }, "funding": [ { @@ -7238,25 +8719,26 @@ "type": "tidelift" } ], - "time": "2021-06-24T08:13:00+00:00" + "time": "2021-09-21T20:52:44+00:00" }, { "name": "symfony/filesystem", - "version": "v5.3.3", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "19b71c8f313b411172dd5f470fd61f24466d79a9" + "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/19b71c8f313b411172dd5f470fd61f24466d79a9", - "reference": "19b71c8f313b411172dd5f470fd61f24466d79a9", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/343f4fe324383ca46792cae728a3b6e2f708fb32", + "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8" + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { @@ -7284,86 +8766,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.3.3" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-06-30T07:27:52+00:00" - }, - { - "name": "symfony/polyfill-php81", - "version": "v1.23.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "e66119f3de95efc359483f810c4c3e6436279436" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/e66119f3de95efc359483f810c4c3e6436279436", - "reference": "e66119f3de95efc359483f810c4c3e6436279436", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php81\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.23.0" + "source": "https://github.com/symfony/filesystem/tree/v5.3.4" }, "funding": [ { @@ -7379,20 +8782,20 @@ "type": "tidelift" } ], - "time": "2021-05-21T13:25:03+00:00" + "time": "2021-07-21T12:40:44+00:00" }, { "name": "theseer/tokenizer", - "version": "1.2.0", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "75a63c33a8577608444246075ea0af0d052e452a" + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a", - "reference": "75a63c33a8577608444246075ea0af0d052e452a", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", "shasum": "" }, "require": { @@ -7421,7 +8824,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/master" + "source": "https://github.com/theseer/tokenizer/tree/1.2.1" }, "funding": [ { @@ -7429,7 +8832,7 @@ "type": "github" } ], - "time": "2020-07-12T23:59:07+00:00" + "time": "2021-07-28T10:34:58+00:00" } ], "aliases": [], diff --git a/config/app.php b/config/app.php index 3d4c02e..eb38f63 100644 --- a/config/app.php +++ b/config/app.php @@ -55,8 +55,11 @@ 'providers' => [ App\Providers\AppServiceProvider::class, + Illuminate\Translation\TranslationServiceProvider::class, + Illuminate\Validation\ValidationServiceProvider::class, \LaravelFans\Confluence\ConfluenceServiceProvider::class, \Dscmall\Flysystem\Cos\CosStorageServiceProvider::class, + Maatwebsite\Excel\ExcelServiceProvider::class, ], ]; diff --git a/config/database.php b/config/database.php new file mode 100644 index 0000000..d7b278f --- /dev/null +++ b/config/database.php @@ -0,0 +1,147 @@ + env('DB_CONNECTION', 'sqlite'), + + /* + |-------------------------------------------------------------------------- + | Database Connections + |-------------------------------------------------------------------------- + | + | Here are each of the database connections setup for your application. + | Of course, examples of configuring each database platform that is + | supported by Laravel is shown below to make development simple. + | + | + | All database work in Laravel is done through the PHP PDO facilities + | so make sure you have the driver for your particular database of + | choice installed on your machine before you begin development. + | + */ + + 'connections' => [ + + 'sqlite' => [ + 'driver' => 'sqlite', + 'url' => env('DATABASE_URL'), + 'database' => env('DB_DATABASE', ':memory:'), + 'prefix' => '', + 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), + ], + + 'mysql' => [ + 'driver' => 'mysql', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => 'utf8mb4', + 'collation' => 'utf8mb4_unicode_ci', + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => true, + 'engine' => null, + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], + + 'pgsql' => [ + 'driver' => 'pgsql', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '5432'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => 'utf8', + 'prefix' => '', + 'prefix_indexes' => true, + 'schema' => 'public', + 'sslmode' => 'prefer', + ], + + 'sqlsrv' => [ + 'driver' => 'sqlsrv', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', 'localhost'), + 'port' => env('DB_PORT', '1433'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => 'utf8', + 'prefix' => '', + 'prefix_indexes' => true, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Migration Repository Table + |-------------------------------------------------------------------------- + | + | This table keeps track of all the migrations that have already run for + | your application. Using this information, we can determine which of + | the migrations on disk haven't actually been run in the database. + | + */ + + 'migrations' => 'migrations', + + /* + |-------------------------------------------------------------------------- + | Redis Databases + |-------------------------------------------------------------------------- + | + | Redis is an open source, fast, and advanced key-value store that also + | provides a richer body of commands than a typical key-value system + | such as APC or Memcached. Laravel makes it easy to dig right in. + | + */ + + 'redis' => [ + + 'client' => env('REDIS_CLIENT', 'phpredis'), + + 'options' => [ + 'cluster' => env('REDIS_CLUSTER', 'redis'), + 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_') . '_database_'), + ], + + 'default' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'password' => env('REDIS_PASSWORD', null), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_DB', '0'), + ], + + 'cache' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'password' => env('REDIS_PASSWORD', null), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_CACHE_DB', '1'), + ], + + ], + +]; diff --git a/storage/framework/.gitignore b/storage/framework/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/framework/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/tests/Feature/IssueImportCommandTest.php b/tests/Feature/IssueImportCommandTest.php new file mode 100755 index 0000000..ccbb869 --- /dev/null +++ b/tests/Feature/IssueImportCommandTest.php @@ -0,0 +1,57 @@ +faker->md5; + config(['coding.token' => $codingToken]); + $this->codingTeamDomain = $this->faker->domainWord; + config(['coding.team_domain' => $this->codingTeamDomain]); + $this->codingProjectUri = $this->faker->slug; + config(['coding.project_uri' => $this->codingProjectUri]); + } + + public function testImportSuccess() + { + $mock = \Mockery::mock(Project::class, [])->makePartial(); + $this->instance(Project::class, $mock); + + $mock->shouldReceive('getIssueTypes')->times(1)->andReturn(json_decode( + file_get_contents($this->dataDir . 'coding/' . 'DescribeProjectIssueTypeListResponse.json'), + true + )['Response']['IssueTypes']); + + $issueMock = \Mockery::mock(Issue::class, [])->makePartial(); + $this->instance(Issue::class, $issueMock); + + $response = json_decode( + file_get_contents($this->dataDir . 'coding/' . 'CreateIssueResponse.json'), + true + )['Response']['Issue']; + $results = []; + for ($i = 1; $i <= 21; $i++) { + $response['Code'] = $i; + $results[] = $response; + } + $issueMock->shouldReceive('create')->times(21)->andReturn(...$results); + + $this->artisan('issue:import', ['file' => $this->dataDir . 'coding/scrum-issues.csv']) + ->expectsOutput("https://$this->codingTeamDomain.coding.net/p/$this->codingProjectUri/all/issues/1") + ->expectsOutput("https://$this->codingTeamDomain.coding.net/p/$this->codingProjectUri/all/issues/2") + ->expectsOutput("https://$this->codingTeamDomain.coding.net/p/$this->codingProjectUri/all/issues/3") + ->expectsOutput("https://$this->codingTeamDomain.coding.net/p/$this->codingProjectUri/all/issues/20") + ->expectsOutput("https://$this->codingTeamDomain.coding.net/p/$this->codingProjectUri/all/issues/21") + ->assertExitCode(0); + } +} diff --git a/tests/data/coding/scrum-issues.csv b/tests/data/coding/scrum-issues.csv new file mode 100644 index 0000000..2fe8c30 --- /dev/null +++ b/tests/data/coding/scrum-issues.csv @@ -0,0 +1,32 @@ +ID,事项类型,标题,描述,状态,创建时间,创建人,更新时间,所属迭代,故事点,处理人,缺陷类型,优先级,截止日期,模块,标签,关注人,开始日期 +23,缺陷,商品详情页中商品价格字体应当显示为红色并且加粗,"步骤: + +测试环境中,打开商品列表页; +点击任意商品进详情页。 +测试结果:商品的价格字体显示为正常大小,颜色为黑色。 +预期结果:商品价格字体为红色加粗。",待处理,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,,,,,中,,,,, +22,缺陷,登录页输入正确的用户名和密码后提示“用户不存在”,"步骤: +测试环境中,输入URL https://mywebsite.com/login 进入登录页; +输入用户名 Admin 和密码 mypassword; +点击“登录”按钮。 +测试结果:页面提示“用户不存在”。 +预期结果:提示“登录成功”并且页面自动跳转到首页。",处理中,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,,,sinkcup,,中,,,,, +21,任务,编制新功能的帮助文档并发布,,未开始,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,,,,,中,,,,, +20,任务,编写脚本将 Excel 中的线下订单转换为商城后台订单,,未开始,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,,,,,中,,,,, +19,任务,注册腾讯云账户,搭建测试环境和生产环境服务器,,处理中,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,第 1 次迭代,3,sinkcup,,中,2021-10-21,,,, +18,用户故事,用户可对未支付的订单执行取消订单操作,,未开始,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,,,,,中,,,,, +17,用户故事,管理员可在商城后台对订单执行发货操作,,未开始,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,,3,,,中,,,,, +16,用户故事,用户可在手机端搜索并查看指定的订单详情,,未开始,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,,1,,,中,,,,, +15,用户故事,通过访问邀请链接可注册成为商城用户,,未开始,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,,,,,中,,,,, +14,用户故事,管理员可取消未发货且状态异常的订单,,未开始,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 2 次迭代,3,,,中,,,,, +13,用户故事,用户可在“个人信息”中编辑个人基本信息,包括修改密码,,未开始,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 2 次迭代,2,sinkcup,,中,,,,, +12,用户故事,管理员可在商城后台搜索订单,,未开始,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 1 次迭代,2,,,中,,,,, +11,用户故事,管理员可在商城后台手工为用户下单,,未开始,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 1 次迭代,5,,,中,2021-10-26,,,, +10,用户故事,用户可在个人中心的“个人信息”中查看个人信息,,已完成,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 1 次迭代,1,,,中,,,,, +9,用户故事,用户可通过短信验证码登录商城,,开发中,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 1 次迭代,,,,中,,,,, +8,子工作项,完成用户注册页面控件并集成后端接口,,处理中,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 1 次迭代,,,,中,2021-10-21,,,, +7,子工作项,完成通过手机号注册用户的接口,,已完成,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 1 次迭代,,,,中,,,,, +6,子工作项,完成手机号注册的短信验证码发送接口,,已完成,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 1 次迭代,,,,中,,,,, +5,用户故事,用户可通过手机号注册账户,,开发中,2021-10-19 11:26:37,sinkcup,2021-10-19 11:26:37,第 1 次迭代,2,sinkcup,,中,2021-10-21,,,, +2,史诗,订单管理,订单管理将实现用户的订单列表查询、订单详情、订单改价、订单地址修改、申请售后、订单取消等功能,未开始,2021-10-19 11:26:37,sinkcup,2021-10-19 11:26:37,,,,,中,,,,,2021-10-19 +1,史诗,用户管理,用户管理将实现用户的注册、邀请、用户查询、个人信息管理、删除用户、注销账户等功能。,未开始,2021-10-19 11:26:37,sinkcup,2021-10-19 11:26:37,,,,,中,,,,,2021-10-19 From 8d970e9089f9addc5a9f49d3b49d1877d44e098f Mon Sep 17 00:00:00 2001 From: sinkcup Date: Wed, 20 Oct 2021 14:01:13 +0800 Subject: [PATCH 11/21] refactor: #72 use fast-excel instead of laravel excel --- app/Commands/IssueImportCommand.php | 5 +- app/Imports/IssuesImport.php | 14 - composer.json | 6 +- composer.lock | 1585 +++++---------------------- config/app.php | 4 +- storage/framework/.gitignore | 2 - 6 files changed, 309 insertions(+), 1307 deletions(-) delete mode 100644 app/Imports/IssuesImport.php delete mode 100644 storage/framework/.gitignore diff --git a/app/Commands/IssueImportCommand.php b/app/Commands/IssueImportCommand.php index f86e206..bb0d7c4 100644 --- a/app/Commands/IssueImportCommand.php +++ b/app/Commands/IssueImportCommand.php @@ -4,9 +4,8 @@ use App\Coding\Issue; use App\Coding\Project; -use App\Imports\IssuesImport; use LaravelZero\Framework\Commands\Command; -use Maatwebsite\Excel\Facades\Excel; +use Rap2hpoutre\FastExcel\Facades\FastExcel; class IssueImportCommand extends Command { @@ -51,7 +50,7 @@ public function handle(Issue $codingIssue, Project $codingProject): int foreach ($result as $item) { $issueTypes[$item['Name']] = $item; } - $rows = Excel::toArray(new IssuesImport(), $filePath)[0]; + $rows = FastExcel::import($filePath); foreach ($rows as $row) { $data = [ 'Type' => $issueTypes[$row['事项类型']]['IssueType'], diff --git a/app/Imports/IssuesImport.php b/app/Imports/IssuesImport.php deleted file mode 100644 index 2327dda..0000000 --- a/app/Imports/IssuesImport.php +++ /dev/null @@ -1,14 +0,0 @@ -=7.2.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2", + "phpunit/phpunit": "^8" + }, + "suggest": { + "ext-iconv": "To handle non UTF-8 CSV files (if \"php-intl\" is not already installed or is too limited)", + "ext-intl": "To handle non UTF-8 CSV files (if \"iconv\" is not already installed)" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Box\\Spout\\": "src/Spout" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Adrien Loison", + "email": "adrien@box.com" + } + ], + "description": "PHP Library to read and write spreadsheet files (CSV, XLSX and ODS), in a fast and scalable way", + "homepage": "https://www.github.com/box/spout", + "keywords": [ + "OOXML", + "csv", + "excel", + "memory", + "odf", + "ods", + "office", + "open", + "php", + "read", + "scale", + "spreadsheet", + "stream", + "write", + "xlsx" + ], + "support": { + "issues": "https://github.com/box/spout/issues", + "source": "https://github.com/box/spout/tree/v3.3.0" + }, + "time": "2021-05-14T21:18:09+00:00" + }, { "name": "brick/math", "version": "0.9.3", @@ -161,86 +235,6 @@ ], "time": "2020-05-29T15:13:26+00:00" }, - { - "name": "doctrine/lexer", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", - "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpstan/phpstan": "^0.11.8", - "phpunit/phpunit": "^8.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", - "homepage": "https://www.doctrine-project.org/projects/lexer.html", - "keywords": [ - "annotations", - "docblock", - "lexer", - "parser", - "php" - ], - "support": { - "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/1.2.1" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", - "type": "tidelift" - } - ], - "time": "2020-05-25T17:44:05+00:00" - }, { "name": "dragonmantank/cron-expression", "version": "v3.1.0", @@ -302,128 +296,6 @@ ], "time": "2020-11-24T19:55:57+00:00" }, - { - "name": "egulias/email-validator", - "version": "2.1.25", - "source": { - "type": "git", - "url": "https://github.com/egulias/EmailValidator.git", - "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/0dbf5d78455d4d6a41d186da50adc1122ec066f4", - "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4", - "shasum": "" - }, - "require": { - "doctrine/lexer": "^1.0.1", - "php": ">=5.5", - "symfony/polyfill-intl-idn": "^1.10" - }, - "require-dev": { - "dominicsayers/isemail": "^3.0.7", - "phpunit/phpunit": "^4.8.36|^7.5.15", - "satooshi/php-coveralls": "^1.0.1" - }, - "suggest": { - "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Egulias\\EmailValidator\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Eduardo Gulias Davis" - } - ], - "description": "A library for validating emails against several RFCs", - "homepage": "https://github.com/egulias/EmailValidator", - "keywords": [ - "email", - "emailvalidation", - "emailvalidator", - "validation", - "validator" - ], - "support": { - "issues": "https://github.com/egulias/EmailValidator/issues", - "source": "https://github.com/egulias/EmailValidator/tree/2.1.25" - }, - "funding": [ - { - "url": "https://github.com/egulias", - "type": "github" - } - ], - "time": "2020-12-29T14:50:06+00:00" - }, - { - "name": "ezyang/htmlpurifier", - "version": "v4.13.0", - "source": { - "type": "git", - "url": "https://github.com/ezyang/htmlpurifier.git", - "reference": "08e27c97e4c6ed02f37c5b2b20488046c8d90d75" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/08e27c97e4c6ed02f37c5b2b20488046c8d90d75", - "reference": "08e27c97e4c6ed02f37c5b2b20488046c8d90d75", - "shasum": "" - }, - "require": { - "php": ">=5.2" - }, - "require-dev": { - "simpletest/simpletest": "dev-master#72de02a7b80c6bb8864ef9bf66d41d2f58f826bd" - }, - "type": "library", - "autoload": { - "psr-0": { - "HTMLPurifier": "library/" - }, - "files": [ - "library/HTMLPurifier.composer.php" - ], - "exclude-from-classmap": [ - "/library/HTMLPurifier/Language/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-2.1-or-later" - ], - "authors": [ - { - "name": "Edward Z. Yang", - "email": "admin@htmlpurifier.org", - "homepage": "http://ezyang.com" - } - ], - "description": "Standards compliant HTML filter written in PHP", - "homepage": "http://htmlpurifier.org/", - "keywords": [ - "html" - ], - "support": { - "issues": "https://github.com/ezyang/htmlpurifier/issues", - "source": "https://github.com/ezyang/htmlpurifier/tree/master" - }, - "time": "2020-06-29T00:56:53+00:00" - }, { "name": "facade/ignition-contracts", "version": "1.0.2", @@ -2011,37 +1883,40 @@ "time": "2021-10-18T13:37:32+00:00" }, { - "name": "illuminate/translation", - "version": "v8.65.0", + "name": "jolicode/jolinotif", + "version": "v2.3.0", "source": { "type": "git", - "url": "https://github.com/illuminate/translation.git", - "reference": "28219a6b98b2f1de529c3a821c4efe494f4247d3" + "url": "https://github.com/jolicode/JoliNotif.git", + "reference": "9cca717bbc47aa2ffeca51d77daa13b824a489ee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/translation/zipball/28219a6b98b2f1de529c3a821c4efe494f4247d3", - "reference": "28219a6b98b2f1de529c3a821c4efe494f4247d3", + "url": "https://api.github.com/repos/jolicode/JoliNotif/zipball/9cca717bbc47aa2ffeca51d77daa13b824a489ee", + "reference": "9cca717bbc47aa2ffeca51d77daa13b824a489ee", "shasum": "" }, "require": { - "ext-json": "*", - "illuminate/collections": "^8.0", - "illuminate/contracts": "^8.0", - "illuminate/filesystem": "^8.0", - "illuminate/macroable": "^8.0", - "illuminate/support": "^8.0", - "php": "^7.3|^8.0" + "php": ">=7.0", + "symfony/process": "^3.3|^4.0|^5.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.0", + "symfony/finder": "^3.3|^4.0|^5.0", + "symfony/phpunit-bridge": "^3.4.26|^4.0|^5.0" }, + "bin": [ + "jolinotif" + ], "type": "library", "extra": { "branch-alias": { - "dev-master": "8.x-dev" + "dev-master": "2.3.x-dev" } }, "autoload": { "psr-4": { - "Illuminate\\Translation\\": "" + "Joli\\JoliNotif\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2050,168 +1925,54 @@ ], "authors": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" + "name": "Loïck Piera", + "email": "pyrech@gmail.com" } ], - "description": "The Illuminate Translation package.", - "homepage": "https://laravel.com", + "description": "Send desktop notifications on Windows, Linux, MacOS.", + "keywords": [ + "MAC", + "growl", + "linux", + "notification", + "windows" + ], "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" + "issues": "https://github.com/jolicode/JoliNotif/issues", + "source": "https://github.com/jolicode/JoliNotif/tree/v2.3.0" }, - "time": "2021-09-15T14:32:50+00:00" + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/jolicode/jolinotif", + "type": "tidelift" + } + ], + "time": "2021-03-07T12:30:00+00:00" }, { - "name": "illuminate/validation", - "version": "v8.65.0", + "name": "laravel-fans/confluence", + "version": "0.1.1", "source": { "type": "git", - "url": "https://github.com/illuminate/validation.git", - "reference": "221e63001f0c698b5df2300224aae6409267d2b9" + "url": "https://github.com/laravel-fans/confluence-sdk-laravel.git", + "reference": "037111ed82450bfa5bfe6a5e2c63c2571f590c5f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/validation/zipball/221e63001f0c698b5df2300224aae6409267d2b9", - "reference": "221e63001f0c698b5df2300224aae6409267d2b9", + "url": "https://api.github.com/repos/laravel-fans/confluence-sdk-laravel/zipball/037111ed82450bfa5bfe6a5e2c63c2571f590c5f", + "reference": "037111ed82450bfa5bfe6a5e2c63c2571f590c5f", "shasum": "" }, "require": { - "egulias/email-validator": "^2.1.10", - "ext-json": "*", - "illuminate/collections": "^8.0", - "illuminate/container": "^8.0", - "illuminate/contracts": "^8.0", - "illuminate/macroable": "^8.0", "illuminate/support": "^8.0", - "illuminate/translation": "^8.0", - "php": "^7.3|^8.0", - "symfony/http-foundation": "^5.1.4", - "symfony/mime": "^5.1.4" + "php": ">=7.4", + "sinkcup/confluence-sdk-php": "^0.1.1" }, - "suggest": { - "illuminate/database": "Required to use the database presence verifier (^8.0)." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "8.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Validation\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Validation package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2021-10-13T13:37:38+00:00" - }, - { - "name": "jolicode/jolinotif", - "version": "v2.3.0", - "source": { - "type": "git", - "url": "https://github.com/jolicode/JoliNotif.git", - "reference": "9cca717bbc47aa2ffeca51d77daa13b824a489ee" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/jolicode/JoliNotif/zipball/9cca717bbc47aa2ffeca51d77daa13b824a489ee", - "reference": "9cca717bbc47aa2ffeca51d77daa13b824a489ee", - "shasum": "" - }, - "require": { - "php": ">=7.0", - "symfony/process": "^3.3|^4.0|^5.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.0", - "symfony/finder": "^3.3|^4.0|^5.0", - "symfony/phpunit-bridge": "^3.4.26|^4.0|^5.0" - }, - "bin": [ - "jolinotif" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Joli\\JoliNotif\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Loïck Piera", - "email": "pyrech@gmail.com" - } - ], - "description": "Send desktop notifications on Windows, Linux, MacOS.", - "keywords": [ - "MAC", - "growl", - "linux", - "notification", - "windows" - ], - "support": { - "issues": "https://github.com/jolicode/JoliNotif/issues", - "source": "https://github.com/jolicode/JoliNotif/tree/v2.3.0" - }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/jolicode/jolinotif", - "type": "tidelift" - } - ], - "time": "2021-03-07T12:30:00+00:00" - }, - { - "name": "laravel-fans/confluence", - "version": "0.1.1", - "source": { - "type": "git", - "url": "https://github.com/laravel-fans/confluence-sdk-laravel.git", - "reference": "037111ed82450bfa5bfe6a5e2c63c2571f590c5f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laravel-fans/confluence-sdk-laravel/zipball/037111ed82450bfa5bfe6a5e2c63c2571f590c5f", - "reference": "037111ed82450bfa5bfe6a5e2c63c2571f590c5f", - "shasum": "" - }, - "require": { - "illuminate/support": "^8.0", - "php": ">=7.4", - "sinkcup/confluence-sdk-php": "^0.1.1" - }, - "require-dev": { - "fakerphp/faker": "^1.14", - "orchestra/testbench": "^6.0", - "phpunit/phpunit": "^9.5", - "squizlabs/php_codesniffer": "^3.6" + "require-dev": { + "fakerphp/faker": "^1.14", + "orchestra/testbench": "^6.0", + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "^3.6" }, "type": "library", "extra": { @@ -2621,324 +2382,6 @@ ], "time": "2021-09-25T08:23:19+00:00" }, - { - "name": "maatwebsite/excel", - "version": "3.1.33", - "source": { - "type": "git", - "url": "https://github.com/Maatwebsite/Laravel-Excel.git", - "reference": "b2de5ba92c5c1ad9415f0eb7c72838fb3eaaa5b8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Maatwebsite/Laravel-Excel/zipball/b2de5ba92c5c1ad9415f0eb7c72838fb3eaaa5b8", - "reference": "b2de5ba92c5c1ad9415f0eb7c72838fb3eaaa5b8", - "shasum": "" - }, - "require": { - "ext-json": "*", - "illuminate/support": "5.8.*|^6.0|^7.0|^8.0", - "php": "^7.0|^8.0", - "phpoffice/phpspreadsheet": "^1.18" - }, - "require-dev": { - "orchestra/testbench": "^6.0", - "predis/predis": "^1.1" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Maatwebsite\\Excel\\ExcelServiceProvider" - ], - "aliases": { - "Excel": "Maatwebsite\\Excel\\Facades\\Excel" - } - } - }, - "autoload": { - "psr-4": { - "Maatwebsite\\Excel\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Patrick Brouwers", - "email": "patrick@maatwebsite.nl" - } - ], - "description": "Supercharged Excel exports and imports in Laravel", - "keywords": [ - "PHPExcel", - "batch", - "csv", - "excel", - "export", - "import", - "laravel", - "php", - "phpspreadsheet" - ], - "support": { - "issues": "https://github.com/Maatwebsite/Laravel-Excel/issues", - "source": "https://github.com/Maatwebsite/Laravel-Excel/tree/3.1.33" - }, - "funding": [ - { - "url": "https://laravel-excel.com/commercial-support", - "type": "custom" - }, - { - "url": "https://github.com/patrickbrouwers", - "type": "github" - } - ], - "time": "2021-08-12T15:52:25+00:00" - }, - { - "name": "maennchen/zipstream-php", - "version": "2.1.0", - "source": { - "type": "git", - "url": "https://github.com/maennchen/ZipStream-PHP.git", - "reference": "c4c5803cc1f93df3d2448478ef79394a5981cc58" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/c4c5803cc1f93df3d2448478ef79394a5981cc58", - "reference": "c4c5803cc1f93df3d2448478ef79394a5981cc58", - "shasum": "" - }, - "require": { - "myclabs/php-enum": "^1.5", - "php": ">= 7.1", - "psr/http-message": "^1.0", - "symfony/polyfill-mbstring": "^1.0" - }, - "require-dev": { - "ext-zip": "*", - "guzzlehttp/guzzle": ">= 6.3", - "mikey179/vfsstream": "^1.6", - "phpunit/phpunit": ">= 7.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "ZipStream\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Paul Duncan", - "email": "pabs@pablotron.org" - }, - { - "name": "Jonatan Männchen", - "email": "jonatan@maennchen.ch" - }, - { - "name": "Jesse Donat", - "email": "donatj@gmail.com" - }, - { - "name": "András Kolesár", - "email": "kolesar@kolesar.hu" - } - ], - "description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.", - "keywords": [ - "stream", - "zip" - ], - "support": { - "issues": "https://github.com/maennchen/ZipStream-PHP/issues", - "source": "https://github.com/maennchen/ZipStream-PHP/tree/master" - }, - "funding": [ - { - "url": "https://opencollective.com/zipstream", - "type": "open_collective" - } - ], - "time": "2020-05-30T13:11:16+00:00" - }, - { - "name": "markbaker/complex", - "version": "2.0.3", - "source": { - "type": "git", - "url": "https://github.com/MarkBaker/PHPComplex.git", - "reference": "6f724d7e04606fd8adaa4e3bb381c3e9db09c946" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/6f724d7e04606fd8adaa4e3bb381c3e9db09c946", - "reference": "6f724d7e04606fd8adaa4e3bb381c3e9db09c946", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "phpcompatibility/php-compatibility": "^9.0", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.3", - "squizlabs/php_codesniffer": "^3.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Complex\\": "classes/src/" - }, - "files": [ - "classes/src/functions/abs.php", - "classes/src/functions/acos.php", - "classes/src/functions/acosh.php", - "classes/src/functions/acot.php", - "classes/src/functions/acoth.php", - "classes/src/functions/acsc.php", - "classes/src/functions/acsch.php", - "classes/src/functions/argument.php", - "classes/src/functions/asec.php", - "classes/src/functions/asech.php", - "classes/src/functions/asin.php", - "classes/src/functions/asinh.php", - "classes/src/functions/atan.php", - "classes/src/functions/atanh.php", - "classes/src/functions/conjugate.php", - "classes/src/functions/cos.php", - "classes/src/functions/cosh.php", - "classes/src/functions/cot.php", - "classes/src/functions/coth.php", - "classes/src/functions/csc.php", - "classes/src/functions/csch.php", - "classes/src/functions/exp.php", - "classes/src/functions/inverse.php", - "classes/src/functions/ln.php", - "classes/src/functions/log2.php", - "classes/src/functions/log10.php", - "classes/src/functions/negative.php", - "classes/src/functions/pow.php", - "classes/src/functions/rho.php", - "classes/src/functions/sec.php", - "classes/src/functions/sech.php", - "classes/src/functions/sin.php", - "classes/src/functions/sinh.php", - "classes/src/functions/sqrt.php", - "classes/src/functions/tan.php", - "classes/src/functions/tanh.php", - "classes/src/functions/theta.php", - "classes/src/operations/add.php", - "classes/src/operations/subtract.php", - "classes/src/operations/multiply.php", - "classes/src/operations/divideby.php", - "classes/src/operations/divideinto.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mark Baker", - "email": "mark@lange.demon.co.uk" - } - ], - "description": "PHP Class for working with complex numbers", - "homepage": "https://github.com/MarkBaker/PHPComplex", - "keywords": [ - "complex", - "mathematics" - ], - "support": { - "issues": "https://github.com/MarkBaker/PHPComplex/issues", - "source": "https://github.com/MarkBaker/PHPComplex/tree/2.0.3" - }, - "time": "2021-06-02T09:44:11+00:00" - }, - { - "name": "markbaker/matrix", - "version": "2.1.3", - "source": { - "type": "git", - "url": "https://github.com/MarkBaker/PHPMatrix.git", - "reference": "174395a901b5ba0925f1d790fa91bab531074b61" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/174395a901b5ba0925f1d790fa91bab531074b61", - "reference": "174395a901b5ba0925f1d790fa91bab531074b61", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "phpcompatibility/php-compatibility": "^9.0", - "phpdocumentor/phpdocumentor": "2.*", - "phploc/phploc": "^4.0", - "phpmd/phpmd": "2.*", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.3", - "sebastian/phpcpd": "^4.0", - "squizlabs/php_codesniffer": "^3.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Matrix\\": "classes/src/" - }, - "files": [ - "classes/src/Functions/adjoint.php", - "classes/src/Functions/antidiagonal.php", - "classes/src/Functions/cofactors.php", - "classes/src/Functions/determinant.php", - "classes/src/Functions/diagonal.php", - "classes/src/Functions/identity.php", - "classes/src/Functions/inverse.php", - "classes/src/Functions/minors.php", - "classes/src/Functions/trace.php", - "classes/src/Functions/transpose.php", - "classes/src/Operations/add.php", - "classes/src/Operations/directsum.php", - "classes/src/Operations/subtract.php", - "classes/src/Operations/multiply.php", - "classes/src/Operations/divideby.php", - "classes/src/Operations/divideinto.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mark Baker", - "email": "mark@demon-angel.eu" - } - ], - "description": "PHP Class for working with matrices", - "homepage": "https://github.com/MarkBaker/PHPMatrix", - "keywords": [ - "mathematics", - "matrix", - "vector" - ], - "support": { - "issues": "https://github.com/MarkBaker/PHPMatrix/issues", - "source": "https://github.com/MarkBaker/PHPMatrix/tree/2.1.3" - }, - "time": "2021-05-25T15:42:17+00:00" - }, { "name": "monolog/monolog", "version": "2.3.5", @@ -3038,66 +2481,6 @@ ], "time": "2021-10-01T21:08:31+00:00" }, - { - "name": "myclabs/php-enum", - "version": "1.8.3", - "source": { - "type": "git", - "url": "https://github.com/myclabs/php-enum.git", - "reference": "b942d263c641ddb5190929ff840c68f78713e937" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/php-enum/zipball/b942d263c641ddb5190929ff840c68f78713e937", - "reference": "b942d263c641ddb5190929ff840c68f78713e937", - "shasum": "" - }, - "require": { - "ext-json": "*", - "php": "^7.3 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.5", - "squizlabs/php_codesniffer": "1.*", - "vimeo/psalm": "^4.6.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "MyCLabs\\Enum\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP Enum contributors", - "homepage": "https://github.com/myclabs/php-enum/graphs/contributors" - } - ], - "description": "PHP Enum implementation", - "homepage": "http://github.com/myclabs/php-enum", - "keywords": [ - "enum" - ], - "support": { - "issues": "https://github.com/myclabs/php-enum/issues", - "source": "https://github.com/myclabs/php-enum/tree/1.8.3" - }, - "funding": [ - { - "url": "https://github.com/mnapoli", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/myclabs/php-enum", - "type": "tidelift" - } - ], - "time": "2021-07-05T08:18:36+00:00" - }, { "name": "nesbot/carbon", "version": "2.53.1", @@ -3408,128 +2791,36 @@ "url": "https://github.com/nunomaduro/laravel-desktop-notifier.git", "reference": "ce17d71c934c42f2e53c308184ac1edf2d17a51a" }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/laravel-desktop-notifier/zipball/ce17d71c934c42f2e53c308184ac1edf2d17a51a", - "reference": "ce17d71c934c42f2e53c308184ac1edf2d17a51a", - "shasum": "" - }, - "require": { - "illuminate/console": "^6.20|^7.29|^8.12", - "illuminate/support": "^6.20|^7.29|^8.12", - "jolicode/jolinotif": "^2.0", - "php": "^7.2.5|^8.0" - }, - "require-dev": { - "graham-campbell/testbench": "^5.5", - "phpunit/phpunit": "^8.5.8|^9.0" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "NunoMaduro\\LaravelDesktopNotifier\\LaravelDesktopNotifierServiceProvider" - ], - "aliases": { - "Notifier": "NunoMaduro\\LaravelDesktopNotifier\\Facaces\\Notifier" - } - } - }, - "autoload": { - "psr-4": { - "NunoMaduro\\LaravelDesktopNotifier\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nuno Maduro", - "email": "enunomaduro@gmail.com" - } - ], - "description": "Send notifications to your desktop from your Laravel commands. An JoliNotif wrapper for Laravel 5.", - "keywords": [ - "JoliNotif", - "Nuno Maduro", - "NunoMaduro", - "artisan", - "console", - "framework", - "laravel", - "notification", - "notifier", - "php", - "wrapper" - ], - "support": { - "issues": "https://github.com/nunomaduro/laravel-desktop-notifier/issues", - "source": "https://github.com/nunomaduro/laravel-desktop-notifier/tree/v2.5.1" - }, - "time": "2020-10-30T15:41:03+00:00" - }, - { - "name": "phpoffice/phpspreadsheet", - "version": "1.18.0", - "source": { - "type": "git", - "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", - "reference": "418cd304e8e6b417ea79c3b29126a25dc4b1170c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/418cd304e8e6b417ea79c3b29126a25dc4b1170c", - "reference": "418cd304e8e6b417ea79c3b29126a25dc4b1170c", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "ext-dom": "*", - "ext-fileinfo": "*", - "ext-gd": "*", - "ext-iconv": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-simplexml": "*", - "ext-xml": "*", - "ext-xmlreader": "*", - "ext-xmlwriter": "*", - "ext-zip": "*", - "ext-zlib": "*", - "ezyang/htmlpurifier": "^4.13", - "maennchen/zipstream-php": "^2.1", - "markbaker/complex": "^2.0", - "markbaker/matrix": "^2.0", - "php": "^7.2 || ^8.0", - "psr/http-client": "^1.0", - "psr/http-factory": "^1.0", - "psr/simple-cache": "^1.0" - }, - "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "dev-master", - "dompdf/dompdf": "^1.0", - "friendsofphp/php-cs-fixer": "^2.18", - "jpgraph/jpgraph": "^4.0", - "mpdf/mpdf": "^8.0", - "phpcompatibility/php-compatibility": "^9.3", - "phpstan/phpstan": "^0.12.82", - "phpstan/phpstan-phpunit": "^0.12.18", - "phpunit/phpunit": "^8.5", - "squizlabs/php_codesniffer": "^3.5", - "tecnickcom/tcpdf": "^6.3" + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/laravel-desktop-notifier/zipball/ce17d71c934c42f2e53c308184ac1edf2d17a51a", + "reference": "ce17d71c934c42f2e53c308184ac1edf2d17a51a", + "shasum": "" }, - "suggest": { - "dompdf/dompdf": "Option for rendering PDF with PDF Writer (doesn't yet support PHP8)", - "jpgraph/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers", - "mpdf/mpdf": "Option for rendering PDF with PDF Writer", - "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer (doesn't yet support PHP8)" + "require": { + "illuminate/console": "^6.20|^7.29|^8.12", + "illuminate/support": "^6.20|^7.29|^8.12", + "jolicode/jolinotif": "^2.0", + "php": "^7.2.5|^8.0" + }, + "require-dev": { + "graham-campbell/testbench": "^5.5", + "phpunit/phpunit": "^8.5.8|^9.0" }, "type": "library", + "extra": { + "laravel": { + "providers": [ + "NunoMaduro\\LaravelDesktopNotifier\\LaravelDesktopNotifierServiceProvider" + ], + "aliases": { + "Notifier": "NunoMaduro\\LaravelDesktopNotifier\\Facaces\\Notifier" + } + } + }, "autoload": { "psr-4": { - "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet" + "NunoMaduro\\LaravelDesktopNotifier\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3538,41 +2829,29 @@ ], "authors": [ { - "name": "Maarten Balliauw", - "homepage": "https://blog.maartenballiauw.be" - }, - { - "name": "Mark Baker", - "homepage": "https://markbakeruk.net" - }, - { - "name": "Franck Lefevre", - "homepage": "https://rootslabs.net" - }, - { - "name": "Erik Tilt" - }, - { - "name": "Adrien Crivelli" + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" } ], - "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine", - "homepage": "https://github.com/PHPOffice/PhpSpreadsheet", + "description": "Send notifications to your desktop from your Laravel commands. An JoliNotif wrapper for Laravel 5.", "keywords": [ - "OpenXML", - "excel", - "gnumeric", - "ods", + "JoliNotif", + "Nuno Maduro", + "NunoMaduro", + "artisan", + "console", + "framework", + "laravel", + "notification", + "notifier", "php", - "spreadsheet", - "xls", - "xlsx" + "wrapper" ], "support": { - "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues", - "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.18.0" + "issues": "https://github.com/nunomaduro/laravel-desktop-notifier/issues", + "source": "https://github.com/nunomaduro/laravel-desktop-notifier/tree/v2.5.1" }, - "time": "2021-05-31T18:21:15+00:00" + "time": "2020-10-30T15:41:03+00:00" }, { "name": "phpoption/phpoption", @@ -4173,6 +3452,69 @@ ], "time": "2021-09-25T23:10:38+00:00" }, + { + "name": "rap2hpoutre/fast-excel", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/rap2hpoutre/fast-excel.git", + "reference": "01e309600b2ead458ce0d4399c70746677b08cca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/rap2hpoutre/fast-excel/zipball/01e309600b2ead458ce0d4399c70746677b08cca", + "reference": "01e309600b2ead458ce0d4399c70746677b08cca", + "shasum": "" + }, + "require": { + "box/spout": "^3", + "illuminate/support": "5.3.* || 5.4.* || 5.5.* || 5.6.* || 5.7.* || 5.8.* || ^6.0 || ^7.0 || ^8.0", + "php": "^7.1|^8.0" + }, + "require-dev": { + "illuminate/database": "^6.20.12 || ^7.30.4 || ^8.24.0", + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Rap2hpoutre\\FastExcel\\Providers\\FastExcelServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Rap2hpoutre\\FastExcel\\": "src/" + }, + "files": [ + "src/functions/fastexcel.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "rap2h", + "email": "raphaelht@gmail.com" + } + ], + "description": "Fast Excel import/export for Laravel", + "keywords": [ + "csv", + "excel", + "laravel", + "xls", + "xlsx" + ], + "support": { + "issues": "https://github.com/rap2hpoutre/fast-excel/issues", + "source": "https://github.com/rap2hpoutre/fast-excel/tree/v3.1.0" + }, + "time": "2021-10-13T20:12:19+00:00" + }, { "name": "sinkcup/confluence-sdk-php", "version": "0.1.1", @@ -4349,173 +3691,32 @@ "psr/log": ">=3", "symfony/dependency-injection": "<4.4", "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", - "symfony/lock": "<4.4", - "symfony/process": "<4.4" - }, - "provide": { - "psr/log-implementation": "1.0|2.0" - }, - "require-dev": { - "psr/log": "^1|^2", - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/event-dispatcher": "^4.4|^5.0", - "symfony/lock": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0", - "symfony/var-dumper": "^4.4|^5.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Eases the creation of beautiful and testable command line interfaces", - "homepage": "https://symfony.com", - "keywords": [ - "cli", - "command line", - "console", - "terminal" - ], - "support": { - "source": "https://github.com/symfony/console/tree/v5.3.7" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-08-25T20:02:16+00:00" - }, - { - "name": "symfony/deprecation-contracts", - "version": "v2.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.4-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "files": [ - "function.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-03-23T23:28:01+00:00" - }, - { - "name": "symfony/error-handler", - "version": "v5.3.7", - "source": { - "type": "git", - "url": "https://github.com/symfony/error-handler.git", - "reference": "3bc60d0fba00ae8d1eaa9eb5ab11a2bbdd1fc321" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/3bc60d0fba00ae8d1eaa9eb5ab11a2bbdd1fc321", - "reference": "3bc60d0fba00ae8d1eaa9eb5ab11a2bbdd1fc321", - "shasum": "" + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" }, - "require": { - "php": ">=7.2.5", - "psr/log": "^1|^2|^3", - "symfony/var-dumper": "^4.4|^5.0" + "provide": { + "psr/log-implementation": "1.0|2.0" }, "require-dev": { - "symfony/deprecation-contracts": "^2.1", - "symfony/http-kernel": "^4.4|^5.0", - "symfony/serializer": "^4.4|^5.0" + "psr/log": "^1|^2", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/event-dispatcher": "^4.4|^5.0", + "symfony/lock": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "symfony/var-dumper": "^4.4|^5.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\ErrorHandler\\": "" + "Symfony\\Component\\Console\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -4535,10 +3736,16 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Provides tools to manage errors and ease debugging PHP code", + "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command line", + "console", + "terminal" + ], "support": { - "source": "https://github.com/symfony/error-handler/tree/v5.3.7" + "source": "https://github.com/symfony/console/tree/v5.3.7" }, "funding": [ { @@ -4554,33 +3761,38 @@ "type": "tidelift" } ], - "time": "2021-08-28T15:07:08+00:00" + "time": "2021-08-25T20:02:16+00:00" }, { - "name": "symfony/finder", - "version": "v5.3.7", + "name": "symfony/deprecation-contracts", + "version": "v2.4.0", "source": { "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93" + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93", - "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" + "php": ">=7.1" }, "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Finder\\": "" + "extra": { + "branch-alias": { + "dev-main": "2.4-dev" }, - "exclude-from-classmap": [ - "/Tests/" + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" ] }, "notification-url": "https://packagist.org/downloads/", @@ -4589,18 +3801,18 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Finds files and directories via an intuitive fluent interface", + "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.3.7" + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" }, "funding": [ { @@ -4616,41 +3828,36 @@ "type": "tidelift" } ], - "time": "2021-08-04T21:20:46+00:00" + "time": "2021-03-23T23:28:01+00:00" }, { - "name": "symfony/http-foundation", + "name": "symfony/error-handler", "version": "v5.3.7", "source": { "type": "git", - "url": "https://github.com/symfony/http-foundation.git", - "reference": "e36c8e5502b4f3f0190c675f1c1f1248a64f04e5" + "url": "https://github.com/symfony/error-handler.git", + "reference": "3bc60d0fba00ae8d1eaa9eb5ab11a2bbdd1fc321" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e36c8e5502b4f3f0190c675f1c1f1248a64f04e5", - "reference": "e36c8e5502b4f3f0190c675f1c1f1248a64f04e5", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/3bc60d0fba00ae8d1eaa9eb5ab11a2bbdd1fc321", + "reference": "3bc60d0fba00ae8d1eaa9eb5ab11a2bbdd1fc321", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php80": "^1.16" + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^4.4|^5.0" }, "require-dev": { - "predis/predis": "~1.0", - "symfony/cache": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/mime": "^4.4|^5.0" - }, - "suggest": { - "symfony/mime": "To use the file extension guesser" + "symfony/deprecation-contracts": "^2.1", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/serializer": "^4.4|^5.0" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\HttpFoundation\\": "" + "Symfony\\Component\\ErrorHandler\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -4670,10 +3877,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Defines an object-oriented layer for the HTTP specification", + "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.3.7" + "source": "https://github.com/symfony/error-handler/tree/v5.3.7" }, "funding": [ { @@ -4689,47 +3896,30 @@ "type": "tidelift" } ], - "time": "2021-08-27T11:20:35+00:00" + "time": "2021-08-28T15:07:08+00:00" }, { - "name": "symfony/mime", - "version": "v5.3.8", + "name": "symfony/finder", + "version": "v5.3.7", "source": { "type": "git", - "url": "https://github.com/symfony/mime.git", - "reference": "a756033d0a7e53db389618653ae991eba5a19a11" + "url": "https://github.com/symfony/finder.git", + "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/a756033d0a7e53db389618653ae991eba5a19a11", - "reference": "a756033d0a7e53db389618653ae991eba5a19a11", + "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-intl-idn": "^1.10", - "symfony/polyfill-mbstring": "^1.0", "symfony/polyfill-php80": "^1.16" }, - "conflict": { - "egulias/email-validator": "~3.0.0", - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0", - "symfony/mailer": "<4.4" - }, - "require-dev": { - "egulias/email-validator": "^2.1.10|^3.1", - "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/property-access": "^4.4|^5.1", - "symfony/property-info": "^4.4|^5.1", - "symfony/serializer": "^5.2" - }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Mime\\": "" + "Symfony\\Component\\Finder\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -4749,14 +3939,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Allows manipulating MIME messages", + "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", - "keywords": [ - "mime", - "mime-type" - ], "support": { - "source": "https://github.com/symfony/mime/tree/v5.3.8" + "source": "https://github.com/symfony/finder/tree/v5.3.7" }, "funding": [ { @@ -4772,7 +3958,7 @@ "type": "tidelift" } ], - "time": "2021-09-10T12:30:38+00:00" + "time": "2021-08-04T21:20:46+00:00" }, { "name": "symfony/polyfill-ctype", @@ -4934,93 +4120,6 @@ ], "time": "2021-05-27T12:26:48+00:00" }, - { - "name": "symfony/polyfill-intl-idn", - "version": "v1.23.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/65bd267525e82759e7d8c4e8ceea44f398838e65", - "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65", - "shasum": "" - }, - "require": { - "php": ">=7.1", - "symfony/polyfill-intl-normalizer": "^1.10", - "symfony/polyfill-php72": "^1.10" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Idn\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Laurent Bassin", - "email": "laurent@bassin.info" - }, - { - "name": "Trevor Rowbotham", - "email": "trevor.rowbotham@pm.me" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "idn", - "intl", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.23.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-05-27T09:27:20+00:00" - }, { "name": "symfony/polyfill-intl-normalizer", "version": "v1.23.0", @@ -5185,82 +4284,6 @@ ], "time": "2021-05-27T12:26:48+00:00" }, - { - "name": "symfony/polyfill-php72", - "version": "v1.23.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "9a142215a36a3888e30d0a9eeea9766764e96976" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976", - "reference": "9a142215a36a3888e30d0a9eeea9766764e96976", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.23.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-05-27T09:17:38+00:00" - }, { "name": "symfony/polyfill-php73", "version": "v1.23.0", diff --git a/config/app.php b/config/app.php index eb38f63..6916200 100644 --- a/config/app.php +++ b/config/app.php @@ -55,11 +55,9 @@ 'providers' => [ App\Providers\AppServiceProvider::class, - Illuminate\Translation\TranslationServiceProvider::class, - Illuminate\Validation\ValidationServiceProvider::class, \LaravelFans\Confluence\ConfluenceServiceProvider::class, \Dscmall\Flysystem\Cos\CosStorageServiceProvider::class, - Maatwebsite\Excel\ExcelServiceProvider::class, + \Rap2hpoutre\FastExcel\Providers\FastExcelServiceProvider::class, ], ]; diff --git a/storage/framework/.gitignore b/storage/framework/.gitignore deleted file mode 100644 index d6b7ef3..0000000 --- a/storage/framework/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore From 8dd02707ca6f4da92ea2ba652d59642137b0d4c0 Mon Sep 17 00:00:00 2001 From: sinkcup Date: Thu, 21 Oct 2021 10:01:36 +0800 Subject: [PATCH 12/21] feat: #72 create iteration when import --- app/Commands/IssueImportCommand.php | 48 ++++++++++++++------ tests/Feature/IssueImportCommandTest.php | 57 +++++++++++++++++++++++- tests/data/coding/scrum-issue-5.csv | 2 + 3 files changed, 91 insertions(+), 16 deletions(-) create mode 100644 tests/data/coding/scrum-issue-5.csv diff --git a/app/Commands/IssueImportCommand.php b/app/Commands/IssueImportCommand.php index bb0d7c4..521cfde 100644 --- a/app/Commands/IssueImportCommand.php +++ b/app/Commands/IssueImportCommand.php @@ -3,6 +3,7 @@ namespace App\Commands; use App\Coding\Issue; +use App\Coding\Iteration; use App\Coding\Project; use LaravelZero\Framework\Commands\Command; use Rap2hpoutre\FastExcel\Facades\FastExcel; @@ -31,11 +32,14 @@ class IssueImportCommand extends Command */ protected $description = '导入事项'; + protected array $iterationMap = []; + protected array $issueTypes = []; + /** * Execute the console command. * */ - public function handle(Issue $codingIssue, Project $codingProject): int + public function handle(Issue $codingIssue, Project $codingProject, Iteration $iteration): int { $this->setCodingApi(); @@ -45,29 +49,45 @@ public function handle(Issue $codingIssue, Project $codingProject): int return 1; } - $result = $codingProject->getIssueTypes($this->codingToken, $this->codingProjectUri); - $issueTypes = []; - foreach ($result as $item) { - $issueTypes[$item['Name']] = $item; - } $rows = FastExcel::import($filePath); foreach ($rows as $row) { - $data = [ - 'Type' => $issueTypes[$row['事项类型']]['IssueType'], - 'IssueTypeId' => $issueTypes[$row['事项类型']]['Id'], - 'Name' => $row['标题'], - 'Priority' => \App\Models\Issue::PRIORITY_MAP[$row['优先级']], - ]; try { - $result = $codingIssue->create($this->codingToken, $this->codingProjectUri, $data); + $iterationResult = $this->createByRow($codingProject, $codingIssue, $iteration, $row); } catch (\Exception $e) { $this->error('Error: ' . $e->getMessage()); return 1; } $this->info("https://{$this->codingTeamDomain}.coding.net/p/{$this->codingProjectUri}" . - "/all/issues/${result['Code']}"); + "/all/issues/${iterationResult['Code']}"); } return 0; } + + private function createByRow(Project $codingProject, Issue $issue, Iteration $iteration, array $row) + { + if (empty($this->issueTypes)) { + $result = $codingProject->getIssueTypes($this->codingToken, $this->codingProjectUri); + foreach ($result as $item) { + $this->issueTypes[$item['Name']] = $item; + } + } + $data = [ + 'Type' => $this->issueTypes[$row['事项类型']]['IssueType'], + 'IssueTypeId' => $this->issueTypes[$row['事项类型']]['Id'], + 'Name' => $row['标题'], + 'Priority' => \App\Models\Issue::PRIORITY_MAP[$row['优先级']], + 'IterationCode' => $row['所属迭代'] ? $this->getIterationCode($iteration, $row['所属迭代']) : null, + ]; + return $issue->create($this->codingToken, $this->codingProjectUri, $data); + } + + private function getIterationCode(Iteration $iteration, string $name) + { + if (!isset($this->iterationMap[$name])) { + $result = $iteration->create($this->codingToken, $this->codingProjectUri, ['name' => $name]); + $this->iterationMap[$name] = $result['Code']; + } + return $this->iterationMap[$name]; + } } diff --git a/tests/Feature/IssueImportCommandTest.php b/tests/Feature/IssueImportCommandTest.php index ccbb869..4272aff 100755 --- a/tests/Feature/IssueImportCommandTest.php +++ b/tests/Feature/IssueImportCommandTest.php @@ -3,19 +3,21 @@ namespace Tests\Feature; use App\Coding\Issue; +use App\Coding\Iteration; use App\Coding\Project; use Tests\TestCase; class IssueImportCommandTest extends TestCase { + private string $codingToken; private string $codingTeamDomain; private string $codingProjectUri; protected function setUp(): void { parent::setUp(); - $codingToken = $this->faker->md5; - config(['coding.token' => $codingToken]); + $this->codingToken = $this->faker->md5; + config(['coding.token' => $this->codingToken]); $this->codingTeamDomain = $this->faker->domainWord; config(['coding.team_domain' => $this->codingTeamDomain]); $this->codingProjectUri = $this->faker->slug; @@ -34,6 +36,8 @@ public function testImportSuccess() $issueMock = \Mockery::mock(Issue::class, [])->makePartial(); $this->instance(Issue::class, $issueMock); + $iterationMock = \Mockery::mock(Iteration::class, [])->makePartial(); + $this->instance(Iteration::class, $iterationMock); $response = json_decode( file_get_contents($this->dataDir . 'coding/' . 'CreateIssueResponse.json'), @@ -44,6 +48,11 @@ public function testImportSuccess() $response['Code'] = $i; $results[] = $response; } + $iterationMock->shouldReceive('create')->times(2)->andReturn(json_decode( + file_get_contents($this->dataDir . 'coding/' . 'CreateIterationResponse.json'), + true + )['Response']['Iteration']); + $issueMock->shouldReceive('create')->times(21)->andReturn(...$results); $this->artisan('issue:import', ['file' => $this->dataDir . 'coding/scrum-issues.csv']) @@ -54,4 +63,48 @@ public function testImportSuccess() ->expectsOutput("https://$this->codingTeamDomain.coding.net/p/$this->codingProjectUri/all/issues/21") ->assertExitCode(0); } + + public function testImportUserStorySuccess() + { + $mock = \Mockery::mock(Project::class, [])->makePartial(); + $this->instance(Project::class, $mock); + + $mock->shouldReceive('getIssueTypes')->times(1)->andReturn(json_decode( + file_get_contents($this->dataDir . 'coding/' . 'DescribeProjectIssueTypeListResponse.json'), + true + )['Response']['IssueTypes']); + + $issueMock = \Mockery::mock(Issue::class, [])->makePartial(); + $this->instance(Issue::class, $issueMock); + $iterationMock = \Mockery::mock(Iteration::class, [])->makePartial(); + $this->instance(Iteration::class, $iterationMock); + + $response = json_decode( + file_get_contents($this->dataDir . 'coding/' . 'CreateIssueResponse.json'), + true + )['Response']['Issue']; + $response['Code'] = $this->faker->randomNumber(); + $result = $response; + $iterationMock->shouldReceive('create')->times(1)->andReturn(json_decode( + file_get_contents($this->dataDir . 'coding/' . 'CreateIterationResponse.json'), + true + )['Response']['Iteration']); + + $issueMock->shouldReceive('create')->times(1)->withArgs([ + $this->codingToken, + $this->codingProjectUri, + [ + 'Type' => 'REQUIREMENT', + 'IssueTypeId' => 213218, + 'Name' => '用户可通过手机号注册账户', + 'Priority' => "1", + 'IterationCode' => 2746, + ] + ])->andReturn($result); + + $this->artisan('issue:import', ['file' => $this->dataDir . 'coding/scrum-issue-5.csv']) + ->expectsOutput("https://$this->codingTeamDomain.coding.net/p/$this->codingProjectUri/all/issues/" . + $result['Code']) + ->assertExitCode(0); + } } diff --git a/tests/data/coding/scrum-issue-5.csv b/tests/data/coding/scrum-issue-5.csv new file mode 100644 index 0000000..437de0e --- /dev/null +++ b/tests/data/coding/scrum-issue-5.csv @@ -0,0 +1,2 @@ +ID,事项类型,标题,描述,状态,创建时间,创建人,更新时间,所属迭代,故事点,处理人,缺陷类型,优先级,截止日期,模块,标签,关注人,开始日期 +5,用户故事,用户可通过手机号注册账户,,开发中,2021-10-19 11:26:37,sinkcup,2021-10-19 11:26:37,第 1 次迭代,2,sinkcup,,中,2021-10-21,,,, From 7cbbbf654c203ef4601a281018f5977675826b35 Mon Sep 17 00:00:00 2001 From: sinkcup Date: Thu, 21 Oct 2021 10:18:01 +0800 Subject: [PATCH 13/21] fix: Undefined array key Iteration --- app/Coding/Iteration.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/Coding/Iteration.php b/app/Coding/Iteration.php index e315698..d105293 100644 --- a/app/Coding/Iteration.php +++ b/app/Coding/Iteration.php @@ -3,6 +3,7 @@ namespace App\Coding; use Carbon\Carbon; +use Exception; class Iteration extends Base { @@ -20,6 +21,9 @@ public function create($token, $projectName, $data) ], $data), ]); $result = json_decode($response->getBody(), true); + if (isset($result['Response']['Error']['Message'])) { + throw new Exception($result['Response']['Error']['Message']); + } return $result['Response']['Iteration']; } From 5bc4e6e6ed5e9c8618fd10ffa09b8b4d7e981efd Mon Sep 17 00:00:00 2001 From: sinkcup Date: Thu, 21 Oct 2021 12:43:58 +0800 Subject: [PATCH 14/21] feat: #72 issue parent code --- app/Commands/IssueImportCommand.php | 18 +++- tests/Feature/IssueImportCommandTest.php | 105 +++++++++++++++++++---- tests/data/coding/scrum-issues-5-6-7.csv | 4 + tests/data/coding/scrum-issues.csv | 60 ++++++------- 4 files changed, 136 insertions(+), 51 deletions(-) create mode 100644 tests/data/coding/scrum-issues-5-6-7.csv diff --git a/app/Commands/IssueImportCommand.php b/app/Commands/IssueImportCommand.php index 521cfde..6f9ee26 100644 --- a/app/Commands/IssueImportCommand.php +++ b/app/Commands/IssueImportCommand.php @@ -34,6 +34,7 @@ class IssueImportCommand extends Command protected array $iterationMap = []; protected array $issueTypes = []; + protected array $issueCodeMap = []; /** * Execute the console command. @@ -50,21 +51,25 @@ public function handle(Issue $codingIssue, Project $codingProject, Iteration $it } $rows = FastExcel::import($filePath); + if (!empty($rows) && isset($rows[0]['ID'])) { + $rows = $rows->sortBy('ID'); + } foreach ($rows as $row) { try { - $iterationResult = $this->createByRow($codingProject, $codingIssue, $iteration, $row); + $issueResult = $this->createIssueByRow($codingProject, $codingIssue, $iteration, $row); } catch (\Exception $e) { $this->error('Error: ' . $e->getMessage()); return 1; } + $this->info('标题:' . $row['标题']); $this->info("https://{$this->codingTeamDomain}.coding.net/p/{$this->codingProjectUri}" . - "/all/issues/${iterationResult['Code']}"); + "/all/issues/${issueResult['Code']}"); } return 0; } - private function createByRow(Project $codingProject, Issue $issue, Iteration $iteration, array $row) + private function createIssueByRow(Project $codingProject, Issue $issue, Iteration $iteration, array $row) { if (empty($this->issueTypes)) { $result = $codingProject->getIssueTypes($this->codingToken, $this->codingProjectUri); @@ -78,8 +83,13 @@ private function createByRow(Project $codingProject, Issue $issue, Iteration $it 'Name' => $row['标题'], 'Priority' => \App\Models\Issue::PRIORITY_MAP[$row['优先级']], 'IterationCode' => $row['所属迭代'] ? $this->getIterationCode($iteration, $row['所属迭代']) : null, + 'ParentCode' => !empty($row['ParentCode']) ? $this->issueCodeMap[$row['ParentCode']] : null, ]; - return $issue->create($this->codingToken, $this->codingProjectUri, $data); + $result = $issue->create($this->codingToken, $this->codingProjectUri, $data); + if (isset($row['ID'])) { + $this->issueCodeMap[$row['ID']] = intval($result['Code']); + } + return $result; } private function getIterationCode(Iteration $iteration, string $name) diff --git a/tests/Feature/IssueImportCommandTest.php b/tests/Feature/IssueImportCommandTest.php index 4272aff..4ba704d 100755 --- a/tests/Feature/IssueImportCommandTest.php +++ b/tests/Feature/IssueImportCommandTest.php @@ -9,19 +9,19 @@ class IssueImportCommandTest extends TestCase { - private string $codingToken; - private string $codingTeamDomain; - private string $codingProjectUri; + private string $token; + private string $teamDomain; + private string $projectUri; protected function setUp(): void { parent::setUp(); - $this->codingToken = $this->faker->md5; - config(['coding.token' => $this->codingToken]); - $this->codingTeamDomain = $this->faker->domainWord; - config(['coding.team_domain' => $this->codingTeamDomain]); - $this->codingProjectUri = $this->faker->slug; - config(['coding.project_uri' => $this->codingProjectUri]); + $this->token = $this->faker->md5; + config(['coding.token' => $this->token]); + $this->teamDomain = $this->faker->domainWord; + config(['coding.team_domain' => $this->teamDomain]); + $this->projectUri = $this->faker->slug; + config(['coding.project_uri' => $this->projectUri]); } public function testImportSuccess() @@ -56,11 +56,11 @@ public function testImportSuccess() $issueMock->shouldReceive('create')->times(21)->andReturn(...$results); $this->artisan('issue:import', ['file' => $this->dataDir . 'coding/scrum-issues.csv']) - ->expectsOutput("https://$this->codingTeamDomain.coding.net/p/$this->codingProjectUri/all/issues/1") - ->expectsOutput("https://$this->codingTeamDomain.coding.net/p/$this->codingProjectUri/all/issues/2") - ->expectsOutput("https://$this->codingTeamDomain.coding.net/p/$this->codingProjectUri/all/issues/3") - ->expectsOutput("https://$this->codingTeamDomain.coding.net/p/$this->codingProjectUri/all/issues/20") - ->expectsOutput("https://$this->codingTeamDomain.coding.net/p/$this->codingProjectUri/all/issues/21") + ->expectsOutput("https://$this->teamDomain.coding.net/p/$this->projectUri/all/issues/1") + ->expectsOutput("https://$this->teamDomain.coding.net/p/$this->projectUri/all/issues/2") + ->expectsOutput("https://$this->teamDomain.coding.net/p/$this->projectUri/all/issues/3") + ->expectsOutput("https://$this->teamDomain.coding.net/p/$this->projectUri/all/issues/20") + ->expectsOutput("https://$this->teamDomain.coding.net/p/$this->projectUri/all/issues/21") ->assertExitCode(0); } @@ -91,20 +91,91 @@ public function testImportUserStorySuccess() )['Response']['Iteration']); $issueMock->shouldReceive('create')->times(1)->withArgs([ - $this->codingToken, - $this->codingProjectUri, + $this->token, + $this->projectUri, [ 'Type' => 'REQUIREMENT', 'IssueTypeId' => 213218, 'Name' => '用户可通过手机号注册账户', 'Priority' => "1", 'IterationCode' => 2746, + 'ParentCode' => null, ] ])->andReturn($result); $this->artisan('issue:import', ['file' => $this->dataDir . 'coding/scrum-issue-5.csv']) - ->expectsOutput("https://$this->codingTeamDomain.coding.net/p/$this->codingProjectUri/all/issues/" . + ->expectsOutput('标题:用户可通过手机号注册账户') + ->expectsOutput("https://$this->teamDomain.coding.net/p/$this->projectUri/all/issues/" . $result['Code']) ->assertExitCode(0); } + + public function testImportSubTask() + { + $mock = \Mockery::mock(Project::class, [])->makePartial(); + $this->instance(Project::class, $mock); + + $mock->shouldReceive('getIssueTypes')->times(1)->andReturn(json_decode( + file_get_contents($this->dataDir . 'coding/' . 'DescribeProjectIssueTypeListResponse.json'), + true + )['Response']['IssueTypes']); + + $issueMock = \Mockery::mock(Issue::class, [])->makePartial(); + $this->instance(Issue::class, $issueMock); + + $response = json_decode( + file_get_contents($this->dataDir . 'coding/' . 'CreateIssueResponse.json'), + true + )['Response']['Issue']; + + $parentIssue = $response; + $issueMock->shouldReceive('create')->times(1)->withArgs([ + $this->token, + $this->projectUri, + [ + 'Type' => 'REQUIREMENT', + 'IssueTypeId' => 213218, + 'Name' => '用户可通过手机号注册账户', + 'Priority' => "1", + 'IterationCode' => null, + 'ParentCode' => null, + ] + ])->andReturn($parentIssue); + + $subTask1 = $response; + $subTask1['Code'] = $this->faker->randomNumber(); + $issueMock->shouldReceive('create')->times(1)->withArgs([ + $this->token, + $this->projectUri, + [ + 'Type' => 'SUB_TASK', + 'IssueTypeId' => 213222, + 'Name' => '完成手机号注册的短信验证码发送接口', + 'Priority' => "1", + 'IterationCode' => null, + 'ParentCode' => 2742, + ] + ])->andReturn($subTask1); + + $subTask2 = $response; + $subTask2['Code'] = $this->faker->randomNumber(); + $issueMock->shouldReceive('create')->times(1)->withArgs([ + $this->token, + $this->projectUri, + [ + 'Type' => 'SUB_TASK', + 'IssueTypeId' => 213222, + 'Name' => '完成通过手机号注册用户的接口', + 'Priority' => "1", + 'IterationCode' => null, + 'ParentCode' => 2742, + ] + ])->andReturn($subTask2); + + $this->artisan('issue:import', ['file' => $this->dataDir . 'coding/scrum-issues-5-6-7.csv']) + ->expectsOutput("https://$this->teamDomain.coding.net/p/$this->projectUri/all/issues/2742") + ->expectsOutput("https://$this->teamDomain.coding.net/p/$this->projectUri/all/issues/" . $subTask1['Code']) + ->expectsOutput("https://$this->teamDomain.coding.net/p/$this->projectUri/all/issues/" . $subTask2['Code']) + ->assertExitCode(0); + } } diff --git a/tests/data/coding/scrum-issues-5-6-7.csv b/tests/data/coding/scrum-issues-5-6-7.csv new file mode 100644 index 0000000..d8fabc1 --- /dev/null +++ b/tests/data/coding/scrum-issues-5-6-7.csv @@ -0,0 +1,4 @@ +ID,ParentCode,事项类型,标题,描述,状态,创建时间,创建人,更新时间,所属迭代,故事点,处理人,缺陷类型,优先级,截止日期,模块,标签,关注人,开始日期 +7,5,子工作项,完成通过手机号注册用户的接口,,已完成,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,,,,,中,,,,, +6,5,子工作项,完成手机号注册的短信验证码发送接口,,已完成,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,,,,,中,,,,, +5,,用户故事,用户可通过手机号注册账户,,开发中,2021-10-19 11:26:37,sinkcup,2021-10-19 11:26:37,,2,sinkcup,,中,2021-10-21,,,, diff --git a/tests/data/coding/scrum-issues.csv b/tests/data/coding/scrum-issues.csv index 2fe8c30..41207dc 100644 --- a/tests/data/coding/scrum-issues.csv +++ b/tests/data/coding/scrum-issues.csv @@ -1,32 +1,32 @@ -ID,事项类型,标题,描述,状态,创建时间,创建人,更新时间,所属迭代,故事点,处理人,缺陷类型,优先级,截止日期,模块,标签,关注人,开始日期 -23,缺陷,商品详情页中商品价格字体应当显示为红色并且加粗,"步骤: - -测试环境中,打开商品列表页; -点击任意商品进详情页。 -测试结果:商品的价格字体显示为正常大小,颜色为黑色。 +ID,ParentCode,事项类型,标题,描述,状态,创建时间,创建人,更新时间,所属迭代,故事点,处理人,缺陷类型,优先级,截止日期,模块,标签,关注人,开始日期 +23,,缺陷,商品详情页中商品价格字体应当显示为红色并且加粗,"步骤: + +测试环境中,打开商品列表页; +点击任意商品进详情页。 +测试结果:商品的价格字体显示为正常大小,颜色为黑色。 预期结果:商品价格字体为红色加粗。",待处理,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,,,,,中,,,,, -22,缺陷,登录页输入正确的用户名和密码后提示“用户不存在”,"步骤: -测试环境中,输入URL https://mywebsite.com/login 进入登录页; -输入用户名 Admin 和密码 mypassword; -点击“登录”按钮。 -测试结果:页面提示“用户不存在”。 +22,,缺陷,登录页输入正确的用户名和密码后提示“用户不存在”,"步骤: +测试环境中,输入URL https://mywebsite.com/login 进入登录页; +输入用户名 Admin 和密码 mypassword; +点击“登录”按钮。 +测试结果:页面提示“用户不存在”。 预期结果:提示“登录成功”并且页面自动跳转到首页。",处理中,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,,,sinkcup,,中,,,,, -21,任务,编制新功能的帮助文档并发布,,未开始,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,,,,,中,,,,, -20,任务,编写脚本将 Excel 中的线下订单转换为商城后台订单,,未开始,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,,,,,中,,,,, -19,任务,注册腾讯云账户,搭建测试环境和生产环境服务器,,处理中,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,第 1 次迭代,3,sinkcup,,中,2021-10-21,,,, -18,用户故事,用户可对未支付的订单执行取消订单操作,,未开始,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,,,,,中,,,,, -17,用户故事,管理员可在商城后台对订单执行发货操作,,未开始,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,,3,,,中,,,,, -16,用户故事,用户可在手机端搜索并查看指定的订单详情,,未开始,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,,1,,,中,,,,, -15,用户故事,通过访问邀请链接可注册成为商城用户,,未开始,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,,,,,中,,,,, -14,用户故事,管理员可取消未发货且状态异常的订单,,未开始,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 2 次迭代,3,,,中,,,,, -13,用户故事,用户可在“个人信息”中编辑个人基本信息,包括修改密码,,未开始,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 2 次迭代,2,sinkcup,,中,,,,, -12,用户故事,管理员可在商城后台搜索订单,,未开始,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 1 次迭代,2,,,中,,,,, -11,用户故事,管理员可在商城后台手工为用户下单,,未开始,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 1 次迭代,5,,,中,2021-10-26,,,, -10,用户故事,用户可在个人中心的“个人信息”中查看个人信息,,已完成,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 1 次迭代,1,,,中,,,,, -9,用户故事,用户可通过短信验证码登录商城,,开发中,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 1 次迭代,,,,中,,,,, -8,子工作项,完成用户注册页面控件并集成后端接口,,处理中,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 1 次迭代,,,,中,2021-10-21,,,, -7,子工作项,完成通过手机号注册用户的接口,,已完成,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 1 次迭代,,,,中,,,,, -6,子工作项,完成手机号注册的短信验证码发送接口,,已完成,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 1 次迭代,,,,中,,,,, -5,用户故事,用户可通过手机号注册账户,,开发中,2021-10-19 11:26:37,sinkcup,2021-10-19 11:26:37,第 1 次迭代,2,sinkcup,,中,2021-10-21,,,, -2,史诗,订单管理,订单管理将实现用户的订单列表查询、订单详情、订单改价、订单地址修改、申请售后、订单取消等功能,未开始,2021-10-19 11:26:37,sinkcup,2021-10-19 11:26:37,,,,,中,,,,,2021-10-19 -1,史诗,用户管理,用户管理将实现用户的注册、邀请、用户查询、个人信息管理、删除用户、注销账户等功能。,未开始,2021-10-19 11:26:37,sinkcup,2021-10-19 11:26:37,,,,,中,,,,,2021-10-19 +21,,任务,编制新功能的帮助文档并发布,,未开始,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,,,,,中,,,,, +20,,任务,编写脚本将 Excel 中的线下订单转换为商城后台订单,,未开始,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,,,,,中,,,,, +19,,任务,注册腾讯云账户,搭建测试环境和生产环境服务器,,处理中,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,第 1 次迭代,3,sinkcup,,中,2021-10-21,,,, +18,,用户故事,用户可对未支付的订单执行取消订单操作,,未开始,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,,,,,中,,,,, +17,,用户故事,管理员可在商城后台对订单执行发货操作,,未开始,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,,3,,,中,,,,, +16,,用户故事,用户可在手机端搜索并查看指定的订单详情,,未开始,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,,1,,,中,,,,, +15,,用户故事,通过访问邀请链接可注册成为商城用户,,未开始,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,,,,,中,,,,, +14,,用户故事,管理员可取消未发货且状态异常的订单,,未开始,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 2 次迭代,3,,,中,,,,, +13,,用户故事,用户可在“个人信息”中编辑个人基本信息,包括修改密码,,未开始,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 2 次迭代,2,sinkcup,,中,,,,, +12,,用户故事,管理员可在商城后台搜索订单,,未开始,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 1 次迭代,2,,,中,,,,, +11,,用户故事,管理员可在商城后台手工为用户下单,,未开始,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 1 次迭代,5,,,中,2021-10-26,,,, +10,,用户故事,用户可在个人中心的“个人信息”中查看个人信息,,已完成,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 1 次迭代,1,,,中,,,,, +9,,用户故事,用户可通过短信验证码登录商城,,开发中,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 1 次迭代,,,,中,,,,, +8,5,子工作项,完成用户注册页面控件并集成后端接口,,处理中,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 1 次迭代,,,,中,2021-10-21,,,, +7,5,子工作项,完成通过手机号注册用户的接口,,已完成,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 1 次迭代,,,,中,,,,, +6,5,子工作项,完成手机号注册的短信验证码发送接口,,已完成,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 1 次迭代,,,,中,,,,, +5,,用户故事,用户可通过手机号注册账户,,开发中,2021-10-19 11:26:37,sinkcup,2021-10-19 11:26:37,第 1 次迭代,2,sinkcup,,中,2021-10-21,,,, +2,,史诗,订单管理,订单管理将实现用户的订单列表查询、订单详情、订单改价、订单地址修改、申请售后、订单取消等功能,未开始,2021-10-19 11:26:37,sinkcup,2021-10-19 11:26:37,,,,,中,,,,,2021-10-19 +1,,史诗,用户管理,用户管理将实现用户的注册、邀请、用户查询、个人信息管理、删除用户、注销账户等功能。,未开始,2021-10-19 11:26:37,sinkcup,2021-10-19 11:26:37,,,,,中,,,,,2021-10-19 From 53954cf88f252a5f141f903b6762340ba78527bb Mon Sep 17 00:00:00 2001 From: sinkcup Date: Thu, 21 Oct 2021 14:22:19 +0800 Subject: [PATCH 15/21] feat: #72 error when issue type not exists --- app/Commands/IssueImportCommand.php | 6 +++++- tests/Feature/IssueImportCommandTest.php | 11 +++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/app/Commands/IssueImportCommand.php b/app/Commands/IssueImportCommand.php index 6f9ee26..364a694 100644 --- a/app/Commands/IssueImportCommand.php +++ b/app/Commands/IssueImportCommand.php @@ -5,6 +5,7 @@ use App\Coding\Issue; use App\Coding\Iteration; use App\Coding\Project; +use Exception; use LaravelZero\Framework\Commands\Command; use Rap2hpoutre\FastExcel\Facades\FastExcel; @@ -57,7 +58,7 @@ public function handle(Issue $codingIssue, Project $codingProject, Iteration $it foreach ($rows as $row) { try { $issueResult = $this->createIssueByRow($codingProject, $codingIssue, $iteration, $row); - } catch (\Exception $e) { + } catch (Exception $e) { $this->error('Error: ' . $e->getMessage()); return 1; } @@ -77,6 +78,9 @@ private function createIssueByRow(Project $codingProject, Issue $issue, Iteratio $this->issueTypes[$item['Name']] = $item; } } + if (!isset($this->issueTypes[$row['事项类型']])) { + throw new Exception('「' . $row['事项类型'] . '」类型不存在,请在项目设置中添加'); + } $data = [ 'Type' => $this->issueTypes[$row['事项类型']]['IssueType'], 'IssueTypeId' => $this->issueTypes[$row['事项类型']]['Id'], diff --git a/tests/Feature/IssueImportCommandTest.php b/tests/Feature/IssueImportCommandTest.php index 4ba704d..c4b7352 100755 --- a/tests/Feature/IssueImportCommandTest.php +++ b/tests/Feature/IssueImportCommandTest.php @@ -178,4 +178,15 @@ public function testImportSubTask() ->expectsOutput("https://$this->teamDomain.coding.net/p/$this->projectUri/all/issues/" . $subTask2['Code']) ->assertExitCode(0); } + + public function testImportFailedIssueTypeNotExists() + { + $mock = \Mockery::mock(Project::class, [])->makePartial(); + $this->instance(Project::class, $mock); + $mock->shouldReceive('getIssueTypes')->times(1)->andReturn([]); + + $this->artisan('issue:import', ['file' => $this->dataDir . 'coding/scrum-issues.csv']) + ->expectsOutput('Error: 「史诗」类型不存在,请在项目设置中添加') + ->assertExitCode(1); + } } From 19d210d153b29b364d78eaf222de6576a2923195 Mon Sep 17 00:00:00 2001 From: sinkcup Date: Thu, 21 Oct 2021 15:25:08 +0800 Subject: [PATCH 16/21] feat: #72 desc, date and StoryPoint --- app/Commands/IssueImportCommand.php | 31 +++++++++++++++++++++--- tests/Feature/IssueImportCommandTest.php | 12 ++++----- tests/data/coding/scrum-issues-5-6-7.csv | 8 +++--- 3 files changed, 36 insertions(+), 15 deletions(-) diff --git a/app/Commands/IssueImportCommand.php b/app/Commands/IssueImportCommand.php index 364a694..01bd96c 100644 --- a/app/Commands/IssueImportCommand.php +++ b/app/Commands/IssueImportCommand.php @@ -70,7 +70,7 @@ public function handle(Issue $codingIssue, Project $codingProject, Iteration $it return 0; } - private function createIssueByRow(Project $codingProject, Issue $issue, Iteration $iteration, array $row) + private function getIssueTypes(Project $codingProject, $row): void { if (empty($this->issueTypes)) { $result = $codingProject->getIssueTypes($this->codingToken, $this->codingProjectUri); @@ -81,14 +81,37 @@ private function createIssueByRow(Project $codingProject, Issue $issue, Iteratio if (!isset($this->issueTypes[$row['事项类型']])) { throw new Exception('「' . $row['事项类型'] . '」类型不存在,请在项目设置中添加'); } + } + + private function createIssueByRow(Project $codingProject, Issue $issue, Iteration $iteration, array $row) + { + $this->getIssueTypes($codingProject, $row); $data = [ 'Type' => $this->issueTypes[$row['事项类型']]['IssueType'], 'IssueTypeId' => $this->issueTypes[$row['事项类型']]['Id'], 'Name' => $row['标题'], - 'Priority' => \App\Models\Issue::PRIORITY_MAP[$row['优先级']], - 'IterationCode' => $row['所属迭代'] ? $this->getIterationCode($iteration, $row['所属迭代']) : null, - 'ParentCode' => !empty($row['ParentCode']) ? $this->issueCodeMap[$row['ParentCode']] : null, ]; + if (!empty($row['优先级'])) { + $data['Priority'] = \App\Models\Issue::PRIORITY_MAP[$row['优先级']]; + } + if (!empty($row['所属迭代'])) { + $data['IterationCode'] = $this->getIterationCode($iteration, $row['所属迭代']); + } + if (!empty($row['ParentCode'])) { + $data['ParentCode'] = $this->issueCodeMap[$row['ParentCode']]; + } + foreach ( + [ + 'Description' => '描述', + 'DueDate' => '截止日期', + 'StartDate' => '开始日期', + 'StoryPoint' => '故事点', + ] as $english => $chinese + ) { + if (!empty($row[$chinese])) { + $data[$english] = $row[$chinese]; + } + } $result = $issue->create($this->codingToken, $this->codingProjectUri, $data); if (isset($row['ID'])) { $this->issueCodeMap[$row['ID']] = intval($result['Code']); diff --git a/tests/Feature/IssueImportCommandTest.php b/tests/Feature/IssueImportCommandTest.php index c4b7352..13f6990 100755 --- a/tests/Feature/IssueImportCommandTest.php +++ b/tests/Feature/IssueImportCommandTest.php @@ -99,7 +99,8 @@ public function testImportUserStorySuccess() 'Name' => '用户可通过手机号注册账户', 'Priority' => "1", 'IterationCode' => 2746, - 'ParentCode' => null, + 'DueDate' => '2021-10-21', + 'StoryPoint' => '2', ] ])->andReturn($result); @@ -136,9 +137,8 @@ public function testImportSubTask() 'Type' => 'REQUIREMENT', 'IssueTypeId' => 213218, 'Name' => '用户可通过手机号注册账户', - 'Priority' => "1", - 'IterationCode' => null, - 'ParentCode' => null, + 'DueDate' => '2021-10-21', + 'StoryPoint' => '2', ] ])->andReturn($parentIssue); @@ -151,8 +151,7 @@ public function testImportSubTask() 'Type' => 'SUB_TASK', 'IssueTypeId' => 213222, 'Name' => '完成手机号注册的短信验证码发送接口', - 'Priority' => "1", - 'IterationCode' => null, + 'Priority' => "0", 'ParentCode' => 2742, ] ])->andReturn($subTask1); @@ -167,7 +166,6 @@ public function testImportSubTask() 'IssueTypeId' => 213222, 'Name' => '完成通过手机号注册用户的接口', 'Priority' => "1", - 'IterationCode' => null, 'ParentCode' => 2742, ] ])->andReturn($subTask2); diff --git a/tests/data/coding/scrum-issues-5-6-7.csv b/tests/data/coding/scrum-issues-5-6-7.csv index d8fabc1..a16f269 100644 --- a/tests/data/coding/scrum-issues-5-6-7.csv +++ b/tests/data/coding/scrum-issues-5-6-7.csv @@ -1,4 +1,4 @@ -ID,ParentCode,事项类型,标题,描述,状态,创建时间,创建人,更新时间,所属迭代,故事点,处理人,缺陷类型,优先级,截止日期,模块,标签,关注人,开始日期 -7,5,子工作项,完成通过手机号注册用户的接口,,已完成,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,,,,,中,,,,, -6,5,子工作项,完成手机号注册的短信验证码发送接口,,已完成,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,,,,,中,,,,, -5,,用户故事,用户可通过手机号注册账户,,开发中,2021-10-19 11:26:37,sinkcup,2021-10-19 11:26:37,,2,sinkcup,,中,2021-10-21,,,, +ID,ParentCode,事项类型,标题,描述,状态,创建时间,创建人,更新时间,所属迭代,故事点,处理人,缺陷类型,优先级,截止日期,模块,标签,关注人,开始日期 +7,5,子工作项,完成通过手机号注册用户的接口,,已完成,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,,,,,中,,,,, +6,5,子工作项,完成手机号注册的短信验证码发送接口,,已完成,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,,,,,低,,,,, +5,,用户故事,用户可通过手机号注册账户,,开发中,2021-10-19 11:26:37,sinkcup,2021-10-19 11:26:37,,2,sinkcup,,,2021-10-21,,,, From 27bf9be93361124336f76f253c873729afe28d27 Mon Sep 17 00:00:00 2001 From: sinkcup Date: Thu, 21 Oct 2021 15:37:24 +0800 Subject: [PATCH 17/21] refactor: #72 rename to project setting --- app/Coding/{Project.php => ProjectSetting.php} | 2 +- app/Commands/IssueImportCommand.php | 14 +++++++------- app/Commands/ProjectGetIssueTypesCommand.php | 6 +++--- tests/Feature/IssueImportCommandTest.php | 18 +++++++++--------- .../ProjectGetIssueTypesCommandTest.php | 6 +++--- tests/Unit/CodingProjectTest.php | 4 ++-- 6 files changed, 25 insertions(+), 25 deletions(-) rename app/Coding/{Project.php => ProjectSetting.php} (95%) diff --git a/app/Coding/Project.php b/app/Coding/ProjectSetting.php similarity index 95% rename from app/Coding/Project.php rename to app/Coding/ProjectSetting.php index 49eebc0..ecfaa48 100644 --- a/app/Coding/Project.php +++ b/app/Coding/ProjectSetting.php @@ -2,7 +2,7 @@ namespace App\Coding; -class Project extends Base +class ProjectSetting extends Base { public function getIssueTypes($token, $projectName) { diff --git a/app/Commands/IssueImportCommand.php b/app/Commands/IssueImportCommand.php index 01bd96c..5049e0a 100644 --- a/app/Commands/IssueImportCommand.php +++ b/app/Commands/IssueImportCommand.php @@ -4,7 +4,7 @@ use App\Coding\Issue; use App\Coding\Iteration; -use App\Coding\Project; +use App\Coding\ProjectSetting; use Exception; use LaravelZero\Framework\Commands\Command; use Rap2hpoutre\FastExcel\Facades\FastExcel; @@ -41,7 +41,7 @@ class IssueImportCommand extends Command * Execute the console command. * */ - public function handle(Issue $codingIssue, Project $codingProject, Iteration $iteration): int + public function handle(Issue $codingIssue, ProjectSetting $projectSetting, Iteration $iteration): int { $this->setCodingApi(); @@ -57,7 +57,7 @@ public function handle(Issue $codingIssue, Project $codingProject, Iteration $it } foreach ($rows as $row) { try { - $issueResult = $this->createIssueByRow($codingProject, $codingIssue, $iteration, $row); + $issueResult = $this->createIssueByRow($projectSetting, $codingIssue, $iteration, $row); } catch (Exception $e) { $this->error('Error: ' . $e->getMessage()); return 1; @@ -70,10 +70,10 @@ public function handle(Issue $codingIssue, Project $codingProject, Iteration $it return 0; } - private function getIssueTypes(Project $codingProject, $row): void + private function getIssueTypes(ProjectSetting $projectSetting, array $row): void { if (empty($this->issueTypes)) { - $result = $codingProject->getIssueTypes($this->codingToken, $this->codingProjectUri); + $result = $projectSetting->getIssueTypes($this->codingToken, $this->codingProjectUri); foreach ($result as $item) { $this->issueTypes[$item['Name']] = $item; } @@ -83,9 +83,9 @@ private function getIssueTypes(Project $codingProject, $row): void } } - private function createIssueByRow(Project $codingProject, Issue $issue, Iteration $iteration, array $row) + private function createIssueByRow(ProjectSetting $projectSetting, Issue $issue, Iteration $iteration, array $row) { - $this->getIssueTypes($codingProject, $row); + $this->getIssueTypes($projectSetting, $row); $data = [ 'Type' => $this->issueTypes[$row['事项类型']]['IssueType'], 'IssueTypeId' => $this->issueTypes[$row['事项类型']]['Id'], diff --git a/app/Commands/ProjectGetIssueTypesCommand.php b/app/Commands/ProjectGetIssueTypesCommand.php index 011b3e8..10e1abd 100644 --- a/app/Commands/ProjectGetIssueTypesCommand.php +++ b/app/Commands/ProjectGetIssueTypesCommand.php @@ -3,7 +3,7 @@ namespace App\Commands; use App\Coding\Issue; -use App\Coding\Project; +use App\Coding\ProjectSetting; use LaravelZero\Framework\Commands\Command; class ProjectGetIssueTypesCommand extends Command @@ -32,11 +32,11 @@ class ProjectGetIssueTypesCommand extends Command * Execute the console command. * */ - public function handle(Project $codingProject): int + public function handle(ProjectSetting $projectSetting): int { $this->setCodingApi(); - $result = $codingProject->getIssueTypes($this->codingToken, $this->codingProjectUri); + $result = $projectSetting->getIssueTypes($this->codingToken, $this->codingProjectUri); foreach ($result as $item) { $this->info($item['Id'] . ' ' . $item['Name']); diff --git a/tests/Feature/IssueImportCommandTest.php b/tests/Feature/IssueImportCommandTest.php index 13f6990..7d7d501 100755 --- a/tests/Feature/IssueImportCommandTest.php +++ b/tests/Feature/IssueImportCommandTest.php @@ -4,7 +4,7 @@ use App\Coding\Issue; use App\Coding\Iteration; -use App\Coding\Project; +use App\Coding\ProjectSetting; use Tests\TestCase; class IssueImportCommandTest extends TestCase @@ -26,8 +26,8 @@ protected function setUp(): void public function testImportSuccess() { - $mock = \Mockery::mock(Project::class, [])->makePartial(); - $this->instance(Project::class, $mock); + $mock = \Mockery::mock(ProjectSetting::class, [])->makePartial(); + $this->instance(ProjectSetting::class, $mock); $mock->shouldReceive('getIssueTypes')->times(1)->andReturn(json_decode( file_get_contents($this->dataDir . 'coding/' . 'DescribeProjectIssueTypeListResponse.json'), @@ -66,8 +66,8 @@ public function testImportSuccess() public function testImportUserStorySuccess() { - $mock = \Mockery::mock(Project::class, [])->makePartial(); - $this->instance(Project::class, $mock); + $mock = \Mockery::mock(ProjectSetting::class, [])->makePartial(); + $this->instance(ProjectSetting::class, $mock); $mock->shouldReceive('getIssueTypes')->times(1)->andReturn(json_decode( file_get_contents($this->dataDir . 'coding/' . 'DescribeProjectIssueTypeListResponse.json'), @@ -113,8 +113,8 @@ public function testImportUserStorySuccess() public function testImportSubTask() { - $mock = \Mockery::mock(Project::class, [])->makePartial(); - $this->instance(Project::class, $mock); + $mock = \Mockery::mock(ProjectSetting::class, [])->makePartial(); + $this->instance(ProjectSetting::class, $mock); $mock->shouldReceive('getIssueTypes')->times(1)->andReturn(json_decode( file_get_contents($this->dataDir . 'coding/' . 'DescribeProjectIssueTypeListResponse.json'), @@ -179,8 +179,8 @@ public function testImportSubTask() public function testImportFailedIssueTypeNotExists() { - $mock = \Mockery::mock(Project::class, [])->makePartial(); - $this->instance(Project::class, $mock); + $mock = \Mockery::mock(ProjectSetting::class, [])->makePartial(); + $this->instance(ProjectSetting::class, $mock); $mock->shouldReceive('getIssueTypes')->times(1)->andReturn([]); $this->artisan('issue:import', ['file' => $this->dataDir . 'coding/scrum-issues.csv']) diff --git a/tests/Feature/ProjectGetIssueTypesCommandTest.php b/tests/Feature/ProjectGetIssueTypesCommandTest.php index 1e8b18f..e900124 100755 --- a/tests/Feature/ProjectGetIssueTypesCommandTest.php +++ b/tests/Feature/ProjectGetIssueTypesCommandTest.php @@ -2,7 +2,7 @@ namespace Tests\Feature; -use App\Coding\Project; +use App\Coding\ProjectSetting; use Tests\TestCase; class ProjectGetIssueTypesCommandTest extends TestCase @@ -20,8 +20,8 @@ protected function setUp(): void public function testCreateSuccess() { - $mock = \Mockery::mock(Project::class, [])->makePartial(); - $this->instance(Project::class, $mock); + $mock = \Mockery::mock(ProjectSetting::class, [])->makePartial(); + $this->instance(ProjectSetting::class, $mock); $mock->shouldReceive('getIssueTypes')->times(1)->andReturn(json_decode( file_get_contents($this->dataDir . 'coding/' . 'DescribeProjectIssueTypeListResponse.json'), diff --git a/tests/Unit/CodingProjectTest.php b/tests/Unit/CodingProjectTest.php index 5052483..c49ba83 100644 --- a/tests/Unit/CodingProjectTest.php +++ b/tests/Unit/CodingProjectTest.php @@ -2,7 +2,7 @@ namespace Tests\Unit; -use App\Coding\Project; +use App\Coding\ProjectSetting; use GuzzleHttp\Client; use GuzzleHttp\Psr7\Response; use Tests\TestCase; @@ -34,7 +34,7 @@ public function testCreateSuccess() ] ) ->willReturn(new Response(200, [], $responseBody)); - $coding = new Project($clientMock); + $coding = new ProjectSetting($clientMock); $result = $coding->getIssueTypes($codingToken, $codingProjectUri); $this->assertEquals(json_decode($responseBody, true)['Response']['IssueTypes'], $result); } From 5c6734f031b35ae544df9817ac0b23ae0536e911 Mon Sep 17 00:00:00 2001 From: sinkcup Date: Thu, 21 Oct 2021 17:33:51 +0800 Subject: [PATCH 18/21] feat: #80 issue type status --- app/Coding/ProjectSetting.php | 18 +++++ tests/Unit/CodingProjectSettingTest.php | 73 +++++++++++++++++ tests/Unit/CodingProjectTest.php | 41 ---------- ...escribeProjectIssueStatusListResponse.json | 79 +++++++++++++++++++ 4 files changed, 170 insertions(+), 41 deletions(-) create mode 100644 tests/Unit/CodingProjectSettingTest.php delete mode 100644 tests/Unit/CodingProjectTest.php create mode 100644 tests/data/coding/DescribeProjectIssueStatusListResponse.json diff --git a/app/Coding/ProjectSetting.php b/app/Coding/ProjectSetting.php index ecfaa48..f0034ea 100644 --- a/app/Coding/ProjectSetting.php +++ b/app/Coding/ProjectSetting.php @@ -20,4 +20,22 @@ public function getIssueTypes($token, $projectName) $result = json_decode($response->getBody(), true); return $result['Response']['IssueTypes']; } + + public function getIssueTypeStatus(string $token, string $projectName, string $issueType) + { + $response = $this->client->request('POST', 'https://e.coding.net/open-api', [ + 'headers' => [ + 'Accept' => 'application/json', + 'Authorization' => "token ${token}", + 'Content-Type' => 'application/json' + ], + 'json' => [ + 'Action' => 'DescribeProjectIssueStatusList', + 'ProjectName' => $projectName, + 'IssueType' => $issueType, + ], + ]); + $result = json_decode($response->getBody(), true); + return $result['Response']['ProjectIssueStatusList']; + } } diff --git a/tests/Unit/CodingProjectSettingTest.php b/tests/Unit/CodingProjectSettingTest.php new file mode 100644 index 0000000..215da09 --- /dev/null +++ b/tests/Unit/CodingProjectSettingTest.php @@ -0,0 +1,73 @@ +dataDir . 'coding/DescribeProjectIssueTypeListResponse.json'); + $codingToken = $this->faker->md5; + $codingProjectUri = $this->faker->slug; + + $clientMock = $this->getMockBuilder(Client::class)->getMock(); + $clientMock->expects($this->once()) + ->method('request') + ->with( + 'POST', + 'https://e.coding.net/open-api', + [ + 'headers' => [ + 'Accept' => 'application/json', + 'Authorization' => "token ${codingToken}", + 'Content-Type' => 'application/json' + ], + 'json' => array_merge([ + 'Action' => 'DescribeProjectIssueTypeList', + 'ProjectName' => $codingProjectUri, + ]) + ] + ) + ->willReturn(new Response(200, [], $responseBody)); + $coding = new ProjectSetting($clientMock); + $result = $coding->getIssueTypes($codingToken, $codingProjectUri); + $this->assertEquals(json_decode($responseBody, true)['Response']['IssueTypes'], $result); + } + + public function testGetIssueTypeStatusSuccess() + { + $responseBody = file_get_contents($this->dataDir . 'coding/DescribeProjectIssueStatusListResponse.json'); + $codingToken = $this->faker->md5; + $codingProjectUri = $this->faker->slug; + + $issueType = $this->faker->randomElement(['DEFECT', 'REQUIREMENT', 'MISSION', 'EPIC', 'SUB_TASK']); + $clientMock = $this->getMockBuilder(Client::class)->getMock(); + $clientMock->expects($this->once()) + ->method('request') + ->with( + 'POST', + 'https://e.coding.net/open-api', + [ + 'headers' => [ + 'Accept' => 'application/json', + 'Authorization' => "token ${codingToken}", + 'Content-Type' => 'application/json' + ], + 'json' => array_merge([ + 'Action' => 'DescribeProjectIssueStatusList', + 'ProjectName' => $codingProjectUri, + 'IssueType' => $issueType, + ]) + ] + ) + ->willReturn(new Response(200, [], $responseBody)); + $coding = new ProjectSetting($clientMock); + $result = $coding->getIssueTypeStatus($codingToken, $codingProjectUri, $issueType); + $this->assertEquals(json_decode($responseBody, true)['Response']['ProjectIssueStatusList'], $result); + } +} diff --git a/tests/Unit/CodingProjectTest.php b/tests/Unit/CodingProjectTest.php deleted file mode 100644 index c49ba83..0000000 --- a/tests/Unit/CodingProjectTest.php +++ /dev/null @@ -1,41 +0,0 @@ -dataDir . 'coding/DescribeProjectIssueTypeListResponse.json'); - $codingToken = $this->faker->md5; - $codingProjectUri = $this->faker->slug; - - $clientMock = $this->getMockBuilder(Client::class)->getMock(); - $clientMock->expects($this->once()) - ->method('request') - ->with( - 'POST', - 'https://e.coding.net/open-api', - [ - 'headers' => [ - 'Accept' => 'application/json', - 'Authorization' => "token ${codingToken}", - 'Content-Type' => 'application/json' - ], - 'json' => array_merge([ - 'Action' => 'DescribeProjectIssueTypeList', - 'ProjectName' => $codingProjectUri, - ]) - ] - ) - ->willReturn(new Response(200, [], $responseBody)); - $coding = new ProjectSetting($clientMock); - $result = $coding->getIssueTypes($codingToken, $codingProjectUri); - $this->assertEquals(json_decode($responseBody, true)['Response']['IssueTypes'], $result); - } -} diff --git a/tests/data/coding/DescribeProjectIssueStatusListResponse.json b/tests/data/coding/DescribeProjectIssueStatusListResponse.json new file mode 100644 index 0000000..5699748 --- /dev/null +++ b/tests/data/coding/DescribeProjectIssueStatusListResponse.json @@ -0,0 +1,79 @@ +{ + "Response": { + "RequestId": "dc827006-32db-a74f-eeae-13bec31c8b92", + "ProjectIssueStatusList": [ + { + "IssueType": "REQUIREMENT", + "IssueStatusId": 4, + "IsDefault": true, + "CreatedAt": 1597283400000, + "UpdatedAt": 1597283400000, + "Sort": 0, + "IssueStatus": { + "Id": 4, + "Index": 3, + "Name": "未开始", + "Type": "TODO", + "Description": "", + "IsSystem": true, + "CreatedAt": 1597283396000, + "UpdatedAt": 1597283396000 + } + }, + { + "IssueType": "REQUIREMENT", + "IssueStatusId": 9, + "IsDefault": false, + "CreatedAt": 1597283400000, + "UpdatedAt": 1597283400000, + "Sort": 0, + "IssueStatus": { + "Id": 9, + "Index": 8, + "Name": "开发中", + "Type": "PROCESSING", + "Description": "", + "IsSystem": true, + "CreatedAt": 1597283396000, + "UpdatedAt": 1597283396000 + } + }, + { + "IssueType": "REQUIREMENT", + "IssueStatusId": 10, + "IsDefault": false, + "CreatedAt": 1597283400000, + "UpdatedAt": 1597283400000, + "Sort": 0, + "IssueStatus": { + "Id": 10, + "Index": 9, + "Name": "测试中", + "Type": "PROCESSING", + "Description": "", + "IsSystem": true, + "CreatedAt": 1597283396000, + "UpdatedAt": 1597283396000 + } + }, + { + "IssueType": "REQUIREMENT", + "IssueStatusId": 13, + "IsDefault": false, + "CreatedAt": 1597283400000, + "UpdatedAt": 1597283400000, + "Sort": 0, + "IssueStatus": { + "Id": 13, + "Index": 12, + "Name": "已完成", + "Type": "COMPLETED", + "Description": "", + "IsSystem": true, + "CreatedAt": 1597283396000, + "UpdatedAt": 1597283396000 + } + } + ] + } +} From ac38550e5e0d952058b764852f5aaf3cf2374be8 Mon Sep 17 00:00:00 2001 From: sinkcup Date: Fri, 22 Oct 2021 12:53:10 +0800 Subject: [PATCH 19/21] feat: #72 import issue type status --- app/Commands/IssueImportCommand.php | 21 +++++++++- tests/Feature/IssueImportCommandTest.php | 50 +++++++++++++++++++----- 2 files changed, 60 insertions(+), 11 deletions(-) diff --git a/app/Commands/IssueImportCommand.php b/app/Commands/IssueImportCommand.php index 5049e0a..522692b 100644 --- a/app/Commands/IssueImportCommand.php +++ b/app/Commands/IssueImportCommand.php @@ -6,6 +6,7 @@ use App\Coding\Iteration; use App\Coding\ProjectSetting; use Exception; +use Illuminate\Support\Arr; use LaravelZero\Framework\Commands\Command; use Rap2hpoutre\FastExcel\Facades\FastExcel; @@ -33,9 +34,10 @@ class IssueImportCommand extends Command */ protected $description = '导入事项'; - protected array $iterationMap = []; - protected array $issueTypes = []; protected array $issueCodeMap = []; + protected array $issueTypes = []; + protected array $issueTypeStatus = []; + protected array $iterationMap = []; /** * Execute the console command. @@ -83,6 +85,18 @@ private function getIssueTypes(ProjectSetting $projectSetting, array $row): void } } + private function getStatusId(ProjectSetting $projectSetting, string $issueType, string $statusChinese): int + { + if (!isset($this->issueTypeStatus[$issueType])) { + $result = $projectSetting->getIssueTypeStatus($this->codingToken, $this->codingProjectUri, $issueType); + foreach ($result as $item) { + $tmp = $item['IssueStatus']; + $this->issueTypeStatus[$issueType][$tmp['Name']] = $tmp['Id']; + } + } + return intval($this->issueTypeStatus[$issueType][$statusChinese]); + } + private function createIssueByRow(ProjectSetting $projectSetting, Issue $issue, Iteration $iteration, array $row) { $this->getIssueTypes($projectSetting, $row); @@ -112,6 +126,9 @@ private function createIssueByRow(ProjectSetting $projectSetting, Issue $issue, $data[$english] = $row[$chinese]; } } + if (!empty($row['状态'])) { + $data['StatusId'] = $this->getStatusId($projectSetting, $data['Type'], $row['状态']); + } $result = $issue->create($this->codingToken, $this->codingProjectUri, $data); if (isset($row['ID'])) { $this->issueCodeMap[$row['ID']] = intval($result['Code']); diff --git a/tests/Feature/IssueImportCommandTest.php b/tests/Feature/IssueImportCommandTest.php index 7d7d501..6dccc71 100755 --- a/tests/Feature/IssueImportCommandTest.php +++ b/tests/Feature/IssueImportCommandTest.php @@ -26,13 +26,33 @@ protected function setUp(): void public function testImportSuccess() { - $mock = \Mockery::mock(ProjectSetting::class, [])->makePartial(); - $this->instance(ProjectSetting::class, $mock); + $projectSettingMock = \Mockery::mock(ProjectSetting::class, [])->makePartial(); + $this->instance(ProjectSetting::class, $projectSettingMock); - $mock->shouldReceive('getIssueTypes')->times(1)->andReturn(json_decode( + $projectSettingMock->shouldReceive('getIssueTypes')->times(1)->andReturn(json_decode( file_get_contents($this->dataDir . 'coding/' . 'DescribeProjectIssueTypeListResponse.json'), true )['Response']['IssueTypes']); + $requirementStatus = json_decode( + file_get_contents($this->dataDir . 'coding/' . 'DescribeProjectIssueStatusListResponse.json'), + true + )['Response']['ProjectIssueStatusList']; + $projectSettingMock->shouldReceive('getIssueTypeStatus')->times(5)->andReturn( + $requirementStatus, + $requirementStatus, + [ + ['IssueStatus' => ['Id' => 11, 'Name' => '已完成']], + ['IssueStatus' => ['Id' => 12, 'Name' => '处理中']], + ], + [ + ['IssueStatus' => ['Id' => 11, 'Name' => '未开始']], + ['IssueStatus' => ['Id' => 12, 'Name' => '处理中']], + ], + [ + ['IssueStatus' => ['Id' => 22, 'Name' => '处理中']], + ['IssueStatus' => ['Id' => 23, 'Name' => '待处理']], + ] + ); $issueMock = \Mockery::mock(Issue::class, [])->makePartial(); $this->instance(Issue::class, $issueMock); @@ -66,13 +86,17 @@ public function testImportSuccess() public function testImportUserStorySuccess() { - $mock = \Mockery::mock(ProjectSetting::class, [])->makePartial(); - $this->instance(ProjectSetting::class, $mock); + $projectSettingMock = \Mockery::mock(ProjectSetting::class, [])->makePartial(); + $this->instance(ProjectSetting::class, $projectSettingMock); - $mock->shouldReceive('getIssueTypes')->times(1)->andReturn(json_decode( + $projectSettingMock->shouldReceive('getIssueTypes')->times(1)->andReturn(json_decode( file_get_contents($this->dataDir . 'coding/' . 'DescribeProjectIssueTypeListResponse.json'), true )['Response']['IssueTypes']); + $projectSettingMock->shouldReceive('getIssueTypeStatus')->times(1)->andReturn(json_decode( + file_get_contents($this->dataDir . 'coding/' . 'DescribeProjectIssueStatusListResponse.json'), + true + )['Response']['ProjectIssueStatusList']); $issueMock = \Mockery::mock(Issue::class, [])->makePartial(); $this->instance(Issue::class, $issueMock); @@ -101,6 +125,7 @@ public function testImportUserStorySuccess() 'IterationCode' => 2746, 'DueDate' => '2021-10-21', 'StoryPoint' => '2', + 'StatusId' => 9, ] ])->andReturn($result); @@ -113,13 +138,17 @@ public function testImportUserStorySuccess() public function testImportSubTask() { - $mock = \Mockery::mock(ProjectSetting::class, [])->makePartial(); - $this->instance(ProjectSetting::class, $mock); + $projectSettingMock = \Mockery::mock(ProjectSetting::class, [])->makePartial(); + $this->instance(ProjectSetting::class, $projectSettingMock); - $mock->shouldReceive('getIssueTypes')->times(1)->andReturn(json_decode( + $projectSettingMock->shouldReceive('getIssueTypes')->times(1)->andReturn(json_decode( file_get_contents($this->dataDir . 'coding/' . 'DescribeProjectIssueTypeListResponse.json'), true )['Response']['IssueTypes']); + $projectSettingMock->shouldReceive('getIssueTypeStatus')->times(2)->andReturn(json_decode( + file_get_contents($this->dataDir . 'coding/' . 'DescribeProjectIssueStatusListResponse.json'), + true + )['Response']['ProjectIssueStatusList']); $issueMock = \Mockery::mock(Issue::class, [])->makePartial(); $this->instance(Issue::class, $issueMock); @@ -139,6 +168,7 @@ public function testImportSubTask() 'Name' => '用户可通过手机号注册账户', 'DueDate' => '2021-10-21', 'StoryPoint' => '2', + 'StatusId' => 9, ] ])->andReturn($parentIssue); @@ -153,6 +183,7 @@ public function testImportSubTask() 'Name' => '完成手机号注册的短信验证码发送接口', 'Priority' => "0", 'ParentCode' => 2742, + 'StatusId' => 13, ] ])->andReturn($subTask1); @@ -167,6 +198,7 @@ public function testImportSubTask() 'Name' => '完成通过手机号注册用户的接口', 'Priority' => "1", 'ParentCode' => 2742, + 'StatusId' => 13, ] ])->andReturn($subTask2); From 8832a71b95d858a2b8464bb59a027eb346d5d232 Mon Sep 17 00:00:00 2001 From: sinkcup Date: Fri, 22 Oct 2021 15:50:57 +0800 Subject: [PATCH 20/21] fix: #72 get type status need id --- app/Coding/ProjectSetting.php | 3 +- app/Commands/IssueImportCommand.php | 17 ++- app/Commands/ProjectGetIssueTypesCommand.php | 1 - tests/Feature/IssueImportCommandTest.php | 18 +-- tests/Unit/CodingProjectSettingTest.php | 4 +- ...escribeProjectIssueStatusListResponse.json | 136 +++++++++--------- tests/data/coding/scrum-issue-5.csv | 4 +- tests/data/coding/scrum-issues-5-6-7.csv | 2 +- tests/data/coding/scrum-issues.csv | 64 ++++----- 9 files changed, 125 insertions(+), 124 deletions(-) diff --git a/app/Coding/ProjectSetting.php b/app/Coding/ProjectSetting.php index f0034ea..ee644f7 100644 --- a/app/Coding/ProjectSetting.php +++ b/app/Coding/ProjectSetting.php @@ -21,7 +21,7 @@ public function getIssueTypes($token, $projectName) return $result['Response']['IssueTypes']; } - public function getIssueTypeStatus(string $token, string $projectName, string $issueType) + public function getIssueTypeStatus(string $token, string $projectName, string $issueType, int $issueTypeId) { $response = $this->client->request('POST', 'https://e.coding.net/open-api', [ 'headers' => [ @@ -33,6 +33,7 @@ public function getIssueTypeStatus(string $token, string $projectName, string $i 'Action' => 'DescribeProjectIssueStatusList', 'ProjectName' => $projectName, 'IssueType' => $issueType, + 'IssueTypeId' => $issueTypeId, ], ]); $result = json_decode($response->getBody(), true); diff --git a/app/Commands/IssueImportCommand.php b/app/Commands/IssueImportCommand.php index 522692b..1f377b1 100644 --- a/app/Commands/IssueImportCommand.php +++ b/app/Commands/IssueImportCommand.php @@ -85,16 +85,21 @@ private function getIssueTypes(ProjectSetting $projectSetting, array $row): void } } - private function getStatusId(ProjectSetting $projectSetting, string $issueType, string $statusChinese): int + private function getStatusId(ProjectSetting $projectSetting, string $issueTypeName, string $statusName): int { - if (!isset($this->issueTypeStatus[$issueType])) { - $result = $projectSetting->getIssueTypeStatus($this->codingToken, $this->codingProjectUri, $issueType); + if (!isset($this->issueTypeStatus[$issueTypeName])) { + $type = $this->issueTypes[$issueTypeName]['IssueType']; + $typeId = $this->issueTypes[$issueTypeName]['Id']; + $result = $projectSetting->getIssueTypeStatus($this->codingToken, $this->codingProjectUri, $type, $typeId); foreach ($result as $item) { $tmp = $item['IssueStatus']; - $this->issueTypeStatus[$issueType][$tmp['Name']] = $tmp['Id']; + $this->issueTypeStatus[$issueTypeName][$tmp['Name']] = $tmp['Id']; } } - return intval($this->issueTypeStatus[$issueType][$statusChinese]); + if (!isset($this->issueTypeStatus[$issueTypeName][$statusName])) { + throw new Exception('「' . $statusName . '」不存在,请在设置中添加'); + } + return intval($this->issueTypeStatus[$issueTypeName][$statusName]); } private function createIssueByRow(ProjectSetting $projectSetting, Issue $issue, Iteration $iteration, array $row) @@ -127,7 +132,7 @@ private function createIssueByRow(ProjectSetting $projectSetting, Issue $issue, } } if (!empty($row['状态'])) { - $data['StatusId'] = $this->getStatusId($projectSetting, $data['Type'], $row['状态']); + $data['StatusId'] = $this->getStatusId($projectSetting, $row['事项类型'], $row['状态']); } $result = $issue->create($this->codingToken, $this->codingProjectUri, $data); if (isset($row['ID'])) { diff --git a/app/Commands/ProjectGetIssueTypesCommand.php b/app/Commands/ProjectGetIssueTypesCommand.php index 10e1abd..6c81755 100644 --- a/app/Commands/ProjectGetIssueTypesCommand.php +++ b/app/Commands/ProjectGetIssueTypesCommand.php @@ -2,7 +2,6 @@ namespace App\Commands; -use App\Coding\Issue; use App\Coding\ProjectSetting; use LaravelZero\Framework\Commands\Command; diff --git a/tests/Feature/IssueImportCommandTest.php b/tests/Feature/IssueImportCommandTest.php index 6dccc71..518767b 100755 --- a/tests/Feature/IssueImportCommandTest.php +++ b/tests/Feature/IssueImportCommandTest.php @@ -40,14 +40,8 @@ public function testImportSuccess() $projectSettingMock->shouldReceive('getIssueTypeStatus')->times(5)->andReturn( $requirementStatus, $requirementStatus, - [ - ['IssueStatus' => ['Id' => 11, 'Name' => '已完成']], - ['IssueStatus' => ['Id' => 12, 'Name' => '处理中']], - ], - [ - ['IssueStatus' => ['Id' => 11, 'Name' => '未开始']], - ['IssueStatus' => ['Id' => 12, 'Name' => '处理中']], - ], + $requirementStatus, + $requirementStatus, [ ['IssueStatus' => ['Id' => 22, 'Name' => '处理中']], ['IssueStatus' => ['Id' => 23, 'Name' => '待处理']], @@ -125,7 +119,7 @@ public function testImportUserStorySuccess() 'IterationCode' => 2746, 'DueDate' => '2021-10-21', 'StoryPoint' => '2', - 'StatusId' => 9, + 'StatusId' => 1227037, ] ])->andReturn($result); @@ -168,7 +162,7 @@ public function testImportSubTask() 'Name' => '用户可通过手机号注册账户', 'DueDate' => '2021-10-21', 'StoryPoint' => '2', - 'StatusId' => 9, + 'StatusId' => 1227037, ] ])->andReturn($parentIssue); @@ -183,7 +177,7 @@ public function testImportSubTask() 'Name' => '完成手机号注册的短信验证码发送接口', 'Priority' => "0", 'ParentCode' => 2742, - 'StatusId' => 13, + 'StatusId' => 1227058, ] ])->andReturn($subTask1); @@ -198,7 +192,7 @@ public function testImportSubTask() 'Name' => '完成通过手机号注册用户的接口', 'Priority' => "1", 'ParentCode' => 2742, - 'StatusId' => 13, + 'StatusId' => 1227058, ] ])->andReturn($subTask2); diff --git a/tests/Unit/CodingProjectSettingTest.php b/tests/Unit/CodingProjectSettingTest.php index 215da09..3766757 100644 --- a/tests/Unit/CodingProjectSettingTest.php +++ b/tests/Unit/CodingProjectSettingTest.php @@ -46,6 +46,7 @@ public function testGetIssueTypeStatusSuccess() $codingProjectUri = $this->faker->slug; $issueType = $this->faker->randomElement(['DEFECT', 'REQUIREMENT', 'MISSION', 'EPIC', 'SUB_TASK']); + $issueTypeId = $this->faker->randomNumber(); $clientMock = $this->getMockBuilder(Client::class)->getMock(); $clientMock->expects($this->once()) ->method('request') @@ -62,12 +63,13 @@ public function testGetIssueTypeStatusSuccess() 'Action' => 'DescribeProjectIssueStatusList', 'ProjectName' => $codingProjectUri, 'IssueType' => $issueType, + 'IssueTypeId' => $issueTypeId, ]) ] ) ->willReturn(new Response(200, [], $responseBody)); $coding = new ProjectSetting($clientMock); - $result = $coding->getIssueTypeStatus($codingToken, $codingProjectUri, $issueType); + $result = $coding->getIssueTypeStatus($codingToken, $codingProjectUri, $issueType, $issueTypeId); $this->assertEquals(json_decode($responseBody, true)['Response']['ProjectIssueStatusList'], $result); } } diff --git a/tests/data/coding/DescribeProjectIssueStatusListResponse.json b/tests/data/coding/DescribeProjectIssueStatusListResponse.json index 5699748..09c446a 100644 --- a/tests/data/coding/DescribeProjectIssueStatusListResponse.json +++ b/tests/data/coding/DescribeProjectIssueStatusListResponse.json @@ -1,79 +1,79 @@ { - "Response": { - "RequestId": "dc827006-32db-a74f-eeae-13bec31c8b92", - "ProjectIssueStatusList": [ + "Response" : { + "ProjectIssueStatusList" : [ { - "IssueType": "REQUIREMENT", - "IssueStatusId": 4, - "IsDefault": true, - "CreatedAt": 1597283400000, - "UpdatedAt": 1597283400000, - "Sort": 0, - "IssueStatus": { - "Id": 4, - "Index": 3, - "Name": "未开始", - "Type": "TODO", - "Description": "", - "IsSystem": true, - "CreatedAt": 1597283396000, - "UpdatedAt": 1597283396000 - } + "CreatedAt" : 1634639726000, + "IsDefault" : true, + "IssueStatus" : { + "CreatedAt" : 1572178128000, + "Description" : "", + "Id" : 1227034, + "Index" : 3, + "IsSystem" : true, + "Name" : "未开始", + "Type" : "TODO", + "UpdatedAt" : 1572178128000 + }, + "IssueStatusId" : 1227034, + "IssueType" : "REQUIREMENT", + "Sort" : 0, + "UpdatedAt" : 1634639726000 }, { - "IssueType": "REQUIREMENT", - "IssueStatusId": 9, - "IsDefault": false, - "CreatedAt": 1597283400000, - "UpdatedAt": 1597283400000, - "Sort": 0, - "IssueStatus": { - "Id": 9, - "Index": 8, - "Name": "开发中", - "Type": "PROCESSING", - "Description": "", - "IsSystem": true, - "CreatedAt": 1597283396000, - "UpdatedAt": 1597283396000 - } + "CreatedAt" : 1634639726000, + "IsDefault" : false, + "IssueStatus" : { + "CreatedAt" : 1572178128000, + "Description" : "", + "Id" : 1227037, + "Index" : 4, + "IsSystem" : true, + "Name" : "处理中", + "Type" : "PROCESSING", + "UpdatedAt" : 1572178128000 + }, + "IssueStatusId" : 1227037, + "IssueType" : "REQUIREMENT", + "Sort" : 0, + "UpdatedAt" : 1634639726000 }, { - "IssueType": "REQUIREMENT", - "IssueStatusId": 10, - "IsDefault": false, - "CreatedAt": 1597283400000, - "UpdatedAt": 1597283400000, - "Sort": 0, - "IssueStatus": { - "Id": 10, - "Index": 9, - "Name": "测试中", - "Type": "PROCESSING", - "Description": "", - "IsSystem": true, - "CreatedAt": 1597283396000, - "UpdatedAt": 1597283396000 - } + "CreatedAt" : 1634639726000, + "IsDefault" : false, + "IssueStatus" : { + "CreatedAt" : 1572178128000, + "Description" : "", + "Id" : 1227040, + "Index" : 5, + "IsSystem" : true, + "Name" : "待验证", + "Type" : "PROCESSING", + "UpdatedAt" : 1572178128000 + }, + "IssueStatusId" : 1227040, + "IssueType" : "REQUIREMENT", + "Sort" : 0, + "UpdatedAt" : 1634639726000 }, { - "IssueType": "REQUIREMENT", - "IssueStatusId": 13, - "IsDefault": false, - "CreatedAt": 1597283400000, - "UpdatedAt": 1597283400000, - "Sort": 0, - "IssueStatus": { - "Id": 13, - "Index": 12, - "Name": "已完成", - "Type": "COMPLETED", - "Description": "", - "IsSystem": true, - "CreatedAt": 1597283396000, - "UpdatedAt": 1597283396000 - } + "CreatedAt" : 1634639726000, + "IsDefault" : false, + "IssueStatus" : { + "CreatedAt" : 1572178128000, + "Description" : "", + "Id" : 1227058, + "Index" : 11, + "IsSystem" : true, + "Name" : "已完成", + "Type" : "COMPLETED", + "UpdatedAt" : 1572178128000 + }, + "IssueStatusId" : 1227058, + "IssueType" : "REQUIREMENT", + "Sort" : 0, + "UpdatedAt" : 1634639726000 } - ] + ], + "RequestId" : "3a8bb049-e28f-01c9-9990-0f17b92952c4" } } diff --git a/tests/data/coding/scrum-issue-5.csv b/tests/data/coding/scrum-issue-5.csv index 437de0e..26d5df2 100644 --- a/tests/data/coding/scrum-issue-5.csv +++ b/tests/data/coding/scrum-issue-5.csv @@ -1,2 +1,2 @@ -ID,事项类型,标题,描述,状态,创建时间,创建人,更新时间,所属迭代,故事点,处理人,缺陷类型,优先级,截止日期,模块,标签,关注人,开始日期 -5,用户故事,用户可通过手机号注册账户,,开发中,2021-10-19 11:26:37,sinkcup,2021-10-19 11:26:37,第 1 次迭代,2,sinkcup,,中,2021-10-21,,,, +ID,事项类型,标题,描述,状态,创建时间,创建人,更新时间,所属迭代,故事点,处理人,缺陷类型,优先级,截止日期,模块,标签,关注人,开始日期 +5,用户故事,用户可通过手机号注册账户,,处理中,2021-10-19 11:26:37,sinkcup,2021-10-19 11:26:37,第 1 次迭代,2,sinkcup,,中,2021-10-21,,,, diff --git a/tests/data/coding/scrum-issues-5-6-7.csv b/tests/data/coding/scrum-issues-5-6-7.csv index a16f269..65d7046 100644 --- a/tests/data/coding/scrum-issues-5-6-7.csv +++ b/tests/data/coding/scrum-issues-5-6-7.csv @@ -1,4 +1,4 @@ ID,ParentCode,事项类型,标题,描述,状态,创建时间,创建人,更新时间,所属迭代,故事点,处理人,缺陷类型,优先级,截止日期,模块,标签,关注人,开始日期 7,5,子工作项,完成通过手机号注册用户的接口,,已完成,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,,,,,中,,,,, 6,5,子工作项,完成手机号注册的短信验证码发送接口,,已完成,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,,,,,低,,,,, -5,,用户故事,用户可通过手机号注册账户,,开发中,2021-10-19 11:26:37,sinkcup,2021-10-19 11:26:37,,2,sinkcup,,,2021-10-21,,,, +5,,用户故事,用户可通过手机号注册账户,,处理中,2021-10-19 11:26:37,sinkcup,2021-10-19 11:26:37,,2,sinkcup,,,2021-10-21,,,, diff --git a/tests/data/coding/scrum-issues.csv b/tests/data/coding/scrum-issues.csv index 41207dc..17c86a4 100644 --- a/tests/data/coding/scrum-issues.csv +++ b/tests/data/coding/scrum-issues.csv @@ -1,32 +1,32 @@ -ID,ParentCode,事项类型,标题,描述,状态,创建时间,创建人,更新时间,所属迭代,故事点,处理人,缺陷类型,优先级,截止日期,模块,标签,关注人,开始日期 -23,,缺陷,商品详情页中商品价格字体应当显示为红色并且加粗,"步骤: - -测试环境中,打开商品列表页; -点击任意商品进详情页。 -测试结果:商品的价格字体显示为正常大小,颜色为黑色。 -预期结果:商品价格字体为红色加粗。",待处理,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,,,,,中,,,,, -22,,缺陷,登录页输入正确的用户名和密码后提示“用户不存在”,"步骤: -测试环境中,输入URL https://mywebsite.com/login 进入登录页; -输入用户名 Admin 和密码 mypassword; -点击“登录”按钮。 -测试结果:页面提示“用户不存在”。 -预期结果:提示“登录成功”并且页面自动跳转到首页。",处理中,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,,,sinkcup,,中,,,,, -21,,任务,编制新功能的帮助文档并发布,,未开始,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,,,,,中,,,,, -20,,任务,编写脚本将 Excel 中的线下订单转换为商城后台订单,,未开始,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,,,,,中,,,,, -19,,任务,注册腾讯云账户,搭建测试环境和生产环境服务器,,处理中,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,第 1 次迭代,3,sinkcup,,中,2021-10-21,,,, -18,,用户故事,用户可对未支付的订单执行取消订单操作,,未开始,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,,,,,中,,,,, -17,,用户故事,管理员可在商城后台对订单执行发货操作,,未开始,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,,3,,,中,,,,, -16,,用户故事,用户可在手机端搜索并查看指定的订单详情,,未开始,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,,1,,,中,,,,, -15,,用户故事,通过访问邀请链接可注册成为商城用户,,未开始,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,,,,,中,,,,, -14,,用户故事,管理员可取消未发货且状态异常的订单,,未开始,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 2 次迭代,3,,,中,,,,, -13,,用户故事,用户可在“个人信息”中编辑个人基本信息,包括修改密码,,未开始,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 2 次迭代,2,sinkcup,,中,,,,, -12,,用户故事,管理员可在商城后台搜索订单,,未开始,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 1 次迭代,2,,,中,,,,, -11,,用户故事,管理员可在商城后台手工为用户下单,,未开始,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 1 次迭代,5,,,中,2021-10-26,,,, -10,,用户故事,用户可在个人中心的“个人信息”中查看个人信息,,已完成,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 1 次迭代,1,,,中,,,,, -9,,用户故事,用户可通过短信验证码登录商城,,开发中,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 1 次迭代,,,,中,,,,, -8,5,子工作项,完成用户注册页面控件并集成后端接口,,处理中,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 1 次迭代,,,,中,2021-10-21,,,, -7,5,子工作项,完成通过手机号注册用户的接口,,已完成,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 1 次迭代,,,,中,,,,, -6,5,子工作项,完成手机号注册的短信验证码发送接口,,已完成,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 1 次迭代,,,,中,,,,, -5,,用户故事,用户可通过手机号注册账户,,开发中,2021-10-19 11:26:37,sinkcup,2021-10-19 11:26:37,第 1 次迭代,2,sinkcup,,中,2021-10-21,,,, -2,,史诗,订单管理,订单管理将实现用户的订单列表查询、订单详情、订单改价、订单地址修改、申请售后、订单取消等功能,未开始,2021-10-19 11:26:37,sinkcup,2021-10-19 11:26:37,,,,,中,,,,,2021-10-19 -1,,史诗,用户管理,用户管理将实现用户的注册、邀请、用户查询、个人信息管理、删除用户、注销账户等功能。,未开始,2021-10-19 11:26:37,sinkcup,2021-10-19 11:26:37,,,,,中,,,,,2021-10-19 +ID,ParentCode,事项类型,标题,描述,状态,创建时间,创建人,更新时间,所属迭代,故事点,处理人,缺陷类型,优先级,截止日期,模块,标签,关注人,开始日期 +23,,缺陷,商品详情页中商品价格字体应当显示为红色并且加粗,"步骤: + +测试环境中,打开商品列表页; +点击任意商品进详情页。 +测试结果:商品的价格字体显示为正常大小,颜色为黑色。 +预期结果:商品价格字体为红色加粗。",待处理,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,,,,,中,,,,, +22,,缺陷,登录页输入正确的用户名和密码后提示“用户不存在”,"步骤: +测试环境中,输入URL https://mywebsite.com/login 进入登录页; +输入用户名 Admin 和密码 mypassword; +点击“登录”按钮。 +测试结果:页面提示“用户不存在”。 +预期结果:提示“登录成功”并且页面自动跳转到首页。",处理中,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,,,sinkcup,,中,,,,, +21,,任务,编制新功能的帮助文档并发布,,未开始,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,,,,,中,,,,, +20,,任务,编写脚本将 Excel 中的线下订单转换为商城后台订单,,未开始,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,第 2 次迭代,5,,,中,,,,, +19,,任务,注册腾讯云账户,搭建测试环境和生产环境服务器,,处理中,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,第 1 次迭代,5,sinkcup,,中,,,,, +18,,用户故事,用户可对未支付的订单执行取消订单操作,,未开始,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,,,,,中,,,,, +17,,用户故事,管理员可在商城后台对订单执行发货操作,,未开始,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,第 2 次迭代,3,,,中,,,,, +16,,用户故事,用户可在手机端搜索并查看指定的订单详情,,未开始,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,第 2 次迭代,1,,,中,,,,, +15,,用户故事,通过访问邀请链接可注册成为商城用户,,未开始,2021-10-19 11:26:39,sinkcup,2021-10-19 11:26:39,第 2 次迭代,2,,,中,,,,, +14,,用户故事,管理员可取消未发货且状态异常的订单,,未开始,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 2 次迭代,3,,,中,,,,, +13,,用户故事,用户可在“个人信息”中编辑个人基本信息,包括修改密码,,未开始,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 2 次迭代,2,sinkcup,,中,,,,, +12,,用户故事,管理员可在商城后台搜索订单,,未开始,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 1 次迭代,2,,,中,,,,, +11,,用户故事,管理员可在商城后台手工为用户下单,,未开始,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 1 次迭代,5,,,中,,,,, +10,,用户故事,用户可在个人中心的“个人信息”中查看个人信息,,已完成,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 1 次迭代,1,,,中,,,,, +9,,用户故事,用户可通过短信验证码登录商城,,处理中,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 1 次迭代,1,,,中,,,,, +8,5,子工作项,完成用户注册页面控件并集成后端接口,,处理中,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 1 次迭代,,,,中,,,,, +7,5,子工作项,完成通过手机号注册用户的接口,,已完成,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 1 次迭代,,,,中,,,,, +6,5,子工作项,完成手机号注册的短信验证码发送接口,,已完成,2021-10-19 11:26:38,sinkcup,2021-10-19 11:26:38,第 1 次迭代,,,,中,,,,, +5,,用户故事,用户可通过手机号注册账户,,处理中,2021-10-19 11:26:37,sinkcup,2021-10-19 11:26:37,第 1 次迭代,2,sinkcup,,中,,,,, +2,,史诗,订单管理,订单管理将实现用户的订单列表查询、订单详情、订单改价、订单地址修改、申请售后、订单取消等功能,未开始,2021-10-19 11:26:37,sinkcup,2021-10-19 11:26:37,,,,,中,,,,, +1,,史诗,用户管理,用户管理将实现用户的注册、邀请、用户查询、个人信息管理、删除用户、注销账户等功能。,未开始,2021-10-19 11:26:37,sinkcup,2021-10-19 11:26:37,,,,,中,,,,, From 12be361a8aada02cd6fb1a77256950f00dadb4be Mon Sep 17 00:00:00 2001 From: sinkcup Date: Fri, 22 Oct 2021 16:54:39 +0800 Subject: [PATCH 21/21] refactor: #72 remove useless code --- app/Commands/IssueImportCommand.php | 1 - app/Models/Issue.php | 18 +--- composer.json | 1 - composer.lock | 70 +------------ config/database.php | 147 ---------------------------- 5 files changed, 2 insertions(+), 235 deletions(-) delete mode 100644 config/database.php diff --git a/app/Commands/IssueImportCommand.php b/app/Commands/IssueImportCommand.php index 1f377b1..f237f61 100644 --- a/app/Commands/IssueImportCommand.php +++ b/app/Commands/IssueImportCommand.php @@ -21,7 +21,6 @@ class IssueImportCommand extends Command */ protected $signature = 'issue:import {file : 文件(支持格式:csv)} - {--type= : 类型(使用英文),如 DEFECT(缺陷)、REQUIREMENT(需求)、MISSION(任务)、EPIC(史诗)、SUB_TASK(子任务)} {--coding_token= : CODING 令牌} {--coding_team_domain= : CODING 团队域名,如 xxx.coding.net 即填写 xxx} {--coding_project_uri= : CODING 项目标识,如 xxx.coding.net/p/yyy 即填写 yyy} diff --git a/app/Models/Issue.php b/app/Models/Issue.php index 0ec3138..44b1797 100644 --- a/app/Models/Issue.php +++ b/app/Models/Issue.php @@ -2,24 +2,8 @@ namespace App\Models; -use Illuminate\Database\Eloquent\Factories\HasFactory; -use Illuminate\Database\Eloquent\Model; - -class Issue extends Model +class Issue { - use HasFactory; - - /** - * The attributes that are mass assignable. - * - * @var array - */ - protected $fillable = [ - 'type', - 'name', - 'priority', - ]; - public const PRIORITY_MAP = [ '低' => '0', '中' => '1', diff --git a/composer.json b/composer.json index dad4a34..a306282 100644 --- a/composer.json +++ b/composer.json @@ -22,7 +22,6 @@ "ext-json": "*", "ext-libxml": "*", "ext-zip": "*", - "illuminate/database": "^8.40", "illuminate/log": "^8.0", "laravel-fans/confluence": "^0.1.1", "laravel-zero/framework": "^8.8", diff --git a/composer.lock b/composer.lock index 09702c2..0a7476d 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "77ca4ecabe820915064742975e88b933", + "content-hash": "0134f2de9ac0b0a115a392c6dfb421dc", "packages": [ { "name": "box/spout", @@ -1428,74 +1428,6 @@ }, "time": "2021-09-08T12:09:40+00:00" }, - { - "name": "illuminate/database", - "version": "v8.65.0", - "source": { - "type": "git", - "url": "https://github.com/illuminate/database.git", - "reference": "95820976fb4ae693664dc656d77de0bd9df36e73" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/database/zipball/95820976fb4ae693664dc656d77de0bd9df36e73", - "reference": "95820976fb4ae693664dc656d77de0bd9df36e73", - "shasum": "" - }, - "require": { - "ext-json": "*", - "illuminate/collections": "^8.0", - "illuminate/container": "^8.0", - "illuminate/contracts": "^8.0", - "illuminate/macroable": "^8.0", - "illuminate/support": "^8.0", - "php": "^7.3|^8.0", - "symfony/console": "^5.1.4" - }, - "suggest": { - "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.13.3|^3.1.2).", - "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", - "illuminate/console": "Required to use the database commands (^8.0).", - "illuminate/events": "Required to use the observers with Eloquent (^8.0).", - "illuminate/filesystem": "Required to use the migrations (^8.0).", - "illuminate/pagination": "Required to paginate the result set (^8.0).", - "symfony/finder": "Required to use Eloquent model factories (^5.1.4)." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "8.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Database\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Database package.", - "homepage": "https://laravel.com", - "keywords": [ - "database", - "laravel", - "orm", - "sql" - ], - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2021-10-19T13:59:31+00:00" - }, { "name": "illuminate/events", "version": "v8.65.0", diff --git a/config/database.php b/config/database.php deleted file mode 100644 index d7b278f..0000000 --- a/config/database.php +++ /dev/null @@ -1,147 +0,0 @@ - env('DB_CONNECTION', 'sqlite'), - - /* - |-------------------------------------------------------------------------- - | Database Connections - |-------------------------------------------------------------------------- - | - | Here are each of the database connections setup for your application. - | Of course, examples of configuring each database platform that is - | supported by Laravel is shown below to make development simple. - | - | - | All database work in Laravel is done through the PHP PDO facilities - | so make sure you have the driver for your particular database of - | choice installed on your machine before you begin development. - | - */ - - 'connections' => [ - - 'sqlite' => [ - 'driver' => 'sqlite', - 'url' => env('DATABASE_URL'), - 'database' => env('DB_DATABASE', ':memory:'), - 'prefix' => '', - 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), - ], - - 'mysql' => [ - 'driver' => 'mysql', - 'url' => env('DATABASE_URL'), - 'host' => env('DB_HOST', '127.0.0.1'), - 'port' => env('DB_PORT', '3306'), - 'database' => env('DB_DATABASE', 'forge'), - 'username' => env('DB_USERNAME', 'forge'), - 'password' => env('DB_PASSWORD', ''), - 'unix_socket' => env('DB_SOCKET', ''), - 'charset' => 'utf8mb4', - 'collation' => 'utf8mb4_unicode_ci', - 'prefix' => '', - 'prefix_indexes' => true, - 'strict' => true, - 'engine' => null, - 'options' => extension_loaded('pdo_mysql') ? array_filter([ - PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), - ]) : [], - ], - - 'pgsql' => [ - 'driver' => 'pgsql', - 'url' => env('DATABASE_URL'), - 'host' => env('DB_HOST', '127.0.0.1'), - 'port' => env('DB_PORT', '5432'), - 'database' => env('DB_DATABASE', 'forge'), - 'username' => env('DB_USERNAME', 'forge'), - 'password' => env('DB_PASSWORD', ''), - 'charset' => 'utf8', - 'prefix' => '', - 'prefix_indexes' => true, - 'schema' => 'public', - 'sslmode' => 'prefer', - ], - - 'sqlsrv' => [ - 'driver' => 'sqlsrv', - 'url' => env('DATABASE_URL'), - 'host' => env('DB_HOST', 'localhost'), - 'port' => env('DB_PORT', '1433'), - 'database' => env('DB_DATABASE', 'forge'), - 'username' => env('DB_USERNAME', 'forge'), - 'password' => env('DB_PASSWORD', ''), - 'charset' => 'utf8', - 'prefix' => '', - 'prefix_indexes' => true, - ], - - ], - - /* - |-------------------------------------------------------------------------- - | Migration Repository Table - |-------------------------------------------------------------------------- - | - | This table keeps track of all the migrations that have already run for - | your application. Using this information, we can determine which of - | the migrations on disk haven't actually been run in the database. - | - */ - - 'migrations' => 'migrations', - - /* - |-------------------------------------------------------------------------- - | Redis Databases - |-------------------------------------------------------------------------- - | - | Redis is an open source, fast, and advanced key-value store that also - | provides a richer body of commands than a typical key-value system - | such as APC or Memcached. Laravel makes it easy to dig right in. - | - */ - - 'redis' => [ - - 'client' => env('REDIS_CLIENT', 'phpredis'), - - 'options' => [ - 'cluster' => env('REDIS_CLUSTER', 'redis'), - 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_') . '_database_'), - ], - - 'default' => [ - 'url' => env('REDIS_URL'), - 'host' => env('REDIS_HOST', '127.0.0.1'), - 'password' => env('REDIS_PASSWORD', null), - 'port' => env('REDIS_PORT', '6379'), - 'database' => env('REDIS_DB', '0'), - ], - - 'cache' => [ - 'url' => env('REDIS_URL'), - 'host' => env('REDIS_HOST', '127.0.0.1'), - 'password' => env('REDIS_PASSWORD', null), - 'port' => env('REDIS_PORT', '6379'), - 'database' => env('REDIS_CACHE_DB', '1'), - ], - - ], - -];