ofsys 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f999d360b1138a8187c4c4692ddd0f3bb57e5aff
4
+ data.tar.gz: bef1207e4b668e54f1aacec44d687e558b7608bf
5
+ SHA512:
6
+ metadata.gz: 241eeb2fe1c96bbee9cea8780f9bfd217603627fed69b0b5cdbd0cd2f5657f20309d01e05723c2b4627245df02521b6adaecdfb6f2ecfe7eeae261abacdd30ac
7
+ data.tar.gz: 68e8c432d75459da5784b9648eac16c5abc81cf8c69b6062ac931489bd293803529036fe7cdb6711d6dc6f935b2f4503164351924c48daf981d5e866e60b0700
data/Rakefile ADDED
@@ -0,0 +1,23 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'Ofsys'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.rdoc')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+ require 'rspec/core'
18
+ require 'rspec/core/rake_task'
19
+
20
+ desc 'Run all specs in spec directory (excluding plugin specs)'
21
+ RSpec::Core::RakeTask.new(:spec)
22
+
23
+ task default: :spec
@@ -0,0 +1,13 @@
1
+ module Ofsys
2
+ DefaultConfig = Struct.new(:id_key, :key, :id_project)
3
+
4
+ def self.configure
5
+ @config = DefaultConfig.new
6
+ yield(@config) if block_given?
7
+ @config
8
+ end
9
+
10
+ def self.config
11
+ @config || configure
12
+ end
13
+ end
@@ -0,0 +1,72 @@
1
+ require 'yajl'
2
+
3
+ module Ofsys
4
+ module Request
5
+ class Base
6
+ class FailedError < RuntimeError; end
7
+
8
+ def initialize(config = Ofsys.config)
9
+ @id_key = config.id_key
10
+ @key = config.key
11
+ @id_project = config.id_project
12
+ end
13
+
14
+ def perform(params = {})
15
+ request.body = body(params)
16
+ result_body = http.request(request).body
17
+ decode_result(result_body)
18
+ end
19
+
20
+ private
21
+
22
+ ENDPOINT_BASE = 'https://ofsys.com/webservices/ofc4'.freeze
23
+
24
+ def request
25
+ @request ||= Net::HTTP::Post.new(uri.request_uri)
26
+ end
27
+
28
+ def uri
29
+ @uri ||= URI.parse(self.class::ENDPOINT)
30
+ end
31
+
32
+ def http
33
+ @http ||= build_http
34
+ end
35
+
36
+ def build_http
37
+ Net::HTTP.new(uri.host, uri.port).tap do |http|
38
+ http.use_ssl = true
39
+ end
40
+ end
41
+
42
+ def body(source_params)
43
+ params = merge_auth(source_params)
44
+ to_json(params)
45
+ end
46
+
47
+ def to_json(hash)
48
+ ::Yajl::Encoder.encode(hash)
49
+ end
50
+
51
+ def to_hash(text)
52
+ ::Yajl::Parser.parse(text)
53
+ end
54
+
55
+ def merge_auth(source_params)
56
+ source_params.merge!(
57
+ AuthKey: {
58
+ Key: @key,
59
+ idKey: @id_key
60
+ },
61
+ idProject: @id_project
62
+ )
63
+ end
64
+
65
+ def decode_result(body)
66
+ result = to_hash(body)
67
+ fail FailedError.new(body) unless result['Success']
68
+ result
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,7 @@
1
+ module Ofsys
2
+ module Request
3
+ class ContactsDelete < Ofsys::Request::Base
4
+ ENDPOINT = "#{ENDPOINT_BASE}/contacts.ashx?method=Delete".freeze
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Ofsys
2
+ module Request
3
+ class ContactsMerge < Ofsys::Request::Base
4
+ ENDPOINT = "#{ENDPOINT_BASE}/contacts.ashx?method=Merge".freeze
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Ofsys
2
+ module Request
3
+ class SendingsSendSingle < Ofsys::Request::Base
4
+ ENDPOINT = "#{ENDPOINT_BASE}/sendings.ashx?method=SendSingle".freeze
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,9 @@
1
+ module Ofsys
2
+ module Request
3
+ end
4
+ end
5
+
6
+ require 'ofsys/request/base'
7
+ require 'ofsys/request/contacts_delete'
8
+ require 'ofsys/request/contacts_merge'
9
+ require 'ofsys/request/sendings_send_single'
@@ -0,0 +1,3 @@
1
+ module Ofsys
2
+ VERSION = '0.0.3'
3
+ end
data/lib/ofsys.rb ADDED
@@ -0,0 +1,5 @@
1
+ module Ofsys
2
+ end
3
+
4
+ require 'ofsys/config'
5
+ require 'ofsys/request'
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe Ofsys do
4
+ context 'known keys' do
5
+ it 'assigns config variables' do
6
+ described_class.configure do |config|
7
+ config.id_key = 'key1'
8
+ config.key = 'key2'
9
+ config.id_project = 'key3'
10
+ end
11
+
12
+ expect(described_class.config.id_key).to eq('key1')
13
+ expect(described_class.config.key).to eq('key2')
14
+ expect(described_class.config.id_project).to eq('key3')
15
+ end
16
+ end
17
+
18
+ context 'unknown key' do
19
+ subject do
20
+ described_class.configure do |config|
21
+ config.unknown_key = 'key1'
22
+ end
23
+ end
24
+
25
+ it 'raise error' do
26
+ expect { subject }.to raise_error(NoMethodError)
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe Ofsys::Request::ContactsDelete do
4
+ include ConfigureHelper
5
+ before(:each) { configure_defaults }
6
+
7
+ let(:data) do
8
+ {
9
+ Clause: {
10
+ :'$type' => 'FieldClause',
11
+ Field: {
12
+ Name: 'f_EMail'
13
+ },
14
+ TypeOperator: 'Equal',
15
+ ComparisonValue: 'aishek@gmail.com'
16
+ },
17
+ MaxRows: 1
18
+ }
19
+ end
20
+
21
+ let(:result) do
22
+ {
23
+ 'Success' => true,
24
+ 'ErrorCode' => nil,
25
+ 'ErrorMessage' => nil,
26
+ 'DeletedRecords' => 1,
27
+ 'idRequest' => 18946891,
28
+ 'Trace' => "Beginning request (04:26:51)\r\n\tchecking OFSYS User authentication: False\r\n\tchecking Dialog Insight administrator: False\r\nTargeted service: Contacts.Delete\r\nDeserializing JSON...\r\nDeserializing JSON completed\r\nValidating parameters...\r\nValidating parameterscompleted with success\r\nExecuting method...\r\nExecuting method completed with success"
29
+ }
30
+ end
31
+
32
+ it 'performs correct request with passed data' do
33
+ VCR.use_cassette('contacts_delete') do
34
+ expect(described_class.new.perform(data)).to eq(result)
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,61 @@
1
+ require 'spec_helper'
2
+
3
+ describe Ofsys::Request::ContactsMerge do
4
+ include ConfigureHelper
5
+ before(:each) { configure_defaults }
6
+
7
+ let(:data) do
8
+ {
9
+ Records: [
10
+ {
11
+ ID: {
12
+ key_f_EMail: 'aishek@gmail.com'
13
+ },
14
+ Data: {
15
+ f_EMail: 'aishek@gmail.com'
16
+ }
17
+ }
18
+ ],
19
+ MergeOptions: {
20
+ AllowInsert: true,
21
+ AllowUpdate: true,
22
+ SkipDuplicateRecords: false,
23
+ SkipUnmatchedRecords: false,
24
+ ReturnRecordsOnSuccess: false,
25
+ ReturnRecordsOnError: false,
26
+ FieldOptions: nil
27
+ }
28
+ }
29
+ end
30
+
31
+ let(:result) do
32
+ {
33
+ 'Success' => true,
34
+ 'ErrorCode' => nil,
35
+ 'ErrorMessage' => nil,
36
+ 'CreatedRecords' => 0,
37
+ 'UpdatedRecords' => 1,
38
+ 'Records' => [
39
+ {
40
+ 'IdRecord' => 15,
41
+ 'Status' => 'Updated',
42
+ 'ValidationResult' => 'OK',
43
+ 'Message' => nil,
44
+ 'ID' => {
45
+ 'key_f_EMail' => 'aishek@gmail.com'
46
+ },
47
+ 'Data' => nil,
48
+ 'Record' => nil
49
+ }
50
+ ],
51
+ 'idRequest' => 18945355,
52
+ 'Trace' => "Beginning request (04:15:25)\r\n\tchecking OFSYS User authentication: False\r\n\tchecking Dialog Insight administrator: False\r\nTargeted service: Contacts.Merge\r\nDeserializing JSON...\r\nDeserializing JSON completed\r\nValidating parameters...\r\nRecords count: 1\r\nRecords candidates for insert: 1\r\nRecords candidates for update: 1\r\nValidating parameterscompleted with success\r\nExecuting method...\r\n\tRecords bulked: 1\r\n\tRecords matched by PK: 1\r\n\tRecords dupes, source versus source: 0\r\n\tRecords dupes, source versus target: 0\r\n\tRecords updated: 1\r\n\tRecords created: 0\r\n\tEMails changed: 0\r\n\tOptins field changed: no flag involved\r\nExecuting method completed with success"
53
+ }
54
+ end
55
+
56
+ it 'performs correct request with passed data' do
57
+ VCR.use_cassette('contacts_merge') do
58
+ expect(described_class.new.perform(data)).to eq(result)
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ describe Ofsys::Request::SendingsSendSingle do
4
+ include ConfigureHelper
5
+ before(:each) { configure_defaults }
6
+
7
+ let(:data) do
8
+ {
9
+ idMessage: 538731,
10
+ contactFilter: {
11
+ Mode: 'Clauses',
12
+ TableClauses: [
13
+ {
14
+ TableCode: 'Contact',
15
+ Clause: {
16
+ :'$type' => 'FieldClause',
17
+ Field: {
18
+ TableCode: 'Contact',
19
+ Name: 'f_EMail'
20
+ },
21
+ TypeOperator: 'Equal',
22
+ ComparisonValue: 'ab+45@cifronomika.ru'
23
+ }
24
+ }
25
+ ]
26
+ }
27
+ }
28
+ end
29
+
30
+ let(:result) do
31
+ {
32
+ 'Success' => true,
33
+ 'ErrorCode' => nil,
34
+ 'ErrorMessage' => nil,
35
+ 'AffectedContacts' => 1,
36
+ 'idRequest' => 18947426,
37
+ 'Trace' => "Beginning request (04:30:24)\r\n\tchecking OFSYS User authentication: False\r\n\tchecking Dialog Insight administrator: False\r\nTargeted service: Sendings.SendSingle\r\nDeserializing JSON...\r\nDeserializing JSON completed\r\nValidating parameters...\r\nValidating parameterscompleted with success\r\nExecuting method...\r\nExecuting method completed with success"
38
+ }
39
+ end
40
+
41
+ it 'performs correct request with passed data' do
42
+ VCR.use_cassette('sendings_send_single') do
43
+ expect(described_class.new.perform(data)).to eq(result)
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,22 @@
1
+ ENV['RAILS_ENV'] ||= 'test'
2
+
3
+ require 'ofsys'
4
+
5
+ require 'coveralls'
6
+ Coveralls.wear!
7
+
8
+ # Load support files
9
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
10
+
11
+ require 'vcr'
12
+ VCR.configure do |c|
13
+ c.cassette_library_dir = "#{File.dirname(__FILE__)}/fixtures/vcr_cassettes"
14
+ c.hook_into :webmock
15
+ c.allow_http_connections_when_no_cassette = true
16
+ end
17
+
18
+ RSpec.configure do |config|
19
+ config.treat_symbols_as_metadata_keys_with_true_values = true
20
+ config.run_all_when_everything_filtered = true
21
+ config.order = 'random'
22
+ end
@@ -0,0 +1,9 @@
1
+ module ConfigureHelper
2
+ def configure_defaults
3
+ Ofsys.configure do |c|
4
+ c.id_key = ENV['OFSYS_ID_KEY']
5
+ c.key = ENV['OFSYS_KEY']
6
+ c.id_project = ENV['OFSYS_ID_PROJECT']
7
+ end
8
+ end
9
+ end
metadata ADDED
@@ -0,0 +1,152 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ofsys
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
5
+ platform: ruby
6
+ authors:
7
+ - Alexandr Borisov
8
+ - Sergey Zyablitsky
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-12-07 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: yajl-ruby
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: rspec
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: webmock
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: vcr
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: coveralls
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: rubocop
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ description: Ofsys.com API wrapper for Ruby language
99
+ email:
100
+ - aishek@gmail.com
101
+ - sergey.zyablitsky@gmail.com
102
+ executables: []
103
+ extensions: []
104
+ extra_rdoc_files: []
105
+ files:
106
+ - Rakefile
107
+ - lib/ofsys.rb
108
+ - lib/ofsys/config.rb
109
+ - lib/ofsys/request.rb
110
+ - lib/ofsys/request/base.rb
111
+ - lib/ofsys/request/contacts_delete.rb
112
+ - lib/ofsys/request/contacts_merge.rb
113
+ - lib/ofsys/request/sendings_send_single.rb
114
+ - lib/ofsys/version.rb
115
+ - spec/config_spec.rb
116
+ - spec/contacts_delete_spec.rb
117
+ - spec/contacts_merge_spec.rb
118
+ - spec/send_single_spec.rb
119
+ - spec/spec_helper.rb
120
+ - spec/support/configure_helper.rb
121
+ homepage: https://github.com/the-furnish/ofsys
122
+ licenses:
123
+ - MIT
124
+ metadata: {}
125
+ post_install_message:
126
+ rdoc_options: []
127
+ require_paths:
128
+ - lib
129
+ required_ruby_version: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - ">="
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ required_rubygems_version: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ requirements: []
140
+ rubyforge_project:
141
+ rubygems_version: 2.2.2
142
+ signing_key:
143
+ specification_version: 4
144
+ summary: Provides interface for ofsys.com (inteligentemails.com) service API
145
+ test_files:
146
+ - spec/contacts_delete_spec.rb
147
+ - spec/config_spec.rb
148
+ - spec/spec_helper.rb
149
+ - spec/support/configure_helper.rb
150
+ - spec/contacts_merge_spec.rb
151
+ - spec/send_single_spec.rb
152
+ has_rdoc: