hoopla_salesforce 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ module HooplaSalesforce
2
+ class << self
3
+ attr_accessor :enterprise_wsdl, :metadata_wsdl
4
+ end
5
+ end
@@ -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,3 @@
1
+ require 'hoopla_salesforce/rake/deploy_task'
2
+ require 'hoopla_salesforce/rake/retrieve_task'
3
+
@@ -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
+
@@ -0,0 +1,3 @@
1
+ module HooplaSalesforce
2
+ VERSION = "0.0.1"
3
+ end
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
+