Merge branch 'caching'
[opensuse:yast-web-client.git] / Rakefile
1 require 'fileutils'
2 require 'yaml' 
3
4 env = ENV.map { |key,val| ENV[key] ? %(#{key}="#{ENV[key]}") : nil }.reject {|x| x.nil?}.join(' ')
5
6 plugins = Dir.glob('plugins/*')#.reject{|x| ['users'].include?(File.basename(x))}
7 PROJECTS = ['webclient', *plugins]
8 desc 'Run all tests by default'
9 task :default => :test
10
11
12 %w(license:report makemo updatepot test test:ui rdoc pgem package release install install_policies check_syntax package-local buildrpm buildrpm-local test:test:rcov).each do |task_name|
13   desc "Run #{task_name} task for all projects"
14   task task_name do
15     PROJECTS.each do |project|
16       puts "run into project #{project}"
17       Dir.chdir project do
18         if File.exist? "Rakefile" #avoid endless loop if directory doesn't contain Rakefile
19           system %(#{env} #{$0} #{task_name})
20           raise "Error on execute task #{task_name} on #{project}" if $?.exitstatus != 0
21         end
22       end
23     end
24   end
25 end
26
27 desc 'Deploy locally for development - convert .po => .mo and run rake db:migrate'
28 task :deploy_devel_all => :makemo do |t|
29   project   = "webclient"
30   task_name = "db:migrate"
31   system %(cd #{project} && #{env} #{$0} #{task_name})
32   raise "Error '#{$?.exitstatus}' on execute task #{task_name} on #{project}" if $?.exitstatus != 0
33 end
34
35 desc "Fetch po files from lcn. Parameter: source directory of lcn e.g. ...lcn/trunk/"
36 task :fetch_po, [:lcn_dir] do |t, args|
37   args.with_defaults(:lcn_dir => File.join(File.dirname(__FILE__),"../../", "lcn", "trunk"))  
38   #remove translation statistik
39   File.delete(File.join("pot", "translation_status.yaml")) if File.exist?("pot/translation_status.yaml")
40   result = Hash.new()
41   task_name = "fetch_po"
42
43   PROJECTS.each do |project|
44       Dir.chdir project do
45         if File.exist? "Rakefile" #avoid endless loop if directory doesn't contain Rakefile
46           system %(#{env} #{$0} #{task_name}[#{args.lcn_dir}] )
47           raise "Error on execute task #{task_name} on #{project}" if $?.exitstatus != 0
48         end
49       end
50
51     #collecting translation information
52     Dir.glob("#{project}/**/*.po").each {|po_file|
53       output = `LANG=C msgfmt -o /dev/null -c -v --statistics #{po_file} 2>&1`
54       language = File.basename(File.dirname(po_file))
55       output.split(",").each {|column|
56         value = column.split(" ")
57         if value.size > 2 
58           if result.has_key? language 
59             if result[language].has_key? value[1]
60               result[language][value[1]] += value[0].to_i
61             else
62               result[language][value[1]] = value[0].to_i
63             end
64           else
65             result[language] = Hash.new
66             result[language][value[1]] = value[0].to_i
67           end
68          end
69       }
70     }
71   end
72   
73   #saving result to pot/translation_status.yaml
74   destdir = File.join(File.dirname(__FILE__), "pot")
75   Dir.mkdir destdir unless File.directory?(destdir)
76   f = File.open(File.join(destdir, "translation_status.yaml"), "w")
77   f.write(result.to_yaml)
78   f.close
79
80   #remove translations which have not at least 80 percent translated text
81   limit = Float(80)
82   result.each {|key,value|
83     translated = un_translated = Float(0)
84     translated = value["translated"].to_f if value.has_key? "translated"
85     un_translated += value["untranslated"].to_f if value.has_key? "untranslated"
86     un_translated += value["fuzzy"].to_f if value.has_key? "fuzzy"
87     limit_eval = translated/(un_translated+translated) 
88     if limit_eval < limit/100
89       puts "Language #{key} should be deleted cause it has only #{(limit_eval*100).to_i} percent translation reached."
90       Dir.glob("**/#{key}/").each {|po_dir|
91         unless po_dir.include? "lang_helper" #do not delete translations for language selections
92 #          puts "deleting #{po_dir}"
93 #          remove_dir(po_dir, true) #force=true
94         end
95       }
96     end      
97   }
98 end
99  
100 desc "Run doc to generate whole documentation"
101 task :doc do
102   #clean old documentation
103   puts "cleaning old doc"
104   system "rm -rf doc"
105   
106   Dir.mkdir 'doc'
107   copy 'index.html.template', "doc/index.html"
108   #handle rest service separate from plugins
109   puts "create framework documentation"
110   Dir.chdir('webclient') do
111     system "rake doc:app"
112   end
113     system "cp -r webclient/doc/app doc/webclient"
114   puts "create plugins documentation"
115   plugins_names = []
116   Dir.chdir('plugins') do
117     plugins_names = Dir.glob '*'
118   end
119   plugins_names.each do |plugin|
120     Dir.chdir("plugins/#{plugin}") do
121       system "rake doc:app" if File.exist? "Rakefile"
122     end
123     system "cp -r plugins/#{plugin}/doc/app doc/#{plugin}"
124   end
125   puts "generate links for plugins"
126   code = ""
127   plugins_names.sort.each do |plugin|
128     code = "#{code}<a href=\"./#{plugin}/index.html\"><b>#{plugin}</b></a><br>"
129   end
130   system "sed -i 's:%%PLUGINS%%:#{code}:' doc/index.html"
131   puts "documentation successfully generated"
132 end
133
134 =begin
135 require 'metric_fu'
136 MetricFu::Configuration.run do |config|
137         #define which metrics you want to use
138         config.metrics  = [:churn, :saikuro, :flog, :reek, :roodi, :rcov] #missing flay and stats both not working
139         config.graphs   = [:flog, :reek, :roodi, :rcov]
140         config.flay     = { :dirs_to_flay => ['webclient', 'plugins']  } 
141         config.flog     = { :dirs_to_flog => ['webclient', 'plugins']  }
142         config.reek     = { :dirs_to_reek => ['webclient', 'plugins']  }
143         config.roodi    = { :dirs_to_roodi => ['webclient', 'plugins'] }
144         config.saikuro  = { :output_directory => 'scratch_directory/saikuro', 
145                             :input_directory => ['webclient', 'plugins'],
146                             :cyclo => "",
147                             :filter_cyclo => "0",
148                             :warn_cyclo => "5",
149                             :error_cyclo => "7",
150                             :formater => "text"} #this needs to be set to "text"
151         config.churn    = { :start_date => "1 year ago", :minimum_churn_count => 10}
152         config.rcov     = { :test_files => ['webclient/test/**/*_test.rb', 
153                                             'plugins/**/test/**/*_test.rb'],
154                             :rcov_opts => ["--sort coverage", 
155                                            "--no-html", 
156                                            "--text-coverage",
157                                            "--no-color",
158                                            "--profile",
159                                            "--rails",
160                                            "--exclude /gems/,/Library/,spec"]}
161     end
162 =end
163