salesforce_fsdb 0.0.2 → 0.0.3
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.
- checksums.yaml +7 -0
- data/CHANGELOG +4 -1
- data/README.rdoc +17 -1
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/lib/salesforce_fsdb/client.rb +58 -4
- data/lib/salesforce_fsdb/rest_client.rb +9 -0
- data/salesforce_fsdb.gemspec +3 -3
- metadata +8 -10
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 5800738a75803b32473b3cf8004f4132922692b0
|
4
|
+
data.tar.gz: 2bb44d97b73ec6c5d266ff908af62f3d6c7a53de
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 3af6c597ceacb8b27a0c8896b0f374300442e9b4a8ff8bcca61d68b858d45f7054a7c302f6e5d5d2e49abbbb1139635922c403dda741c565beb9bea9804965af
|
7
|
+
data.tar.gz: f6d3d8dee9c54328bc014eb2a1537082af1d04f1edaacce6bdd3dc35fecc1c6c9b36fcdf2fa356970370c992d7bf7c71201febc0f60d9860626611a31828d05c
|
data/CHANGELOG
CHANGED
data/README.rdoc
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
= SalesforceFsdb
|
2
2
|
|
3
|
-
Salesforce SObject system to retrieve and cache SObjects.
|
3
|
+
Salesforce SObject system to retrieve and cache queries from Salesforce.com including SObjects and SOQL results.
|
4
4
|
|
5
5
|
== Installation
|
6
6
|
|
@@ -33,12 +33,28 @@ Download and install salesforce_fsdb with the following:
|
|
33
33
|
sfFsdbClient = SalesforceFsdb::Client.new(paramsGeneral,paramsToken)
|
34
34
|
sObjectHash = sfFsdbClient.getSobjectForSfidAndType('my_sobject_id','Account')
|
35
35
|
|
36
|
+
sSfid = '1234567890'
|
37
|
+
sSoql = %{ SELECT Id,AccountId,Name,IsWon,StageName,CloseDate from Opportunity where AccountId='#{sSfid}' }
|
38
|
+
sPath = "AccountOpportunities/sf_act_#{sSfid}_opps.jff"
|
39
|
+
|
40
|
+
dResults = sfFsdbClient.getResForSoqlAndPath( sSoql, sPath )
|
41
|
+
|
36
42
|
# without using a filesystem cache
|
37
43
|
sfRestClient = SalesforceFsdb::RestClient.new(paramsGeneral,paramsToken)
|
38
44
|
sObjectHash = sfRestClient.getSobjectForSfidAndType('my_sobject_id','Account')
|
39
45
|
|
40
46
|
== Notes
|
41
47
|
|
48
|
+
=== Max Age
|
49
|
+
|
50
|
+
The :max_age parameter is used to indicate the maximum age in seconds for cached data. If local data exceeds maximum age, a new copy of the data is retrieved from Salesforce.com. To ensure retrieval of a new copy, use :max_age=-1.
|
51
|
+
|
52
|
+
=== Directory Paths
|
53
|
+
|
54
|
+
Salesforce Sobjects are stored on the file system under File.join( paramsGeneral[:data_dir], Sobject_type ).
|
55
|
+
|
56
|
+
SOQL results are stored in the path indicated. Sub-directories are created for SOQL paths. If a relative directory is provided, it is appended to the :data_dir. If an absolute directory is provided, it is used as an absolute directory in its entirety.
|
57
|
+
|
42
58
|
=== Object Size
|
43
59
|
|
44
60
|
Some large Salesforce Objects may generate Salesforce errors. A future release will allow specifying specific fields for retrieval.
|
data/Rakefile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.3
|
@@ -5,32 +5,84 @@ require 'salesforce_fsdb/rest_client'
|
|
5
5
|
module SalesforceFsdb
|
6
6
|
class Client
|
7
7
|
attr_accessor :oSfRestClient
|
8
|
+
|
8
9
|
def initialize(dParamsGeneral={},dParamsToken={})
|
9
10
|
@oSfRestClient = SalesforceFsdb::RestClient.new(dParamsGeneral,dParamsToken)
|
10
11
|
@sFsdbBaseDir = dParamsGeneral[:data_dir] || '.'
|
11
12
|
@iMaxAgeSec = dParamsGeneral[:max_age] || 3600*24*7
|
12
13
|
end
|
14
|
+
|
13
15
|
def getFileForSfidAndType(sSfid=nil,sType=nil)
|
14
16
|
sFile = %Q{sf_#{sType}_#{sSfid}.json}
|
15
17
|
return sFile
|
16
18
|
end
|
19
|
+
|
17
20
|
def getDirForType(sType=nil)
|
18
21
|
sDir = File.join(@sFsdbBaseDir,sType)
|
19
22
|
return sDir
|
20
23
|
end
|
24
|
+
|
21
25
|
def getPathForSfidAndType(sSfid=nil,sType=nil)
|
22
26
|
sPath = File.join( self.getDirForType(sType), self.getFileForSfidAndType(sSfid,sType))
|
23
27
|
return sPath
|
24
28
|
end
|
29
|
+
|
30
|
+
def getResForSoqlAndPath(sSoql=nil,sPath=nil)
|
31
|
+
return nil if sSoql.nil?
|
32
|
+
if ! sPath.nil? && sPath !~ /^\s*\//
|
33
|
+
sPath.strip!
|
34
|
+
sPath = File.join(@sFsdbBaseDir,sPath)
|
35
|
+
end
|
36
|
+
dRes = { :meta => { :iEpochRetrieved => -1, :iStatus => 404 } }
|
37
|
+
if !sPath.nil? && File.exists?(sPath)
|
38
|
+
jTop = File.open(sPath,'r').read
|
39
|
+
dTop = JSON.parse(jTop,:symbolize_names=>true)
|
40
|
+
if dTop.has_key?(:source) && dTop.has_key?(:meta) && dTop[:meta].has_key?(:iEpochRetrieved)
|
41
|
+
iEpochRetrieved = dTop[:meta][:iEpochRetrieved]
|
42
|
+
iEpochNow = Time.now.to_i
|
43
|
+
iAgeSec = iEpochNow - iEpochRetrieved
|
44
|
+
if iAgeSec < @iMaxAgeSec && dTop[:source].has_key?(:done)
|
45
|
+
dRes = dTop[:source]
|
46
|
+
return dRes
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
return self.getResForSoqlAndPathFromRemote(sSoql,sPath)
|
51
|
+
end
|
52
|
+
|
53
|
+
def getResForSoqlAndPathFromRemote(sSoql=nil,sPath=nil)
|
54
|
+
return nil if sSoql.nil?
|
55
|
+
if ! sPath.nil? && sPath !~ /^\s*\//
|
56
|
+
sPath.strip!
|
57
|
+
sPath = File.join(@sFsdbBaseDir,sPath)
|
58
|
+
end
|
59
|
+
dRes = @oSfRestClient.getSoqlResults(sSoql)
|
60
|
+
if ! dRes.nil? && dRes.has_key?(:done) && dRes[:done] == true && ! sPath.nil?
|
61
|
+
if sPath =~ /^([\S]+)\/[^\/]+$/
|
62
|
+
sDir = $1
|
63
|
+
FileUtils.mkdir_p(sDir) if ! Dir.exists?(sDir)
|
64
|
+
end
|
65
|
+
File.open(sPath,'w') do |fTop|
|
66
|
+
dTop = {
|
67
|
+
:meta => { :iEpochRetrieved => Time.now.to_i, :iStatus => 200 },
|
68
|
+
:source => dRes
|
69
|
+
}
|
70
|
+
jTop = JSON.dump(dTop)
|
71
|
+
fTop.puts(jTop)
|
72
|
+
end
|
73
|
+
return dRes
|
74
|
+
end
|
75
|
+
return nil
|
76
|
+
end
|
77
|
+
|
25
78
|
def getSobjectForSfidAndType(sSfid=nil,sType=nil)
|
26
79
|
sPath = self.getPathForSfidAndType(sSfid,sType)
|
27
80
|
dObj = { :meta => { :iEpochRetrieved => -1, :iStatus => 404 } }
|
28
|
-
iEpochNow = Time.now.to_i
|
29
81
|
if File.exists?(sPath)
|
30
82
|
jTop = File.open(sPath,'r').read
|
31
83
|
dTop = JSON.parse(jTop,:symbolize_names=>true)
|
32
|
-
if dTop.has_key?(:source) && dTop.has_key?(:meta) &&
|
33
|
-
iEpochRetrieved =
|
84
|
+
if dTop.has_key?(:source) && dTop.has_key?(:meta) && dTop[:meta].has_key?(:iEpochRetrieved)
|
85
|
+
iEpochRetrieved = dTop[:meta][:iEpochRetrieved]
|
34
86
|
iEpochNow = Time.now.to_i
|
35
87
|
iAgeSec = iEpochNow - iEpochRetrieved
|
36
88
|
if iAgeSec < @iMaxAgeSec && dTop[:source].has_key?(:Id)
|
@@ -41,6 +93,7 @@ module SalesforceFsdb
|
|
41
93
|
end
|
42
94
|
return self.getSobjectForSfidAndTypeFromRemote(sSfid,sType)
|
43
95
|
end
|
96
|
+
|
44
97
|
def getSobjectForSfidAndTypeFromRemote(sSfid=nil,sType=nil)
|
45
98
|
dObj = @oSfRestClient.getSobjectForSfidAndType(sSfid,sType)
|
46
99
|
if dObj.has_key?(:Id)
|
@@ -57,7 +110,8 @@ module SalesforceFsdb
|
|
57
110
|
end
|
58
111
|
return dObj
|
59
112
|
end
|
60
|
-
return
|
113
|
+
return nil
|
61
114
|
end
|
115
|
+
|
62
116
|
end
|
63
117
|
end
|
@@ -3,8 +3,10 @@ require 'json'
|
|
3
3
|
|
4
4
|
module SalesforceFsdb
|
5
5
|
class RestClient
|
6
|
+
|
6
7
|
attr_accessor :sSfTokenUrl
|
7
8
|
attr_accessor :dTokenRes
|
9
|
+
|
8
10
|
def initialize(dParamsGeneral={},dParamsToken={})
|
9
11
|
@dParamsToken = dParamsToken
|
10
12
|
@sSfTokenUrl = dParamsGeneral.has_key?(:token_url) ? dParamsGeneral[:token_url] \
|
@@ -14,20 +16,24 @@ module SalesforceFsdb
|
|
14
16
|
@dTokenRes = {}
|
15
17
|
self.loadToken()
|
16
18
|
end
|
19
|
+
|
17
20
|
def loadToken()
|
18
21
|
oRes = Faraday.post(@sSfTokenUrl,@dParamsToken)
|
19
22
|
@dTokenRes = JSON.parse(oRes.body,:symbolize_names=>true)
|
20
23
|
return self
|
21
24
|
end
|
25
|
+
|
22
26
|
def getAttr(yKey=nil)
|
23
27
|
yKey = yKey.to_sym if yKey.is_a?(String)
|
24
28
|
xxVal = @dTokenRes.has_key?(yKey) ? @dTokenRes[yKey] : nil
|
25
29
|
return xxVal
|
26
30
|
end
|
31
|
+
|
27
32
|
def getHeaders()
|
28
33
|
dHeaders = { 'Authorization' => 'Bearer ' + self.getAttr(:access_token) }
|
29
34
|
return dHeaders
|
30
35
|
end
|
36
|
+
|
31
37
|
def getSoqlResults(sSoql=nil)
|
32
38
|
dQry = { :q => sSoql}
|
33
39
|
sUrl = "https://#{@sApiFqdn}/services/data/v#{@sApiVersion}/query"
|
@@ -36,10 +42,12 @@ module SalesforceFsdb
|
|
36
42
|
dRes = JSON.parse(oRes.body,:symbolize_names=>true)
|
37
43
|
return dRes
|
38
44
|
end
|
45
|
+
|
39
46
|
def getSfUrlForSfidAndType(sSfid=nil,sType=nil)
|
40
47
|
sUrl = "https://#{@sApiFqdn}/services/data/v#{@sApiVersion}/sobjects/#{sType}/#{sSfid}/"
|
41
48
|
return sUrl
|
42
49
|
end
|
50
|
+
|
43
51
|
def getSobjectForSfidAndType(sSfid=nil,sType=nil)
|
44
52
|
sUrl = self.getSfUrlForSfidAndType(sSfid,sType)
|
45
53
|
sHead = self.getHeaders()
|
@@ -47,5 +55,6 @@ module SalesforceFsdb
|
|
47
55
|
dRes = JSON.parse(oRes.body,:symbolize_names=>true)
|
48
56
|
return dRes
|
49
57
|
end
|
58
|
+
|
50
59
|
end
|
51
60
|
end
|
data/salesforce_fsdb.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'salesforce_fsdb'
|
3
|
-
s.version = '0.0.
|
4
|
-
s.date = '2014-
|
3
|
+
s.version = '0.0.3'
|
4
|
+
s.date = '2014-02-06'
|
5
5
|
s.summary = 'Salesforce Filesystem DB'
|
6
6
|
s.description = 'Filesystem cache manager for Salesforce sObjects'
|
7
7
|
s.authors = ['John Wang']
|
@@ -19,4 +19,4 @@ Gem::Specification.new do |s|
|
|
19
19
|
]
|
20
20
|
s.homepage = 'http://johnwang.com/'
|
21
21
|
s.license = 'MIT'
|
22
|
-
end
|
22
|
+
end
|
metadata
CHANGED
@@ -1,15 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: salesforce_fsdb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.3
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- John Wang
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2014-
|
11
|
+
date: 2014-02-06 00:00:00.000000000 Z
|
13
12
|
dependencies: []
|
14
13
|
description: Filesystem cache manager for Salesforce sObjects
|
15
14
|
email: johncwang@gmail.com
|
@@ -22,33 +21,32 @@ files:
|
|
22
21
|
- README.rdoc
|
23
22
|
- Rakefile
|
24
23
|
- VERSION
|
25
|
-
- salesforce_fsdb.gemspec
|
26
24
|
- lib/salesforce_fsdb/client.rb
|
27
25
|
- lib/salesforce_fsdb/rest_client.rb
|
26
|
+
- salesforce_fsdb.gemspec
|
28
27
|
- test/test_setup.rb
|
29
28
|
homepage: http://johnwang.com/
|
30
29
|
licenses:
|
31
30
|
- MIT
|
31
|
+
metadata: {}
|
32
32
|
post_install_message:
|
33
33
|
rdoc_options: []
|
34
34
|
require_paths:
|
35
35
|
- lib
|
36
36
|
required_ruby_version: !ruby/object:Gem::Requirement
|
37
|
-
none: false
|
38
37
|
requirements:
|
39
|
-
- -
|
38
|
+
- - ">="
|
40
39
|
- !ruby/object:Gem::Version
|
41
40
|
version: '0'
|
42
41
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
43
|
-
none: false
|
44
42
|
requirements:
|
45
|
-
- -
|
43
|
+
- - ">="
|
46
44
|
- !ruby/object:Gem::Version
|
47
45
|
version: '0'
|
48
46
|
requirements: []
|
49
47
|
rubyforge_project:
|
50
|
-
rubygems_version:
|
48
|
+
rubygems_version: 2.2.1
|
51
49
|
signing_key:
|
52
|
-
specification_version:
|
50
|
+
specification_version: 4
|
53
51
|
summary: Salesforce Filesystem DB
|
54
52
|
test_files: []
|