dpu 0.4.2 → 0.5.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 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