redmine_remotes 0.11.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/controllers/project_remote_issues_controller/create.rb +1 -1
- data/app/controllers/project_remote_issues_controller/update.rb +1 -1
- data/app/controllers/remote_trackers_controller.rb +4 -1
- data/app/models/remote_issue.rb +11 -0
- data/app/models/remote_issue_fetch/base.rb +45 -0
- data/app/models/remote_issue_fetch/base/_local_issue.rb +77 -0
- data/app/models/remote_issue_fetch/base/_provider_issue.rb +18 -0
- data/app/models/remote_issue_fetch/base/_remote_issue.rb +19 -0
- data/app/models/remote_issue_fetch/create.rb +44 -0
- data/app/models/remote_issue_fetch/create/_local_issue.rb +21 -0
- data/app/models/remote_issue_fetch/create/_remote_issue.rb +21 -0
- data/app/models/remote_issue_fetch/update.rb +18 -0
- data/app/models/remote_issue_fetch/update/_local_issue.rb +15 -0
- data/app/models/remote_issue_fetch/update/_remote_issue.rb +15 -0
- data/app/models/remote_tracker.rb +7 -1
- data/app/models/remote_tracker/find_issue_local_status.rb +1 -1
- data/app/models/remote_tracker/remote.rb +32 -8
- data/app/models/remote_tracker_fetch.rb +47 -0
- data/app/models/remote_tracker_fetch/provider.rb +13 -0
- data/app/models/remote_tracker_fetch/remote_issues.rb +27 -0
- data/app/models/remote_tracker_fetch/remote_tracker.rb +16 -0
- data/app/models/remote_user/find_local_user.rb +3 -3
- data/config/initializers/001_patches.rb +1 -0
- data/config/locales/en.yml +1 -0
- data/config/locales/pt-BR.yml +1 -0
- data/config/routes.rb +6 -5
- data/db/migrate/20190531171641_create_remote_trackers.rb +1 -1
- data/db/migrate/20190910182842_create_remote_users.rb +1 -1
- data/db/migrate/20190910203552_create_remote_issue_statuses.rb +1 -1
- data/db/migrate/20190912000000_create_remote_issues.rb +1 -1
- data/db/migrate/20200602192120_add_outdated_at_to_remote_issues.rb +7 -0
- data/db/migrate/20200602194753_add_fetched_at_to_remote_issues.rb +7 -0
- data/db/migrate/20200602203020_add_fetched_at_to_remote_trackers.rb +7 -0
- data/lib/redmine_remotes/esosti/entities/issue.rb +40 -1
- data/lib/redmine_remotes/esosti/instance.rb +8 -5
- data/lib/redmine_remotes/jira/entities/issue.rb +6 -2
- data/lib/redmine_remotes/jira/instance.rb +4 -17
- data/lib/redmine_remotes/jobs/fetch_issues.rb +31 -0
- data/lib/redmine_remotes/jobs/fetch_trackers.rb +30 -0
- data/lib/redmine_remotes/patches/avmtrf1_rest_provider_instance.rb +22 -0
- data/lib/redmine_remotes/version.rb +1 -1
- data/lib/tasks/redmine_remotes.rake +16 -11
- metadata +49 -27
- data/app/models/redmine_remotes/tableless/remote_issue_fetch/base.rb +0 -39
- data/app/models/redmine_remotes/tableless/remote_issue_fetch/base/_local_issue.rb +0 -67
- data/app/models/redmine_remotes/tableless/remote_issue_fetch/base/_provider_issue.rb +0 -22
- data/app/models/redmine_remotes/tableless/remote_issue_fetch/create.rb +0 -57
- data/app/models/redmine_remotes/tableless/remote_issue_fetch/create/_local_issue.rb +0 -25
- data/app/models/redmine_remotes/tableless/remote_issue_fetch/create/_remote_issue.rb +0 -32
- data/app/models/redmine_remotes/tableless/remote_issue_fetch/update.rb +0 -30
- data/app/models/redmine_remotes/tableless/remote_issue_fetch/update/_local_issue.rb +0 -19
- data/app/models/redmine_remotes/tableless/remote_issue_fetch/update/_remote_issue.rb +0 -19
- data/lib/redmine_remotes/rest_provider/http_response.rb +0 -31
- data/lib/redmine_remotes/rest_provider/instance.rb +0 -35
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6f6710957b993d233b258cc399182801aaf348281e51df537cf4d10721309154
|
4
|
+
data.tar.gz: f9fc4342d569bf8359696a330eddb9c980293ee17f3e2a72be03c5fa6c0b5103
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 27bb24d1b92d9c58e388cd0b14bf150e0ffa09d3a540baf41a5417eb6318ee707a4a18bbc59fc4fbd60d01e2924c0ce432741d8c9b630634852a8600101eec74
|
7
|
+
data.tar.gz: ea5eae31d4a6eff4e51d6b72428b798302bab4c49120ad2635c119313928234e4a82f0e43f658f79b80077449604f91efa92d1d5529747c5bf3757e80aa109ea
|
@@ -14,7 +14,10 @@ class RemoteTrackersController < ApplicationController
|
|
14
14
|
conf.columns[:password].form_ui = :password
|
15
15
|
conf.columns[:profile].form_ui = :select
|
16
16
|
conf.columns[:default_local_user].form_ui = :select
|
17
|
-
%w[list show].each
|
17
|
+
%w[list show].each do |action|
|
18
|
+
conf.send(action).columns.exclude :password
|
19
|
+
conf.send(action).columns << :fetched_at
|
20
|
+
end
|
18
21
|
end
|
19
22
|
|
20
23
|
private
|
data/app/models/remote_issue.rb
CHANGED
@@ -12,6 +12,17 @@ class RemoteIssue < ActiveRecord::Base
|
|
12
12
|
validates :remote_tracker, presence: true
|
13
13
|
validates :remote_code, presence: true, uniqueness: { scope: [:remote_tracker] }
|
14
14
|
|
15
|
+
scope :outdated, lambda {
|
16
|
+
t = arel_table
|
17
|
+
where(
|
18
|
+
t[:fetched_at].eq(nil)
|
19
|
+
.or(
|
20
|
+
t[:outdated_at].not_eq(nil)
|
21
|
+
.and(t[:fetched_at].lt(t[:outdated_at]))
|
22
|
+
)
|
23
|
+
)
|
24
|
+
}
|
25
|
+
|
15
26
|
def to_s
|
16
27
|
"#{remote_tracker}|#{remote_code}"
|
17
28
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_rails_utils/models/fetch_errors'
|
4
|
+
require 'eac_ruby_utils/core_ext'
|
5
|
+
|
6
|
+
module RemoteIssueFetch
|
7
|
+
class Base < ::EacRailsUtils::Models::Tableless
|
8
|
+
enable_simple_cache
|
9
|
+
require_sub __FILE__
|
10
|
+
include ::EacRailsUtils::Models::FetchErrors
|
11
|
+
|
12
|
+
validates :fetched_at, presence: true
|
13
|
+
validates :local_tracker, presence: true
|
14
|
+
validates :remote_tracker, presence: true
|
15
|
+
validates :issue_remote_code, presence: true
|
16
|
+
|
17
|
+
validate :author_present
|
18
|
+
validate :provider_issue_present
|
19
|
+
|
20
|
+
def author_present
|
21
|
+
return if provider_issue.blank?
|
22
|
+
return if local_issue_author.present?
|
23
|
+
|
24
|
+
errors.add(:remote_code,
|
25
|
+
"Usuário local não encontrado para \"#{provider_issue.author_login}\"")
|
26
|
+
end
|
27
|
+
|
28
|
+
def provider_issue_present
|
29
|
+
return if issue_remote_code.blank?
|
30
|
+
return if provider_issue.present?
|
31
|
+
|
32
|
+
errors.add(:remote_code,
|
33
|
+
"Demanda remota não encontrada com o código \"#{issue_remote_code}\"")
|
34
|
+
end
|
35
|
+
|
36
|
+
def save
|
37
|
+
::Issue.transaction do
|
38
|
+
return false unless valid?
|
39
|
+
return false unless save_local_issue
|
40
|
+
return false unless save_remote_issue
|
41
|
+
end
|
42
|
+
true
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RemoteIssueFetch
|
4
|
+
class Base < ::EacRailsUtils::Models::Tableless
|
5
|
+
private
|
6
|
+
|
7
|
+
DESCRIPTION_SECTION_SEPARATOR = "\n\n"
|
8
|
+
|
9
|
+
def save_local_issue
|
10
|
+
save_local_issue_except_create_on && save_local_issue_created_on
|
11
|
+
end
|
12
|
+
|
13
|
+
def save_local_issue_created_on
|
14
|
+
local_issue_provider_attributes[:created_on].if_present do |created_on|
|
15
|
+
if created_on.present? && local_issue.created_on != created_on
|
16
|
+
local_issue.update_column( # rubocop:disable Rails/SkipsModelValidations
|
17
|
+
:created_on, created_on
|
18
|
+
)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
true
|
23
|
+
end
|
24
|
+
|
25
|
+
def save_local_issue_except_create_on
|
26
|
+
local_issue_provider_attributes.except(:created_on)
|
27
|
+
.each { |attr, value| local_issue.send("#{attr}=", value) }
|
28
|
+
return true if local_issue.save
|
29
|
+
|
30
|
+
fetch_record_errors(local_issue, default_column: default_error_column)
|
31
|
+
false
|
32
|
+
end
|
33
|
+
|
34
|
+
def local_issue_provider_attributes
|
35
|
+
{
|
36
|
+
subject: local_issue_subject, author: local_issue_author, status: local_issue_status,
|
37
|
+
description: local_issue_description,
|
38
|
+
created_on: provider_issue.created_on
|
39
|
+
}
|
40
|
+
end
|
41
|
+
|
42
|
+
def local_issue_subject
|
43
|
+
"[#{provider_issue.code}] #{provider_issue.subject}".truncate(100)
|
44
|
+
end
|
45
|
+
|
46
|
+
def local_issue_author_uncached
|
47
|
+
return nil if provider_issue.blank?
|
48
|
+
|
49
|
+
::RemoteUser.find_local_user(
|
50
|
+
provider_issue.author_login,
|
51
|
+
remote_tracker,
|
52
|
+
true
|
53
|
+
)
|
54
|
+
end
|
55
|
+
|
56
|
+
def local_issue_status
|
57
|
+
remote_tracker.try(:find_local_issue_status, local_tracker, provider_issue.status_name, true)
|
58
|
+
end
|
59
|
+
|
60
|
+
def local_issue_description
|
61
|
+
[local_issue_extra_description(:before), provider_issue.description,
|
62
|
+
local_issue_extra_description(:after), local_issue_import_footer]
|
63
|
+
.reject(&:blank?).map(&:strip).join("\n\n----\n\n") + "\n"
|
64
|
+
end
|
65
|
+
|
66
|
+
def local_issue_extra_description(position)
|
67
|
+
extra = provider_issue.try("extra_description_#{position}").if_present('')
|
68
|
+
extra = extra.map { |k, v| "* *#{k}:* #{v}" } if extra.is_a?(::Hash)
|
69
|
+
extra = extra.map { |v| "#{v}\n" }.join if extra.is_a?(::Enumerable)
|
70
|
+
extra.to_s
|
71
|
+
end
|
72
|
+
|
73
|
+
def local_issue_import_footer
|
74
|
+
"_Demanda remota importada de #{provider_issue.human_view_url}._"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RemoteIssueFetch
|
4
|
+
class Base < ::EacRailsUtils::Models::Tableless
|
5
|
+
private
|
6
|
+
|
7
|
+
def provider_issue_uncached
|
8
|
+
return nil if [remote_tracker, issue_remote_code].any?(&:blank?)
|
9
|
+
|
10
|
+
remote_tracker.find_remote_issue(issue_remote_code)
|
11
|
+
rescue ::Avmtrf1::RestProvider::Response => e
|
12
|
+
errors.add(default_error_column,
|
13
|
+
"Requisição a \"#{e.url}\" retornou com status #{e.status}")
|
14
|
+
::Rails.logger.warn(e.body)
|
15
|
+
nil
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RemoteIssueFetch
|
4
|
+
class Base < ::EacRailsUtils::Models::Tableless
|
5
|
+
private
|
6
|
+
|
7
|
+
def fetched_at_uncached
|
8
|
+
::Time.zone.now
|
9
|
+
end
|
10
|
+
|
11
|
+
def save_remote_issue
|
12
|
+
remote_issue.fetched_at = fetched_at
|
13
|
+
return true if remote_issue.save
|
14
|
+
|
15
|
+
fetch_record_errors(remote_issue, default_column: default_error_column)
|
16
|
+
false
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RemoteIssueFetch
|
4
|
+
class Create < ::RemoteIssueFetch::Base
|
5
|
+
require_sub __FILE__
|
6
|
+
|
7
|
+
attribute :issue_remote_code, ::String
|
8
|
+
attribute :local_tracker_id, ::Integer
|
9
|
+
attribute :project_id, ::Integer
|
10
|
+
attribute :remote_tracker_id, ::Integer
|
11
|
+
|
12
|
+
belongs_to :local_tracker, class_name: 'Tracker'
|
13
|
+
belongs_to :project, class_name: 'Project'
|
14
|
+
belongs_to :remote_tracker, class_name: 'RemoteTracker'
|
15
|
+
|
16
|
+
validates :project, presence: true
|
17
|
+
|
18
|
+
validate :tracker_in_project
|
19
|
+
|
20
|
+
def default_error_column
|
21
|
+
:issue_remote_code
|
22
|
+
end
|
23
|
+
|
24
|
+
def save
|
25
|
+
remote_issue_by_remote_code.present? ? update : super
|
26
|
+
end
|
27
|
+
|
28
|
+
def tracker_in_project
|
29
|
+
return unless local_tracker.present? && project.present?
|
30
|
+
return if project.trackers.include?(local_tracker)
|
31
|
+
|
32
|
+
errors.add(:local_tracker, 'is not a tracker of project')
|
33
|
+
end
|
34
|
+
|
35
|
+
def update
|
36
|
+
update_record = ::RemoteIssueFetch::Update
|
37
|
+
.new(remote_issue: remote_issue_by_remote_code)
|
38
|
+
return true if update_record.save
|
39
|
+
|
40
|
+
fetch_record_errors(update_record, default_column: default_error_column)
|
41
|
+
false
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RemoteIssueFetch
|
4
|
+
class Create < ::RemoteIssueFetch::Base
|
5
|
+
private
|
6
|
+
|
7
|
+
def local_issue_provider_attributes
|
8
|
+
super.merge(
|
9
|
+
project: project, tracker: local_tracker, priority: local_issue_priority
|
10
|
+
)
|
11
|
+
end
|
12
|
+
|
13
|
+
def local_issue_uncached
|
14
|
+
remote_issue_by_remote_code.if_present(&:local_issue) || ::Issue.new
|
15
|
+
end
|
16
|
+
|
17
|
+
def local_issue_priority
|
18
|
+
::IssuePriority.default
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RemoteIssueFetch
|
4
|
+
class Create < ::RemoteIssueFetch::Base
|
5
|
+
private
|
6
|
+
|
7
|
+
def remote_issue_uncached
|
8
|
+
remote_issue_by_remote_code.if_blank do
|
9
|
+
::RemoteIssue.new(remote_tracker: remote_tracker, remote_code: issue_remote_code,
|
10
|
+
local_issue: local_issue)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def remote_issue_by_remote_code_uncached
|
15
|
+
::RemoteIssue.find_by(
|
16
|
+
remote_tracker: remote_tracker,
|
17
|
+
remote_code: ::RemoteIssue.remote_code_sanitize(issue_remote_code)
|
18
|
+
)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_ruby_utils/core_ext'
|
4
|
+
|
5
|
+
module RemoteIssueFetch
|
6
|
+
class Update < ::RemoteIssueFetch::Base
|
7
|
+
require_sub __FILE__
|
8
|
+
|
9
|
+
attribute :remote_issue_id, ::Integer
|
10
|
+
belongs_to :remote_issue
|
11
|
+
|
12
|
+
validates :remote_issue, presence: true
|
13
|
+
|
14
|
+
def default_error_column
|
15
|
+
:remote_issue_id
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -27,6 +27,12 @@ class RemoteTracker < ActiveRecord::Base
|
|
27
27
|
validates :password, presence: true
|
28
28
|
validates :default_local_user, presence: true
|
29
29
|
|
30
|
+
scope :fetchable, -> { where(profile: fetchable_profiles) }
|
31
|
+
|
32
|
+
def fetchable?
|
33
|
+
self.class.fetchable_profiles.include?(profile)
|
34
|
+
end
|
35
|
+
|
30
36
|
def find_local_issue_status(local_tracker, remote_status_name, register_not_found = false)
|
31
37
|
::RemoteTracker::FindIssueLocalStatus.new(self, local_tracker, remote_status_name,
|
32
38
|
register_not_found).result
|
@@ -37,6 +43,6 @@ class RemoteTracker < ActiveRecord::Base
|
|
37
43
|
end
|
38
44
|
|
39
45
|
def setting_value(name)
|
40
|
-
::RemoteTrackerSetting.
|
46
|
+
::RemoteTrackerSetting.find_by(remote_tracker: self, name: name).if_present(&:value)
|
41
47
|
end
|
42
48
|
end
|
@@ -22,7 +22,7 @@ class RemoteTracker < ActiveRecord::Base
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def result_by_remote_issue_status
|
25
|
-
::RemoteIssueStatus.
|
25
|
+
::RemoteIssueStatus.find_by(remote_issue_status_find_attributes).try(:local_issue_status)
|
26
26
|
end
|
27
27
|
|
28
28
|
def result_by_local_issue_status
|
@@ -1,19 +1,43 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'eac_ruby_utils/core_ext'
|
4
|
+
|
3
5
|
class RemoteTracker < ActiveRecord::Base
|
4
6
|
module Remote
|
5
|
-
|
6
|
-
|
7
|
-
|
7
|
+
common_concern
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
def fetchable_profiles
|
11
|
+
@fetchable_profiles ||= lists.profile.values.select do |profile|
|
12
|
+
profile_fetchable?(profile)
|
13
|
+
end
|
14
|
+
end
|
8
15
|
|
9
|
-
|
10
|
-
|
16
|
+
def profile_fetchable?(profile)
|
17
|
+
provider_instance_class(profile).method_defined?(:fetch_issues_changed)
|
18
|
+
end
|
19
|
+
|
20
|
+
def provider_instance_class(profile)
|
21
|
+
lists.profile.value_validate!(profile)
|
22
|
+
|
23
|
+
::RedmineRemotes.const_get(profile.capitalize).const_get('Instance')
|
24
|
+
end
|
11
25
|
end
|
12
26
|
|
13
|
-
|
14
|
-
|
27
|
+
module InstanceMethods
|
28
|
+
def find_remote_issue(issue_id)
|
29
|
+
remote_instance.find_issue(issue_id)
|
30
|
+
end
|
31
|
+
|
32
|
+
def remote_instance
|
33
|
+
r = remote_instance_class.new(root_url, username, password)
|
34
|
+
r.send('remote_tracker=', self)
|
35
|
+
r
|
36
|
+
end
|
15
37
|
|
16
|
-
|
38
|
+
def remote_instance_class
|
39
|
+
self.class.provider_instance_class(profile)
|
40
|
+
end
|
17
41
|
end
|
18
42
|
end
|
19
43
|
end
|