Warning, /kdevelop/kdev-ruby/Guardfile is written in an unsupported language. File is not indexed.

0001 ##
0002 # This file is part of KDevelop
0003 #
0004 # Copyright (C) 2012-2015 Miquel Sabaté Solà <mikisabate@gmail.com>
0005 #
0006 # This program is free software; you can redistribute it and/or modify
0007 # it under the terms of the GNU General Public License as published by
0008 # the Free Software Foundation; either version 3 of the License, or
0009 # (at your option) any later version.
0010 #
0011 # This program is distributed in the hope that it will be useful,
0012 # but WITHOUT ANY WARRANTY; without even the implied warranty of
0013 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0014 # GNU General Public License for more details.
0015 #
0016 # You should have received a copy of the GNU General Public License along
0017 # with this program; if not, write to the Free Software Foundation, Inc.,
0018 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
0019 
0020 
0021 require 'guard'
0022 require 'guard/guard'
0023 
0024 
0025 module ::Guard
0026   # Subclass the Guard::Guard class so then we can setup the watchers
0027   # through the guard('kdev') method call.
0028   class KDev < ::Guard::Guard
0029     # Public: Initialize the Guard::KDev watcher.
0030     #
0031     # watchers - an Array containing the Guard watchers.
0032     # options  - a Hash with the available options:
0033     #            :build_url - a String representing the absolute path to the
0034     #                         build dir.
0035     #            :tests     - a Hash of hashes with the config for each test.
0036     def initialize(watchers = [], options = {})
0037       super
0038       @opts = { :build_url => '', :tests => {} }.merge(options)
0039     end
0040 
0041     # Public: It will be called on start. It just shows a message.
0042     #
0043     # Returns nothing.
0044     def start
0045       UI.info "Watching everything inside: #{@opts[:build_url]}"
0046     end
0047 
0048     # Public: It will be called when some watched file has changed.
0049     #
0050     # paths - An Array of strings that identify which tests
0051     # should be run again.
0052     #
0053     # Returns nothing.
0054     def run_on_changes(paths)
0055       @failed = 0
0056       tests = {}
0057       paths.each { |k| tests[k.to_sym] = @opts[:tests][k.to_sym] }
0058       run_required(tests)
0059     end
0060 
0061     # Public: Run all the tests and notify the user (console and libnotify).
0062     #
0063     # Returns nothing.
0064     def run_all
0065       run_required(@opts[:tests])
0066     end
0067 
0068     private
0069 
0070     # Internal: Run the required tests.
0071     #
0072     # tests - A Hash of hashes containing all the info of the tests that
0073     # have to be run in this iteration.
0074     #
0075     # Returns nothing.
0076     def run_required(tests)
0077       @results = {}
0078       @failed = 0
0079       tests.each do |k, v|
0080         UI.info "Running the tests for the #{k.to_s.capitalize}..."
0081         v[:execs] = [v[:execs]] if v[:execs].is_a? String
0082         run_tests k, v[:url], v[:execs]
0083       end
0084 
0085       notify!
0086     end
0087 
0088     # Internal: Run all the tests of a certain component.
0089     #
0090     # key   - A Symbol that is the identifier of the test.
0091     # url   - A String with the relative url of the component's test directory.
0092     # tests - An Array of strings where each string is the command to be
0093     #         executed in order to run the test.
0094     #
0095     # Returns nothing.
0096     def run_tests(key, url, tests)
0097       base = @opts[:build_url] + url
0098       tests.each do |t|
0099         UI.info "Executing the following command: '#{t}' in #{base}"
0100         Dir.chdir base
0101         output = `#{t}`
0102         append_results key, output, t.start_with?('./')
0103       end
0104     end
0105 
0106     # Internal: Append the results of an execution to the @results array.
0107     #
0108     # key        - A Symbol that is the identifier of the test.
0109     # text       - A String with the output of the execution.
0110     # executable - A Boolean that tells us whether this execution comes from
0111     #              an executable file or not.
0112     #
0113     # Returns nothing.
0114     def append_results(key, text, executable)
0115       total, win = 0, 0
0116       if executable
0117         text.match /Totals: (\d+) passed, (\d+) failed/
0118         total, win = $1.to_i + $2.to_i, $1.to_i
0119       else
0120         line = text.split("\n").last
0121         line.match /^(\d+) tests, (\d+) assertions/
0122         total, win = $1.to_i, $2.to_i
0123       end
0124       @results[key] = [win, total - win]
0125       @failed += 1
0126     end
0127 
0128     # Internal: Notify the user by printing the results to the console.
0129     # A notification will also be sent (i.e. through libnotify).
0130     #
0131     # Returns nothing.
0132     def notify!
0133       puts "\n****************************************"
0134       @results.each do |k, v|
0135         puts "#{k.to_s.capitalize}: Passed: #{v.first}, Failed: #{v.last}"
0136       end
0137       puts "****************************************\n"
0138 
0139       if @failed > 0
0140         ::Guard::Notifier.notify('Some tests are failing !', :image => :failed)
0141       else
0142         ::Guard::Notifier.notify('All tests passed !')
0143       end
0144     end
0145   end
0146 end
0147 
0148 
0149 #
0150 # And now let's use the infrastructure created above :)
0151 #
0152 
0153 # The base build url.
0154 relative = (ARGV.size > 0) ? ARGV.last : 'build'
0155 build_url = File.join File.expand_path(File.dirname(__FILE__)), relative
0156 build_url += '/' unless build_url.end_with? '/'
0157 unless File.exists?(build_url)
0158   puts 'Error: wrong build directory.'
0159   exit 1
0160 end
0161 
0162 # For each component (Completion, DUChain) specify the relative url
0163 # and how to execute each test.
0164 tests = {
0165     :completion => { :url => 'completion/tests/', :execs => './completion' },
0166     :duchain => { :url => 'duchain/tests/', :execs => ['./duchain', './uses'] }
0167 }
0168 
0169 # Setting up the Guard::KDev watcher for DUChain and CodeCompletion.
0170 guard 'kdev', :build_url => build_url, :tests => tests do
0171   watch(%r{^duchain/*})         { [:duchain, :completion] }
0172   watch(%r{^completion/*})      { [:completion] }
0173 end
0174 
0175 # And now let's turn the Guard::RSpec watcher on for the parser.
0176 rspec_paths = File.join(build_url, 'parser/tools')
0177 guard 'rspec', cmd: 'bundle exec rspec -c -f doc', spec_paths: ["#{rspec_paths}/parser_spec.rb"] do
0178   watch(%r{^parser/(.*)$}) { "#{rspec_paths}/parser_spec.rb" }
0179 end