rubygems-requirements-system 0.0.1 → 0.0.2

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: 7b4f3b0dc17cf9b76958081357cc6f9cf1ab338e86a88aad5ed4643d9bca8766
4
- data.tar.gz: 4ebf3a4f17907e0c5ac6ce55a857eeddc5265cb85c6cd229a19f89ca5b738eb2
3
+ metadata.gz: 598b91ef023d6606d97e7bfc74168cef0316de0897c63266c7371ef844322d6a
4
+ data.tar.gz: 99fe81ea125044711118147950372853e17377a25306b09e20f9ca0f3369e43e
5
5
  SHA512:
6
- metadata.gz: dabaddfe7338b0918888b16933b8c110a2bd6a7de9b626e425fab0736b6314d70f3daf48814f4c69d778f6d178f3da2b5e05a626ceec3c37090125f0fc35586e
7
- data.tar.gz: 6f6caa567e5e2d34c680e86e8ba08ca60b1d8f0d6cdfcde0314c90b5db86ae39314796fefe938b009d919a97d9f2c25be1b704144660b034a08222be529d1e6b
6
+ metadata.gz: b0dbff35b8e7ccfd004b78bfcf26efe011afd87106c646ba02093c4c7e076f568ebc8d65b96dc3ce15d2ed739780de8504557a412f5e4a1e21a2a38c15e6f735
7
+ data.tar.gz: 89933a20c0aa2129b871df4a70d445bb856258959889a225849f25030d55de60252470db5e540e3a3fd12cedc4773ca5c78712d170183aa393948267419ea2b2
data/README.md CHANGED
@@ -52,6 +52,8 @@ Gem::Specification.new do |spec|
52
52
  end
53
53
  ```
54
54
 
55
+ ### Basic usage
56
+
55
57
  Add dependency information to `Gem::Specification#requirements`:
56
58
 
57
59
  ```ruby
@@ -77,6 +79,8 @@ Gem::Specification.new do |spec|
77
79
  end
78
80
  ```
79
81
 
82
+ ### OR dependency
83
+
80
84
  You can require dependency A or B. For example, you can require
81
85
  `mysqlclient` or `libmariadb`.
82
86
 
@@ -85,14 +89,23 @@ Gem::Specification.new do |spec|
85
89
  # ...
86
90
 
87
91
  # We need mysqliclient or libmariadb for this gem.
88
- spec.requirements << "system: mysqlclient|libmariadb: arch_linux: mariadb-libs"
89
- spec.requirements << "system: mysqlclient|libmariadb: debian: libmysqlclient-dev"
92
+
93
+ # Try libmysqlclient-dev and then libmariadb-dev on Ubuntu. Because
94
+ # "debian: libmariadb-dev" is also used on Ubuntu.
95
+ #
96
+ # mysqlclient or libmariadb will be satsfied by a system package.
97
+ spec.requirements << "system: mysqlclient|libmariadb: ubuntu: libmysqlclient-dev"
98
+ # Try only libmariadb-dev on Debian.
99
+ #
100
+ # libmariadb will be satsfied by a system package.
90
101
  spec.requirements << "system: mysqlclient|libmariadb: debian: libmariadb-dev"
91
102
 
92
103
  # ...
93
104
  end
94
105
  ```
95
106
 
107
+ ### Multiple packages per dependency
108
+
96
109
  You can install multiple packages for a dependency.
97
110
 
98
111
  ```ruby
@@ -115,6 +128,85 @@ Gem::Specification.new do |spec|
115
128
  end
116
129
  ```
117
130
 
131
+ ### Install packages via HTTPS
132
+
133
+ You can install `.deb`/`.rpm` via HTTPS. If a product provides its
134
+ APT/Yum repository configurations by `.deb`/`.rpm`, you can use this
135
+ feature to register additional APT/Yum repositories.
136
+
137
+ You can use placeholder for URL with `%{KEY}` format.
138
+
139
+ Here are available placeholders:
140
+
141
+ `debian` family platforms:
142
+
143
+ * `distribution`: The `ID` value in `/etc/os-release`. It's `debian`,
144
+ `ubuntu` and so on.
145
+ * `code_name`: The `VERSION_CODENAME` value in `/etc/os-release`. It's
146
+ `bookworm`, `noble` and so on.
147
+ * `version`: The `VERSION_ID` value in `/etc/os-release`. It's `12`,
148
+ `24.04` and so on.
149
+
150
+ `fedora` family platforms:
151
+
152
+ * `distribution`: The `ID` value in `/etc/os-release`. It's `fedora`,
153
+ `rhel`, `almalinux` and so on.
154
+ * `major_version`: The major part of `VERSION_ID` value in
155
+ `/etc/os-release`. It's `41`, `9` and so on.
156
+ * `version`: The `VERSION_ID` value in `/etc/os-release`. It's `41`,
157
+ `9.5` and so on.
158
+
159
+ Here is an example that uses this feature for adding new repositories:
160
+
161
+ ```ruby
162
+ Gem::Specification.new do |spec|
163
+ # ...
164
+
165
+ # Install Groonga's APT repository for libgroonga-dev on Debian
166
+ # family platforms.
167
+ #
168
+ # %{distribution} and %{code_name} are placeholders.
169
+ #
170
+ # On Debian GNU/Linux bookworm:
171
+ # https://packages.groonga.org/%{distribution}/groonga-apt-source-latest-%{code_name}.deb ->
172
+ # https://packages.groonga.org/debian/groonga-apt-source-latest-bookworm.deb
173
+ #
174
+ # On Ubuntu 24.04:
175
+ # https://packages.groonga.org/%{distribution}/groonga-apt-source-latest-%{code_name}.deb ->
176
+ # https://packages.groonga.org/ubuntu/groonga-apt-source-latest-nobole.deb
177
+ spec.requirements << "system: groonga: debian: https://packages.groonga.org/%{distribution}/groonga-apt-source-latest-%{code_name}.deb"
178
+ # Install libgroonga-dev from the registered repository.
179
+ spec.requirements << "system: groonga: debian: libgroonga-dev"
180
+
181
+ # Install 2 repositories for pkgconfig(groonga) package on RHEL
182
+ # family plaforms:
183
+ # 1. Apache Arrow: https://apache.jfrog.io/artifactory/arrow/almalinux/%{major_version}/apache-arrow-release-latest.rpm
184
+ # 2. Groonga: https://packages.groonga.org/almalinux/%{major_version}/groonga-release-latest.noarch.rpm
185
+ #
186
+ # %{major_version} is placeholder.
187
+ #
188
+ # On AlmaLinux 8:
189
+ # https://apache.jfrog.io/artifactory/arrow/almalinux/%{major_version}/apache-arrow-release-latest.rpm ->
190
+ # https://apache.jfrog.io/artifactory/arrow/almalinux/8/apache-arrow-release-latest.rpm
191
+ #
192
+ # https://packages.groonga.org/almalinux/%{major_version}/groonga-release-latest.noarch.rpm ->
193
+ # https://packages.groonga.org/almalinux/8/groonga-release-latest.noarch.rpm
194
+ #
195
+ # On AlmaLinux 9:
196
+ # https://apache.jfrog.io/artifactory/arrow/almalinux/%{major_version}/apache-arrow-release-latest.rpm ->
197
+ # https://apache.jfrog.io/artifactory/arrow/almalinux/9/apache-arrow-release-latest.rpm
198
+ #
199
+ # https://packages.groonga.org/almalinux/%{major_version}/groonga-release-latest.noarch.rpm ->
200
+ # https://packages.groonga.org/almalinux/9/groonga-release-latest.noarch.rpm
201
+ spec.requirements << "system: groonga: rhel: https://apache.jfrog.io/artifactory/arrow/almalinux/%{major_version}/apache-arrow-release-latest.rpm"
202
+ spec.requirements << "system: groonga: rhel: https://packages.groonga.org/almalinux/%{major_version}/groonga-release-latest.noarch.rpm"
203
+ # Install pkgconfig(groonga) from the registered repositories.
204
+ spec.requirements << "system: groonga: rhel: pkgconfig(groonga)"
205
+
206
+ # ...
207
+ end
208
+ ```
209
+
118
210
  ## Requirements
119
211
 
120
212
  RubyGems 3.5.0 or later is required. RubyGems can load installed
@@ -136,6 +228,6 @@ other word than "native". So we create a new gem.
136
228
 
137
229
  ## License
138
230
 
139
- Copyright (C) 2013-2025 Ruby-GNOME Project Team
231
+ Copyright (C) 2025 Ruby-GNOME Project Team
140
232
 
141
233
  LGPL-3 or later. See doc/text/lgpl-3.txt for details.
data/doc/text/news.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # News
2
2
 
3
+ ## 0.0.2 - 2025-01-08
4
+
5
+ ### Improvements
6
+
7
+ * debian: Added support for installing `.deb` via HTTPS.
8
+
9
+ * ubuntu: Added support for PPA repository.
10
+
11
+ * fedora: Added support for installing `.rpm` via HTTPS.
12
+
3
13
  ## 0.0.1 - 2025-01-08
4
14
 
5
15
  Initial release!!!
@@ -41,6 +41,14 @@ module RubyGemsRequirementsSystem
41
41
  self["VERSION"]
42
42
  end
43
43
 
44
+ def version_codename
45
+ self["VERSION_CODENAME"]
46
+ end
47
+
48
+ def version_id
49
+ self["VERSION_ID"]
50
+ end
51
+
44
52
  private
45
53
  def parse
46
54
  @variables = {}
@@ -14,6 +14,8 @@
14
14
  # along with this program. If not, see <http://www.gnu.org/licenses/>.
15
15
 
16
16
  require "fileutils"
17
+ require "open-uri"
18
+ require "tempfile"
17
19
 
18
20
  require_relative "../executable-finder"
19
21
  require_relative "../os-release"
@@ -79,19 +81,34 @@ module RubyGemsRequirementsSystem
79
81
  super_user?
80
82
  end
81
83
 
84
+ def temporary_file_scope
85
+ @temporary_files = []
86
+ begin
87
+ yield
88
+ ensure
89
+ @temporary_files.each(&:close!)
90
+ end
91
+ end
92
+
93
+ def create_temporary_file(basename)
94
+ file = Tempfile.new(basename)
95
+ @temporary_files << file
96
+ file
97
+ end
98
+
82
99
  def install_package(package)
83
- command_line = prepare_command_line(package)
84
- if command_line
85
- unless run_command_line(package, "prepare", command_line)
86
- return false
100
+ temporary_file_scope do
101
+ prepare_command_lines(package).each do |command_line|
102
+ unless run_command_line(package, "prepare", command_line)
103
+ return false
104
+ end
87
105
  end
106
+ run_command_line(package, "install", install_command_line(package))
88
107
  end
89
- run_command_line(package, "install", install_command_line(package))
90
108
  end
91
109
 
92
110
  def run_command_line(package, action, command_line)
93
111
  failed_to_get_super_user_priviledge = false
94
- command_line = install_command_line(package)
95
112
  if have_priviledge?
96
113
  succeeded = system(*command_line)
97
114
  else
@@ -118,13 +135,13 @@ module RubyGemsRequirementsSystem
118
135
  alert_warning("'#{package}' system package is required.")
119
136
  alert_warning("Run the following command " +
120
137
  "to #{action} required system package: " +
121
- escaped_command.join(" "))
138
+ escaped_command_line.join(" "))
122
139
  end
123
140
  succeeded
124
141
  end
125
142
 
126
- def prepare_command_line(package)
127
- nil
143
+ def prepare_command_lines(package)
144
+ []
128
145
  end
129
146
 
130
147
  def install_command_line(package)
@@ -43,11 +43,28 @@ module RubyGemsRequirementsSystem
43
43
  end
44
44
 
45
45
  private
46
- def prepare_command_line(package)
47
- ["apt-get", "update"]
46
+ def prepare_command_lines(package)
47
+ [
48
+ ["apt-get", "update"],
49
+ ]
48
50
  end
49
51
 
50
52
  def install_command_line(package)
53
+ if package.start_with?("https://")
54
+ package_url = resolve_package_url_template(package)
55
+ temporary_file_base_name = [
56
+ "rubygems-requirements-system-debian",
57
+ File.extname(package),
58
+ ]
59
+ local_package = create_temporary_file(temporary_file_base_name)
60
+ URI.open(package_url) do |response|
61
+ IO.copy_stream(response, local_package)
62
+ end
63
+ local_package.close
64
+ @temporary_files << local_package
65
+ FileUtils.chmod("go+r", local_package.path)
66
+ package = local_package.path
67
+ end
51
68
  [
52
69
  "env",
53
70
  "DEBIAN_FRONTEND=noninteractive",
@@ -62,6 +79,15 @@ module RubyGemsRequirementsSystem
62
79
  def need_super_user_priviledge?
63
80
  true
64
81
  end
82
+
83
+ def resolve_package_url_template(package_url_template)
84
+ os_release = OSRelease.new
85
+ package_url_template % {
86
+ distribution: os_release.id,
87
+ code_name: os_release.version_codename,
88
+ version: os_release.version_id,
89
+ }
90
+ end
65
91
  end
66
92
  end
67
93
  end
@@ -13,11 +13,11 @@
13
13
  # You should have received a copy of the GNU Lesser General Public License
14
14
  # along with this program. If not, see <http://www.gnu.org/licenses/>.
15
15
 
16
- require_relative "red-hat-enterprise-linux"
16
+ require_relative "base"
17
17
 
18
18
  module RubyGemsRequirementsSystem
19
19
  module Platform
20
- class Fedora < RedHatEnterpriseLinux
20
+ class Fedora < Base
21
21
  Platform.register(self)
22
22
 
23
23
  class << self
@@ -28,17 +28,38 @@ module RubyGemsRequirementsSystem
28
28
  end
29
29
 
30
30
  def target?(platform)
31
- platform == "fedora" || super
31
+ platform == "fedora"
32
+ end
33
+
34
+ def default_system_packages(packages)
35
+ packages.collect {|package| "pkgconfig(#{package.id})"}
32
36
  end
33
37
 
34
38
  private
35
39
  def install_command_line(package)
40
+ if package.start_with?("https://")
41
+ package = resolve_package_url_template(package)
42
+ end
36
43
  ["dnf", "install", "-y", package]
37
44
  end
38
45
 
39
46
  def need_super_user_priviledge?
40
47
  true
41
48
  end
49
+
50
+ def resolve_package_url_template(package_url_template)
51
+ os_release = OSRelease.new
52
+ package_url_template % {
53
+ distribution: os_release.id,
54
+ major_version: major_version.to_s,
55
+ version: os_release.version_id,
56
+ }
57
+ end
58
+
59
+ def major_version
60
+ major_version_string = OSRelease.new.version_id.split(".")[0]
61
+ Integer(major_version_string, 10)
62
+ end
42
63
  end
43
64
  end
44
65
  end
@@ -13,11 +13,11 @@
13
13
  # You should have received a copy of the GNU Lesser General Public License
14
14
  # along with this program. If not, see <http://www.gnu.org/licenses/>.
15
15
 
16
- require_relative "base"
16
+ require_relative "fedora"
17
17
 
18
18
  module RubyGemsRequirementsSystem
19
19
  module Platform
20
- class RedHatEnterpriseLinux < Base
20
+ class RedHatEnterpriseLinux < Fedora
21
21
  Platform.register(self)
22
22
 
23
23
  class << self
@@ -34,17 +34,15 @@ module RubyGemsRequirementsSystem
34
34
  when "redhat" # For backward compatibility
35
35
  true
36
36
  else
37
- false
37
+ super
38
38
  end
39
39
  end
40
40
 
41
- def default_system_packages(packages)
42
- packages.collect {|package| "pkgconfig(#{package.id})"}
43
- end
44
-
45
41
  private
46
-
47
42
  def install_command_line(package)
43
+ if package.start_with?("https://")
44
+ package = resolve_package_url_template(package)
45
+ end
48
46
  if major_version >= 9
49
47
  ["dnf", "install", "--enablerepo=crb", "-y", package]
50
48
  elsif major_version >= 8
@@ -57,11 +55,6 @@ module RubyGemsRequirementsSystem
57
55
  def need_super_user_priviledge?
58
56
  true
59
57
  end
60
-
61
- def major_version
62
- major_version_string = File.read("/etc/redhat-release")[/(\d+)/, 0]
63
- Integer(major_version_string, 10)
64
- end
65
58
  end
66
59
  end
67
60
  end
@@ -36,6 +36,30 @@ module RubyGemsRequirementsSystem
36
36
  def target?(platform)
37
37
  platform == "ubuntu" || super
38
38
  end
39
+
40
+ private
41
+ def prepare_command_lines(package)
42
+ if package.start_with?("ppa:")
43
+ [
44
+ ["apt-get", "update"],
45
+ install_command_line("software-properties-common"),
46
+ ]
47
+ else
48
+ super
49
+ end
50
+ end
51
+
52
+ def install_command_line(package)
53
+ if package.start_with?("ppa:")
54
+ [
55
+ "add-apt-repository",
56
+ "-y",
57
+ package,
58
+ ]
59
+ else
60
+ super
61
+ end
62
+ end
39
63
  end
40
64
  end
41
65
  end
@@ -14,5 +14,5 @@
14
14
  # along with this program. If not, see <http://www.gnu.org/licenses/>.
15
15
 
16
16
  module RubyGemsRequirementsSystem
17
- VERSION = "0.0.1"
17
+ VERSION = "0.0.2"
18
18
  end
metadata CHANGED
@@ -1,11 +1,10 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubygems-requirements-system
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sutou Kouhei
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
10
  date: 2025-01-08 00:00:00.000000000 Z
@@ -72,7 +71,6 @@ homepage: https://github.com/ruby-gnome/rubygems-requirements-system
72
71
  licenses:
73
72
  - LGPL-3.0-or-later
74
73
  metadata: {}
75
- post_install_message:
76
74
  rdoc_options: []
77
75
  require_paths:
78
76
  - lib
@@ -87,8 +85,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
87
85
  - !ruby/object:Gem::Version
88
86
  version: '0'
89
87
  requirements: []
90
- rubygems_version: 3.4.20
91
- signing_key:
88
+ rubygems_version: 3.6.2
92
89
  specification_version: 4
93
90
  summary: Users can install system packages automatically on "gem install"
94
91
  test_files: []