redmine_remotes 0.8.1 → 0.10.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/models/redmine_remotes/tableless/remote_issue_fetch/base/_local_issue.rb +28 -2
- data/app/models/redmine_remotes/tableless/remote_issue_fetch/create.rb +1 -1
- data/app/models/redmine_remotes/tableless/remote_issue_fetch/create/_local_issue.rb +5 -11
- data/app/models/redmine_remotes/tableless/remote_issue_fetch/update.rb +1 -1
- data/app/models/redmine_remotes/tableless/remote_issue_fetch/update/_local_issue.rb +0 -7
- data/app/models/remote_tracker.rb +2 -8
- data/app/models/remote_tracker/remote.rb +19 -0
- data/app/models/remote_user.rb +2 -13
- data/app/models/remote_user/find_local_user.rb +60 -0
- data/config/locales/en.yml +2 -0
- data/config/locales/pt-BR.yml +2 -0
- data/lib/redmine_remotes/esosti.rb +15 -0
- data/lib/redmine_remotes/esosti/entities/issue.rb +45 -0
- data/lib/redmine_remotes/esosti/instance.rb +26 -0
- data/lib/redmine_remotes/jira/entities/issue.rb +0 -4
- data/lib/redmine_remotes/version.rb +1 -1
- metadata +9 -11
- data/app/models/remote_tracker/jira.rb +0 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2a0671e339c9e225c9413feb402fed23e0ac5e930a3e72027aa2b183749441d5
|
4
|
+
data.tar.gz: eb1245a9f15262922b95bec5574bdbb3dbc84f286d7fed371970b759657f6e2d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0af87885a31cc69c7ec0cc8f1bbd7201b189b8c5f260382d990189affb7ab642b5eba050231e3e7c0a78f5d65a134c21490148d5461858c61af9ad92c813e578
|
7
|
+
data.tar.gz: 322120abe8ba4dde501c3d6cccc3a3315933d18f585d4c7eb9a86b8c147ec797c0dcb2bff8b08ac29001466eb12e2824cb29a1ef7394b5db1d8f21cbe4c31778
|
@@ -6,11 +6,36 @@ module RedmineRemotes
|
|
6
6
|
class Base < ::EacRailsUtils::TablelessModel
|
7
7
|
private
|
8
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
|
+
|
9
34
|
def local_issue_provider_attributes
|
10
35
|
{
|
11
36
|
subject: local_issue_subject, author: local_issue_author, status: local_issue_status,
|
12
37
|
description: local_issue_description,
|
13
|
-
created_on: provider_issue.created_on
|
38
|
+
created_on: provider_issue.created_on
|
14
39
|
}
|
15
40
|
end
|
16
41
|
|
@@ -23,7 +48,8 @@ module RedmineRemotes
|
|
23
48
|
|
24
49
|
::RemoteUser.find_local_user(
|
25
50
|
provider_issue.author_login,
|
26
|
-
remote_tracker
|
51
|
+
remote_tracker,
|
52
|
+
true
|
27
53
|
)
|
28
54
|
end
|
29
55
|
|
@@ -6,20 +6,14 @@ module RedmineRemotes
|
|
6
6
|
class Create < ::RedmineRemotes::Tableless::RemoteIssueFetch::Base
|
7
7
|
private
|
8
8
|
|
9
|
-
def
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
false
|
9
|
+
def local_issue_provider_attributes
|
10
|
+
super.merge(
|
11
|
+
project: project, tracker: local_tracker, priority: local_issue_priority
|
12
|
+
)
|
14
13
|
end
|
15
14
|
|
16
15
|
def local_issue_uncached
|
17
|
-
remote_issue_by_remote_code.if_present
|
18
|
-
::Issue.new(
|
19
|
-
local_issue_provider_attributes.merge(
|
20
|
-
project: project, tracker: local_tracker, priority: local_issue_priority
|
21
|
-
)
|
22
|
-
)
|
16
|
+
remote_issue_by_remote_code.if_present(&:local_issue) || ::Issue.new
|
23
17
|
end
|
24
18
|
|
25
19
|
def local_issue_priority
|
@@ -13,13 +13,6 @@ module RedmineRemotes
|
|
13
13
|
def local_tracker
|
14
14
|
local_issue.if_present(&:tracker)
|
15
15
|
end
|
16
|
-
|
17
|
-
def update_local_issue_with_remote_data
|
18
|
-
return true if local_issue.update(local_issue_provider_attributes)
|
19
|
-
|
20
|
-
fetch_record_errors(local_issue, default_column: default_error_column)
|
21
|
-
false
|
22
|
-
end
|
23
16
|
end
|
24
17
|
end
|
25
18
|
end
|
@@ -6,14 +6,14 @@ require 'validate_url'
|
|
6
6
|
|
7
7
|
class RemoteTracker < ActiveRecord::Base
|
8
8
|
include ::EacRubyUtils::Listable
|
9
|
-
include ::RemoteTracker::
|
9
|
+
include ::RemoteTracker::Remote
|
10
10
|
|
11
11
|
has_many :issues, class_name: 'RemoteIssue', inverse_of: :remote_tracker,
|
12
12
|
dependent: :restrict_with_error
|
13
13
|
has_many :settings, class_name: 'RemoteTrackerSetting', inverse_of: :remote_tracker,
|
14
14
|
dependent: :destroy
|
15
15
|
|
16
|
-
lists.add_string :profile, :jira
|
16
|
+
lists.add_string :profile, :esosti, :jira
|
17
17
|
|
18
18
|
has_many :issue_statuses, class_name: 'RemoteIssueStatus', inverse_of: :remote_tracker,
|
19
19
|
dependent: :destroy
|
@@ -31,12 +31,6 @@ class RemoteTracker < ActiveRecord::Base
|
|
31
31
|
"#{root_url} [#{profile_label}, #{username}]"
|
32
32
|
end
|
33
33
|
|
34
|
-
def find_remote_issue(issue_id)
|
35
|
-
raise 'Profile blank' if profile.blank?
|
36
|
-
|
37
|
-
send("#{profile}_find_remote_issue", issue_id)
|
38
|
-
end
|
39
|
-
|
40
34
|
def setting_value(name)
|
41
35
|
::RemoteTrackerSetting.where(remote_tracker: self, name: name).first.if_present(&:value)
|
42
36
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class RemoteTracker < ActiveRecord::Base
|
4
|
+
module Remote
|
5
|
+
def find_remote_issue(issue_id)
|
6
|
+
remote_instance.find_issue(issue_id)
|
7
|
+
end
|
8
|
+
|
9
|
+
def remote_instance
|
10
|
+
remote_instance_class.new(self, root_url, username, password)
|
11
|
+
end
|
12
|
+
|
13
|
+
def remote_instance_class
|
14
|
+
raise 'Profile blank' if profile.blank?
|
15
|
+
|
16
|
+
::RedmineRemotes.const_get(profile.capitalize).const_get('Instance')
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/app/models/remote_user.rb
CHANGED
@@ -11,18 +11,7 @@ class RemoteUser < ActiveRecord::Base
|
|
11
11
|
validates :remote_login, presence: true, uniqueness: { scope: [:remote_tracker] }
|
12
12
|
validates :local_user, presence: true
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
[remote_tracker, nil].each do |tracker|
|
17
|
-
remote_user = ::RemoteUser.where(
|
18
|
-
remote_tracker: tracker,
|
19
|
-
remote_login: remote_login_sanitize(remote_login)
|
20
|
-
).first
|
21
|
-
return remote_user.local_user if remote_user
|
22
|
-
end
|
23
|
-
return remote_tracker.default_local_user if remote_tracker.present?
|
24
|
-
|
25
|
-
nil
|
26
|
-
end
|
14
|
+
def self.find_local_user(remote_login, remote_tracker = nil, register_not_found = false)
|
15
|
+
::RemoteUser::FindLocalUser.new(remote_login, remote_tracker, register_not_found).result
|
27
16
|
end
|
28
17
|
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_ruby_utils/core_ext'
|
4
|
+
|
5
|
+
class RemoteUser < ActiveRecord::Base
|
6
|
+
class FindLocalUser
|
7
|
+
common_constructor :remote_login, :remote_tracker, :register_not_found do
|
8
|
+
self.remote_login = ::RemoteUser.remote_login_sanitize(remote_login)
|
9
|
+
end
|
10
|
+
|
11
|
+
def result
|
12
|
+
result_by_local_user || result_by_remote_user || result_by_register_not_found ||
|
13
|
+
result_by_remote_tracker_default
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def result_by_local_user
|
19
|
+
result_by_local_user_login || result_by_local_user_mail_address
|
20
|
+
end
|
21
|
+
|
22
|
+
def result_by_local_user_login
|
23
|
+
::User.find_by(login: remote_login)
|
24
|
+
end
|
25
|
+
|
26
|
+
def result_by_local_user_mail_address
|
27
|
+
condition = ::EmailAddress.arel_table[:address].matches("#{remote_login}@%")
|
28
|
+
::EmailAddress.where(condition).first.try(:user)
|
29
|
+
end
|
30
|
+
|
31
|
+
def result_by_register_not_found
|
32
|
+
return nil unless register_not_found
|
33
|
+
return nil if remote_tracker.blank?
|
34
|
+
|
35
|
+
::RemoteUser.create!(remote_login: remote_login, remote_tracker: remote_tracker,
|
36
|
+
local_user: remote_tracker.default_local_user).local_user
|
37
|
+
end
|
38
|
+
|
39
|
+
def result_by_remote_user
|
40
|
+
remote_trackers_to_search
|
41
|
+
.map { |tracker| remote_tracker_result(tracker) }
|
42
|
+
.find(&:present?)
|
43
|
+
end
|
44
|
+
|
45
|
+
def result_by_remote_tracker_default
|
46
|
+
remote_tracker.try(:default_local_user)
|
47
|
+
end
|
48
|
+
|
49
|
+
def remote_tracker_result(remote_tracker)
|
50
|
+
::RemoteUser.where(
|
51
|
+
remote_tracker: remote_tracker,
|
52
|
+
remote_login: remote_login
|
53
|
+
).first.try(:local_user)
|
54
|
+
end
|
55
|
+
|
56
|
+
def remote_trackers_to_search
|
57
|
+
remote_tracker.if_present([]) { |v| [v] } + [nil]
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
data/config/locales/en.yml
CHANGED
data/config/locales/pt-BR.yml
CHANGED
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RedmineRemotes
|
4
|
+
module Esosti
|
5
|
+
class << self
|
6
|
+
RICH_TEXT_COMMENT = /<!--\s*RICH\s+TEXT\s-->/i.freeze
|
7
|
+
|
8
|
+
def remote_text_to_local(remote_text)
|
9
|
+
::Redmine::WikiFormatting.html_parser.to_text(
|
10
|
+
remote_text.gsub(RICH_TEXT_COMMENT, '').each_line.map(&:strip).join(" \n")
|
11
|
+
).each_line.map(&:strip).join("\n").gsub(/\n+/, "\n")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'avmtrf1/esosti/entities/issue'
|
4
|
+
|
5
|
+
module RedmineRemotes
|
6
|
+
module Esosti
|
7
|
+
module Entities
|
8
|
+
class Issue < ::Avmtrf1::Esosti::Entities::Issue
|
9
|
+
def author_login
|
10
|
+
attributes.fetch('CREATEDBY').if_present { |v| v.gsub(/@[^@]+\z/, '') }
|
11
|
+
end
|
12
|
+
|
13
|
+
def attributes
|
14
|
+
data.first.fetch('Attributes')
|
15
|
+
end
|
16
|
+
|
17
|
+
def code
|
18
|
+
attributes.fetch('TICKETID')
|
19
|
+
end
|
20
|
+
|
21
|
+
def created_on
|
22
|
+
attributes.fetch('CREATIONDATE')
|
23
|
+
end
|
24
|
+
|
25
|
+
def description
|
26
|
+
::RedmineRemotes::Esosti.remote_text_to_local(
|
27
|
+
related_mbos.fetch('LONGDESCRIPTION').first.fetch('Attributes').fetch('LDTEXT')
|
28
|
+
)
|
29
|
+
end
|
30
|
+
|
31
|
+
def related_mbos
|
32
|
+
data.first.fetch('RelatedMbos')
|
33
|
+
end
|
34
|
+
|
35
|
+
def status_name
|
36
|
+
attributes.fetch('STATUS')
|
37
|
+
end
|
38
|
+
|
39
|
+
def subject
|
40
|
+
attributes.fetch('DESCRIPTION')
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RedmineRemotes
|
4
|
+
module Esosti
|
5
|
+
class Instance < ::RedmineRemotes::RestProvider::Instance
|
6
|
+
ISSUE_ID_PATTERN = /\A(?:ss|in)[0-9]+\z/i.freeze
|
7
|
+
|
8
|
+
class << self
|
9
|
+
def parse_issue_id(global_issue_id)
|
10
|
+
m = ISSUE_ID_PATTERN.match(global_issue_id)
|
11
|
+
return nil unless m
|
12
|
+
|
13
|
+
::OpenStruct.new(provider_issue_id: m[0], project_id: nil, project_issue_id: nil)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def build_service_url(service_url_suffix)
|
18
|
+
"#{root_url}/maxrest/rest#{service_url_suffix}"
|
19
|
+
end
|
20
|
+
|
21
|
+
def issue_get_url_suffix(provider_issue_id)
|
22
|
+
"/os/MS_RMTICKET/?ticketid=#{provider_issue_id}"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redmine_remotes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eduardo Henrique Bogoni
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-05-
|
11
|
+
date: 2020-05-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aranha-parsers
|
@@ -30,20 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '0.
|
34
|
-
- - ">="
|
35
|
-
- !ruby/object:Gem::Version
|
36
|
-
version: 0.27.1
|
33
|
+
version: '0.28'
|
37
34
|
type: :runtime
|
38
35
|
prerelease: false
|
39
36
|
version_requirements: !ruby/object:Gem::Requirement
|
40
37
|
requirements:
|
41
38
|
- - "~>"
|
42
39
|
- !ruby/object:Gem::Version
|
43
|
-
version: '0.
|
44
|
-
- - ">="
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
version: 0.27.1
|
40
|
+
version: '0.28'
|
47
41
|
- !ruby/object:Gem::Dependency
|
48
42
|
name: curb
|
49
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -145,9 +139,10 @@ files:
|
|
145
139
|
- app/models/remote_issue.rb
|
146
140
|
- app/models/remote_issue_status.rb
|
147
141
|
- app/models/remote_tracker.rb
|
148
|
-
- app/models/remote_tracker/
|
142
|
+
- app/models/remote_tracker/remote.rb
|
149
143
|
- app/models/remote_tracker_setting.rb
|
150
144
|
- app/models/remote_user.rb
|
145
|
+
- app/models/remote_user/find_local_user.rb
|
151
146
|
- app/views/project_remote_issues/_issues.html.erb
|
152
147
|
- app/views/project_remote_issues/_trackers.html.erb
|
153
148
|
- app/views/project_remote_issues/index.html.erb
|
@@ -170,6 +165,9 @@ files:
|
|
170
165
|
- db/migrate/20200505161002_add_timestamps_to_remote_users.rb
|
171
166
|
- init.rb
|
172
167
|
- lib/redmine_remotes.rb
|
168
|
+
- lib/redmine_remotes/esosti.rb
|
169
|
+
- lib/redmine_remotes/esosti/entities/issue.rb
|
170
|
+
- lib/redmine_remotes/esosti/instance.rb
|
173
171
|
- lib/redmine_remotes/jira/entities/issue.rb
|
174
172
|
- lib/redmine_remotes/jira/instance.rb
|
175
173
|
- lib/redmine_remotes/patches/issue.rb
|
@@ -1,13 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
class RemoteTracker < ActiveRecord::Base
|
4
|
-
module Jira
|
5
|
-
def jira_find_remote_issue(issue_id)
|
6
|
-
jira_create_instance.find_issue(issue_id)
|
7
|
-
end
|
8
|
-
|
9
|
-
def jira_create_instance
|
10
|
-
::RedmineRemotes::Jira::Instance.new(self, root_url, username, password)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|