----- Original Message ----- > From: "Vít Ondruch" <vondr...@redhat.com> > To: ruby-sig@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@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> _______________________________________________ ruby-sig mailing list ruby-sig@lists.fedoraproject.org https://lists.fedoraproject.org/admin/lists/ruby-sig@lists.fedoraproject.org