----- Original Message -----
From: "Vít Ondruch" <vondruch(a)redhat.com>
To: ruby-sig(a)lists.fedoraproject.org
Sent: Thursday, September 15, 2016 2:00:59 PM
Subject: Re: Macros to modify gem dependencies
Dne 15.9.2016 v 10:06 Vít Ondruch napsal(a):
> BTW this is first draft of the macros. I am going to try second
> implementation, which will probably need to use a bit different syntax
> for macro calls, but it might replace the 3 lines usage example above
> with 2 lines version:
>
>
> ```
>
> %gemspec_remove_runtime_dependency -n fog-dynect
> %gemspec_add_runtime_dependency -n fog-dynect ['~> 10.0', '>=
10.1']
>
> ```
The above gives me strange result in gemspec
```
s.add_runtime_dependency(%q<fog-dynect>, [">= 10.1", ">=
10.1", "~> 10.0"])
```
However,
```
%gemspec_add_dep -n fog-dynect '~> 10.0'
```
results in
```
s.add_dependency(%q<fog-dynect>, [">= 10.1", "~> 10.0"])
```
Which I consider correct for the first example.
Also, using the notation below does not produce expected result
```
%gemspec_remove_dep fog-dynect
%gemspec_add_dep -n fog-dynect '~> 10.0'
%gemspec_add_dep -n fog-dynect '>= 10.1'
```
=>
```
s.add_dependency(%q<fog-dynect>, ["~> 10.0"])
```
FTR, in case of the non-named-variable-macro version (without '-n') the result is
correct.
>
>
As I promised, this is implementation with the '-n' parameter:
```
%define gemspec_add_runtime_dependency(n:) \
read -d '' add_runtime_dependency_script << 'EOR' || : \
name = '%{-n*}' \
version = %{*} \
spec = Gem::Specification.load('.%{gem_spec}') \
dep = spec.dependencies.detect { |d| d.type == :runtime && d.name ==
name } \
if dep \
dep.requirement.concat version \
else \
spec.add_runtime_dependency name, version \
end \
File.write '.%{gem_spec}', spec.to_ruby \
EOR\
echo "$add_runtime_dependency_script" | ruby \
%{nil}
```
The above can be also written as
```
%define gemspec_add_dep(n:) \
echo ' \
name = %q<%{-n*}> \
version = %{*} \
spec = Gem::Specification.load(%q<.%{gem_spec}>) \
dep = spec.dependencies.detect { |d| d.type == :runtime && d.name == name } \
if dep \
dep.requirement.concat version \
else \
spec.add_runtime_dependency name, version \
end \
File.write %q<.%{gem_spec}>, spec.to_ruby \
' | ruby
%{nil}
```
I was not sure whether I could use double quotes instead of single ones
```
echo " \
...
" | ruby
```
therefore I have used the %q< ... > notation in the ruby code instead.
It is a bit more flexible, since what is following behind the name of
the dependency is pasted directly into Ruby code, so either ```['~>
10.0', '>= 10.1']``` or '~> 10.0' are viable options. IOW, it
must be
valid ruby code, otherwise the script bails out with error. E.g. for
```
%gemspec_add_runtime_dependency -n fog-dynect ~> 10.0
```
the following error is reported:
```
+ read -d '' add_runtime_dependency_script
+ :
+ echo 'name = '\''fog-dynect'\''
version = ~> 10.0
spec =
Gem::Specification.load('\''./usr/share/gems/specifications/fog-1.38.0.gemspec'\'')
dep = spec.dependencies.detect { |d| d.type == :runtime && d.name ==
name }
if dep
dep.requirement.concat version
else
spec.add_runtime_dependency name, version
end
File.write
'\''./usr/share/gems/specifications/fog-1.38.0.gemspec'\'',
spec.to_ruby'
+ ruby
-:2: syntax error, unexpected '>'
version = ~> 10.0
^
```
Vít
_______________________________________________
ruby-sig mailing list
ruby-sig(a)lists.fedoraproject.org
https://lists.fedoraproject.org/admin/lists/ruby-sig@lists.fedoraproject.org
Pavel Valena
Associate Software Engineer
Brno, Czech Republic
RED HAT | TRIED. TESTED. TRUSTED.
All of the airlines in the Fortune Global 500 rely on Red Hat.
Find out why at Trusted | Red Hat
<
http://www.redhat.com/en/about/trusted>