levene 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/Manifest.txt +18 -0
- data/README.markdown +46 -0
- data/Rakefile +21 -0
- data/levene.gemspec +50 -0
- data/lib/levene/connection.rb +30 -0
- data/lib/levene/extensions/binding.rb +46 -0
- data/lib/levene/models/account.rb +6 -0
- data/lib/levene/models/base.rb +140 -0
- data/lib/levene/models/campaign.rb +6 -0
- data/lib/levene/models/campaign_member.rb +6 -0
- data/lib/levene/models/contact.rb +6 -0
- data/lib/levene/models/lead.rb +6 -0
- data/lib/levene/models/opportunity.rb +6 -0
- data/lib/levene/version.rb +3 -0
- data/lib/levene.rb +21 -0
- data/test/helper.rb +13 -0
- data/test/test_base_model.rb +8 -0
- data/test/test_lead_model.rb +29 -0
- data/test/test_login.rb +66 -0
- metadata +178 -0
data/Manifest.txt
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
Manifest.txt
|
2
|
+
README.markdown
|
3
|
+
Rakefile
|
4
|
+
levene.gemspec
|
5
|
+
lib/levene.rb
|
6
|
+
lib/levene/version.rb
|
7
|
+
lib/levene/connection.rb
|
8
|
+
lib/levene/models/account.rb
|
9
|
+
lib/levene/models/base.rb
|
10
|
+
lib/levene/models/campaign.rb
|
11
|
+
lib/levene/models/campaign_member.rb
|
12
|
+
lib/levene/models/contact.rb
|
13
|
+
lib/levene/models/lead.rb
|
14
|
+
lib/levene/models/opportunity.rb
|
15
|
+
lib/levene/extensions/binding.rb
|
16
|
+
test/helper.rb
|
17
|
+
test/test_login.rb
|
18
|
+
test/test_lead_model.rb
|
data/README.markdown
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
# Levene
|
2
|
+
|
3
|
+
* https://github.com/robrasmussen/levene
|
4
|
+
|
5
|
+
|
6
|
+
## DESCRIPTION
|
7
|
+
|
8
|
+
A light wrapper around RForce to make working with Salesforce a little
|
9
|
+
easier.
|
10
|
+
|
11
|
+
## USAGE
|
12
|
+
|
13
|
+
Levene allows you to easily create models that map to their Salesforce
|
14
|
+
API counterpart:
|
15
|
+
|
16
|
+
class Contact < Levene::Models::Base
|
17
|
+
end
|
18
|
+
|
19
|
+
Levene depends on a few environment variables being defined:
|
20
|
+
|
21
|
+
SALESFORCE_DEV_USER: The Salesforce account you're using
|
22
|
+
SALESFORCE_DEV_PASS: Your Salesforce password + security token
|
23
|
+
|
24
|
+
(If you don't have a Salesforce dev account or an account with API
|
25
|
+
access, you'll have to take care of that first.)
|
26
|
+
|
27
|
+
|
28
|
+
Creating a subclass of Levene::Models::Base will cause the fields of the
|
29
|
+
relevant Salesforce object to be looked up, and will create accessors
|
30
|
+
and ActiveModel validations based on the field definititions.
|
31
|
+
|
32
|
+
contact = Contact.new
|
33
|
+
contact.valid? #=> false
|
34
|
+
contact.errors.full_messages #=> ["Last name can't be blank"]
|
35
|
+
contact.first_name = "Ricky"
|
36
|
+
contact.last_name = "Roma"
|
37
|
+
contact.description = "The guy is a closer."
|
38
|
+
contact.save #=> true
|
39
|
+
contact.id #=> "00AA000006636drIAA"
|
40
|
+
|
41
|
+
|
42
|
+
This is not a replacement for the ActiveRecord connection adapter for
|
43
|
+
Salesforce. Levene is mostly for people who need to push data up to
|
44
|
+
Salesforce in the background. *It is not thread-safe*.
|
45
|
+
|
46
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
gem 'hoe', '>= 2.1.0'
|
3
|
+
require 'hoe'
|
4
|
+
|
5
|
+
Hoe.plugins.delete :rubyforge
|
6
|
+
Hoe.plugin :minitest #gem install hoe-seattlerb
|
7
|
+
Hoe.plugin :gemspec #gem install hoe-gemspec
|
8
|
+
|
9
|
+
Hoe.spec 'levene' do
|
10
|
+
developer('Robert Rasmussen', 'rob.rasmussen@gmail.com')
|
11
|
+
|
12
|
+
self.readme_file = 'README.markdown'
|
13
|
+
self.extra_rdoc_files = FileList['README.markdown']
|
14
|
+
|
15
|
+
self.extra_deps << [ 'activemodel', '>=3.0.3' ]
|
16
|
+
self.extra_deps << [ 'activesupport', '>=3.0.3' ]
|
17
|
+
self.extra_deps << [ 'rforce', '~>0.6.0' ]
|
18
|
+
|
19
|
+
self.extra_dev_deps << [ 'nokogiri', '>=1.4.4' ]
|
20
|
+
end
|
21
|
+
|
data/levene.gemspec
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{levene}
|
5
|
+
s.version = "0.0.1"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Robert Rasmussen"]
|
9
|
+
s.date = %q{2011-01-20}
|
10
|
+
s.description = %q{A light wrapper around RForce to make working with Salesforce a little
|
11
|
+
easier.}
|
12
|
+
s.email = ["rob.rasmussen@gmail.com"]
|
13
|
+
s.extra_rdoc_files = ["Manifest.txt", "README.markdown"]
|
14
|
+
s.files = ["Manifest.txt", "README.markdown", "Rakefile", "levene.gemspec", "lib/levene.rb", "lib/levene/version.rb", "lib/levene/connection.rb", "lib/levene/models/account.rb", "lib/levene/models/base.rb", "lib/levene/models/campaign.rb", "lib/levene/models/campaign_member.rb", "lib/levene/models/contact.rb", "lib/levene/models/lead.rb", "lib/levene/models/opportunity.rb", "lib/levene/extensions/binding.rb", "test/helper.rb", "test/test_login.rb", "test/test_lead_model.rb", "test/test_base_model.rb"]
|
15
|
+
s.homepage = %q{https://github.com/robrasmussen/levene}
|
16
|
+
s.rdoc_options = ["--main", "README.markdown"]
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
s.rubyforge_project = %q{levene}
|
19
|
+
s.rubygems_version = %q{1.3.7}
|
20
|
+
s.summary = %q{A light wrapper around RForce to make working with Salesforce a little easier.}
|
21
|
+
s.test_files = ["test/test_base_model.rb", "test/test_lead_model.rb", "test/test_login.rb"]
|
22
|
+
|
23
|
+
if s.respond_to? :specification_version then
|
24
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
25
|
+
s.specification_version = 3
|
26
|
+
|
27
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
28
|
+
s.add_runtime_dependency(%q<activemodel>, [">= 3.0.3"])
|
29
|
+
s.add_runtime_dependency(%q<activesupport>, [">= 3.0.3"])
|
30
|
+
s.add_runtime_dependency(%q<rforce>, ["~> 0.6.0"])
|
31
|
+
s.add_development_dependency(%q<minitest>, [">= 1.6.0"])
|
32
|
+
s.add_development_dependency(%q<nokogiri>, [">= 1.4.4"])
|
33
|
+
s.add_development_dependency(%q<hoe>, [">= 2.8.0"])
|
34
|
+
else
|
35
|
+
s.add_dependency(%q<activemodel>, [">= 3.0.3"])
|
36
|
+
s.add_dependency(%q<activesupport>, [">= 3.0.3"])
|
37
|
+
s.add_dependency(%q<rforce>, ["~> 0.6.0"])
|
38
|
+
s.add_dependency(%q<minitest>, [">= 1.6.0"])
|
39
|
+
s.add_dependency(%q<nokogiri>, [">= 1.4.4"])
|
40
|
+
s.add_dependency(%q<hoe>, [">= 2.8.0"])
|
41
|
+
end
|
42
|
+
else
|
43
|
+
s.add_dependency(%q<activemodel>, [">= 3.0.3"])
|
44
|
+
s.add_dependency(%q<activesupport>, [">= 3.0.3"])
|
45
|
+
s.add_dependency(%q<rforce>, ["~> 0.6.0"])
|
46
|
+
s.add_dependency(%q<minitest>, [">= 1.6.0"])
|
47
|
+
s.add_dependency(%q<nokogiri>, [">= 1.4.4"])
|
48
|
+
s.add_dependency(%q<hoe>, [">= 2.8.0"])
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Levene
|
2
|
+
class Connection
|
3
|
+
|
4
|
+
def login(username, password)
|
5
|
+
login_result = self.binding.login username, password
|
6
|
+
true
|
7
|
+
rescue
|
8
|
+
false
|
9
|
+
end
|
10
|
+
|
11
|
+
def binding
|
12
|
+
@binding ||= ::RForce::Binding.new 'https://login.salesforce.com/services/Soap/u/20.0'
|
13
|
+
end
|
14
|
+
|
15
|
+
def start
|
16
|
+
yield binding
|
17
|
+
logout
|
18
|
+
end
|
19
|
+
|
20
|
+
def logout
|
21
|
+
self.binding.logout
|
22
|
+
@binding = nil
|
23
|
+
end
|
24
|
+
|
25
|
+
def has_session?
|
26
|
+
!self.binding.instance_variable_get("@session_id").nil?
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Levene
|
2
|
+
module Extensions
|
3
|
+
module Binding
|
4
|
+
|
5
|
+
def logout
|
6
|
+
response = call_remote(:logout, [])
|
7
|
+
@session_id = nil
|
8
|
+
end
|
9
|
+
|
10
|
+
def describe(model)
|
11
|
+
result = call_remote(:describeSObject, :sObjectType => model.name.demodulize)
|
12
|
+
if result[:Fault]
|
13
|
+
raise result[:Fault][:faultstring]
|
14
|
+
else
|
15
|
+
return result[:describeSObjectResponse][:result][:fields]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def query(model, conditions)
|
20
|
+
full_query = "SELECT #{model.columns.collect {|c| c[:name]}.join(", ")} FROM #{model.model_name.demodulize} #{conditions || ""}"
|
21
|
+
result = call_remote(:query, :queryString => full_query)
|
22
|
+
if result[:Fault]
|
23
|
+
raise result[:Fault][:faultstring]
|
24
|
+
else
|
25
|
+
result[:queryResponse][:result].nil? ? [] : [result[:queryResponse][:result][:records]].flatten
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def create(model)
|
30
|
+
return false unless model.valid?
|
31
|
+
result = call_remote(:create, model.to_s_object)
|
32
|
+
if result[:Fault]
|
33
|
+
raise result[:Fault][:faultstring]
|
34
|
+
else
|
35
|
+
unless result[:createResponse][:result][:id].nil?
|
36
|
+
model.id = result[:createResponse][:result][:id]
|
37
|
+
return true
|
38
|
+
else
|
39
|
+
model.errors.add_to_base(result[:createResponse][:result][:errors][:message])
|
40
|
+
return false
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,140 @@
|
|
1
|
+
require 'active_model'
|
2
|
+
require 'active_support/core_ext/class/attribute'
|
3
|
+
|
4
|
+
module Levene
|
5
|
+
module Models
|
6
|
+
class Base
|
7
|
+
extend ActiveModel::Naming
|
8
|
+
include ActiveModel::Validations
|
9
|
+
|
10
|
+
class_attribute :connection
|
11
|
+
|
12
|
+
def attributes
|
13
|
+
self.class.attr_names.inject({}) do |memo, name|
|
14
|
+
memo[name] = self.send(name)
|
15
|
+
memo
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def attributes=(attrs)
|
20
|
+
attrs.each do |attr, val|
|
21
|
+
if attr[0] == attr[0].upcase
|
22
|
+
attr = attr.to_s.underscore
|
23
|
+
attr = attr[0].downcase + attr[1..-1]
|
24
|
+
end
|
25
|
+
|
26
|
+
if attr == "id" && Array === val
|
27
|
+
val = val.first
|
28
|
+
end
|
29
|
+
|
30
|
+
self.send "#{attr}=", val if self.respond_to?("#{attr}=".to_sym)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def save
|
35
|
+
if self.id.nil?
|
36
|
+
self.connection.binding.create(self)
|
37
|
+
else
|
38
|
+
self.connection.binding.update(self)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def to_s_object
|
43
|
+
attributeMap = self.attributes.inject({}) do |memo, attr|
|
44
|
+
next memo if attr.last.nil? || attr.last.blank?
|
45
|
+
levene_attr_name = attr.first.to_s.camelize
|
46
|
+
if attr.first.to_s.ends_with?("__c")
|
47
|
+
levene_attr_name.gsub!(/_c$/, "__c")
|
48
|
+
end
|
49
|
+
memo[levene_attr_name] = attr.last
|
50
|
+
memo
|
51
|
+
end
|
52
|
+
|
53
|
+
fieldsToNull = self.attributes.select {|k,v| self.class.column_hash[k][:createable] == "true" && (v.nil? || v.blank?)}.collect {|k,v| k.to_s.camelize}
|
54
|
+
fieldsToNull = fieldsToNull.collect {|k| k[0].downcase + k[1..-1]}
|
55
|
+
|
56
|
+
{:sObject => {"xsi:type" => self.class.model_name.demodulize}.merge(attributeMap)}
|
57
|
+
end
|
58
|
+
|
59
|
+
class << self
|
60
|
+
attr_accessor :abstract
|
61
|
+
alias_method :abstract?, :abstract
|
62
|
+
attr_accessor :columns
|
63
|
+
attr_accessor :attr_names
|
64
|
+
attr_accessor :column_hash
|
65
|
+
|
66
|
+
def abstract!
|
67
|
+
self.abstract = true
|
68
|
+
end
|
69
|
+
|
70
|
+
def inherited(klazz)
|
71
|
+
klazz.abstract = false
|
72
|
+
klazz.get_column_definitions
|
73
|
+
end
|
74
|
+
|
75
|
+
def find(*ids)
|
76
|
+
results = self.connection.find(self,ids)
|
77
|
+
end
|
78
|
+
|
79
|
+
def find_by_soql(query)
|
80
|
+
result = self.connection.binding.query(self, query)
|
81
|
+
return [] if result == [nil]
|
82
|
+
result.collect {|r| obj = self.new; obj.attributes = r; obj}
|
83
|
+
end
|
84
|
+
|
85
|
+
def get_column_definitions
|
86
|
+
self.columns = self.connection.binding.describe(self)
|
87
|
+
self.columns.each do |col|
|
88
|
+
next if col[:deprecatedAndHidden] == "true"
|
89
|
+
|
90
|
+
attribute = (col[:name][0].downcase + col[:name][1..-1]).underscore
|
91
|
+
self.attr_names ||= []
|
92
|
+
self.attr_names << attribute.to_sym
|
93
|
+
self.column_hash ||= {}
|
94
|
+
self.column_hash[attribute.to_sym] = col
|
95
|
+
|
96
|
+
attr_accessor attribute
|
97
|
+
|
98
|
+
if col[:nillable] == "false" && col[:createable] == "true" && col[:defaultedOnCreate] != "true"
|
99
|
+
validates_presence_of attribute
|
100
|
+
end
|
101
|
+
|
102
|
+
if col[:type] == "string" && col[:length] && col[:length].to_i > 0
|
103
|
+
validates_length_of attribute, :maximum => col[:length].to_i
|
104
|
+
end
|
105
|
+
|
106
|
+
if col[:picklistValues]
|
107
|
+
valid_values = col[:picklistValues].select {|h| h[:active] == "true"}.collect {|h| h[:value]}
|
108
|
+
default = col[:picklistValues].find {|h| h[:defaultValue] == "true"}
|
109
|
+
if col[:nillable] == "true" || col[:createable] == "false"
|
110
|
+
validates_inclusion_of attribute, :in => valid_values, :allow_nil => true
|
111
|
+
else
|
112
|
+
validates_inclusion_of attribute, :in => valid_values
|
113
|
+
end
|
114
|
+
|
115
|
+
if default
|
116
|
+
class_eval """def #{attribute}
|
117
|
+
@#{attribute} ||= \"#{default[:value]}\"
|
118
|
+
end"""
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def connection_established?
|
125
|
+
!connection.nil? && connection.has_session?
|
126
|
+
end
|
127
|
+
|
128
|
+
def establish_connection
|
129
|
+
self.connection = Levene::Connection.new
|
130
|
+
self.connection.login ENV["SALESFORCE_DEV_USER"], ENV["SALESFORCE_DEV_PASS"]
|
131
|
+
end
|
132
|
+
|
133
|
+
end
|
134
|
+
|
135
|
+
abstract!
|
136
|
+
establish_connection
|
137
|
+
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
data/lib/levene.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'rforce'
|
2
|
+
require 'active_support'
|
3
|
+
|
4
|
+
module Levene
|
5
|
+
autoload :Connection, "levene/connection.rb"
|
6
|
+
module Models
|
7
|
+
autoload :Base, "levene/models/base.rb"
|
8
|
+
autoload :Account, "levene/models/account.rb"
|
9
|
+
autoload :Campaign, "levene/models/campaign.rb"
|
10
|
+
autoload :CampaignMember, "levene/models/campaign_member.rb"
|
11
|
+
autoload :Contact, "levene/models/contact.rb"
|
12
|
+
autoload :Lead, "levene/models/lead.rb"
|
13
|
+
autoload :Opportunity, "levene/models/opportunity.rb"
|
14
|
+
|
15
|
+
end
|
16
|
+
module Extensions
|
17
|
+
autoload :Binding, "levene/extensions/binding.rb"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
RForce::Binding.send(:include, Levene::Extensions::Binding)
|
data/test/helper.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe Levene::Models::Lead do
|
4
|
+
before do
|
5
|
+
@lead = Levene::Models::Lead.new
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should conform to ActiveModel::Naming" do
|
9
|
+
@lead.class.model_name.must_equal "Levene::Models::Lead"
|
10
|
+
@lead.class.model_name.human.must_equal "Lead"
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should not be abstract" do
|
14
|
+
@lead.class.abstract?.must_be_false
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should have a list of columns" do
|
18
|
+
@lead.class.columns.count.must_be :>, 0
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should have a connection attribute" do
|
22
|
+
@lead.class.must_respond_to :connection
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should respond to #save" do
|
26
|
+
@lead.must_respond_to :save
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
data/test/test_login.rb
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe Levene::Connection do
|
4
|
+
before do
|
5
|
+
@connection = Levene::Connection.new
|
6
|
+
end
|
7
|
+
|
8
|
+
it "must respond to #login" do
|
9
|
+
@connection.must_respond_to :login
|
10
|
+
end
|
11
|
+
|
12
|
+
it "must respond to #binding" do
|
13
|
+
@connection.must_respond_to :binding
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "with valid user credentials" do
|
17
|
+
before do
|
18
|
+
@username = ENV["SALESFORCE_DEV_USER"]
|
19
|
+
@password = ENV["SALESFORCE_DEV_PASS"]
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should return a truthy value for a successful login" do
|
23
|
+
assert @connection.login(@username, @password), "Successful login should return something truthy"
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should report is has a ssession after a successful login" do
|
27
|
+
@connection.login(@username, @password)
|
28
|
+
@connection.has_session?.must_be_true
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "with invalid user credentials" do
|
33
|
+
before do
|
34
|
+
@username= "foo"
|
35
|
+
@password = "bar"
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should return false for an unsuccessful login" do
|
39
|
+
assert !@connection.login(@username, @password), "Unsuccessful login should return someing falsy"
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should not have a session after an unsuccessful login" do
|
43
|
+
@connection.login(@username, @password)
|
44
|
+
assert @connection.has_session?.must_be_false
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
describe "a logged in connection" do
|
50
|
+
before do
|
51
|
+
@connection.login(ENV["SALESFORCE_DEV_USER"], ENV["SALESFORCE_DEV_PASS"])
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should yield a levene binding from start" do
|
55
|
+
@connection.start do |binding|
|
56
|
+
binding.must_be_kind_of RForce::Binding
|
57
|
+
@connection.has_session?.must_be_true
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should not have an active binding after the block finished" do
|
62
|
+
@connection.start {|binding| }
|
63
|
+
@connection.has_session?.must_be_false
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
metadata
ADDED
@@ -0,0 +1,178 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: levene
|
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
|
+
- Robert Rasmussen
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2011-01-20 00:00:00 -06:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: activemodel
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
segments:
|
29
|
+
- 3
|
30
|
+
- 0
|
31
|
+
- 3
|
32
|
+
version: 3.0.3
|
33
|
+
type: :runtime
|
34
|
+
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: activesupport
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
segments:
|
44
|
+
- 3
|
45
|
+
- 0
|
46
|
+
- 3
|
47
|
+
version: 3.0.3
|
48
|
+
type: :runtime
|
49
|
+
version_requirements: *id002
|
50
|
+
- !ruby/object:Gem::Dependency
|
51
|
+
name: rforce
|
52
|
+
prerelease: false
|
53
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
55
|
+
requirements:
|
56
|
+
- - ~>
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
segments:
|
59
|
+
- 0
|
60
|
+
- 6
|
61
|
+
- 0
|
62
|
+
version: 0.6.0
|
63
|
+
type: :runtime
|
64
|
+
version_requirements: *id003
|
65
|
+
- !ruby/object:Gem::Dependency
|
66
|
+
name: minitest
|
67
|
+
prerelease: false
|
68
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
69
|
+
none: false
|
70
|
+
requirements:
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
segments:
|
74
|
+
- 1
|
75
|
+
- 6
|
76
|
+
- 0
|
77
|
+
version: 1.6.0
|
78
|
+
type: :development
|
79
|
+
version_requirements: *id004
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: nokogiri
|
82
|
+
prerelease: false
|
83
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
84
|
+
none: false
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
segments:
|
89
|
+
- 1
|
90
|
+
- 4
|
91
|
+
- 4
|
92
|
+
version: 1.4.4
|
93
|
+
type: :development
|
94
|
+
version_requirements: *id005
|
95
|
+
- !ruby/object:Gem::Dependency
|
96
|
+
name: hoe
|
97
|
+
prerelease: false
|
98
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
99
|
+
none: false
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
segments:
|
104
|
+
- 2
|
105
|
+
- 8
|
106
|
+
- 0
|
107
|
+
version: 2.8.0
|
108
|
+
type: :development
|
109
|
+
version_requirements: *id006
|
110
|
+
description: |-
|
111
|
+
A light wrapper around RForce to make working with Salesforce a little
|
112
|
+
easier.
|
113
|
+
email:
|
114
|
+
- rob.rasmussen@gmail.com
|
115
|
+
executables: []
|
116
|
+
|
117
|
+
extensions: []
|
118
|
+
|
119
|
+
extra_rdoc_files:
|
120
|
+
- Manifest.txt
|
121
|
+
- README.markdown
|
122
|
+
files:
|
123
|
+
- Manifest.txt
|
124
|
+
- README.markdown
|
125
|
+
- Rakefile
|
126
|
+
- levene.gemspec
|
127
|
+
- lib/levene.rb
|
128
|
+
- lib/levene/version.rb
|
129
|
+
- lib/levene/connection.rb
|
130
|
+
- lib/levene/models/account.rb
|
131
|
+
- lib/levene/models/base.rb
|
132
|
+
- lib/levene/models/campaign.rb
|
133
|
+
- lib/levene/models/campaign_member.rb
|
134
|
+
- lib/levene/models/contact.rb
|
135
|
+
- lib/levene/models/lead.rb
|
136
|
+
- lib/levene/models/opportunity.rb
|
137
|
+
- lib/levene/extensions/binding.rb
|
138
|
+
- test/helper.rb
|
139
|
+
- test/test_login.rb
|
140
|
+
- test/test_lead_model.rb
|
141
|
+
- test/test_base_model.rb
|
142
|
+
has_rdoc: true
|
143
|
+
homepage: https://github.com/robrasmussen/levene
|
144
|
+
licenses: []
|
145
|
+
|
146
|
+
post_install_message:
|
147
|
+
rdoc_options:
|
148
|
+
- --main
|
149
|
+
- README.markdown
|
150
|
+
require_paths:
|
151
|
+
- lib
|
152
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ">="
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
segments:
|
158
|
+
- 0
|
159
|
+
version: "0"
|
160
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
161
|
+
none: false
|
162
|
+
requirements:
|
163
|
+
- - ">="
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
segments:
|
166
|
+
- 0
|
167
|
+
version: "0"
|
168
|
+
requirements: []
|
169
|
+
|
170
|
+
rubyforge_project: levene
|
171
|
+
rubygems_version: 1.3.7
|
172
|
+
signing_key:
|
173
|
+
specification_version: 3
|
174
|
+
summary: A light wrapper around RForce to make working with Salesforce a little easier.
|
175
|
+
test_files:
|
176
|
+
- test/test_base_model.rb
|
177
|
+
- test/test_lead_model.rb
|
178
|
+
- test/test_login.rb
|