hoopla_salesforce 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,6 @@
1
1
  require 'base64'
2
2
  require 'savon'
3
- require 'pp'
3
+ require 'hoopla_salesforce/text_reporter'
4
4
 
5
5
  Savon::Request.logger = Logger.new(STDOUT)
6
6
  Savon::Request.logger.level = Logger::WARN
@@ -45,7 +45,7 @@ module HooplaSalesforce
45
45
  @header = { "wsdl:SessionHeader" => { "wsdl:sessionId" => response[:session_id] } }
46
46
  end
47
47
 
48
- def deploy(zipfile)
48
+ def deploy(zipfile, options)
49
49
  login
50
50
 
51
51
  data = Base64.encode64(File.read(zipfile))
@@ -53,9 +53,7 @@ module HooplaSalesforce
53
53
  response = metaclient.deploy do |soap, wsse|
54
54
  soap.header = header
55
55
  soap.body = { "wsdl:ZipFile" => data,
56
- "wsdl:DeployOptions" => {
57
- "wsdl:runAllTests" => true
58
- },
56
+ "wsdl:DeployOptions" => options,
59
57
  :order! => ['wsdl:ZipFile', 'wsdl:DeployOptions']
60
58
  }
61
59
  end.to_hash[:deploy_response][:result]
@@ -73,10 +71,11 @@ module HooplaSalesforce
73
71
  soap.body = { "wsdl:asyncProcessId" => response[:id] }
74
72
  end.to_hash[:check_deploy_status_response][:result]
75
73
 
76
- pp response
74
+ error_out unless TextReporter.new(response).report
75
+ end
77
76
 
78
- puts response[:run_test_result][:code_coverage_warnings][:message] rescue nil
79
- puts response[:messages].map{ |m| m[:problem] }.join("\n")
77
+ def error_out
78
+ raise "Deployment errors. See report for details."
80
79
  end
81
80
 
82
81
  def retrieve(request)
@@ -45,7 +45,25 @@ module HooplaSalesforce
45
45
  make_resources
46
46
  make_zipfile
47
47
  require 'hoopla_salesforce/deployer'
48
- HooplaSalesforce::Deployer.new(username, password, token, enterprise_wsdl, metadata_wsdl).deploy(deploy_file)
48
+ HooplaSalesforce::Deployer.new(username, password, token, enterprise_wsdl, metadata_wsdl).deploy(deploy_file, deploy_options)
49
+ end
50
+ end
51
+
52
+ def deploy_options
53
+ testNames = Dir["#{src}/classes/*.cls"].inject([]) do |names, f|
54
+ body = File.read(f)
55
+ if body =~ /(testMethod|@isTest)/ && match = body.match(/\bclass\s+(\w+)\s*\{\s*/)
56
+ names << match[1]
57
+ else
58
+ names
59
+ end
60
+ end
61
+
62
+ if testNames.empty?
63
+ { "wsdl:runAllTests" => true }
64
+ else
65
+ testNames.map! { |n| namespace.sub(/__$/, '.') + n } if namespace
66
+ { "wsdl:runTests" => testNames }
49
67
  end
50
68
  end
51
69
 
@@ -0,0 +1,107 @@
1
+ require 'pp'
2
+
3
+ module HooplaSalesforce
4
+ class TextReporter
5
+ attr_reader :result
6
+
7
+ def initialize(result)
8
+ @result = result
9
+ end
10
+
11
+ def green
12
+ "\e[32m"
13
+ end
14
+
15
+ def red
16
+ "\e[31m"
17
+ end
18
+
19
+ def end_color
20
+ "\e[0m"
21
+ end
22
+
23
+ def sanitize(data)
24
+ return data if data.is_a? Array
25
+ return [data] if data
26
+ []
27
+ end
28
+
29
+ def report
30
+ indent = " "
31
+ updated_files = []
32
+ problems = []
33
+ test_failures = []
34
+ coverage_warnings = []
35
+
36
+ result[:messages].each do |message|
37
+ if message[:success]
38
+ status = " "
39
+ status = "U" if message[:changed]
40
+ status = "D" if message[:deleted]
41
+ status = "A" if message[:created]
42
+
43
+ updated_files << "#{green}#{indent}#{status} #{message[:file_name]}#{end_color}"
44
+ end
45
+
46
+ if message[:problem]
47
+ problem = "#{red}#{indent}#{message[:file_name]}:#{message[:line_number]} (column #{message[:column_number]})\n"
48
+ problem += "#{indent*2}#{message[:problem]}#{end_color}"
49
+ problems << problem
50
+ end
51
+ end
52
+
53
+ if ENV['FULL_OUTPUT']
54
+ pp result
55
+ else
56
+ puts "(Run with FULL_OUTPUT=true to show full deploy output)"
57
+ end
58
+
59
+ puts
60
+ puts "Updated files:"
61
+ puts updated_files.uniq.join("\n")
62
+ puts
63
+
64
+ puts "Test results:"
65
+ test_result = result[:run_test_result]
66
+ failures = test_result[:num_failures].to_i
67
+ passes = test_result[:num_tests_run].to_i - failures
68
+ print "#{indent}Passes: #{green}#{passes}#{end_color} "
69
+ print "Failures: #{red}#{failures}#{end_color} "
70
+ puts "Duration: #{test_result[:total_time]}"
71
+ puts
72
+
73
+ # :failures is only an array if we have more than 1. Fun...
74
+ sanitize(test_result[:failures]).each do |failure|
75
+ message = "#{indent}#{red}#{failure[:name]}.#{failure[:method_name]}: #{failure[:message]}\n"
76
+ message += failure[:stack_trace].split("\n").map{ |l| indent * 2 + l }.join("\n")
77
+ message += end_color
78
+ test_failures << message
79
+ end
80
+
81
+ if !test_failures.empty?
82
+ puts "Test failures:"
83
+ puts test_failures.join("\n")
84
+ puts
85
+ end
86
+
87
+ sanitize(test_result[:code_coverage_warnings]).each do |warning|
88
+ coverage_warnings << "#{indent}#{warning[:name]}: #{warning[:message]}"
89
+ end
90
+
91
+ if !coverage_warnings.empty?
92
+ puts "Coverage warnings:"
93
+ puts coverage_warnings.join("\n")
94
+ puts
95
+ end
96
+
97
+ if !problems.empty?
98
+ puts "Problems:"
99
+ puts problems.join("\n")
100
+ puts
101
+ end
102
+
103
+ return problems.empty?
104
+ end
105
+ end
106
+ end
107
+
@@ -1,3 +1,3 @@
1
1
  module HooplaSalesforce
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 2
9
- version: 0.0.2
8
+ - 3
9
+ version: 0.0.3
10
10
  platform: ruby
11
11
  authors:
12
12
  - Trotter Cashion
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-08-05 00:00:00 -04:00
18
+ date: 2010-08-11 00:00:00 -04:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -60,6 +60,7 @@ files:
60
60
  - lib/hoopla_salesforce/rake/deploy_task.rb
61
61
  - lib/hoopla_salesforce/rake/retrieve_task.rb
62
62
  - lib/hoopla_salesforce/version.rb
63
+ - lib/hoopla_salesforce/text_reporter.rb
63
64
  - lib/hoopla_salesforce/deployer.rb
64
65
  - lib/hoopla_salesforce.rb
65
66
  has_rdoc: true