infopark_crm_connector 0.9.2 → 1.0.0

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.
Files changed (40) hide show
  1. data/.yardopts +8 -0
  2. data/CHANGELOG.markdown +94 -0
  3. data/LICENSE +2 -0
  4. data/README.markdown +110 -0
  5. data/lib/crm_connector.rb +11 -15
  6. data/lib/crm_connector/account.rb +31 -2
  7. data/lib/crm_connector/activity.rb +61 -3
  8. data/lib/crm_connector/configuration.rb +2 -4
  9. data/lib/crm_connector/contact.rb +123 -3
  10. data/lib/crm_connector/core/continuation_support.rb +2 -1
  11. data/lib/crm_connector/core/enumerator.rb +20 -11
  12. data/lib/crm_connector/core/known_attributes.rb +3 -1
  13. data/lib/crm_connector/core/resource.rb +108 -16
  14. data/lib/crm_connector/core/search_support.rb +3 -1
  15. data/lib/crm_connector/custom_type.rb +20 -3
  16. data/lib/crm_connector/{default.rb → errors.rb} +1 -1
  17. data/lib/crm_connector/errors/authentication_failed.rb +10 -0
  18. data/lib/crm_connector/errors/base.rb +8 -0
  19. data/lib/crm_connector/event.rb +37 -2
  20. data/lib/crm_connector/event_contact.rb +38 -2
  21. data/lib/crm_connector/mailing.rb +35 -2
  22. data/lib/crm_connector/role.rb +7 -2
  23. data/lib/crm_connector/system.rb +14 -8
  24. metadata +22 -53
  25. data/CHANGELOG.rdoc +0 -87
  26. data/README.rdoc +0 -59
  27. data/lib/crm_connector/base.rb +0 -4
  28. data/lib/crm_connector/core/base.rb +0 -111
  29. data/lib/crm_connector/debugging.rb +0 -21
  30. data/lib/crm_connector/default/account.rb +0 -30
  31. data/lib/crm_connector/default/activity.rb +0 -54
  32. data/lib/crm_connector/default/contact.rb +0 -112
  33. data/lib/crm_connector/default/custom_type.rb +0 -24
  34. data/lib/crm_connector/default/event.rb +0 -23
  35. data/lib/crm_connector/default/event_contact.rb +0 -57
  36. data/lib/crm_connector/default/mailing.rb +0 -33
  37. data/lib/crm_connector/default/resource.rb +0 -10
  38. data/lib/crm_connector/default/role.rb +0 -9
  39. data/lib/crm_connector/inheriting_resource.rb +0 -30
  40. data/lib/crm_connector/resource.rb +0 -15
data/.yardopts ADDED
@@ -0,0 +1,8 @@
1
+ --tag webcrm_rest_url:"WebCRM Rest Url"
2
+ --tag webcrm_todo:"WebCRM To Do"
3
+ --hide-tag webcrm_todo
4
+ --hide-void-return
5
+ --no-private
6
+ -
7
+ LICENSE
8
+ CHANGELOG.markdown
@@ -0,0 +1,94 @@
1
+ ## Version 1.0.0 - 2012-09-14
2
+ * Enabled support for `event.custom_attributes`
3
+ * Removed deprecated functions `EventContact.find_by` and `EventContact.find_by_event_id_and_contact_id`. Please user `EventContact.search` instead.
4
+ * Removed `configuration.debug`.
5
+ * Renamed `Infopark::Crm::AuthenticationFailed` to `Infopark::Crm::Errors::AuthenticationFailed`.
6
+ * Merged `Infopark::Crm::Core::Base` and `Infopark::Crm::Resource` into `Infopark::Crm::Core:Resource`.
7
+
8
+ ## Version 0.9.2 - 2012-03-19
9
+ * Security improvement for `Contact.authenticate`, `Contact.password_set` and `contact.password_request`
10
+
11
+ ## Version 0.9.1 - 2012-02-28
12
+ * Removed `Diary`. Please use `Activity` instead.
13
+ * Added `Mailing`
14
+ * Added `appointment_*` and `task_*` fields to `Activity`
15
+ * Added `role_names` field to `Contact`
16
+ * Added `tags` field to `Activity`, `Account` and `Contact`
17
+
18
+ ## Version 0.9 - 2012-01-27
19
+ Initial Release of Infopark CRM Connector
20
+
21
+ ### Changes from OMC Connector to CRM Connector
22
+ * Namespace changed from `OmcConector::` to `Infopark::Crm::`
23
+ * Attribute names may have changed. For new attributes please refer to [Web Services API documentation](http://kb.infopark.de/crm-api).
24
+ * Works only with Infopark WebCRM.
25
+
26
+ #### Changed configuration
27
+ * `live_server_groups_callback` - replaces `contact_roles_callback`
28
+
29
+ #### New classes
30
+ * `CustomType`
31
+ * `Role`
32
+ * `System`
33
+
34
+ #### New methods
35
+ * `Account.search`
36
+ * `Activity.search`
37
+ * `Contact.search`
38
+ * `Event.search`
39
+ * `EventContact.search`
40
+ * `contact.live_server_groups` - replaces `contact.roles`
41
+
42
+ #### Removed classes
43
+ * `AccountCollection`
44
+ * `InquiryKind` - use `CustomType`
45
+ * `InquiryLink`
46
+ * `Inquiry` - use `Activity`
47
+ * `Location` - use `contact` and `account` properties
48
+ * `Mailing`
49
+ * `RegistrationInquiry`
50
+ * `Session`
51
+
52
+
53
+ #### Removed methods
54
+ * `account.contacts` - use `Contact.search(:params => {:acount_id => acount_id})`
55
+ * `Account.find_by_name` - use `Account.search`
56
+ * `account.inquiries` - use `Activity.search(:params => {:account_id => account_id})`
57
+ * `account.locations`
58
+ * `contact.account_activities` - use `Activity.search(:query => {:account_id => account_id})`
59
+ * `contact.activities` - use `Activity.search(:params => {:contact_id => contact_id})`
60
+ * `contact.create_activity`
61
+ * `contact.create_diary`
62
+ * `contact.create_location_with_account_association`
63
+ * `contact.create_location`
64
+ * `contact.create_registration_request`
65
+ * `contact.event_participation`
66
+ * `contact.find_activity`
67
+ * `Contact.find_by_email` - use `Contact.search(:params => {:email => email})`
68
+ * `Contact.find_by_login` - use `Contact.search(:params => {:login => login})`
69
+ * `Contact.languages`
70
+ * `contact.location`
71
+ * `Contact.lookup_uptions`
72
+ * `contact.move_location`
73
+ * `contact.roles` - use `contact.live_server_groups`
74
+ * `contact.serialized_attributes` - use `contact.attributes`
75
+ * `contact.subscriptions`
76
+ * `Contact.titles`
77
+ * `contact.update_location`
78
+ * `contact.update_subscriptions`
79
+ * `contact.validate_login` - use `Contact.search(:params => {:login => login})`
80
+ * `event.attend(!)`
81
+ * `event.contacts` - use `EventContact.search(:event_id => event_id)`
82
+ * `Event.find_by_name`
83
+ * `event.inquire(!)`
84
+ * `event.refuse(!)`
85
+ * `event.register(!)`
86
+ * `event_contact.attend` - use `event_contact.status = 'attended'`
87
+ * `event_contact.inquire` - use `event_contact.status = 'unregistered'`
88
+ * `event_contact.refuse` - use `event_contact.status = 'refused'`
89
+ * `event_contact.register` - use `event_contact.status = 'registered'`
90
+ * `event_contact.update_details`
91
+ * `inquiry.create_diary`
92
+ * `inquiry.create_link`
93
+ * `inquiry.diaries`
94
+ * `inquiry.links`
data/LICENSE CHANGED
@@ -1 +1,3 @@
1
1
  Copyright (c) 2009 - 2012 Infopark AG (http://www.infopark.com)
2
+
3
+ This software can be used and modified under the LGPLv3. Please refer to http://www.gnu.org/licenses/lgpl-3.0.html for the license text.
data/README.markdown ADDED
@@ -0,0 +1,110 @@
1
+ <img alt="Infopark WebCRM Connector" src="data:image/png;base64,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" />
2
+
3
+
4
+ Infopark WebCRM Connector is the official Ruby SDK for [Infopark WebCRM](http://www.infopark.de/webcrm). It basically wraps the [WebCRM web services API](http://kb.infopark.de/crm-api) using [Active Resource](http://rubydoc.info/gems/activeresource/3.2.8/frames). Currently, Active Resource 3.0, 3.1 and 3.2 in combination with Ruby 1.8.7 and 1.9.x are tested and supported.
5
+
6
+ # Installation
7
+
8
+ Add `infopark_crm_connector` to your `gemfile`:
9
+
10
+ gem 'infopark_crm_connector'
11
+
12
+ Install the gem with [Bundler](http://gembundler.com/):
13
+
14
+ bundle install
15
+
16
+ # Configuration
17
+
18
+ require 'infopark_crm_connector'
19
+
20
+ Infopark::Crm.configure do |configuration|
21
+ configuration.url = "https://webcrm.server/url"
22
+ configuration.login = "webcrm_user"
23
+ configuration.api_key = "api_key_of_webcrm_user"
24
+ end
25
+
26
+ # See, if it is working
27
+ Infopark::Crm::Contact.first.last_name
28
+
29
+ See {Infopark::Crm.configure} for a complete list of configuration keys.
30
+
31
+ # Example Usage
32
+
33
+ This Ruby SDK provides the WebCRM's domain models {Infopark::Crm::Account Account}, {Infopark::Crm::Activity Activity}, {Infopark::Crm::Contact Contact}, {Infopark::Crm::Event Event}, {Infopark::Crm::Mailing Mailing}, among others. All domain models are subclasses of {Infopark::Crm::Core::Resource} which itself inherits from {ActiveResource::Base} and provides methods such as `find(id)`, `create(hash)`, `update(hash)`, `search(params)` and others.
34
+
35
+ ## Contact
36
+ # Retrieve the contact identified by the login 'root'
37
+ contact = Infopark::Crm::Contact.search(:params => {:login => 'root'}).first
38
+
39
+ # Change this contact's mail address
40
+ contact.update_attribute(:email, 'root@example.com')
41
+
42
+ # Send a new password request mail to the contact's address
43
+ contact.password_request
44
+
45
+ ## Activity
46
+
47
+ # Create a new activity kind
48
+ Infopark::Crm::CustomType.create(:name => 'support case', :kind => 'Activity',
49
+ :states => ['created'])
50
+
51
+ # Create a new activity
52
+ activity = Infopark::Crm::Activity.new(:kind => 'support case')
53
+
54
+ # Set properties of this activity
55
+ activity.title = 'Sprechen Sie Deutsch?'
56
+
57
+ # Switch to a different request locale
58
+ Infopark::Crm.configure {|c| c.locale = 'de'}
59
+
60
+ # Post the activity (which is going to fail)
61
+ activity.save
62
+ # => false
63
+
64
+ # Get to know what's missing
65
+ activity.errors.to_hash
66
+ # => {:state=>["ist kein gültiger Wert"]}
67
+
68
+ # Contributing
69
+
70
+ The source code is freely available at (https://github.com/infopark/crm_connector). Pull requests are welcome.
71
+
72
+ ## Get started
73
+
74
+ git clone git@github.com:infopark/crm_connector.git
75
+ cd crm_connector/
76
+ bundle
77
+
78
+ ## Run tests
79
+
80
+ Configure `test/config.json` with an empty WebCRM tenant (see `test/config_template.json`)
81
+
82
+ Run tests with the current version of Active Resource:
83
+
84
+ bundle exec rake test
85
+
86
+
87
+ Run tests with all supported versions of Active Resource:
88
+
89
+ bundle exec rake appraisal:install
90
+ bundle exec rake appraisal
91
+
92
+ ## Build and install gem
93
+
94
+ bundle exec rake gem #build
95
+ bundle exec rake install #build and install
96
+
97
+ ## Documentation
98
+
99
+ bundle exec rake yard
100
+ open doc/index.html
101
+
102
+ # Changelog
103
+
104
+ {include:file:CHANGELOG.markdown}
105
+
106
+ # License
107
+
108
+ Copyright (c) 2009 - 2012 Infopark AG (http://www.infopark.com)
109
+
110
+ This software can be used and modified under the LGPLv3. Please refer to http://www.gnu.org/licenses/lgpl-3.0.html for the license text.
data/lib/crm_connector.rb CHANGED
@@ -2,6 +2,7 @@ require 'active_resource'
2
2
  require 'active_support/core_ext/string/conversions'
3
3
 
4
4
  module Infopark; module Crm
5
+ # @private
5
6
  def self.setup_autoload(mod, mod_source)
6
7
  dir = File.expand_path(".", mod_source)[0..-4] # - ".rb"
7
8
  pattern = "#{dir}/*.rb"
@@ -13,24 +14,20 @@ module Infopark; module Crm
13
14
  end
14
15
 
15
16
  setup_autoload(self, __FILE__)
16
-
17
- # exceptions (defined elsewhere)
18
- autoload :AuthenticationFailed, File.expand_path('../crm_connector/core/base', __FILE__)
19
-
20
17
  end; end
21
18
 
22
19
  module Infopark; module Crm
23
20
 
24
- # Configures the web service connection
21
+ # Configures the web services connection
25
22
  #
26
- # View {README}[link:README_rdoc.html] for a usage example.
23
+ # View {file:README.markdown README} for a usage example.
27
24
  #
28
25
  # Supported configuration keys are:
29
- # [url] the web service server url (schema, host, port, path (up to, but not including /api))
26
+ # [url] The web services server url (schema, host, port, path (up to, but not including /api)).
30
27
  #
31
- # [login] the login of a WebCRM user with an API key (web service credential)
28
+ # [login] The user name (login) of the WebCRM contact person.
32
29
  #
33
- # [api_key] the WebCRM user's valid api key (web service credential)
30
+ # [api_key] The WebCRM user's valid API key (web services credential).
34
31
  #
35
32
  # [locale] The locale to use when sending requests to the server. Can be
36
33
  # redefined at any time.
@@ -43,9 +40,9 @@ module Infopark; module Crm
43
40
  #
44
41
  # Infopark::Crm::Contact.create.errors.full_messages
45
42
  #
46
- # [live_server_groups_callback] A custom definition of what the live_server_groups of
47
- # a contact is. The provided lambda is called with the contact
48
- # instance and must return an array of live_server_groups (strings)
43
+ # [live_server_groups_callback] A custom definition of what a contact's live_server_groups field
44
+ # returns. Provide a lambda that takes the contact instance as an
45
+ # argument and returns an array of live_server_groups (strings).
49
46
  #
50
47
  # Example:
51
48
  #
@@ -60,13 +57,12 @@ module Infopark; module Crm
60
57
  # }
61
58
  # end
62
59
  #
63
- # [debug] When set to true, includes the module Debugging into every resource, which
64
- # provides a logger method. Cannot be reverted by setting to +false+
65
60
  #
61
+ # @return [void]
66
62
  def self.configure(&block)
67
63
  yield Configuration
68
64
 
69
- Core::Base.configure(Configuration)
65
+ Core::Resource.configure(Configuration)
70
66
  end
71
67
 
72
68
  end; end
@@ -1,4 +1,33 @@
1
1
  module Infopark; module Crm
2
- # This is an extendable class. See Default::Account for documentation
3
- class Account < Default::Account; end
2
+
3
+ class Account < Core::Resource
4
+
5
+ ##
6
+ # @!method self.search(input)
7
+ # Searches for accounts
8
+ # @param input [Hash] A hash containing a +params+ key. The value of this key is a hash containing the actual search query.
9
+ # @return [Core::Enumerator<Infopark::Crm::Account>]
10
+ # @webcrm_rest_url <code>GET /api/accounts/search</code>
11
+ # @example
12
+ # results = Infopark::Crm::Account.search(:params => {:account_group => 'account_group_name'})
13
+ # results = Infopark::Crm::Account.search(:params => {:q => 'full-text search'})
14
+ has_search
15
+
16
+ self.schema = {
17
+ :account_group => :string,
18
+ :country => :string,
19
+ :extended_address => :string,
20
+ :home_page => :string,
21
+ :locality => :string,
22
+ :name => :string,
23
+ :org_name_address => :string,
24
+ :org_unit_address => :string,
25
+ :phone => :string,
26
+ :postalcode => :string,
27
+ :region => :string,
28
+ :street_address => :string,
29
+ :tags => :array,
30
+ :want_geo_location => :boolean,
31
+ }
32
+ end
4
33
  end; end
@@ -1,5 +1,63 @@
1
+ require 'ostruct'
2
+
1
3
  module Infopark; module Crm
2
- # This is an extendable class. See Default::Activity for documentation
3
- class Activity < Default::Activity; end
4
- end; end
4
+ class Activity < Core::Resource
5
+
6
+ ##
7
+ # @!method self.search(input)
8
+ # Searches for activities
9
+ # @param input [Hash] A hash containing a +params+ key. The value of this key is a hash containing the actual search query.
10
+ # @return [Array<Infopark::Crm::Activity>]
11
+ # @webcrm_rest_url <code>GET /api/activities/search</code>
12
+ # @example
13
+ # results = Infopark::Crm::Activity.search(:params => {:state => 'created'})
14
+ # results = Infopark::Crm::Activity.search(:params => {:kind => 'support case'})
15
+ # results = Infopark::Crm::Activity.search(:params => {:contact_id => cid})
16
+ # results = Infopark::Crm::Activity.search(:params => {:account_id => aid})
17
+ # results = Infopark::Crm::Activity.search(:params => {:q => 'full-text search'})
18
+ has_search
19
+
20
+ self.schema = {
21
+ :account_id => :string,
22
+ :appointment_contact_id => :string,
23
+ :appointment_dtend_at => :time,
24
+ :appointment_dtstart_at => :time,
25
+ :appointment_location => :string,
26
+ :comment_notes => :string,
27
+ :comment_published => :boolean,
28
+ :contact_id => :string,
29
+ :email_cc => :string,
30
+ :kind => :string,
31
+ :state => :string,
32
+ :tags => :array,
33
+ :task_due_at => :time,
34
+ :task_owner_id => :string,
35
+ :title => :string,
36
+ }
5
37
 
38
+ ##
39
+ # Queries the WebCRM for the Contact with the id +contact_id+.
40
+ # @return [Infopark::Crm::Contact] The contact associated with this activity, if +contact_id+ is present.
41
+ # @webcrm_rest_url <code>GET /api/contacts/_contact_id_</code>
42
+ def contact
43
+ Infopark::Crm::Contact.find(contact_id) if contact_id
44
+ end
45
+
46
+ ##
47
+ # Queries the WebCRM for the Account with the id +account_id+.
48
+ # @return [Infopark::Crm::Account] The account associated with this activity, if +account_id+ is present.
49
+ # @webcrm_rest_url <code>GET /api/accounts/_account_id_</code>
50
+ def account
51
+ Infopark::Crm::Account.find(account_id) if account_id
52
+ end
53
+
54
+ ##
55
+ # Queries the WebCRM for the CustomType with the id +kind+.
56
+ # @return [Infopark::Crm::CustomType] The custom type associated with this activity, if +kind+ is present.
57
+ # @webcrm_rest_url <code>GET /api/custom_types/_kind_</code>
58
+ def custom_type
59
+ Infopark::Crm::CustomType.find(kind) if kind
60
+ end
61
+
62
+ end
63
+ end; end
@@ -1,8 +1,8 @@
1
- # :stopdoc:
2
-
3
1
  require 'active_support/core_ext/class/attribute_accessors'
4
2
 
5
3
  module Infopark; module Crm
4
+
5
+ # @private
6
6
  class Configuration
7
7
 
8
8
  cattr_accessor :api_key
@@ -17,8 +17,6 @@ module Infopark; module Crm
17
17
 
18
18
  cattr_accessor :live_server_groups_callback
19
19
 
20
- cattr_accessor :debug
21
-
22
20
  self.login = "webservice"
23
21
 
24
22
  self.live_server_groups_callback = lambda {|contact| []}
@@ -1,5 +1,125 @@
1
1
  module Infopark; module Crm
2
- # This is an extendable class. See Default::Contact for documentation
3
- class Contact < Default::Contact; end
4
- end; end
2
+ class Contact < Core::Resource
3
+
4
+ ##
5
+ # @!method self.search(input)
6
+ # Searches for contacts
7
+ # @param input [Hash] A hash containing a +params+ key. The value of this key is a hash containing the actual search query.
8
+ # @return [Array<Infopark::Crm::Contact>]
9
+ # @webcrm_rest_url <code>GET /api/contacts/search</code>
10
+ # @example
11
+ # results = Infopark::Crm::Contact.search(:params => {:login => 'the_login'})
12
+ # results = Infopark::Crm::Contact.search(:params => {:email => 'email@example.com'})
13
+ # results = Infopark::Crm::Contact.search(:params => {:q => 'full-text search'})
14
+ has_search
15
+
16
+ self.schema = {
17
+ :account_id => :string,
18
+ :country => :string,
19
+ :email => :string,
20
+ :extended_address => :string,
21
+ :fax => :string,
22
+ :first_name => :string,
23
+ :gender => :string,
24
+ :job_title => :string,
25
+ :language => :string,
26
+ :last_name => :string,
27
+ :locality => :string,
28
+ :login => :string,
29
+ :mobile_phone => :string,
30
+ :name_prefix => :string,
31
+ :org_name_address => :string,
32
+ :org_unit_address => :string,
33
+ :phone => :string,
34
+ :postalcode => :string,
35
+ :region => :string,
36
+ :role_names => :array,
37
+ :street_address => :string,
38
+ :tags => :array,
39
+ :want_email => :boolean,
40
+ :want_geo_location => :boolean,
41
+ :want_phonecall => :boolean,
42
+ :want_snailmail => :boolean,
43
+ }
44
+
45
+ ##
46
+ # Queries the WebCRM for the Account with the id +account_id+.
47
+ # @return [Infopark::Crm::Account] The account associated with this contact, if +account_id+ is present.
48
+ # @webcrm_rest_url <code>GET /api/accounts/_account_id_</code>
49
+ def account
50
+ Infopark::Crm::Account.find(account_id) if account_id
51
+ end
52
+
53
+ ##
54
+ # Looks for the user with the given +login+ and check whether the +password+ is correct.
55
+ # @param login [String]
56
+ # @param password [String]
57
+ # @return [Infopark::Crm::Contact] The found and authenticated contact.
58
+ # @raise [Infopark::Crm::Errors::AuthenticationFailed] if provided +password+ is not correct.
59
+ # @webcrm_rest_url <code>POST /api/contacts/authenticate</code>
60
+ def self.authenticate(login, password)
61
+ begin
62
+ response = post(:authenticate, {}, format.encode({:login => login, :password => password}))
63
+ result = format.decode(response.body)
64
+ return find(result['id']) if result.kind_of? Hash # ActiveResource 3.0
65
+ find(result)
66
+ rescue ActiveResource::ResourceInvalid
67
+ raise Errors::AuthenticationFailed
68
+ end
69
+ end
70
+
71
+ ##
72
+ # Sets a new +password+ for the contact, which is associated with the given +token+.
73
+ # @param password [String] The new password.
74
+ # @param token [String] The token provided by +password_request+ which is associated with a contact.
75
+ # @return [String] The result message from the server.
76
+ # @webcrm_rest_url <code>POST /api/contacts/password_set</code>
77
+ def self.password_set(password, token)
78
+ response = post(:password_set, {}, format.encode({:password => password, :token => token}))
79
+ result = format.decode(response.body)
80
+ return result['message'] if result.kind_of? Hash # ActiveResource 3.0
81
+ result
82
+ end
5
83
 
84
+ ##
85
+ # Sets the password of this contact to +password+.
86
+ # @param password [String] the new password
87
+ # @return [void]
88
+ def password_set(password)
89
+ token = password_request(:params => {:only_get_token => true})
90
+ self.class.password_set(password, token)
91
+ end
92
+
93
+ ##
94
+ # Instructs the WebCRM to send the user an e-mail to let them set a new password.
95
+ # @param options [Hash]
96
+ # @webcrm_rest_url <code>GET /api/contacts/_id_/password_request</code>
97
+ # @webcrm_todo return nil instead of message for default parameters?
98
+ def password_request(options = {})
99
+ params = options[:params] || {}
100
+ response = post(:password_request, {}, self.class.format.encode(params))
101
+ result = self.class.format.decode(response.body)
102
+ return result.values.first if result.kind_of? Hash # ActiveResource 3.0
103
+ result
104
+ end
105
+
106
+ # Returns the live_server_groups of this contact as defined by +Configuration.live_server_groups_callback+
107
+ # @return [Array<String>] The calculated roles of this contact.
108
+ def live_server_groups
109
+ return @live_server_groups if defined?(@live_server_groups)
110
+ callback = Configuration.live_server_groups_callback
111
+ @live_server_groups = callback.call(self) if callback.respond_to?(:call)
112
+ raise "live_server_groups_callback: not defined or unexpected result!" unless @live_server_groups
113
+
114
+ @live_server_groups
115
+ end
116
+
117
+ ##
118
+ # Overwrites +live_server_groups+, so live_server_groups_callback is not called for this object.
119
+ # @return [void]
120
+ def live_server_groups=(value)
121
+ @live_server_groups = value
122
+ end
123
+
124
+ end
125
+ end; end