You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@devlake.apache.org by GitBox <gi...@apache.org> on 2022/09/16 01:07:14 UTC

[GitHub] [incubator-devlake] nicoabie opened a new pull request, #3096: feat(plugin): linear plugin poc

nicoabie opened a new pull request, #3096:
URL: https://github.com/apache/incubator-devlake/pull/3096

   ### ⚠️ Pre Checklist
   
   > Please complete _ALL_ items in this checklist, and remove before submitting
   
   - [X] I have read through the [Contributing Documentation](https://devlake.apache.org/community/).
   - [ ] I have added relevant tests.
   - [ ] I have added relevant documentation.
   - [X] I will add labels to the PR, such as `pr-type/bug-fix`, `pr-type/feature-development`, etc.
   
   
   
   # Summary
   
   <!--
   Thanks for submitting a pull request!
   
   We appreciate you spending the time to work on these changes.
   Please fill out as many sections below as possible.
   -->
   
   ### Does this close any open issues?
   Closes xx
   
   ### Screenshots
   Include any relevant screenshots here.
   
   ### Other Information
   Any other information that is important to this PR.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@devlake.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-devlake] nicoabie commented on a diff in pull request #3096: feat(plugin): linear plugin poc

Posted by GitBox <gi...@apache.org>.
nicoabie commented on code in PR #3096:
URL: https://github.com/apache/incubator-devlake/pull/3096#discussion_r972531253


##########
plugins/linear/models/migrationscripts/register.go:
##########
@@ -0,0 +1,27 @@
+/*

Review Comment:
   generated by the plugin template



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@devlake.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-devlake] nicoabie commented on a diff in pull request #3096: feat(plugin): linear plugin poc

Posted by GitBox <gi...@apache.org>.
nicoabie commented on code in PR #3096:
URL: https://github.com/apache/incubator-devlake/pull/3096#discussion_r972529623


##########
plugins/helper/api_client.go:
##########
@@ -119,6 +120,10 @@ func (apiClient *ApiClient) Setup(
 	apiClient.SetHeaders(headers)
 }
 
+func (apiClient *ApiClient) GetHttpClient() *http.Client {

Review Comment:
   I'm exposing the inner http client because I need one for
   `graphql.NewClient(connection.Endpoint+`graphql`, apiClient.GetHttpClient())` in plugins/linear/tasks/graphql_client.go
   
   Not sure how should I construct the graphql client if not



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@devlake.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-devlake] nicoabie commented on a diff in pull request #3096: feat(plugin): linear plugin poc

Posted by GitBox <gi...@apache.org>.
nicoabie commented on code in PR #3096:
URL: https://github.com/apache/incubator-devlake/pull/3096#discussion_r972530637


##########
plugins/linear/impl/impl.go:
##########
@@ -0,0 +1,117 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package impl
+
+import (
+	"github.com/apache/incubator-devlake/errors"
+	"github.com/apache/incubator-devlake/migration"
+	"github.com/apache/incubator-devlake/plugins/core"
+	"github.com/apache/incubator-devlake/plugins/helper"
+	"github.com/apache/incubator-devlake/plugins/linear/api"
+	"github.com/apache/incubator-devlake/plugins/linear/models"
+	"github.com/apache/incubator-devlake/plugins/linear/models/migrationscripts"
+	"github.com/apache/incubator-devlake/plugins/linear/tasks"
+	"github.com/spf13/viper"
+	"gorm.io/gorm"
+)
+
+// make sure interface is implemented
+var _ core.PluginMeta = (*Linear)(nil)
+var _ core.PluginInit = (*Linear)(nil)
+var _ core.PluginTask = (*Linear)(nil)
+var _ core.PluginApi = (*Linear)(nil)
+var _ core.PluginBlueprintV100 = (*Linear)(nil)
+var _ core.CloseablePluginTask = (*Linear)(nil)
+
+type Linear struct{}
+
+func (plugin Linear) Description() string {
+	return "collect some Linear data"
+}
+
+func (plugin Linear) Init(config *viper.Viper, logger core.Logger, db *gorm.DB) errors.Error {
+	api.Init(config, logger, db)
+	return nil
+}
+
+func (plugin Linear) SubTaskMetas() []core.SubTaskMeta {
+	// TODO add your sub task here
+	return []core.SubTaskMeta{
+		tasks.CollectIssuesMeta,
+	}
+}
+
+func (plugin Linear) PrepareTaskData(taskCtx core.TaskContext, options map[string]interface{}) (interface{}, errors.Error) {
+	op, err := tasks.DecodeAndValidateTaskOptions(options)
+	if err != nil {
+		return nil, err
+	}
+	connectionHelper := helper.NewConnectionHelper(
+		taskCtx,
+		nil,
+	)
+	connection := &models.LinearConnection{}
+	err = connectionHelper.FirstById(connection, op.ConnectionId)
+	if err != nil {
+		return nil, errors.Default.Wrap(err, "unable to get Linear connection by the given connection ID")
+	}
+
+	asyncGraphqlClient, err := tasks.NewLinearGraphqlClient(taskCtx, connection)

Review Comment:
   linear uses a graphql client https://developers.linear.app/docs/graphql/working-with-the-graphql-api



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@devlake.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-devlake] warren830 commented on a diff in pull request #3096: feat(plugin): linear plugin poc

Posted by GitBox <gi...@apache.org>.
warren830 commented on code in PR #3096:
URL: https://github.com/apache/incubator-devlake/pull/3096#discussion_r972950847


##########
plugins/linear/api/blueprint.go:
##########
@@ -0,0 +1,70 @@
+/*

Review Comment:
   yes, this is for asf



##########
plugins/linear/linear.go:
##########
@@ -0,0 +1,45 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package main
+
+import (
+	"github.com/apache/incubator-devlake/plugins/linear/impl"
+	"github.com/apache/incubator-devlake/runner"
+	"github.com/spf13/cobra"
+)
+
+// Export a variable named PluginEntry for Framework to search and load
+var PluginEntry impl.Linear //nolint
+
+// standalone mode for debugging
+func main() {

Review Comment:
   if you want to run this plugin, you can use this main() 



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@devlake.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-devlake] keon94 commented on a diff in pull request #3096: feat(plugin): linear plugin poc

Posted by GitBox <gi...@apache.org>.
keon94 commented on code in PR #3096:
URL: https://github.com/apache/incubator-devlake/pull/3096#discussion_r972593139


##########
plugins/linear/tasks/graphql_client.go:
##########
@@ -0,0 +1,78 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package tasks
+
+import (
+	"context"
+	"fmt"
+	"net/http"
+	"reflect"
+	"time"
+
+	"github.com/apache/incubator-devlake/errors"
+	"github.com/apache/incubator-devlake/plugins/core"
+	"github.com/apache/incubator-devlake/plugins/helper"
+	"github.com/apache/incubator-devlake/plugins/linear/models"
+	"github.com/merico-dev/graphql"
+)
+
+type GraphQueryRateLimit struct {
+	RateLimit struct {
+		Limit     graphql.Int
+		Remaining graphql.Int
+		ResetAt   time.Time
+	}
+}
+
+func NewLinearGraphqlClient(taskCtx core.TaskContext, connection *models.LinearConnection) (*helper.GraphqlAsyncClient, errors.Error) {
+	// create synchronize api client so we can calculate api rate limit dynamically
+	headers := map[string]string{
+		"Authorization": fmt.Sprintf("Bearer %v", connection.Token),
+	}
+	apiClient, err := helper.NewApiClient(taskCtx.GetContext(), connection.Endpoint, headers, 0, connection.Proxy, taskCtx)
+	if err != nil {
+		return nil, err
+	}
+	apiClient.SetAfterFunction(func(res *http.Response) errors.Error {
+		if res.StatusCode == http.StatusUnauthorized {
+			return errors.Default.New(fmt.Sprintf("authentication failed, please check your AccessToken"))

Review Comment:
   change this to errors.Unauthorized.New(...) to match the status code



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@devlake.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-devlake] abeizn commented on pull request #3096: feat(plugin): linear plugin poc

Posted by GitBox <gi...@apache.org>.
abeizn commented on PR #3096:
URL: https://github.com/apache/incubator-devlake/pull/3096#issuecomment-1248813847

   @nicoabie hello nicoabie, good job! Glad you contributed the linear plugin, looking forward to the final product.
   By the way, is there a corresponding issue for this pr.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@devlake.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-devlake] github-actions[bot] commented on pull request #3096: feat(plugin): linear plugin poc

Posted by GitBox <gi...@apache.org>.
github-actions[bot] commented on PR #3096:
URL: https://github.com/apache/incubator-devlake/pull/3096#issuecomment-1396271366

   This pull request has been automatically marked as stale because it has not had recent activity for 120 days. It will be closed in 7 days if no further activity occurs.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@devlake.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-devlake] github-actions[bot] commented on pull request #3096: feat(plugin): linear plugin poc

Posted by github-actions.
github-actions[bot] commented on PR #3096:
URL: https://github.com/apache/incubator-devlake/pull/3096#issuecomment-1405847197

   This pull request has been closed because it has not had recent activity. You could reopen it if you try to continue your work, and anyone who are interested in it are encouraged to continue work on this pull request.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@devlake.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-devlake] nicoabie commented on a diff in pull request #3096: feat(plugin): linear plugin poc

Posted by GitBox <gi...@apache.org>.
nicoabie commented on code in PR #3096:
URL: https://github.com/apache/incubator-devlake/pull/3096#discussion_r972532039


##########
plugins/linear/tasks/task_data.go:
##########
@@ -0,0 +1,52 @@
+/*

Review Comment:
   generated by the plugin template



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@devlake.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-devlake] nicoabie commented on a diff in pull request #3096: feat(plugin): linear plugin poc

Posted by GitBox <gi...@apache.org>.
nicoabie commented on code in PR #3096:
URL: https://github.com/apache/incubator-devlake/pull/3096#discussion_r972529962


##########
plugins/linear/api/connection.go:
##########
@@ -0,0 +1,149 @@
+/*

Review Comment:
   generated by the plugin template



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@devlake.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-devlake] nicoabie commented on a diff in pull request #3096: feat(plugin): linear plugin poc

Posted by GitBox <gi...@apache.org>.
nicoabie commented on code in PR #3096:
URL: https://github.com/apache/incubator-devlake/pull/3096#discussion_r972531161


##########
plugins/linear/models/migrationscripts/20220906_add_init_tables.go:
##########
@@ -0,0 +1,43 @@
+/*

Review Comment:
   generated by the plugin template



##########
plugins/linear/models/migrationscripts/20220906_add_init_tables.go:
##########
@@ -0,0 +1,43 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package migrationscripts
+
+import (
+	"context"
+
+	"github.com/apache/incubator-devlake/errors"
+	"github.com/apache/incubator-devlake/plugins/linear/models"
+	"gorm.io/gorm"
+)
+
+type addInitTables struct{}
+
+func (u *addInitTables) Up(ctx context.Context, db *gorm.DB) errors.Error {
+	err := db.Migrator().AutoMigrate(
+		&models.LinearIssue{},

Review Comment:
   only model for now



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@devlake.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-devlake] nicoabie commented on a diff in pull request #3096: feat(plugin): linear plugin poc

Posted by GitBox <gi...@apache.org>.
nicoabie commented on code in PR #3096:
URL: https://github.com/apache/incubator-devlake/pull/3096#discussion_r972531641


##########
plugins/linear/tasks/graphql_client.go:
##########
@@ -0,0 +1,78 @@
+/*

Review Comment:
   this is the interesting bit, creating a graphql client for linear



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@devlake.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-devlake] keon94 commented on a diff in pull request #3096: feat(plugin): linear plugin poc

Posted by GitBox <gi...@apache.org>.
keon94 commented on code in PR #3096:
URL: https://github.com/apache/incubator-devlake/pull/3096#discussion_r974838080


##########
plugins/linear/api/connection.go:
##########
@@ -0,0 +1,149 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package api
+
+import (
+	"context"
+	"fmt"
+	"net/http"
+	"time"
+
+	"github.com/apache/incubator-devlake/errors"
+	"github.com/apache/incubator-devlake/plugins/core"
+	"github.com/apache/incubator-devlake/plugins/helper"
+	"github.com/apache/incubator-devlake/plugins/linear/models"
+)
+
+// TODO Please modify the following code to fit your needs
+func TestConnection(input *core.ApiResourceInput) (*core.ApiResourceOutput, errors.Error) {
+	// decode
+	var err errors.Error
+	var connection models.TestConnectionRequest
+	if err = helper.Decode(input.Body, &connection, vld); err != nil {
+		return nil, err
+	}
+	// test connection
+	apiClient, err := helper.NewApiClient(
+		context.TODO(),
+		connection.Endpoint,
+		map[string]string{
+			"Authorization": fmt.Sprintf("Bearer %v", connection.Token),
+		},
+		3*time.Second,
+		connection.Proxy,
+		basicRes,
+	)
+	if err != nil {
+		return nil, err
+	}
+
+	res, err := apiClient.Get("user", nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	resBody := &models.ApiUserResponse{}
+	err = helper.UnmarshalResponse(res, resBody)
+	if err != nil {
+		return nil, err
+	}
+
+	if res.StatusCode != http.StatusOK {
+		return nil, errors.HttpStatus(res.StatusCode).New(fmt.Sprintf("unexpected status code: %d", res.StatusCode))
+	}
+	return nil, nil
+}
+
+//TODO Please modify the folowing code to adapt to your plugin
+/*
+POST /plugins/linear/connections
+{
+	"name": "Linear data connection name",
+	"endpoint": "Linear api endpoint, i.e. https://example.com",
+	"username": "username, usually should be email address",
+	"password": "Linear api access token"
+}
+*/
+func PostConnections(input *core.ApiResourceInput) (*core.ApiResourceOutput, errors.Error) {

Review Comment:
   This is the API you need to hit to create a connection object for Linear. You will need to pass in a JSON struct as part of the body of the http call, and this JSON struct should take the structure of your ```models.LinearConnection``` struct as key-value pairs.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@devlake.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-devlake] keon94 commented on a diff in pull request #3096: feat(plugin): linear plugin poc

Posted by GitBox <gi...@apache.org>.
keon94 commented on code in PR #3096:
URL: https://github.com/apache/incubator-devlake/pull/3096#discussion_r974839130


##########
plugins/linear/impl/impl.go:
##########
@@ -0,0 +1,117 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package impl
+
+import (
+	"github.com/apache/incubator-devlake/errors"
+	"github.com/apache/incubator-devlake/migration"
+	"github.com/apache/incubator-devlake/plugins/core"
+	"github.com/apache/incubator-devlake/plugins/helper"
+	"github.com/apache/incubator-devlake/plugins/linear/api"
+	"github.com/apache/incubator-devlake/plugins/linear/models"
+	"github.com/apache/incubator-devlake/plugins/linear/models/migrationscripts"
+	"github.com/apache/incubator-devlake/plugins/linear/tasks"
+	"github.com/spf13/viper"
+	"gorm.io/gorm"
+)
+
+// make sure interface is implemented
+var _ core.PluginMeta = (*Linear)(nil)
+var _ core.PluginInit = (*Linear)(nil)
+var _ core.PluginTask = (*Linear)(nil)
+var _ core.PluginApi = (*Linear)(nil)
+var _ core.PluginBlueprintV100 = (*Linear)(nil)
+var _ core.CloseablePluginTask = (*Linear)(nil)
+
+type Linear struct{}
+
+func (plugin Linear) Description() string {
+	return "collect some Linear data"
+}
+
+func (plugin Linear) Init(config *viper.Viper, logger core.Logger, db *gorm.DB) errors.Error {
+	api.Init(config, logger, db)
+	return nil
+}
+
+func (plugin Linear) SubTaskMetas() []core.SubTaskMeta {
+	// TODO add your sub task here
+	return []core.SubTaskMeta{
+		tasks.CollectIssuesMeta,
+	}
+}
+
+func (plugin Linear) PrepareTaskData(taskCtx core.TaskContext, options map[string]interface{}) (interface{}, errors.Error) {
+	op, err := tasks.DecodeAndValidateTaskOptions(options)
+	if err != nil {
+		return nil, err
+	}
+	connectionHelper := helper.NewConnectionHelper(
+		taskCtx,
+		nil,
+	)
+	connection := &models.LinearConnection{}
+	err = connectionHelper.FirstById(connection, op.ConnectionId)
+	if err != nil {
+		return nil, errors.Default.Wrap(err, "unable to get Linear connection by the given connection ID")
+	}
+
+	asyncGraphqlClient, err := tasks.NewLinearGraphqlClient(taskCtx, connection)

Review Comment:
   and this is where we initialize the client using that connection, which you're correctly doing already inside this constructor.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@devlake.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-devlake] keon94 commented on a diff in pull request #3096: feat(plugin): linear plugin poc

Posted by GitBox <gi...@apache.org>.
keon94 commented on code in PR #3096:
URL: https://github.com/apache/incubator-devlake/pull/3096#discussion_r974838496


##########
plugins/linear/impl/impl.go:
##########
@@ -0,0 +1,117 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package impl
+
+import (
+	"github.com/apache/incubator-devlake/errors"
+	"github.com/apache/incubator-devlake/migration"
+	"github.com/apache/incubator-devlake/plugins/core"
+	"github.com/apache/incubator-devlake/plugins/helper"
+	"github.com/apache/incubator-devlake/plugins/linear/api"
+	"github.com/apache/incubator-devlake/plugins/linear/models"
+	"github.com/apache/incubator-devlake/plugins/linear/models/migrationscripts"
+	"github.com/apache/incubator-devlake/plugins/linear/tasks"
+	"github.com/spf13/viper"
+	"gorm.io/gorm"
+)
+
+// make sure interface is implemented
+var _ core.PluginMeta = (*Linear)(nil)
+var _ core.PluginInit = (*Linear)(nil)
+var _ core.PluginTask = (*Linear)(nil)
+var _ core.PluginApi = (*Linear)(nil)
+var _ core.PluginBlueprintV100 = (*Linear)(nil)
+var _ core.CloseablePluginTask = (*Linear)(nil)
+
+type Linear struct{}
+
+func (plugin Linear) Description() string {
+	return "collect some Linear data"
+}
+
+func (plugin Linear) Init(config *viper.Viper, logger core.Logger, db *gorm.DB) errors.Error {
+	api.Init(config, logger, db)
+	return nil
+}
+
+func (plugin Linear) SubTaskMetas() []core.SubTaskMeta {
+	// TODO add your sub task here
+	return []core.SubTaskMeta{
+		tasks.CollectIssuesMeta,
+	}
+}
+
+func (plugin Linear) PrepareTaskData(taskCtx core.TaskContext, options map[string]interface{}) (interface{}, errors.Error) {
+	op, err := tasks.DecodeAndValidateTaskOptions(options)
+	if err != nil {
+		return nil, err
+	}
+	connectionHelper := helper.NewConnectionHelper(
+		taskCtx,
+		nil,
+	)
+	connection := &models.LinearConnection{}
+	err = connectionHelper.FirstById(connection, op.ConnectionId)

Review Comment:
   This is where the created connection object is read from the database and loaded in



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@devlake.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-devlake] nicoabie commented on a diff in pull request #3096: feat(plugin): linear plugin poc

Posted by GitBox <gi...@apache.org>.
nicoabie commented on code in PR #3096:
URL: https://github.com/apache/incubator-devlake/pull/3096#discussion_r972532144


##########
plugins/linear/tasks/task_data.go:
##########
@@ -0,0 +1,52 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package tasks
+
+import (
+	"github.com/apache/incubator-devlake/errors"
+	"github.com/apache/incubator-devlake/plugins/helper"
+)
+
+type LinearApiParams struct {
+}
+
+type LinearOptions struct {
+	// TODO add some custom options here if necessary
+	// options means some custom params required by plugin running.
+	// Such As How many rows do your want
+	// You can use it in sub tasks and you need pass it in main.go and pipelines.
+	ConnectionId uint64   `json:"connectionId"`
+	Tasks        []string `json:"tasks,omitempty"`
+	Since        string
+}
+
+type LinearTaskData struct {
+	Options       *LinearOptions
+	GraphqlClient *helper.GraphqlAsyncClient

Review Comment:
   here I changed it to pass wht gql client instead of an http client
   



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@devlake.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-devlake] nicoabie commented on a diff in pull request #3096: feat(plugin): linear plugin poc

Posted by GitBox <gi...@apache.org>.
nicoabie commented on code in PR #3096:
URL: https://github.com/apache/incubator-devlake/pull/3096#discussion_r972531943


##########
plugins/linear/tasks/issues_extractor.go:
##########
@@ -0,0 +1,56 @@
+/*

Review Comment:
   generated by the plugin template



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@devlake.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-devlake] nicoabie commented on a diff in pull request #3096: feat(plugin): linear plugin poc

Posted by GitBox <gi...@apache.org>.
nicoabie commented on code in PR #3096:
URL: https://github.com/apache/incubator-devlake/pull/3096#discussion_r972530124


##########
plugins/linear/api/init.go:
##########
@@ -0,0 +1,39 @@
+/*

Review Comment:
   generated by the plugin template



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@devlake.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-devlake] nicoabie commented on a diff in pull request #3096: feat(plugin): linear plugin poc

Posted by GitBox <gi...@apache.org>.
nicoabie commented on code in PR #3096:
URL: https://github.com/apache/incubator-devlake/pull/3096#discussion_r972529801


##########
plugins/linear/api/blueprint.go:
##########
@@ -0,0 +1,70 @@
+/*

Review Comment:
   generated by the plugin template



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@devlake.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-devlake] keon94 commented on a diff in pull request #3096: feat(plugin): linear plugin poc

Posted by GitBox <gi...@apache.org>.
keon94 commented on code in PR #3096:
URL: https://github.com/apache/incubator-devlake/pull/3096#discussion_r973232562


##########
plugins/linear/tasks/issues_collector.go:
##########
@@ -0,0 +1,110 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package tasks
+
+import (
+	"github.com/apache/incubator-devlake/errors"
+	"github.com/apache/incubator-devlake/plugins/core"
+	"github.com/apache/incubator-devlake/plugins/helper"
+	"github.com/apache/incubator-devlake/plugins/linear/models"
+	"github.com/merico-dev/graphql"
+)
+
+const RAW_ISSUES_TABLE = "linear_issues"
+
+type GraphqlQueryIssueWrapper struct {
+	IssueList struct {
+		TotalCount graphql.Int
+		Issues     []GraphqlQueryIssue `graphql:"nodes"`
+		PageInfo   *helper.GraphqlQueryPageInfo
+	} `graphql:"issues(first: $pageSize, after: $skipCursor)"`
+}
+
+type GraphqlQueryIssue struct {
+	Id         string
+	Identifier string
+	Title      string
+	Number     int
+	BranchName string
+}
+
+var _ core.SubTaskEntryPoint = CollectIssues
+
+var CollectIssuesMeta = core.SubTaskMeta{
+	Name:             "CollectIssues",
+	EntryPoint:       CollectIssues,
+	EnabledByDefault: true,
+	Description:      "Collect Issues data from Linear api",
+}
+
+func CollectIssues(taskCtx core.SubTaskContext) errors.Error {
+	data := taskCtx.GetData().(*LinearTaskData)
+
+	collector, err := helper.NewGraphqlCollector(helper.GraphqlCollectorArgs{
+		RawDataSubTaskArgs: helper.RawDataSubTaskArgs{
+			Ctx:    taskCtx,
+			Params: LinearApiParams{},
+			Table:  RAW_ISSUES_TABLE,
+		},
+		GraphqlClient: data.GraphqlClient,
+		PageSize:      100,
+
+		BuildQuery: func(reqData *helper.GraphqlRequestData) (interface{}, map[string]interface{}, error) {
+			query := &GraphqlQueryIssueWrapper{}
+			variables := map[string]interface{}{
+				"pageSize":   graphql.Int(reqData.Pager.Size),
+				"skipCursor": (*graphql.String)(reqData.Pager.SkipCursor),
+			}
+			return query, variables, nil
+		},
+		GetPageInfo: func(iQuery interface{}, args *helper.GraphqlCollectorArgs) (*helper.GraphqlQueryPageInfo, error) {
+			query := iQuery.(*GraphqlQueryIssueWrapper)
+			return query.IssueList.PageInfo, nil
+		},
+		ResponseParser: func(iQuery interface{}, variables map[string]interface{}) ([]interface{}, error) {
+			query := iQuery.(*GraphqlQueryIssueWrapper)
+			issues := query.IssueList.Issues
+
+			results := make([]interface{}, 0, 1)
+			for _, issue := range issues {
+				githubIssue, err := convertLinearIssue(issue, data.Options.ConnectionId)

Review Comment:
   *linearIssue



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@devlake.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-devlake] keon94 commented on pull request #3096: feat(plugin): linear plugin poc

Posted by GitBox <gi...@apache.org>.
keon94 commented on PR #3096:
URL: https://github.com/apache/incubator-devlake/pull/3096#issuecomment-1251774879

   @nicoabie Hey Nico, you've gotten the setup correct for testing purposes. All you need to do is follow my comment [here](https://github.com/apache/incubator-devlake/pull/3096/files#r974838080) to create and save the connection in Devlake, and then run the plugin using the plugin's main method. You will need to know the connectionID to run main(): the PostConnection API will return that to you in the response. Alternatively, you can look it up in the connections table of the Devlake DB.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@devlake.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-devlake] nicoabie commented on a diff in pull request #3096: feat(plugin): linear plugin poc

Posted by GitBox <gi...@apache.org>.
nicoabie commented on code in PR #3096:
URL: https://github.com/apache/incubator-devlake/pull/3096#discussion_r972532974


##########
plugins/linear/tasks/issues_collector.go:
##########
@@ -0,0 +1,110 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package tasks
+
+import (
+	"github.com/apache/incubator-devlake/errors"
+	"github.com/apache/incubator-devlake/plugins/core"
+	"github.com/apache/incubator-devlake/plugins/helper"
+	"github.com/apache/incubator-devlake/plugins/linear/models"
+	"github.com/merico-dev/graphql"
+)
+
+const RAW_ISSUES_TABLE = "linear_issues"
+
+type GraphqlQueryIssueWrapper struct {
+	IssueList struct {
+		TotalCount graphql.Int
+		Issues     []GraphqlQueryIssue `graphql:"nodes"`
+		PageInfo   *helper.GraphqlQueryPageInfo
+	} `graphql:"issues(first: $pageSize, after: $skipCursor)"`
+}
+
+type GraphqlQueryIssue struct {
+	Id         string
+	Identifier string
+	Title      string
+	Number     int
+	BranchName string
+}
+
+var _ core.SubTaskEntryPoint = CollectIssues
+
+var CollectIssuesMeta = core.SubTaskMeta{
+	Name:             "CollectIssues",
+	EntryPoint:       CollectIssues,
+	EnabledByDefault: true,
+	Description:      "Collect Issues data from Linear api",
+}
+
+func CollectIssues(taskCtx core.SubTaskContext) errors.Error {
+	data := taskCtx.GetData().(*LinearTaskData)
+
+	collector, err := helper.NewGraphqlCollector(helper.GraphqlCollectorArgs{
+		RawDataSubTaskArgs: helper.RawDataSubTaskArgs{
+			Ctx:    taskCtx,
+			Params: LinearApiParams{},
+			Table:  RAW_ISSUES_TABLE,
+		},
+		GraphqlClient: data.GraphqlClient,
+		PageSize:      100,
+
+		BuildQuery: func(reqData *helper.GraphqlRequestData) (interface{}, map[string]interface{}, error) {
+			query := &GraphqlQueryIssueWrapper{}
+			variables := map[string]interface{}{
+				"pageSize":   graphql.Int(reqData.Pager.Size),
+				"skipCursor": (*graphql.String)(reqData.Pager.SkipCursor),
+			}
+			return query, variables, nil
+		},
+		GetPageInfo: func(iQuery interface{}, args *helper.GraphqlCollectorArgs) (*helper.GraphqlQueryPageInfo, error) {
+			query := iQuery.(*GraphqlQueryIssueWrapper)
+			return query.IssueList.PageInfo, nil
+		},
+		ResponseParser: func(iQuery interface{}, variables map[string]interface{}) ([]interface{}, error) {
+			query := iQuery.(*GraphqlQueryIssueWrapper)
+			issues := query.IssueList.Issues
+
+			results := make([]interface{}, 0, 1)
+			for _, issue := range issues {
+				githubIssue, err := convertLinearIssue(issue, data.Options.ConnectionId)
+				if err != nil {
+					return nil, err
+				}
+				results = append(results, githubIssue)
+			}
+			return results, nil
+		},
+	})
+	if err != nil {
+		return err
+	}
+
+	return collector.Execute()
+}
+
+func convertLinearIssue(issue GraphqlQueryIssue, connectionId uint64) (*models.LinearIssue, error) {

Review Comment:
   I took the example of github_graphql issue_collector but I shouldn't be generating model from here right? I should be storing the json representation in the tool layer, correct?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@devlake.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-devlake] nicoabie commented on a diff in pull request #3096: feat(plugin): linear plugin poc

Posted by GitBox <gi...@apache.org>.
nicoabie commented on code in PR #3096:
URL: https://github.com/apache/incubator-devlake/pull/3096#discussion_r972533183


##########
plugins/linear/tasks/issues_collector.go:
##########
@@ -0,0 +1,110 @@
+/*

Review Comment:
   this is another interesting bit, collecting linear issues



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@devlake.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-devlake] nicoabie commented on a diff in pull request #3096: feat(plugin): linear plugin poc

Posted by GitBox <gi...@apache.org>.
nicoabie commented on code in PR #3096:
URL: https://github.com/apache/incubator-devlake/pull/3096#discussion_r972530905


##########
plugins/linear/models/connection.go:
##########
@@ -0,0 +1,51 @@
+/*

Review Comment:
   generated by the plugin template



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@devlake.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-devlake] keon94 commented on a diff in pull request #3096: feat(plugin): linear plugin poc

Posted by GitBox <gi...@apache.org>.
keon94 commented on code in PR #3096:
URL: https://github.com/apache/incubator-devlake/pull/3096#discussion_r972592484


##########
plugins/helper/api_client.go:
##########
@@ -119,6 +120,10 @@ func (apiClient *ApiClient) Setup(
 	apiClient.SetHeaders(headers)
 }
 
+func (apiClient *ApiClient) GetHttpClient() *http.Client {

Review Comment:
   you'll need to add a doc comment on top of this function to make the linter happy (since it's an exported function)



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@devlake.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-devlake] nicoabie commented on a diff in pull request #3096: feat(plugin): linear plugin poc

Posted by GitBox <gi...@apache.org>.
nicoabie commented on code in PR #3096:
URL: https://github.com/apache/incubator-devlake/pull/3096#discussion_r972528386


##########
plugins/linear/impl/impl.go:
##########
@@ -0,0 +1,117 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package impl
+
+import (
+	"github.com/apache/incubator-devlake/errors"
+	"github.com/apache/incubator-devlake/migration"
+	"github.com/apache/incubator-devlake/plugins/core"
+	"github.com/apache/incubator-devlake/plugins/helper"
+	"github.com/apache/incubator-devlake/plugins/linear/api"
+	"github.com/apache/incubator-devlake/plugins/linear/models"
+	"github.com/apache/incubator-devlake/plugins/linear/models/migrationscripts"
+	"github.com/apache/incubator-devlake/plugins/linear/tasks"
+	"github.com/spf13/viper"
+	"gorm.io/gorm"
+)
+
+// make sure interface is implemented
+var _ core.PluginMeta = (*Linear)(nil)
+var _ core.PluginInit = (*Linear)(nil)
+var _ core.PluginTask = (*Linear)(nil)
+var _ core.PluginApi = (*Linear)(nil)
+var _ core.PluginBlueprintV100 = (*Linear)(nil)
+var _ core.CloseablePluginTask = (*Linear)(nil)
+
+type Linear struct{}
+
+func (plugin Linear) Description() string {
+	return "collect some Linear data"
+}
+
+func (plugin Linear) Init(config *viper.Viper, logger core.Logger, db *gorm.DB) errors.Error {
+	api.Init(config, logger, db)
+	return nil
+}
+
+func (plugin Linear) SubTaskMetas() []core.SubTaskMeta {
+	// TODO add your sub task here
+	return []core.SubTaskMeta{
+		tasks.CollectIssuesMeta,

Review Comment:
   just one subtask for testing



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@devlake.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-devlake] nicoabie commented on a diff in pull request #3096: feat(plugin): linear plugin poc

Posted by GitBox <gi...@apache.org>.
nicoabie commented on code in PR #3096:
URL: https://github.com/apache/incubator-devlake/pull/3096#discussion_r972531078


##########
plugins/linear/models/issue.go:
##########
@@ -0,0 +1,36 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package models
+
+import (
+	"github.com/apache/incubator-devlake/models/common"
+)
+
+type LinearIssue struct {

Review Comment:
   bring a couple of fields for testing



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@devlake.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-devlake] nicoabie commented on a diff in pull request #3096: feat(plugin): linear plugin poc

Posted by GitBox <gi...@apache.org>.
nicoabie commented on code in PR #3096:
URL: https://github.com/apache/incubator-devlake/pull/3096#discussion_r972530792


##########
plugins/linear/linear.go:
##########
@@ -0,0 +1,45 @@
+/*

Review Comment:
   generated by the plugin template



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@devlake.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [incubator-devlake] github-actions[bot] closed pull request #3096: feat(plugin): linear plugin poc

Posted by github-actions.
github-actions[bot] closed pull request #3096: feat(plugin): linear plugin poc
URL: https://github.com/apache/incubator-devlake/pull/3096


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@devlake.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org