hoopla_salesforce 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/hoopla_salesforce.rb +5 -0
- data/lib/hoopla_salesforce/deployer.rb +107 -0
- data/lib/hoopla_salesforce/rake.rb +3 -0
- data/lib/hoopla_salesforce/rake/base_task.rb +36 -0
- data/lib/hoopla_salesforce/rake/deploy_task.rb +38 -0
- data/lib/hoopla_salesforce/rake/retrieve_task.rb +32 -0
- data/lib/hoopla_salesforce/version.rb +3 -0
- metadata +82 -0
@@ -0,0 +1,107 @@
|
|
1
|
+
require 'base64'
|
2
|
+
require 'savon'
|
3
|
+
require 'pp'
|
4
|
+
|
5
|
+
Savon::Request.logger = Logger.new(STDOUT)
|
6
|
+
Savon::Request.logger.level = Logger::WARN
|
7
|
+
Savon::Request.log_level = :debug
|
8
|
+
|
9
|
+
module HooplaSalesforce
|
10
|
+
class Deployer
|
11
|
+
attr_accessor :client, :metaclient, :header,
|
12
|
+
:username, :password, :token
|
13
|
+
|
14
|
+
def initialize(username, password, token, enterprise_wsdl, metadata_wsdl)
|
15
|
+
@username = username
|
16
|
+
@password = password
|
17
|
+
@token = token
|
18
|
+
@enterprise_wsdl = enterprise_wsdl
|
19
|
+
@metadata_wsdl = metadata_wsdl
|
20
|
+
end
|
21
|
+
|
22
|
+
def login
|
23
|
+
build_clients
|
24
|
+
set_certs
|
25
|
+
setup_metaclient_and_store_header
|
26
|
+
end
|
27
|
+
|
28
|
+
def build_clients
|
29
|
+
@client = Savon::Client.new @enterprise_wsdl
|
30
|
+
@metaclient = Savon::Client.new @metadata_wsdl
|
31
|
+
end
|
32
|
+
|
33
|
+
def set_certs
|
34
|
+
# TODO figure out how to get Savon to validat SF's cert
|
35
|
+
[@client, @metaclient].each { |c| c.request.http.ssl_client_auth(:verify_mode => OpenSSL::SSL::VERIFY_NONE) }
|
36
|
+
end
|
37
|
+
|
38
|
+
def setup_metaclient_and_store_header
|
39
|
+
response = client.login do |soap, wsse|
|
40
|
+
soap.body = { "wsdl:username" => username, "wsdl:password" => password + token}
|
41
|
+
end.to_hash[:login_response][:result]
|
42
|
+
|
43
|
+
metaclient.wsdl.soap_endpoint = response[:metadata_server_url]
|
44
|
+
|
45
|
+
@header = { "wsdl:SessionHeader" => { "wsdl:sessionId" => response[:session_id] } }
|
46
|
+
end
|
47
|
+
|
48
|
+
def deploy(zipfile)
|
49
|
+
login
|
50
|
+
|
51
|
+
data = Base64.encode64(File.read(zipfile))
|
52
|
+
|
53
|
+
response = metaclient.deploy do |soap, wsse|
|
54
|
+
soap.header = header
|
55
|
+
soap.body = { "wsdl:ZipFile" => data,
|
56
|
+
"wsdl:DeployOptions" => {
|
57
|
+
"wsdl:runAllTests" => true
|
58
|
+
},
|
59
|
+
:order! => ['wsdl:ZipFile', 'wsdl:DeployOptions']
|
60
|
+
}
|
61
|
+
end.to_hash[:deploy_response][:result]
|
62
|
+
|
63
|
+
puts "Deployment requested, awaiting completion of job #{response[:id]}..."
|
64
|
+
while !response[:done]
|
65
|
+
response = metaclient.check_status do |soap, wsse|
|
66
|
+
soap.header = header
|
67
|
+
soap.body = { "wsdl:asyncProcessId" => response[:id] }
|
68
|
+
end.to_hash[:check_status_response][:result]
|
69
|
+
end
|
70
|
+
|
71
|
+
response = metaclient.check_deploy_status do |soap, wsse|
|
72
|
+
soap.header = header
|
73
|
+
soap.body = { "wsdl:asyncProcessId" => response[:id] }
|
74
|
+
end.to_hash[:check_deploy_status_response][:result]
|
75
|
+
|
76
|
+
pp response
|
77
|
+
|
78
|
+
puts response[:run_test_result][:code_coverage_warnings][:message] rescue nil
|
79
|
+
puts response[:messages].map{ |m| m[:problem] }.join("\n")
|
80
|
+
end
|
81
|
+
|
82
|
+
def retrieve(request)
|
83
|
+
login
|
84
|
+
|
85
|
+
response = metaclient.retrieve do |soap, wsse|
|
86
|
+
soap.header = @header
|
87
|
+
soap.body = { "wsdl:retrieveRequest" => request }
|
88
|
+
end.to_hash[:retrieve_response][:result]
|
89
|
+
|
90
|
+
puts "Retrieve requested, awaiting completion of job #{response[:id]}..."
|
91
|
+
while !response[:done]
|
92
|
+
response = metaclient.check_status do |soap, wsse|
|
93
|
+
soap.header = @header
|
94
|
+
soap.body = { "wsdl:asyncProcessId" => response[:id] }
|
95
|
+
end.to_hash[:check_status_response][:result]
|
96
|
+
end
|
97
|
+
|
98
|
+
response = metaclient.check_retrieve_status do |soap, wsse|
|
99
|
+
soap.header = @header
|
100
|
+
soap.body = { "wsdl:asyncProcessId" => response[:id] }
|
101
|
+
end.to_hash[:check_retrieve_status_response][:result]
|
102
|
+
|
103
|
+
File.open('retrieved.zip', 'w') { |f| f.print Base64.decode64(response[:zip_file]) }
|
104
|
+
puts "Wrote retrieved contents to retrieved.zip."
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/tasklib'
|
3
|
+
require 'hoopla_salesforce'
|
4
|
+
|
5
|
+
module HooplaSalesforce
|
6
|
+
module Rake
|
7
|
+
class BaseTask < ::Rake::TaskLib
|
8
|
+
# The name for the task and any dependencies.
|
9
|
+
attr_accessor :name
|
10
|
+
|
11
|
+
# Your salesforce username
|
12
|
+
attr_accessor :username
|
13
|
+
|
14
|
+
# Your salesforce password
|
15
|
+
attr_accessor :password
|
16
|
+
|
17
|
+
# Your salesforce API token, which will get concatenated onto your password.
|
18
|
+
attr_accessor :token
|
19
|
+
|
20
|
+
# Path to your enterprise WSDL. Defaults to value of HooplaSalesforce.enterprise_wsdl.
|
21
|
+
attr_accessor :enterprise_wsdl
|
22
|
+
|
23
|
+
# Path to your metadata WSDL. Defaults to value of HooplaSalesforce.metadata_wsdl.
|
24
|
+
attr_accessor :metadata_wsdl
|
25
|
+
|
26
|
+
def initialize(name)
|
27
|
+
@name = name
|
28
|
+
@enterprise_wsdl = HooplaSalesforce.enterprise_wsdl
|
29
|
+
@metadata_wsdl = HooplaSalesforce.metadata_wsdl
|
30
|
+
|
31
|
+
yield self if block_given?
|
32
|
+
define
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'hoopla_salesforce/rake/base_task'
|
2
|
+
|
3
|
+
module HooplaSalesforce
|
4
|
+
module Rake
|
5
|
+
class DeployTask < BaseTask
|
6
|
+
# Your project root. Defaults to 'src'
|
7
|
+
attr_accessor :src
|
8
|
+
|
9
|
+
# The location of the zip file generated for deployment. Defaults to 'deploy.zip'
|
10
|
+
attr_accessor :deployfile
|
11
|
+
|
12
|
+
def initialize(name=:deploy)
|
13
|
+
@deploy_file = "deploy.zip"
|
14
|
+
@src = 'src'
|
15
|
+
super
|
16
|
+
end
|
17
|
+
|
18
|
+
def define
|
19
|
+
desc "Deploy to salesforce"
|
20
|
+
task name do
|
21
|
+
make_zipfile
|
22
|
+
require 'hoopla_salesforce/deployer'
|
23
|
+
HooplaSalesforce::Deployer.new(username, password, token, enterprise_wsdl, metadata_wsdl).deploy(deployfile)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def make_zipfile
|
28
|
+
require 'zip/zip'
|
29
|
+
rm_f deployfile
|
30
|
+
Zip::ZipFile.open(deployfile, Zip::ZipFile::CREATE) do |zip|
|
31
|
+
Dir["#{src}/**/*"].each do |file|
|
32
|
+
zip.add(file, file)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'hoopla_salesforce/rake/base_task'
|
2
|
+
|
3
|
+
module HooplaSalesforce
|
4
|
+
module Rake
|
5
|
+
class RetrieveTask < BaseTask
|
6
|
+
# The format of the retrieve request. Defaults to:
|
7
|
+
# { "wsdl:unpackaged" => { "wsdl:types" =>
|
8
|
+
# [{ "wsdl:members" => "*", "wsdl:name" => "ApexClass" }]
|
9
|
+
# }}
|
10
|
+
#
|
11
|
+
# If your code is in a salesforce package, you can specify:
|
12
|
+
# { "wsdl:packageNames" => ["Your Package Name"] }
|
13
|
+
attr_accessor :request
|
14
|
+
|
15
|
+
def initialize(name=:retrieve)
|
16
|
+
@request = { "wsdl:unpackaged" => { "wsdl:types" =>
|
17
|
+
[{ "wsdl:members" => "*", "wsdl:name" => "ApexClass" }]
|
18
|
+
}}
|
19
|
+
super
|
20
|
+
end
|
21
|
+
|
22
|
+
def define
|
23
|
+
desc "Retrieve all apex classes from salesforce.com"
|
24
|
+
task name do
|
25
|
+
require 'hoopla_salesforce/deployer'
|
26
|
+
HooplaSalesforce::Deployer.new(username, password, token, enterprise_wsdl, metadata_wsdl).retrieve(request)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
metadata
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: hoopla_salesforce
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
version: 0.0.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Trotter Cashion
|
13
|
+
- Mat Schaffer
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-08-04 00:00:00 -04:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: hoopla-savon
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
segments:
|
29
|
+
- 0
|
30
|
+
- 7
|
31
|
+
- 6
|
32
|
+
version: 0.7.6
|
33
|
+
type: :runtime
|
34
|
+
version_requirements: *id001
|
35
|
+
description: No really, these helpers are awesome
|
36
|
+
email: dev@hoopla.net
|
37
|
+
executables: []
|
38
|
+
|
39
|
+
extensions: []
|
40
|
+
|
41
|
+
extra_rdoc_files: []
|
42
|
+
|
43
|
+
files:
|
44
|
+
- lib/hoopla_salesforce.rb
|
45
|
+
- lib/hoopla_salesforce/rake.rb
|
46
|
+
- lib/hoopla_salesforce/deployer.rb
|
47
|
+
- lib/hoopla_salesforce/rake/deploy_task.rb
|
48
|
+
- lib/hoopla_salesforce/rake/retrieve_task.rb
|
49
|
+
- lib/hoopla_salesforce/rake/base_task.rb
|
50
|
+
- lib/hoopla_salesforce/version.rb
|
51
|
+
has_rdoc: true
|
52
|
+
homepage: http://hoopla.net
|
53
|
+
licenses: []
|
54
|
+
|
55
|
+
post_install_message:
|
56
|
+
rdoc_options: []
|
57
|
+
|
58
|
+
require_paths:
|
59
|
+
- lib
|
60
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
segments:
|
65
|
+
- 0
|
66
|
+
version: "0"
|
67
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
segments:
|
72
|
+
- 0
|
73
|
+
version: "0"
|
74
|
+
requirements: []
|
75
|
+
|
76
|
+
rubyforge_project: nowarning
|
77
|
+
rubygems_version: 1.3.6
|
78
|
+
signing_key:
|
79
|
+
specification_version: 3
|
80
|
+
summary: Some awesome helpers for the salesforce API
|
81
|
+
test_files: []
|
82
|
+
|