You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@devlake.apache.org by zh...@apache.org on 2022/08/17 12:36:19 UTC

[incubator-devlake] branch release-v0.12 updated: fix: support multi type of story point field (#2760)

This is an automated email from the ASF dual-hosted git repository.

zhangliang2022 pushed a commit to branch release-v0.12
in repository https://gitbox.apache.org/repos/asf/incubator-devlake.git


The following commit(s) were added to refs/heads/release-v0.12 by this push:
     new 0db38674 fix: support multi type of story point field (#2760)
0db38674 is described below

commit 0db3867450b939e46f739b09d53617077f2e0e2d
Author: NaRro <co...@merico.dev>
AuthorDate: Wed Aug 17 20:36:14 2022 +0800

    fix: support multi type of story point field (#2760)
    
    cherry-picked from https://github.com/apache/incubator-devlake/pull/2754
    
    #2753
---
 plugins/jira/e2e/raw_tables/_raw_jira_api_issues.csv   |  2 +-
 plugins/jira/e2e/snapshot_tables/_tool_jira_issues.csv |  2 +-
 plugins/jira/e2e/snapshot_tables/issues.csv            |  2 +-
 plugins/jira/tasks/issue_extractor.go                  | 14 +++++++++++---
 4 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/plugins/jira/e2e/raw_tables/_raw_jira_api_issues.csv b/plugins/jira/e2e/raw_tables/_raw_jira_api_issues.csv
index 7387436f..f9d3ff03 100644
--- a/plugins/jira/e2e/raw_tables/_raw_jira_api_issues.csv
+++ b/plugins/jira/e2e/raw_tables/_raw_jira_api_issues.csv
@@ -1,6 +1,6 @@
 "id","params","data","url","input","created_at"
 12441,"{""ConnectionId"":2,""BoardId"":8}","{""id"": ""10063"", ""key"": ""EE-1"", ""self"": ""https://merico.atlassian.net/rest/agile/1.0/issue/10063"", ""expand"": ""operations,versionedRepresentations,editmeta,changelog,renderedFields"", ""fields"": {""epic"": null, ""votes"": {""self"": ""https://merico.atlassian.net/rest/api/2/issue/EE-1/votes"", ""votes"": 0, ""hasVoted"": false}, ""labels"": [], ""sprint"": null, ""status"": {""id"": ""10068"", ""name"": ""已完成"", ""self"": ""https [...]
-12442,"{""ConnectionId"":2,""BoardId"":8}","{""id"": ""10064"", ""key"": ""EE-2"", ""self"": ""https://merico.atlassian.net/rest/agile/1.0/issue/10064"", ""expand"": ""operations,versionedRepresentations,editmeta,changelog,renderedFields"", ""fields"": {""epic"": null, ""votes"": {""self"": ""https://merico.atlassian.net/rest/api/2/issue/EE-2/votes"", ""votes"": 0, ""hasVoted"": false}, ""labels"": [], ""sprint"": null, ""status"": {""id"": ""10068"", ""name"": ""已完成"", ""self"": ""https [...]
+12442,"{""ConnectionId"":2,""BoardId"":8}","{""id"": ""10064"", ""key"": ""EE-2"", ""self"": ""https://merico.atlassian.net/rest/agile/1.0/issue/10064"", ""expand"": ""operations,versionedRepresentations,editmeta,changelog,renderedFields"", ""fields"": {""epic"": null, ""votes"": {""self"": ""https://merico.atlassian.net/rest/api/2/issue/EE-2/votes"", ""votes"": 0, ""hasVoted"": false}, ""labels"": [], ""sprint"": null, ""status"": {""id"": ""10068"", ""name"": ""已完成"", ""self"": ""https [...]
 12443,"{""ConnectionId"":2,""BoardId"":8}","{""id"": ""10065"", ""key"": ""EE-3"", ""self"": ""https://merico.atlassian.net/rest/agile/1.0/issue/10065"", ""expand"": ""operations,versionedRepresentations,editmeta,changelog,renderedFields"", ""fields"": {""epic"": null, ""votes"": {""self"": ""https://merico.atlassian.net/rest/api/2/issue/EE-3/votes"", ""votes"": 0, ""hasVoted"": false}, ""labels"": [], ""sprint"": null, ""status"": {""id"": ""10068"", ""name"": ""已完成"", ""self"": ""https [...]
 12444,"{""ConnectionId"":2,""BoardId"":8}","{""id"": ""10066"", ""key"": ""EE-4"", ""self"": ""https://merico.atlassian.net/rest/agile/1.0/issue/10066"", ""expand"": ""operations,versionedRepresentations,editmeta,changelog,renderedFields"", ""fields"": {""epic"": null, ""votes"": {""self"": ""https://merico.atlassian.net/rest/api/2/issue/EE-4/votes"", ""votes"": 0, ""hasVoted"": false}, ""labels"": [], ""sprint"": null, ""status"": {""id"": ""10068"", ""name"": ""已完成"", ""self"": ""https [...]
 12445,"{""ConnectionId"":2,""BoardId"":8}","{""id"": ""10067"", ""key"": ""EE-5"", ""self"": ""https://merico.atlassian.net/rest/agile/1.0/issue/10067"", ""expand"": ""operations,versionedRepresentations,editmeta,changelog,renderedFields"", ""fields"": {""epic"": null, ""votes"": {""self"": ""https://merico.atlassian.net/rest/api/2/issue/EE-5/votes"", ""votes"": 0, ""hasVoted"": false}, ""labels"": [], ""sprint"": null, ""status"": {""id"": ""10068"", ""name"": ""已完成"", ""self"": ""https [...]
diff --git a/plugins/jira/e2e/snapshot_tables/_tool_jira_issues.csv b/plugins/jira/e2e/snapshot_tables/_tool_jira_issues.csv
index 372403e2..e51ed25d 100644
--- a/plugins/jira/e2e/snapshot_tables/_tool_jira_issues.csv
+++ b/plugins/jira/e2e/snapshot_tables/_tool_jira_issues.csv
@@ -1,6 +1,6 @@
 connection_id,issue_id,project_id,self,issue_key,summary,type,epic_key,status_name,status_key,story_point,original_estimate_minutes,aggregate_estimate_minutes,remaining_estimate_minutes,creator_account_id,creator_account_type,creator_display_name,assignee_account_id,assignee_account_type,assignee_display_name,priority_id,priority_name,parent_id,parent_key,sprint_id,sprint_name,resolution_date,created,updated,spent_minutes,lead_time_minutes,std_story_point,std_type,std_status,_raw_data_pa [...]
 2,10063,10003,https://merico.atlassian.net/rest/agile/1.0/issue/10063,EE-1,​四个排序图:测试/注释覆盖度、复用度、模块性,Story,,已完成,done,-1,0,1260,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0c730ec90c1999cadf,,Dingding Zhang,3,Medium,0,,0,,2020-06-19T06:31:18.495+00:00,2020-06-12T00:13:13.360+00:00,2021-03-28T08:06:08.713+00:00,0,10458,-1,STORY,DONE,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issues,12441,,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?siz [...]
-2,10064,10003,https://merico.atlassian.net/rest/agile/1.0/issue/10064,EE-2,​问题堆叠分布排序图,Story,,已完成,done,0,0,840,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0c730ec90c1999cadf,,Dingding Zhang,3,Medium,0,,0,,2020-06-23T10:20:58.999+00:00,2020-06-12T00:15:36.123+00:00,2021-03-28T08:05:55.016+00:00,0,16445,0,STORY,DONE,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issues,12442,,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium
+2,10064,10003,https://merico.atlassian.net/rest/agile/1.0/issue/10064,EE-2,​问题堆叠分布排序图,Story,,已完成,done,2,0,840,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0c730ec90c1999cadf,,Dingding Zhang,3,Medium,0,,0,,2020-06-23T10:20:58.999+00:00,2020-06-12T00:15:36.123+00:00,2021-03-28T08:05:55.016+00:00,0,16445,2,STORY,DONE,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issues,12442,,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium
 2,10065,10003,https://merico.atlassian.net/rest/agile/1.0/issue/10065,EE-3,​问题积压图率,Story,,已完成,done,0,0,600,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0c730ec90c1999cadf,,Dingding Zhang,3,Medium,0,,0,,2020-06-23T10:21:11.996+00:00,2020-06-12T00:15:41.600+00:00,2021-03-28T08:05:55.061+00:00,0,16445,0,STORY,DONE,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issues,12443,,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium
 2,10066,10003,https://merico.atlassian.net/rest/agile/1.0/issue/10066,EE-4,​问题分布的帕累托图,Story,,已完成,done,0,0,480,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0c730ec90c1999cadf,,Dingding Zhang,3,Medium,0,,0,,2020-06-23T10:21:23.562+00:00,2020-06-12T00:15:46.144+00:00,2021-03-28T08:06:09.535+00:00,0,16445,0,STORY,DONE,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issues,12444,,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium
 2,10067,10003,https://merico.atlassian.net/rest/agile/1.0/issue/10067,EE-5,​通用技术任务,Task,,已完成,done,0,0,360,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0c730ec90c1999cadf,,Dingding Zhang,3,Medium,0,,0,,2020-06-18T04:06:00.747+00:00,2020-06-12T00:16:44.157+00:00,2021-03-28T08:05:54.622+00:00,0,8869,0,TASK,DONE,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issues,12445,,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium
diff --git a/plugins/jira/e2e/snapshot_tables/issues.csv b/plugins/jira/e2e/snapshot_tables/issues.csv
index c0029e9e..f1702621 100644
--- a/plugins/jira/e2e/snapshot_tables/issues.csv
+++ b/plugins/jira/e2e/snapshot_tables/issues.csv
@@ -1,6 +1,6 @@
 id,url,icon_url,issue_key,title,description,epic_key,type,status,original_status,story_point,resolution_date,created_date,updated_date,lead_time_minutes,parent_issue_id,priority,original_estimate_minutes,time_spent_minutes,time_remaining_minutes,creator_id,creator_name,assignee_id,assignee_name,severity,component
 jira:JiraIssue:2:10063,https://merico.atlassian.net/browse/EE-1,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,EE-1,​四个排序图:测试/注释覆盖度、复用度、模块性,,,STORY,DONE,已完成,-1,2020-06-19T06:31:18.495+00:00,2020-06-12T00:13:13.360+00:00,2021-03-28T08:06:08.713+00:00,10458,,Medium,0,0,0,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,
-jira:JiraIssue:2:10064,https://merico.atlassian.net/browse/EE-2,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,EE-2,​问题堆叠分布排序图,,,STORY,DONE,已完成,0,2020-06-23T10:20:58.999+00:00,2020-06-12T00:15:36.123+00:00,2021-03-28T08:05:55.016+00:00,16445,,Medium,0,0,0,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,
+jira:JiraIssue:2:10064,https://merico.atlassian.net/browse/EE-2,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,EE-2,​问题堆叠分布排序图,,,STORY,DONE,已完成,2,2020-06-23T10:20:58.999+00:00,2020-06-12T00:15:36.123+00:00,2021-03-28T08:05:55.016+00:00,16445,,Medium,0,0,0,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,
 jira:JiraIssue:2:10065,https://merico.atlassian.net/browse/EE-3,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,EE-3,​问题积压图率,,,STORY,DONE,已完成,0,2020-06-23T10:21:11.996+00:00,2020-06-12T00:15:41.600+00:00,2021-03-28T08:05:55.061+00:00,16445,,Medium,0,0,0,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,
 jira:JiraIssue:2:10066,https://merico.atlassian.net/browse/EE-4,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,EE-4,​问题分布的帕累托图,,,STORY,DONE,已完成,0,2020-06-23T10:21:23.562+00:00,2020-06-12T00:15:46.144+00:00,2021-03-28T08:06:09.535+00:00,16445,,Medium,0,0,0,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,
 jira:JiraIssue:2:10067,https://merico.atlassian.net/browse/EE-5,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium,EE-5,​通用技术任务,,,TASK,DONE,已完成,0,2020-06-18T04:06:00.747+00:00,2020-06-12T00:16:44.157+00:00,2021-03-28T08:05:54.622+00:00,8869,,Medium,0,0,0,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,
diff --git a/plugins/jira/tasks/issue_extractor.go b/plugins/jira/tasks/issue_extractor.go
index 6fc28bbe..19097a88 100644
--- a/plugins/jira/tasks/issue_extractor.go
+++ b/plugins/jira/tasks/issue_extractor.go
@@ -19,11 +19,12 @@ package tasks
 
 import (
 	"encoding/json"
-	"github.com/apache/incubator-devlake/plugins/core/dal"
 	"strconv"
 	"strings"
 	"time"
 
+	"github.com/apache/incubator-devlake/plugins/core/dal"
+
 	"github.com/apache/incubator-devlake/plugins/core"
 	"github.com/apache/incubator-devlake/plugins/helper"
 	"github.com/apache/incubator-devlake/plugins/jira/models"
@@ -107,9 +108,16 @@ func ExtractIssues(taskCtx core.SubTaskContext) error {
 				issue.LeadTimeMinutes = uint(issue.ResolutionDate.Unix()-issue.Created.Unix()) / 60
 			}
 			if data.Options.TransformationRules.StoryPointField != "" {
-				strStoryPoint, _ := apiIssue.Fields.AllFields[data.Options.TransformationRules.StoryPointField].(string)
-				if strStoryPoint != "" {
+				unknownStoryPoint := apiIssue.Fields.AllFields[data.Options.TransformationRules.StoryPointField]
+				switch unknownStoryPoint.(type) {
+				case string:
+					// string, try to parse
+					strStoryPoint, _ := unknownStoryPoint.(string)
 					issue.StoryPoint, _ = strconv.ParseFloat(strStoryPoint, 32)
+				case nil:
+				default:
+					// not string, convert to float64, ignore it if failed
+					issue.StoryPoint, _ = unknownStoryPoint.(float64)
 				}
 			}
 			issue.Type = typeIdMapping[issue.Type]