dpu 0.4.2 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1d4e5362a3f5be5dd2a03b88cf4d9223a492dbc0612721ae90e0235cc7440bfd
4
- data.tar.gz: 36f99c5337c5810d9c0daf40ea10cc2588e54e129ca7839faad50170772b093d
3
+ metadata.gz: dac668681b4d1ec193e02d8f9762392b575a944e3d5f6c14401af8df6ce48059
4
+ data.tar.gz: 51a3a6f5eb287a6ed2a190cdcb0054e641e51adb9b88a27d9a24802a2a6ee7ac
5
5
  SHA512:
6
- metadata.gz: e278b4267be87dd61903c6b18b3283c47bb35c2cd2a08a1cb6f9c18ef2a5f1e6ce0e135845b59ceba18b0cc269bd6f976a220968111f7116992e9710cd7cb24f
7
- data.tar.gz: 9c4bda05c75bb0a19f01352a45309c17276a5f15ea6f5c5446922b4f8042f0ceb747355216163c1bc18023c5c65190829b56f6e19937f619736447ae83792176
6
+ metadata.gz: c1a2519ff236aa25fef3ac00807f0a1e2e172deeb8492e9a3612863b5b306755568d2ecf0ec786ff4df5ead9f31df0483046c3639a709bc8b137d72421c67e3d
7
+ data.tar.gz: b0dae8f855296d97ef063f60b94bf28e7d8c2593ce38ab423f9a6064c0496040c8f670e4b5ac459f601a9fda82eea87e159fdcd7fbfe268592f4bce9d98afc91
data/Gemfile CHANGED
@@ -4,5 +4,3 @@ source "https://rubygems.org"
4
4
 
5
5
  # Specify your gem's dependencies in dpu.gemspec
6
6
  gemspec
7
-
8
- gem "rake", "~> 13.0"
data/README.md CHANGED
@@ -67,7 +67,7 @@ Then type `C-x L` to copy permanent URI. `C-y` to paste it.
67
67
  define_command(:copy_permanent_uri, doc: "Copy permanent URI") do
68
68
  require "dpu"
69
69
  b = Buffer.current
70
- uri = Dpu.determine_permanent_uri(Pathname(b.file_name), b.current_line)
70
+ uri = Dpu.determine_permanent_uri(Pathname(b.file_name), start_line_number: b.current_line)
71
71
  KILL_RING.push(uri)
72
72
  Clipboard.copy(uri) if CLIPBOARD_AVAILABLE
73
73
  message("Copied: #{uri}")
data/lib/dpu/cli.rb CHANGED
@@ -15,7 +15,11 @@ class Dpu::Cli
15
15
  start_line_number = s_start_line_number&.to_i
16
16
  end_line_number = s_end_line_number&.to_i
17
17
 
18
- uri = Dpu.determine_permanent_uri(path, start_line_number, end_line_number)
18
+ uri = Dpu.determine_permanent_uri(
19
+ path,
20
+ start_line_number: start_line_number,
21
+ end_line_number: end_line_number,
22
+ )
19
23
  puts(uri)
20
24
  end
21
25
  end
@@ -0,0 +1,25 @@
1
+ class Dpu::ScmService::Base
2
+ def determine_repository_uri(repository_http_or_ssh_url)
3
+ md = self.class::REMOTE_URL_PATTERN.match(repository_http_or_ssh_url)
4
+ return nil if !md
5
+
6
+ url = self.class::REPOSITORY_URI_TEMPLATE % {
7
+ account_name: md[:account_name],
8
+ repository_name: md[:repository_name],
9
+ }
10
+ return URI(url)
11
+ end
12
+
13
+ def ref_prefix
14
+ return self.class::REF_PREFIX
15
+ end
16
+
17
+ def determine_fragment(start_line_number, end_line_number)
18
+ return nil if !start_line_number
19
+ return "L#{start_line_number}" if !end_line_number || start_line_number == end_line_number
20
+ return self.class::START_AND_END_LINE_NUMBER_FRAGMENT_TEMPLATE % {
21
+ start_line_number: start_line_number,
22
+ end_line_number: end_line_number,
23
+ }
24
+ end
25
+ end
@@ -0,0 +1,18 @@
1
+ class Dpu::ScmService::Github < Dpu::ScmService::Base
2
+ REPOSITORY_URI_TEMPLATE = "https://github.com/%{account_name}/%{repository_name}"
3
+
4
+ REMOTE_URL_PATTERN = [
5
+ %r{\Agit://github\.com/(?<account_name>[^/]+)/(?<repository_name>[^/]+(?=\.git)|[^/]+)},
6
+ %r{\Ahttps?://github\.com/(?<account_name>[^/]+)/(?<repository_name>[^/]+(?=\.git)|[^/]+)},
7
+ %r{\Agit@github\.com:(?<account_name>[^/]+)/(?<repository_name>[^/]+(?=\.git)|[^/]+)},
8
+ %r{\Assh://git@github\.com/(?<account_name>[^/]+)/(?<repository_name>[^/]+(?=\.git)|[^/]+)},
9
+ ].then { |patterns|
10
+ Regexp.union(*patterns)
11
+ }
12
+
13
+ REF_PREFIX = "blob"
14
+
15
+ START_AND_END_LINE_NUMBER_FRAGMENT_TEMPLATE = "L%{start_line_number}-L%{end_line_number}"
16
+ end
17
+
18
+ Dpu::SCM_SERVICES << Dpu::ScmService::Github.new
@@ -0,0 +1,16 @@
1
+ class Dpu::ScmService::Sourcehut < Dpu::ScmService::Base
2
+ REPOSITORY_URI_TEMPLATE = "https://git.sr.ht/~%{account_name}/%{repository_name}"
3
+
4
+ REMOTE_URL_PATTERN = [
5
+ %r{\Ahttps://git\.sr\.ht/\~(?<account_name>[^/]+)/(?<repository_name>.+)},
6
+ %r{\Agit@git\.sr\.ht:\~(?<account_name>[^/]+)/(?<repository_name>.+)},
7
+ ].then { |patterns|
8
+ Regexp.union(*patterns)
9
+ }
10
+
11
+ REF_PREFIX = "tree"
12
+
13
+ START_AND_END_LINE_NUMBER_FRAGMENT_TEMPLATE = "L%{start_line_number}-%{end_line_number}"
14
+ end
15
+
16
+ Dpu::SCM_SERVICES << Dpu::ScmService::Sourcehut.new
@@ -0,0 +1,2 @@
1
+ module Dpu::ScmService
2
+ end
data/lib/dpu/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Dpu
4
- VERSION = "0.4.2"
4
+ VERSION = "0.5.0"
5
5
  end
data/lib/dpu.rb CHANGED
@@ -2,57 +2,30 @@ require "open3"
2
2
  require "pathname"
3
3
  require "uri"
4
4
 
5
+ require "version_sorter"
6
+
5
7
  module Dpu
6
8
  autoload :Cli, "dpu/cli"
7
9
  autoload :VERSION, "dpu/vesion"
8
10
 
11
+ SCM_SERVICES = []
12
+
9
13
  class << self
10
- GITHUB_REPOSITORY_URI_TEMPLATE = "https://github.com/%{account_name}/%{repository_name}"
11
- SOURCEHUT_REPOSITORY_URI_TEMPLATE = "https://git.sr.ht/~%{account_name}/%{repository_name}"
12
- REPOSITORY_URI_TEMPLATES = {
13
- github: GITHUB_REPOSITORY_URI_TEMPLATE,
14
- sourcehut: SOURCEHUT_REPOSITORY_URI_TEMPLATE,
15
- }
16
-
17
- GITHUB_REMOTE_URL_PATTERN = [
18
- %r{\Agit://github\.com/(?<account_name>[^/]+)/(?<repository_name>[^/]+(?=\.git)|[^/]+)},
19
- %r{\Ahttps?://github\.com/(?<account_name>[^/]+)/(?<repository_name>[^/]+(?=\.git)|[^/]+)},
20
- %r{\Agit@github\.com:(?<account_name>[^/]+)/(?<repository_name>[^/]+(?=\.git)|[^/]+)},
21
- %r{\Assh://git@github\.com/(?<account_name>[^/]+)/(?<repository_name>[^/]+(?=\.git)|[^/]+)},
22
- ].then { |patterns|
23
- Regexp.union(*patterns)
24
- }
25
- SOURCEHUT_REMOTE_URL_PATTERN = [
26
- %r{\Ahttps://git\.sr\.ht/\~(?<account_name>[^/]+)/(?<repository_name>.+)},
27
- %r{\Agit@git\.sr\.ht:\~(?<account_name>[^/]+)/(?<repository_name>.+)},
28
- ].then { |patterns|
29
- Regexp.union(*patterns)
30
- }
31
- REMOTE_URL_PATTERNS = {
32
- github: GITHUB_REMOTE_URL_PATTERN,
33
- sourcehut: SOURCEHUT_REMOTE_URL_PATTERN,
34
- }
35
-
36
- REF_PREFIX = {
37
- github: 'blob',
38
- sourcehut: 'tree',
39
- }
40
-
41
- def determine_permanent_uri(path_or_link, start_line_number = nil, end_line_number = nil)
14
+ def determine_permanent_uri(path_or_link, start_line_number: nil, end_line_number: nil)
42
15
  path = path_or_link.realpath
43
16
  relative_path = determine_relative_path(path)
44
17
 
45
18
  remote_url = get_remote_url(path)
46
- vcs_service = determine_vcs_service(remote_url)
19
+ scm_service, repository_uri = determine_scm_service_and_repository_uri(remote_url)
47
20
 
48
21
  permanent_uri_parts = [
49
- determine_repository_uri(vcs_service, remote_url),
50
- REF_PREFIX[vcs_service],
22
+ repository_uri,
23
+ scm_service.ref_prefix,
51
24
  find_same_content_version(path, relative_path) || determine_commit_id(path),
52
25
  relative_path,
53
26
  ]
54
27
  permanent_uri = URI(permanent_uri_parts.join("/"))
55
- permanent_uri.fragment = determine_fragment(vcs_service, start_line_number, end_line_number)
28
+ permanent_uri.fragment = scm_service.determine_fragment(start_line_number, end_line_number)
56
29
  return permanent_uri
57
30
  end
58
31
 
@@ -77,28 +50,13 @@ module Dpu
77
50
  return run_command("git remote get-url origin", chdir: path.dirname).chomp
78
51
  end
79
52
 
80
- def determine_vcs_service(repository_http_or_ssh_url)
81
- if GITHUB_REMOTE_URL_PATTERN.match?(repository_http_or_ssh_url)
82
- return :github
83
- end
84
- if SOURCEHUT_REMOTE_URL_PATTERN.match?(repository_http_or_ssh_url)
85
- return :sourcehut
86
- end
87
-
88
- raise "unknown VCS service: #{repository_http_or_ssh_url}"
89
- end
90
-
91
- def determine_repository_uri(vcs_service, repository_http_or_ssh_url)
92
- md = REMOTE_URL_PATTERNS[vcs_service].match(repository_http_or_ssh_url)
93
- if !md
94
- return URI(repository_http_or_ssh_url)
53
+ def determine_scm_service_and_repository_uri(repository_http_or_ssh_url)
54
+ SCM_SERVICES.each do |scm_service|
55
+ repository_uri = scm_service.determine_repository_uri(repository_http_or_ssh_url)
56
+ return scm_service, repository_uri if repository_uri
95
57
  end
96
58
 
97
- url = REPOSITORY_URI_TEMPLATES[vcs_service] % {
98
- account_name: md[:account_name],
99
- repository_name: md[:repository_name],
100
- }
101
- return URI(url)
59
+ raise "unknown SCM service: #{repository_http_or_ssh_url}"
102
60
  end
103
61
 
104
62
  def determine_commit_id(path)
@@ -109,12 +67,7 @@ module Dpu
109
67
 
110
68
  def find_same_content_version(path, relative_path_from_repository_root)
111
69
  stdout = run_command(*%w[git tag --list [0-9]* v[0-9]*], chdir: path.dirname)
112
- versions = stdout.each_line(chomp: true).sort_by { |v|
113
- comparable_version =
114
- v.sub(/\Av/, "").
115
- gsub(/[_@]+/, ".") # https://github.com/ruby/ruby/tree/v1_8_5_55%4013008
116
- Gem::Version.new(comparable_version)
117
- }
70
+ versions = VersionSorter.sort(stdout.each_line(chomp: true).select(&:ascii_only?))
118
71
 
119
72
  content_in_head = path.read
120
73
  same_content_version = versions.reverse_each.find { |version|
@@ -126,12 +79,10 @@ module Dpu
126
79
  }
127
80
  return same_content_version
128
81
  end
129
-
130
- def determine_fragment(vcs_service, start_line_number, end_line_number)
131
- return nil if !start_line_number
132
- return "L#{start_line_number}" if !end_line_number || start_line_number == end_line_number
133
- return "L#{start_line_number}-L#{end_line_number}" if vcs_service == :github
134
- return "L#{start_line_number}-#{end_line_number}" if vcs_service == :sourcehut
135
- end
136
82
  end
137
83
  end
84
+
85
+ require "dpu/scm_service"
86
+ require "dpu/scm_service/base"
87
+ require "dpu/scm_service/github"
88
+ require "dpu/scm_service/sourcehut"
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dpu
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yuya.Nishida.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-07-15 00:00:00.000000000 Z
11
+ date: 2023-07-29 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: version_sorter
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: debug
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -24,6 +38,20 @@ dependencies:
24
38
  - - ">="
25
39
  - !ruby/object:Gem::Version
26
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
27
55
  - !ruby/object:Gem::Dependency
28
56
  name: test-unit
29
57
  requirement: !ruby/object:Gem::Requirement
@@ -53,6 +81,10 @@ files:
53
81
  - exe/dpu
54
82
  - lib/dpu.rb
55
83
  - lib/dpu/cli.rb
84
+ - lib/dpu/scm_service.rb
85
+ - lib/dpu/scm_service/base.rb
86
+ - lib/dpu/scm_service/github.rb
87
+ - lib/dpu/scm_service/sourcehut.rb
56
88
  - lib/dpu/version.rb
57
89
  - sig/dpu.rbs
58
90
  homepage: https://github.com/nishidayuya/dpu