%YAML 1.2
--- |
  # -*- ruby -*-
  # encoding: utf-8
  $LOAD_PATH.push File.expand_path('../src/ruby/lib', __FILE__)
  require 'grpc/version'

  Gem::Specification.new do |s|
    s.name          = 'grpc'
    s.version       = GRPC::VERSION
    s.authors       = ['gRPC Authors']
    s.email         = 'grpc-io@googlegroups.com'
    s.homepage      = 'https://github.com/google/grpc/tree/master/src/ruby'
    s.summary       = 'GRPC system in Ruby'
    s.description   = 'Send RPCs from Ruby using GRPC'
    s.license       = 'Apache-2.0'

    s.required_ruby_version = '>= 2.4.0'

    s.files = %w( Makefile .yardopts )
    s.files += %w( etc/roots.pem )
    s.files += Dir.glob('src/ruby/bin/**/*')
    s.files += Dir.glob('src/ruby/ext/**/*')
    s.files += Dir.glob('src/ruby/lib/**/*').reject do |f|
      # Binaries are included by rake-compiler and would lead to circular dependencies here
      File.fnmatch("**/?.?/grpc_c.so", f)
    end
    s.files += Dir.glob('src/ruby/pb/**/*').reject do |f|
      f.match(%r{^src/ruby/pb/test})
    end
    s.files += Dir.glob('include/grpc/**/*')
    s.test_files = Dir.glob('src/ruby/spec/**/*')
    s.bindir = 'src/ruby/bin'
    s.require_paths = %w( src/ruby/lib src/ruby/bin src/ruby/pb )
    s.platform      = Gem::Platform::RUBY

    s.add_dependency 'google-protobuf', '~> ${settings.protobuf_major_minor_version}'
    s.add_dependency 'googleapis-common-protos-types', '~> 1.0'

    s.add_development_dependency 'bundler',            '>= 1.9'
    s.add_development_dependency 'facter',             '~> 2.4'
    s.add_development_dependency 'logging',            '~> 2.0'
    s.add_development_dependency 'simplecov',          '~> 0.14.1'
    s.add_development_dependency 'rake',               '~> 13.0'
    s.add_development_dependency 'rake-compiler',      '~> 1.1'
    s.add_development_dependency 'rake-compiler-dock', '~> 1.0'
    s.add_development_dependency 'rspec',              '~> 3.6'
    s.add_development_dependency 'rubocop',            '~> 0.49.1'
    s.add_development_dependency 'signet',             '~> 0.7'
    s.add_development_dependency 'googleauth',         '>= 0.5.1', '< 0.10'

    s.extensions = %w(src/ruby/ext/grpc/extconf.rb)
  <%
    files = []
    ruby_deps = ruby_gem.get('deps', [])
    lib_maps = {lib.name: lib for lib in libs}
    for dep in ruby_deps[:]:
      ruby_deps.extend(lib_maps[dep].transitive_deps)
    for dep in ruby_deps:
      lib = lib_maps[dep]
      files.extend(lib.get('public_headers', []) + lib.headers + lib.src)
    files = sorted(set(files))
  %>
    % for file in files:
    s.files += %w( ${file} )
    % endfor
  end
