Hi,

for inspiration: maven packages are using these macros:

%pom_add_dep
%pom_add_plugin
%pom_remove_dep
%pom_remove_plugin

What about similar shorter names for gems?:

%gemspec_add_dep
%gemspec_remove_dep

Just an idea. There wouldn't be clear the macros are changing runtime
dependency...

  Frantisek

Vít Ondruch píše v Čt 15. 09. 2016 v 10:06 +0200:
> Hi,
> 
> From time to time, it is necessary to modify the gem dependencies we
> ship. For example, it is good idea to remove the Mac/Windows specific
> dependencies from Listen gem or sometimes it is necessary to relax
> some
> gem dependency. Historically, we did that using sed or applying
> patches.
> I don't think neither is optimal solution. So lately, I was thinking
> about introducing macros to achieve this.
> 
> I am thinking about two macros ATM and here is their implementation:
> 
> 
> ```
> 
> %global gemspec_add_runtime_dependency() \
> read -d '' add_runtime_dependency_script << 'EOR' || : \
>   options = %w(%{*}) \
>   name = options.shift \
>   version = [options.join(' ')] \
>   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}
> 
> %global gemspec_remove_runtime_dependency() \
> ruby \\\
>   -e "name = '%{1}'" \\\
>   -e "spec = Gem::Specification.load('.%{gem_spec}')" \\\
>   -e "spec.dependencies.reject! { |d| d.type == :runtime && d.name ==
> name }" \\\
>   -e "File.write '.%{gem_spec}', spec.to_ruby" \
> %{nil}
> 
> ```
> 
> and you can use them as:
> 
> 
> ```
> 
> %gemspec_remove_runtime_dependency fog-dynect
> %gemspec_add_runtime_dependency fog-dynect ~> 10.0
> %gemspec_add_runtime_dependency fog-dynect >= 10.1
> 
> ```
> 
> As you can see, both are using a bit different way of implementation.
> Let me discuss the details.
> 
> 
> The 'gemspec_remove_runtime_dependency' is using bunch of '-e'
> parameters to specify the code. The advantage of this approach is,
> that
> the build output log contains traces of the precise command which was
> used, e.g.:
> 
> 
> ```
> 
> + ruby -e 'name = '\''fog-dynect'\''' -e 'spec =
> Gem::Specification.load('\''./usr/share/gems/specifications/fog-
> 1.38.0.gemspec'\'')'
> -e 'spec.dependencies.reject! { |d| d.type == :runtime && d.name ==
> name
> }' -e 'File.write
> '\''./usr/share/gems/specifications/fog-1.38.0.gemspec'\'',
> spec.to_ruby'
> 
> ```
> 
> 
> This is helpful, but the output is not very nice and the
> implementation
> is polluted with a lot of noise.
> 
> The other approach used in 'gemspec_add_runtime_dependency' puts the
> entire script into environment variable and then pipes it into the
> ruby.
> The log output looks like:
> 
> 
> ```
> 
> + read -d '' add_runtime_dependency_script
> + :
> + echo 'options = %w(fog-dynect >= 10.1)
>   name = options.shift
>   version = [options.join('\'' '\'')]
>   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
> 
> ```
> 
> Is this actually useful? Of course, the script could be piped
> directly
> into ruby without the env variable magic, but the output is then
> reduced
> just to:
> 
> 
> ```
> 
> + ruby
> 
> ```
> 
> which is not helpful at all (but could be improved by some hint as
> "adding dependency ....").
> 
> So what is you opinion on usefulness of these macros and on the
> implementation? What is the preferred way for you?
> 
> 
> 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']
> 
> ```
> 
> Please share your thoughts on this topic.
> 
> 
> Vít
> 
> _______________________________________________
> ruby-sig mailing list
> ruby-sig@lists.fedoraproject.org
> https://lists.fedoraproject.org/admin/lists/ruby-sig@lists.fedoraproj
> ect.org
_______________________________________________
ruby-sig mailing list
ruby-sig@lists.fedoraproject.org
https://lists.fedoraproject.org/admin/lists/ruby-sig@lists.fedoraproject.org

Reply via email to