hoopla_salesforce 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
+
|