fluent-plugin-sforce 0.0.4 → 0.0.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a0187aac8337c5f6f85a9ea34b9207eb8c5056eb19ad25de83ce0cf8826c5328
4
- data.tar.gz: 970036defa6d99dd0564e3dc54cc305a22cb70059fc8cc30788721be4f24b367
3
+ metadata.gz: 8863f1e04136df66a435721438f38036aaf395f7f4e097b060489a67c1a8ecba
4
+ data.tar.gz: 7b968ebbffa37441ce8502df1352f3f9cdb0fd003dd0abc25736c80ea21d919f
5
5
  SHA512:
6
- metadata.gz: b30e5497b815f6a52c57232677a64c4a1ac567888d6ec3bc0a0f4d5ec58e841734514df609000795b27d705d3044eab8d96fc3abeac6bcce91212f994b2cd975
7
- data.tar.gz: 53b5bd1d7d667d3aefe09d960b80edfdabc966939ee143c4a2d06d622b2c372ca6decbb567a7a9017f11bbbe9899f4df9c92a8e7db8c4c21b192b8098538a942
6
+ metadata.gz: dc7eff2c230abddec690465a64b6e68e232277f3859363418f7340c66018fb9378f3814b05fafc34a90f69f63f4c1a7a8750098cbedf1d6167fb84c92dcd1217
7
+ data.tar.gz: 1a14bc0f6d6d7a3f8b270c44f37fb5fa3ebd9bd81dc88fec0cdb80053be14fda08fdc8d2def53c70795550f6c901c8d047244c0525d002cf27fd1225929bc1e8
data/.gitignore CHANGED
@@ -14,3 +14,4 @@
14
14
  *.gem
15
15
  mkmf.log
16
16
  /vendor/bundle
17
+ /.idea
data/.travis.yml CHANGED
@@ -1,4 +1,5 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.4.10
4
- - 2.5.1
3
+ - 2.3.8
4
+ - 2.4.5
5
+ - 2.5.2
data/Makefile ADDED
@@ -0,0 +1,13 @@
1
+ .PHONY: test
2
+ test:
3
+ bundle exec rake test
4
+
5
+ .PHONY:
6
+ install:
7
+ bundle install --path=vendor/bundle -j4
8
+
9
+
10
+ .PHONY: release
11
+ release:
12
+ bundle exec rake release
13
+
data/README.md CHANGED
@@ -29,14 +29,18 @@ Or install it yourself as:
29
29
  query SELECT id, Body FROM FeedItem
30
30
  polling_interval 60
31
31
  # topic AllMessages
32
+ # version 43.0
33
+ # login_endpoint test.salesforce.com
32
34
  </source>
33
35
  ```
34
36
 
35
- username : Salesforce Username for exporting data.
36
- password : Salesforce User's Password.
37
- query : SOQL Query.
38
- polling_interval : Query Interval Time.
39
- topic : PushTopic name to subscribe.
37
+ |key|description|
38
+ |-|-|
39
+ |username|Salesforce Username for exporting data.|
40
+ |password|Salesforce User's Password.|
41
+ |query|SOQL Query.|
42
+ |polling_interval|Query Interval Time.|
43
+ |topic|PushTopic name to subscribe.|
40
44
 
41
45
  ## Contributing
42
46
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.4
1
+ 0.0.5
@@ -3,22 +3,23 @@ lib = File.expand_path('../lib', __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
- spec.name = "fluent-plugin-sforce"
7
- spec.version = File.read("VERSION").strip
8
- spec.authors = ["Makoto Tajitsu"]
9
- spec.email = ["makoto_tajitsu@hotmail.co.jp"]
6
+ spec.name = 'fluent-plugin-sforce'
7
+ spec.version = File.read('VERSION').strip
8
+ spec.authors = ['Makoto Tajitsu']
9
+ spec.email = ['makoto_tajitsu@hotmail.co.jp']
10
10
  spec.summary = %q{Fluent Plugin to export data from Salesforce.com.}
11
11
  spec.description = %q{Fluent Plugin to export data from Salesforce.com.}
12
- spec.homepage = "https://github.com/tzmfreedom/fluent-plugin-sforce"
12
+ spec.homepage = 'https://github.com/tzmfreedom/fluent-plugin-sforce'
13
13
 
14
14
  spec.files = `git ls-files -z`.split("\x0")
15
15
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
16
16
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
17
- spec.require_paths = ["lib"]
17
+ spec.require_paths = ['lib']
18
18
 
19
- spec.add_dependency "fluentd", "~> 1.1.3"
20
- spec.add_dependency "restforce", "~> 3.0.0"
21
- spec.add_dependency "faye", "~> 1.2.4"
22
- spec.add_dependency "nokogiri", "~> 1.8.2"
23
- spec.add_development_dependency "rake"
19
+ spec.add_dependency 'fluentd'
20
+ spec.add_dependency 'restforce', '~> 3.0.0'
21
+ spec.add_dependency 'faye', '~> 1.2.4'
22
+ spec.add_dependency 'nokogiri', '~> 1.8.2'
23
+ spec.add_development_dependency 'rake'
24
+ spec.add_development_dependency 'test-unit'
24
25
  end
@@ -5,111 +5,123 @@ require 'restforce'
5
5
  require 'date'
6
6
  require 'net/http'
7
7
  require 'faye'
8
+ require 'fluent/plugin/input'
8
9
 
9
10
  module Fluent
10
- class SforceInput < Input
11
- unless method_defined?(:log)
12
- define_method("log") { $log }
13
- end
11
+ module Plugin
12
+ class SforceInput < Input
13
+ class SforceConnectionError < StandardError; end
14
14
 
15
- Plugin.register_input('sforce', self)
15
+ Fluent::Plugin.register_input('sforce', self)
16
16
 
17
- config_param :query, :string, :default => "SELECT id, Body, CreatedById FROM FeedItem"
18
- config_param :tag, :string, :default => "sforce"
19
- config_param :polling_interval, :integer, :default => 60
20
- config_param :topic, :string, :default => nil
21
- config_param :username, :string
22
- config_param :password, :string
17
+ config_param :query, :string, default: 'SELECT id, Body, CreatedById FROM FeedItem'
18
+ config_param :tag, :string, default: 'sforce'
19
+ config_param :polling_interval, :integer, default: 60
20
+ config_param :topic, :string, default: nil
21
+ config_param :username, :string
22
+ config_param :password, :string
23
+ config_param :version, :string, default: '43.0'
24
+ config_param :login_endpoint, :string, default: 'login.salesforce.com'
23
25
 
24
- def configure(conf)
25
- super
26
- end
26
+ def configure(conf)
27
+ super
28
+ end
27
29
 
28
- def start
29
- super
30
- login_info = login()
31
- client = Restforce.new :oauth_token => login_info["sessionId"],
32
- :instance_url => login_info["instanceUrl"]
33
-
34
- th_low = DateTime.now().strftime("%Y-%m-%dT%H:%M:%S.000%Z")
35
- # query
36
- if @topic == nil then
37
- sleep(@polling_interval)
38
- th_high = DateTime.now().strftime("%Y-%m-%dT%H:%M:%S.000%Z")
39
- loop do
40
- # create soql query string
41
- where = "CreatedDate <= #{th_high} AND CreatedDate > #{th_low}"
42
- soql = ""
43
- if @query =~ /^(.+)\s(where|WHERE)\s(.+)$/ then
44
- soql = "#{$1} WHERE #{where} AND #{$3}"
45
- elsif @query =~ /^(.+)$/ then
46
- soql = "#{$1} WHERE #{where}"
47
- end
30
+ def start
31
+ super
32
+ login_info = login
33
+ client = Restforce.new login_info.merge(api_version: @version)
48
34
 
49
- begin
50
- log.info "query: #{soql}"
51
- records = client.query(soql)
52
- records.each do |record|
53
- Fluent::Engine.emit(@tag, Fluent::Engine.now, record)
35
+ th_low = DateTime.now.strftime('%Y-%m-%dT%H:%M:%S.000%Z')
36
+ # query
37
+ if @topic == nil then
38
+ sleep(@polling_interval)
39
+ th_high = DateTime.now.strftime('%Y-%m-%dT%H:%M:%S.000%Z')
40
+ loop do
41
+ # create soql query string
42
+ where = "CreatedDate <= #{th_high} AND CreatedDate > #{th_low}"
43
+ soql = ''
44
+ if @query =~ /^(.+)\s(where|WHERE)\s(.+)$/ then
45
+ soql = "#{$1} WHERE #{where} AND #{$3}"
46
+ elsif @query =~ /^(.+)$/ then
47
+ soql = "#{$1} WHERE #{where}"
48
+ end
49
+
50
+ begin
51
+ log.info "query: #{soql}"
52
+ records = client.query(soql)
53
+ records.each do |record|
54
+ router.emit(@tag, Fluent::Engine.now, record)
55
+ end
56
+ sleep(@polling_interval)
57
+ th_low = th_high
58
+ th_high = DateTime.now.strftime('%Y-%m-%dT%H:%M:%S.000%Z')
59
+ rescue Restforce::UnauthorizedError => e
60
+ log.error e
61
+ # retry login
62
+ login_info = login
63
+ client = Restforce.new login_info.merge(api_version: @version)
54
64
  end
55
- sleep(@polling_interval)
56
- th_low = th_high
57
- th_high = DateTime.now().strftime("%Y-%m-%dT%H:%M:%S.000%Z")
58
- rescue Restforce::UnauthorizedError => e
59
- log.error e
60
- # retry login
61
- login_info = login()
62
- client = Restforce.new :oauth_token => login_info["sessionId"],
63
- :instance_url => login_info["instanceUrl"]
64
65
  end
65
- end
66
- # streaming api
67
- else
68
- EM.run do
69
- log.info "suscribe: #{@topic}"
70
- # Subscribe to the PushTopic.
71
- client.subscribe @topic do |message|
72
- Fluent::Engine.emit(@tag, Fluent::Engine.now, message)
66
+ # streaming api
67
+ else
68
+ EM.run do
69
+ log.info "suscribe: #{@topic}"
70
+ # Subscribe to the PushTopic.
71
+ client.subscribe @topic do |message|
72
+ router.emit(@tag, Fluent::Engine.now, message)
73
+ end
73
74
  end
74
75
  end
76
+ rescue SforceConnectionError => e
77
+ log.error e.message
75
78
  end
76
- end
77
79
 
78
- def shutdown
79
- end
80
+ def shutdown
81
+ super
82
+ end
80
83
 
81
- private
84
+ private
82
85
 
83
- def login
84
- uri = URI('https://login.salesforce.com/services/Soap/u/30.0')
85
- request = Net::HTTP::Post.new(uri.request_uri, initheader = {'Content-Type' =>'text/xml', 'SOAPAction' => '""'})
86
- request.body = <<"BODY"
86
+ def login
87
+ uri = URI(login_endpoint)
88
+ request = Net::HTTP::Post.new(uri.request_uri, initheader = {'Content-Type' =>'text/xml', 'SOAPAction' => "''"})
89
+ request.body = <<BODY
87
90
  <?xml version="1.0" encoding="utf-8"?>
88
91
  <env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
89
92
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
90
93
  xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
91
94
  <env:Body>
92
95
  <n1:login xmlns:n1="urn:partner.soap.sforce.com">
93
- <n1:username>#{@username}</n1:username>
94
- <n1:password>#{@password}</n1:password>
96
+ <n1:username>#{@username.encode(xml: :text)}</n1:username>
97
+ <n1:password>#{@password.encode(xml: :text)}</n1:password>
95
98
  </n1:login>
96
99
  </env:Body>
97
100
  </env:Envelope>
98
101
  BODY
99
102
 
100
- http = Net::HTTP.new(uri.host, uri.port)
101
- http.use_ssl = true
102
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE
103
-
104
- # request login call and parse login response.
105
- http.start do |h|
106
- response = h.request(request)
107
- doc = Nokogiri::XML(response.body)
108
- session_id = doc.css("sessionId").inner_text
109
- /^(https:\/\/.+\.salesforce\.com)\//.match(doc.css("serverUrl").inner_text)
110
- instance_url = $1
111
- log.info "login is successful."
112
- {"sessionId" => session_id, "instanceUrl" => instance_url}
103
+ http = Net::HTTP.new(uri.host, uri.port)
104
+ http.use_ssl = true
105
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
106
+
107
+ # request login call and parse login response.
108
+ http.start do |h|
109
+ response = h.request(request)
110
+ doc = Nokogiri::XML(response.body)
111
+ fault = doc.css('faultstring').inner_text
112
+ raise SforceConnectionError, fault unless fault.empty?
113
+
114
+ session_id = doc.css('sessionId').inner_text
115
+ /^(https:\/\/.+\.salesforce\.com)\//.match(doc.css('serverUrl').inner_text)
116
+ instance_url = $1
117
+ log.info "login is successful. instance_url = '#{instance_url}'"
118
+
119
+ {oauth_token: session_id, instance_url: instance_url}
120
+ end
121
+ end
122
+
123
+ def login_endpoint
124
+ "https://#{@login_endpoint}/services/Soap/u/#{@version}"
113
125
  end
114
126
  end
115
127
  end
data/test/helper.rb CHANGED
@@ -7,11 +7,14 @@ rescue Bundler::BundlerError => e
7
7
  $stderr.puts "Run `bundle install` to install missing gems"
8
8
  exit e.status_code
9
9
  end
10
- require 'test/unit'
10
+ require 'test-unit'
11
11
 
12
12
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
13
13
  $LOAD_PATH.unshift(File.dirname(__FILE__))
14
+
14
15
  require 'fluent/test'
16
+ require 'fluent/test/helpers'
17
+
15
18
  unless ENV.has_key?('VERBOSE')
16
19
  nulllogger = Object.new
17
20
  nulllogger.instance_eval {|obj|
@@ -23,6 +26,3 @@ unless ENV.has_key?('VERBOSE')
23
26
  end
24
27
 
25
28
  require 'fluent/plugin/in_sforce'
26
-
27
- class Test::Unit::TestCase
28
- end
@@ -14,21 +14,22 @@ class SforceInputTest < Test::Unit::TestCase
14
14
  polling_interval 60
15
15
  ]
16
16
 
17
- def create_driver(conf = CONFIG)
18
- Fluent::Test::InputTestDriver.new(Fluent::SforceInput).configure(conf)
19
- end
20
-
21
17
  def test_configure
22
18
  d = create_driver
23
19
 
24
- assert_equal "test@example.com", d.instance.username
25
- assert_equal "hogefuga", d.instance.password
26
- assert_equal "test.access", d.instance.tag
27
- assert_equal "SELECT id, Name FROM Account", d.instance.query
20
+ assert_equal 'test@example.com', d.instance.username
21
+ assert_equal 'hogefuga', d.instance.password
22
+ assert_equal 'test.access', d.instance.tag
23
+ assert_equal 'SELECT id, Name FROM Account', d.instance.query
28
24
  assert_equal 60, d.instance.polling_interval
29
25
  end
30
26
 
31
- #def test_emit
32
- #TODO
33
- #end
27
+ # TODO
28
+ def test_emit; end
29
+
30
+ private
31
+
32
+ def create_driver(conf = CONFIG)
33
+ Fluent::Test::InputTestDriver.new(Fluent::Plugin::SforceInput).configure(conf)
34
+ end
34
35
  end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-sforce
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Makoto Tajitsu
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-08-15 00:00:00.000000000 Z
11
+ date: 2019-01-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fluentd
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 1.1.3
19
+ version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 1.1.3
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: restforce
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: test-unit
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
83
97
  description: Fluent Plugin to export data from Salesforce.com.
84
98
  email:
85
99
  - makoto_tajitsu@hotmail.co.jp
@@ -91,6 +105,7 @@ files:
91
105
  - ".travis.yml"
92
106
  - Gemfile
93
107
  - LICENSE.txt
108
+ - Makefile
94
109
  - README.md
95
110
  - Rakefile
96
111
  - VERSION
@@ -117,7 +132,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
117
132
  version: '0'
118
133
  requirements: []
119
134
  rubyforge_project:
120
- rubygems_version: 2.7.6
135
+ rubygems_version: 2.7.7
121
136
  signing_key:
122
137
  specification_version: 4
123
138
  summary: Fluent Plugin to export data from Salesforce.com.