328 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			328 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
require_relative 'lib/concurrent/version'
 | 
						|
require_relative 'lib/concurrent/utility/engine'
 | 
						|
 | 
						|
if Concurrent.ruby_version :<, 2, 0, 0
 | 
						|
  # @!visibility private
 | 
						|
  module Kernel
 | 
						|
    def __dir__
 | 
						|
      File.dirname __FILE__
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
core_gemspec = Gem::Specification.load File.join(__dir__, 'concurrent-ruby.gemspec')
 | 
						|
ext_gemspec  = Gem::Specification.load File.join(__dir__, 'concurrent-ruby-ext.gemspec')
 | 
						|
edge_gemspec = Gem::Specification.load File.join(__dir__, 'concurrent-ruby-edge.gemspec')
 | 
						|
 | 
						|
require 'rake/javaextensiontask'
 | 
						|
 | 
						|
Rake::JavaExtensionTask.new('concurrent_ruby', core_gemspec) do |ext|
 | 
						|
  ext.ext_dir = 'ext/concurrent-ruby'
 | 
						|
  ext.lib_dir = 'lib/concurrent'
 | 
						|
end
 | 
						|
 | 
						|
unless Concurrent.on_jruby?
 | 
						|
  require 'rake/extensiontask'
 | 
						|
 | 
						|
  Rake::ExtensionTask.new('concurrent_ruby_ext', ext_gemspec) do |ext|
 | 
						|
    ext.ext_dir        = 'ext/concurrent-ruby-ext'
 | 
						|
    ext.lib_dir        = 'lib/concurrent'
 | 
						|
    ext.source_pattern = '*.{c,h}'
 | 
						|
 | 
						|
    ext.cross_compile  = true
 | 
						|
    ext.cross_platform = ['x86-mingw32', 'x64-mingw32']
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
require 'rake_compiler_dock'
 | 
						|
namespace :repackage do
 | 
						|
  desc '* with Windows fat distributions'
 | 
						|
  task :all do
 | 
						|
    Dir.chdir(__dir__) do
 | 
						|
      # store gems in vendor cache for docker
 | 
						|
      sh 'bundle package'
 | 
						|
 | 
						|
      # build only the jar file not the whole gem for java platform, the jar is part the concurrent-ruby-x.y.z.gem
 | 
						|
      Rake::Task['lib/concurrent/concurrent_ruby.jar'].invoke
 | 
						|
 | 
						|
      # build all gem files
 | 
						|
      RakeCompilerDock.sh 'bundle install --local && bundle exec rake cross native package --trace'
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
require 'rubygems'
 | 
						|
require 'rubygems/package_task'
 | 
						|
 | 
						|
Gem::PackageTask.new(core_gemspec) {} if core_gemspec
 | 
						|
Gem::PackageTask.new(ext_gemspec) {} if ext_gemspec && !Concurrent.on_jruby?
 | 
						|
Gem::PackageTask.new(edge_gemspec) {} if edge_gemspec
 | 
						|
 | 
						|
CLEAN.include('lib/concurrent/2.*', 'lib/concurrent/*.jar')
 | 
						|
 | 
						|
begin
 | 
						|
  require 'rspec'
 | 
						|
  require 'rspec/core/rake_task'
 | 
						|
 | 
						|
  RSpec::Core::RakeTask.new(:spec)
 | 
						|
 | 
						|
  namespace :spec do
 | 
						|
    desc '* Configured for ci'
 | 
						|
    RSpec::Core::RakeTask.new(:ci) do |t|
 | 
						|
      options      = %w[ --color
 | 
						|
                    --backtrace
 | 
						|
                    --order defined
 | 
						|
                    --format documentation
 | 
						|
                    --tag ~notravis ]
 | 
						|
      t.rspec_opts = [*options].join(' ')
 | 
						|
    end
 | 
						|
 | 
						|
    desc '* test packaged and installed gems instead of local files'
 | 
						|
    task :installed do
 | 
						|
      Dir.chdir(__dir__) do
 | 
						|
        sh "gem install pkg/concurrent-ruby-#{Concurrent::VERSION}.gem"
 | 
						|
        sh "gem install pkg/concurrent-ruby-ext-#{Concurrent::VERSION}.gem" if Concurrent.on_cruby?
 | 
						|
        sh "gem install pkg/concurrent-ruby-edge-#{Concurrent::EDGE_VERSION}.gem"
 | 
						|
        ENV['NO_PATH'] = 'true'
 | 
						|
        sh 'bundle update'
 | 
						|
        sh 'bundle exec rake spec:ci'
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  desc 'executed in CI'
 | 
						|
  task :ci => [:compile, 'spec:ci']
 | 
						|
 | 
						|
  task :default => [:clobber, :compile, :spec]
 | 
						|
rescue LoadError => e
 | 
						|
  puts 'RSpec is not installed, skipping test task definitions: ' + e.message
 | 
						|
end
 | 
						|
 | 
						|
current_yard_version_name = Concurrent::VERSION
 | 
						|
 | 
						|
begin
 | 
						|
  require 'yard'
 | 
						|
  require 'md_ruby_eval'
 | 
						|
  require_relative 'support/yard_full_types'
 | 
						|
 | 
						|
  common_yard_options = ['--no-yardopts',
 | 
						|
                         '--no-document',
 | 
						|
                         '--no-private',
 | 
						|
                         '--embed-mixins',
 | 
						|
                         '--markup', 'markdown',
 | 
						|
                         '--title', 'Concurrent Ruby',
 | 
						|
                         '--template', 'default',
 | 
						|
                         '--template-path', 'yard-template',
 | 
						|
                         '--default-return', 'undocumented']
 | 
						|
 | 
						|
  desc 'Generate YARD Documentation (signpost, master)'
 | 
						|
  task :yard => ['yard:signpost', 'yard:master']
 | 
						|
 | 
						|
  namespace :yard do
 | 
						|
 | 
						|
    desc '* eval markdown files'
 | 
						|
    task :eval_md do
 | 
						|
      Dir.chdir File.join(__dir__, 'docs-source') do
 | 
						|
        sh 'bundle exec md-ruby-eval --auto'
 | 
						|
      end
 | 
						|
    end
 | 
						|
 | 
						|
    task :update_readme do
 | 
						|
      Dir.chdir __dir__ do
 | 
						|
        content = File.read(File.join('README.md')).
 | 
						|
            gsub(/\[([\w ]+)\]\(http:\/\/ruby-concurrency\.github\.io\/concurrent-ruby\/master\/.*\)/) do |_|
 | 
						|
          case $1
 | 
						|
          when 'LockFreeLinkedSet'
 | 
						|
            "{Concurrent::Edge::#{$1} #{$1}}"
 | 
						|
          when '.dataflow'
 | 
						|
            '{Concurrent.dataflow Concurrent.dataflow}'
 | 
						|
          when 'thread pool'
 | 
						|
            '{file:thread_pools.md thread pool}'
 | 
						|
          else
 | 
						|
            "{Concurrent::#{$1} #{$1}}"
 | 
						|
          end
 | 
						|
        end
 | 
						|
        FileUtils.mkpath 'tmp'
 | 
						|
        File.write 'tmp/README.md', content
 | 
						|
      end
 | 
						|
    end
 | 
						|
 | 
						|
    define_yard_task = -> name do
 | 
						|
      output_dir = "docs/#{name}"
 | 
						|
 | 
						|
      removal_name = "remove.#{name}"
 | 
						|
      task removal_name do
 | 
						|
        Dir.chdir __dir__ do
 | 
						|
          FileUtils.rm_rf output_dir
 | 
						|
        end
 | 
						|
      end
 | 
						|
 | 
						|
      desc "* of #{name} into subdir #{name}"
 | 
						|
      YARD::Rake::YardocTask.new(name) do |yard|
 | 
						|
        yard.options.push(
 | 
						|
            '--output-dir', output_dir,
 | 
						|
            '--main', 'tmp/README.md',
 | 
						|
            *common_yard_options)
 | 
						|
        yard.files = ['./lib/**/*.rb',
 | 
						|
                      './lib-edge/**/*.rb',
 | 
						|
                      './ext/concurrent_ruby_ext/**/*.c',
 | 
						|
                      '-',
 | 
						|
                      'docs-source/thread_pools.md',
 | 
						|
                      'docs-source/promises.out.md',
 | 
						|
                      'docs-source/medium-example.out.rb',
 | 
						|
                      'LICENSE.md',
 | 
						|
                      'CHANGELOG.md']
 | 
						|
      end
 | 
						|
      Rake::Task[name].prerequisites.push removal_name, 'yard:eval_md', 'yard:update_readme'
 | 
						|
    end
 | 
						|
 | 
						|
    define_yard_task.call current_yard_version_name
 | 
						|
    define_yard_task.call 'master'
 | 
						|
 | 
						|
    desc "* signpost for versions"
 | 
						|
    YARD::Rake::YardocTask.new(:signpost) do |yard|
 | 
						|
      yard.options.push(
 | 
						|
          '--output-dir', 'docs',
 | 
						|
          '--main', 'docs-source/signpost.md',
 | 
						|
          *common_yard_options)
 | 
						|
      yard.files = ['no-lib']
 | 
						|
    end
 | 
						|
 | 
						|
    define_uptodate_task = -> name do
 | 
						|
      namespace name do
 | 
						|
        desc "** ensure that #{name} generated documentation is matching the source code"
 | 
						|
        task :uptodate do
 | 
						|
          Dir.chdir(__dir__) do
 | 
						|
            begin
 | 
						|
              FileUtils.cp_r 'docs', 'docs-copy', verbose: true
 | 
						|
              Rake::Task["yard:#{name}"].invoke
 | 
						|
              sh 'diff -r docs/ docs-copy/' do |ok, res|
 | 
						|
                unless ok
 | 
						|
                  begin
 | 
						|
                    STDOUT.puts 'Command failed. Continue? (y/n)'
 | 
						|
                    input = STDIN.gets.strip.downcase
 | 
						|
                  end until %w(y n).include?(input)
 | 
						|
                  exit 1 if input == 'n'
 | 
						|
                end
 | 
						|
              end
 | 
						|
            ensure
 | 
						|
              FileUtils.rm_rf 'docs-copy', verbose: true
 | 
						|
            end
 | 
						|
          end
 | 
						|
        end
 | 
						|
      end
 | 
						|
    end
 | 
						|
 | 
						|
    define_uptodate_task.call current_yard_version_name
 | 
						|
    define_uptodate_task.call 'master'
 | 
						|
  end
 | 
						|
 | 
						|
rescue LoadError => e
 | 
						|
  puts 'YARD is not installed, skipping documentation task definitions: ' + e.message
 | 
						|
end
 | 
						|
 | 
						|
desc 'build, test, and publish the gem'
 | 
						|
task :release => ['release:checks', 'release:build', 'release:test', 'release:publish']
 | 
						|
 | 
						|
namespace :release do
 | 
						|
  # Depends on environment of @pitr-ch
 | 
						|
 | 
						|
  mri_version   = '2.5.1'
 | 
						|
  jruby_version = 'jruby-9.1.17.1'
 | 
						|
 | 
						|
  task :checks => "yard:#{current_yard_version_name}:uptodate" do
 | 
						|
    Dir.chdir(__dir__) do
 | 
						|
      sh 'test -z "$(git status --porcelain)"' do |ok, res|
 | 
						|
        unless ok
 | 
						|
          begin
 | 
						|
            STDOUT.puts 'Command failed. Continue? (y/n)'
 | 
						|
            input = STDIN.gets.strip.downcase
 | 
						|
          end until %w(y n).include?(input)
 | 
						|
          exit 1 if input == 'n'
 | 
						|
        end
 | 
						|
      end
 | 
						|
      sh 'git fetch'
 | 
						|
      sh 'test $(git show-ref --verify --hash refs/heads/master) = ' +
 | 
						|
             '$(git show-ref --verify --hash refs/remotes/origin/master)' do |ok, res|
 | 
						|
        unless ok
 | 
						|
          begin
 | 
						|
            STDOUT.puts 'Command failed. Continue? (y/n)'
 | 
						|
            input = STDIN.gets.strip.downcase
 | 
						|
          end until %w(y n).include?(input)
 | 
						|
          exit 1 if input == 'n'
 | 
						|
        end
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  desc '* build all *.gem files necessary for release'
 | 
						|
  task :build => [:clobber, 'repackage:all']
 | 
						|
 | 
						|
  desc '* test actual installed gems instead of cloned repository on MRI and JRuby'
 | 
						|
  task :test do
 | 
						|
    Dir.chdir(__dir__) do
 | 
						|
      old = ENV['RBENV_VERSION']
 | 
						|
 | 
						|
      ENV['RBENV_VERSION'] = mri_version
 | 
						|
      sh 'rbenv version'
 | 
						|
      sh 'bundle exec rake spec:installed'
 | 
						|
 | 
						|
      ENV['RBENV_VERSION'] = jruby_version
 | 
						|
      sh 'rbenv version'
 | 
						|
      sh 'bundle exec rake spec:installed'
 | 
						|
 | 
						|
      puts 'Windows build is untested'
 | 
						|
 | 
						|
      ENV['RBENV_VERSION'] = old
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  desc '* do all nested steps'
 | 
						|
  task :publish => ['publish:ask', 'publish:tag', 'publish:rubygems', 'publish:post_steps']
 | 
						|
 | 
						|
  namespace :publish do
 | 
						|
    publish_edge = false
 | 
						|
 | 
						|
    task :ask do
 | 
						|
      begin
 | 
						|
        STDOUT.puts 'Do you want to publish anything? (y/n)'
 | 
						|
        input = STDIN.gets.strip.downcase
 | 
						|
      end until %w(y n).include?(input)
 | 
						|
      exit 1 if input == 'n'
 | 
						|
      begin
 | 
						|
        STDOUT.puts 'Do you want to publish edge? (y/n)'
 | 
						|
        input = STDIN.gets.strip.downcase
 | 
						|
      end until %w(y n).include?(input)
 | 
						|
      publish_edge = input == 'y'
 | 
						|
    end
 | 
						|
 | 
						|
    desc '** tag HEAD with current version and push to github'
 | 
						|
    task :tag do
 | 
						|
      Dir.chdir(__dir__) do
 | 
						|
        sh "git tag v#{Concurrent::VERSION}"
 | 
						|
        sh "git push origin v#{Concurrent::VERSION}"
 | 
						|
        sh "git tag edge-v#{Concurrent::EDGE_VERSION}" if publish_edge
 | 
						|
        sh "git push origin edge-v#{Concurrent::EDGE_VERSION}" if publish_edge
 | 
						|
      end
 | 
						|
    end
 | 
						|
 | 
						|
    desc '** push all *.gem files to rubygems'
 | 
						|
    task :rubygems do
 | 
						|
      Dir.chdir(__dir__) do
 | 
						|
        sh "gem push pkg/concurrent-ruby-#{Concurrent::VERSION}.gem"
 | 
						|
        sh "gem push pkg/concurrent-ruby-edge-#{Concurrent::EDGE_VERSION}.gem" if publish_edge
 | 
						|
        sh "gem push pkg/concurrent-ruby-ext-#{Concurrent::VERSION}.gem"
 | 
						|
        sh "gem push pkg/concurrent-ruby-ext-#{Concurrent::VERSION}-x64-mingw32.gem"
 | 
						|
        sh "gem push pkg/concurrent-ruby-ext-#{Concurrent::VERSION}-x86-mingw32.gem"
 | 
						|
      end
 | 
						|
    end
 | 
						|
 | 
						|
    desc '** print post release steps'
 | 
						|
    task :post_steps do
 | 
						|
      puts 'Manually: create a release on GitHub with relevant changelog part'
 | 
						|
      puts 'Manually: send email same as release with relevant changelog part'
 | 
						|
      puts 'Manually: tweet'
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 |