church-community-builder 0.1.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 (52) hide show
  1. data/.gitignore +3 -0
  2. data/.rvmrc +1 -0
  3. data/Gemfile +13 -0
  4. data/Gemfile.lock +52 -0
  5. data/README.rdoc +54 -0
  6. data/Rakefile +32 -0
  7. data/ccb_api.gemspec +26 -0
  8. data/docs/batch_implement.pdf +0 -0
  9. data/docs/event_implement.pdf +0 -0
  10. data/docs/group_implement.pdf +0 -0
  11. data/docs/individual_profile_implement.pdf +0 -0
  12. data/docs/pwt_implement.pdf +0 -0
  13. data/docs/pwt_overview.pdf +0 -0
  14. data/examples/batch.rb +50 -0
  15. data/examples/calendar.rb +18 -0
  16. data/examples/campus.rb +13 -0
  17. data/examples/individual.rb +38 -0
  18. data/examples/sync_data.rb +48 -0
  19. data/lib/api/address.rb +28 -0
  20. data/lib/api/api_object.rb +116 -0
  21. data/lib/api/batch.rb +48 -0
  22. data/lib/api/batch_list.rb +50 -0
  23. data/lib/api/campus.rb +29 -0
  24. data/lib/api/campus_list.rb +65 -0
  25. data/lib/api/individual.rb +138 -0
  26. data/lib/api/individual_list.rb +65 -0
  27. data/lib/api/mergeable_individual_list.rb +92 -0
  28. data/lib/api/mergeable_transaction_list.rb +74 -0
  29. data/lib/api/search.rb +81 -0
  30. data/lib/api/transaction.rb +114 -0
  31. data/lib/api/transaction_list.rb +52 -0
  32. data/lib/api/valid_individual.rb +43 -0
  33. data/lib/api/valid_individual_list.rb +49 -0
  34. data/lib/auto_load.rb +17 -0
  35. data/lib/ccb_api.rb +33 -0
  36. data/lib/common.rb +41 -0
  37. data/lib/exceptions.rb +5 -0
  38. data/lib/readers/api_reader.rb +35 -0
  39. data/lib/readers/batch_list_reader.rb +17 -0
  40. data/lib/readers/batch_reader.rb +14 -0
  41. data/lib/readers/campus_list_reader.rb +17 -0
  42. data/lib/readers/individual_list_reader.rb +18 -0
  43. data/lib/readers/individual_reader.rb +14 -0
  44. data/lib/writers/api_writer.rb +64 -0
  45. data/lib/writers/user_writer.rb +46 -0
  46. data/spec/api/user_spec.rb +37 -0
  47. data/spec/factories/user.rb +51 -0
  48. data/spec/functional/ccb_spec.rb +20 -0
  49. data/spec/readers/user_reader_spec.rb +7 -0
  50. data/spec/spec_helper.rb +31 -0
  51. data/spec/writers/user_writer_spec.rb +80 -0
  52. metadata +137 -0
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ .DS_Store
2
+
3
+ church-community-builder-*.gem
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm ruby-1.9.3-p392@church-community-builder-api --create
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ source 'http://rubygems.org'
2
+
3
+ gem 'typhoeus', '0.5.1'
4
+ gem 'json'
5
+ gem 'xml-simple'
6
+
7
+ group :development, :test do
8
+ gem 'colored'
9
+ gem 'autotest'
10
+ gem 'rspec'
11
+ gem 'debugger'
12
+ gem 'factory_girl'
13
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,52 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ ZenTest (4.9.1)
5
+ activesupport (3.2.13)
6
+ i18n (= 0.6.1)
7
+ multi_json (~> 1.0)
8
+ autotest (4.4.6)
9
+ ZenTest (>= 4.4.1)
10
+ colored (1.2)
11
+ columnize (0.3.6)
12
+ debugger (1.5.0)
13
+ columnize (>= 0.3.1)
14
+ debugger-linecache (~> 1.2.0)
15
+ debugger-ruby_core_source (~> 1.2.0)
16
+ debugger-linecache (1.2.0)
17
+ debugger-ruby_core_source (1.2.0)
18
+ diff-lcs (1.2.4)
19
+ ethon (0.5.3)
20
+ ffi (~> 1.0.11)
21
+ mime-types (~> 1.18)
22
+ factory_girl (4.2.0)
23
+ activesupport (>= 3.0.0)
24
+ ffi (1.0.11)
25
+ i18n (0.6.1)
26
+ json (1.8.0)
27
+ mime-types (1.23)
28
+ multi_json (1.7.3)
29
+ rspec (2.13.0)
30
+ rspec-core (~> 2.13.0)
31
+ rspec-expectations (~> 2.13.0)
32
+ rspec-mocks (~> 2.13.0)
33
+ rspec-core (2.13.1)
34
+ rspec-expectations (2.13.0)
35
+ diff-lcs (>= 1.1.3, < 2.0)
36
+ rspec-mocks (2.13.1)
37
+ typhoeus (0.5.1)
38
+ ethon (= 0.5.3)
39
+ xml-simple (1.1.2)
40
+
41
+ PLATFORMS
42
+ ruby
43
+
44
+ DEPENDENCIES
45
+ autotest
46
+ colored
47
+ debugger
48
+ factory_girl
49
+ json
50
+ rspec
51
+ typhoeus (= 0.5.1)
52
+ xml-simple
data/README.rdoc ADDED
@@ -0,0 +1,54 @@
1
+ = The Church Community Builder API
2
+
3
+ This Ruby project is an API wrapper for Church Community Builder API.
4
+
5
+
6
+ == Install / Setup
7
+
8
+ Installing the gem
9
+
10
+ gem install church-community-builder
11
+
12
+
13
+ To add it to your Gemfile
14
+
15
+ gem 'church-community-builder', :require => 'ccb_api'
16
+
17
+
18
+ Add your church's API Token and API Key to [RAILS_ROOT]/config/initializers/ccb_config.rb
19
+
20
+ CCB_USERNAME = '**** YOUR CCB API USERNAME ****'
21
+ CCB_PASSWORD = '**** YOUR CCB API PASSWORD ****'
22
+ CCB_SUBDOMAIN = '**** YOUR CCB API SUBDOMAIN ****'
23
+
24
+
25
+ Next you will need to initialize a connection
26
+
27
+ ChurchCommunityBuilder::Api.connect(CCB_USERNAME, CCB_PASSWORD, CCB_SUBDOMAIN)
28
+
29
+
30
+
31
+ == Example usage
32
+
33
+ Checkout the examples folder.
34
+
35
+
36
+ == Additional resources
37
+
38
+
39
+
40
+ == License
41
+
42
+ This project is released under the MIT license (see LICENSE).
43
+
44
+ This project is maintained by Wes Hays (https://github.com/weshays).
45
+
46
+
47
+ == Contributors
48
+
49
+ Chad Feller: https://github.com/cfeller
50
+
51
+
52
+ == Want to Contribute?
53
+
54
+ If you would like to get involved in this project, then please fork the project. Make changes, add features, write some tests, and then send us a pull request.
data/Rakefile ADDED
@@ -0,0 +1,32 @@
1
+ require 'rspec/core/rake_task'
2
+
3
+
4
+ desc 'Default: run specs.'
5
+ task :default => :spec
6
+ task :test => :spec
7
+
8
+ desc "Run specs"
9
+ RSpec::Core::RakeTask.new do |t|
10
+ t.pattern = "./spec/**/*_spec.rb" # don't need this, it's default.
11
+ # Put spec opts in a file named .rspec in root
12
+ end
13
+
14
+
15
+ desc "Generate code coverage"
16
+ RSpec::Core::RakeTask.new(:coverage) do |t|
17
+ t.pattern = "./spec/**/*_spec.rb" # don't need this, it's default.
18
+ t.rcov = true
19
+ t.rcov_opts = ['--exclude', 'spec']
20
+ end
21
+
22
+
23
+
24
+ namespace :docs do
25
+
26
+ desc 'Build the docs for The City Admin API.'
27
+ task :build do
28
+ system('rm -rf doc')
29
+ system('yardoc --no-private --protected lib/**/*.rb')
30
+ end
31
+
32
+ end
data/ccb_api.gemspec ADDED
@@ -0,0 +1,26 @@
1
+ Gem::Specification.new do |s|
2
+ PROJECT_GEM = 'church-community-builder'
3
+ PROJECT_GEM_VERSION = '0.1.0'
4
+
5
+ s.name = PROJECT_GEM
6
+ s.version = PROJECT_GEM_VERSION
7
+ s.platform = Gem::Platform::RUBY
8
+ #s.date = '2009-01-05'
9
+
10
+ s.homepage = 'https://github.com/weshays/church-community-builder-api-ruby'
11
+ s.rubyforge_project = 'Project on www.github.com'
12
+ s.authors = ['Wes Hays', 'Chad Feller']
13
+ s.email = ['weshays@gbdev.com','feller@cs.unr.edu']
14
+
15
+ s.summary = 'Ruby gem/plugin to interact with the Church Community Builder API.'
16
+ s.description = 'Ruby gem/plugin to interact with the Church Community Builder API. Checkout the project on github for more detail.'
17
+
18
+ s.add_dependency('typhoeus', '0.5.1')
19
+ s.add_dependency('xml-simple')
20
+
21
+
22
+ s.files = `git ls-files`.split("\n")
23
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
24
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
25
+ s.require_paths = ["lib"]
26
+ end
Binary file
Binary file
Binary file
Binary file
Binary file
data/examples/batch.rb ADDED
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.dirname(__FILE__) + '/../lib/ccb_api.rb'
4
+
5
+ # Load batch by id
6
+ batch_1 = ChurchCommunityBuilder::Search.search_for_batch_by_id(469)
7
+
8
+ # Pull TransactionList from given Batch
9
+ trans_list_1 = ChurchCommunityBuilder::TransactionList.new(batch_1.transactions)
10
+
11
+ # Search for transactions by date
12
+ start_date = "2013-05-03"
13
+ end_date = nil #optional
14
+ batch_2 = ChurchCommunityBuilder::Search.search_for_batch_by_date_range(start_date,end_date)
15
+
16
+ # Create MergeableTransactionList, and load all transactions from batch_2 into it
17
+ mtl = ChurchCommunityBuilder::MergeableTransactionList.new
18
+
19
+ batch_2.each do |batch|
20
+ trans_list = ChurchCommunityBuilder::TransactionList.new(batch.transactions)
21
+ mtl.add(trans_list)
22
+ end
23
+
24
+ puts mtl.all_names
25
+
26
+ # Create MergeableIndividualList, and lookup all Individuals from mtl.
27
+ individual_list = ChurchCommunityBuilder::MergeableIndividualList.new
28
+
29
+ mtl.each do |transaction|
30
+ individual = ChurchCommunityBuilder::Individual.load_by_id(transaction.individual_id)
31
+ individual_list.add(individual)
32
+ end
33
+
34
+ puts "********************************************************************"
35
+ # Batch reporting
36
+ individual_list = ChurchCommunityBuilder::MergeableIndividualList.new
37
+
38
+ mtl.each do |transaction|
39
+ individual = ChurchCommunityBuilder::Individual.load_by_id(transaction.individual_id)
40
+
41
+ puts transaction.date + "\t" +
42
+ individual.family_name + "\t" +
43
+ individual.full_name + "\t" +
44
+ "$" + transaction.amount.to_s #unless transaction.multiple_transactions?
45
+ puts transaction.fund_id.to_s + "\t" +
46
+ transaction.fund_name.to_s + "\t" +
47
+ transaction.payment_type + "\t" +
48
+ transaction.check_number.to_s #check_number will be nil if not paid by check
49
+ puts "********************************************************************"
50
+ end
@@ -0,0 +1,18 @@
1
+ # #!/usr/bin/env ruby
2
+
3
+ # require 'json'
4
+ # require 'yaml'
5
+ # require 'typhoeus'
6
+ # require 'active_support/core_ext'
7
+
8
+ # y = YAML.load(File.read("config/ccb.yml"))
9
+ # resp1 = Typhoeus::Request.get(y[:url],
10
+ # params: {srv: "public_calendar_listing",
11
+ # date_start: "2008-11-25",
12
+ # #date_end: "2008-12-31"
13
+ # },
14
+ # username: y[:username],
15
+ # password: y[:password]
16
+ # )
17
+ # jresp1 = JSON.parse(Hash.from_xml(resp1.body).to_json)
18
+ # puts jresp1.inspect
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.dirname(__FILE__) + '/../lib/ccb_api'
4
+ require 'pp'
5
+
6
+ campus_list = ChurchCommunityBuilder::Search.search_for_all_campuses
7
+
8
+ puts campus_list.all_names
9
+ puts campus_list.ids
10
+
11
+ campus_0 = campus_list[0]
12
+
13
+ pp campus_0
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.dirname(__FILE__) + '/../lib/ccb_api'
4
+
5
+ # IndividualList is returned from Search
6
+ x_names = ChurchCommunityBuilder::Search.search_for_person_by_name("x")
7
+ puts x_names.all_names
8
+
9
+ # Individual is created here
10
+ individual = ChurchCommunityBuilder::Individual.load_by_id(2)
11
+ puts "Name ==> " + individual.full_name
12
+ puts "Address: "
13
+ puts individual.mailing_address.street_address + "\n" +
14
+ individual.mailing_address.city + ", " +
15
+ individual.mailing_address.state + " " +
16
+ individual.mailing_address.zip
17
+
18
+ puts "Phone ==>" + individual.contact_phone
19
+ puts "Email ==> " + individual.email
20
+
21
+ puts "Gender ==> " + individual.gender
22
+ puts "Birthday ==> " + individual.birthday
23
+ puts "Marital Status ==> " + individual.marital_status
24
+
25
+ puts "Family Name ==> " + individual.family_name
26
+ puts "Campus Name ==> " + individual.campus_name
27
+
28
+ # Grab all individuals
29
+ all_valid_individuals = ChurchCommunityBuilder::Search.search_for_all_valid_individuals
30
+
31
+ # all individuals is a ValidIndividualList.
32
+ # we can use this to build an IndividualList
33
+ mil = ChurchCommunityBuilder::MergeableIndividualList.new
34
+
35
+ all_valid_individuals.each do |vi|
36
+ individual = ChurchCommunityBuilder::Individual.load_by_id(vi.id)
37
+ mil.add(individual)
38
+ end
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'debugger'
4
+ require File.dirname(__FILE__) + '/../lib/ccb_api'
5
+
6
+
7
+ start_date = "2013-04-01"
8
+ end_date = "2013-04-21"
9
+ batch_list = ChurchCommunityBuilder::Search.search_for_batch_by_date_range(start_date, end_date)
10
+
11
+ batch_list.each do |batch|
12
+ if batch.has_transactions?
13
+ transaction_list = ChurchCommunityBuilder::TransactionList.new(batch.transactions)
14
+
15
+ puts "-----------------------------"
16
+ transaction_list.each do |transaction|
17
+ # Info to use
18
+ puts "Campus: #{transaction.campus_name}"
19
+ puts "Amount: #{transaction.amount}"
20
+ puts "Donor: #{transaction.individual_id}"
21
+ puts "Entered On: #{transaction.date}"
22
+ puts "Fund: #{transaction.fund_name}"
23
+ puts "Instrument Type: #{transaction.payment_type}"
24
+ puts "-----------------------------"
25
+
26
+ individual = ChurchCommunityBuilder::Individual.load_by_id(transaction.individual_id)
27
+
28
+ puts '#########################'
29
+ puts "First name: #{individual.first_name}"
30
+ puts "Last name: #{individual.last_name}"
31
+ puts "Full name: #{individual.full_name}"
32
+ puts "Campus name: #{individual.campus_name}"
33
+ puts "Donor ID: #{individual.giving_number}"
34
+ puts "Family ID: #{individual.family_id}"
35
+ puts "Address: #{individual.home_address}"
36
+ puts "Phone number 1: #{individual.home_phone}"
37
+ puts "Phone number 2: #{individual.mobile_phone}"
38
+ puts "Date of Birth: #{individual.birthday}"
39
+ puts "Gender: #{individual.gender}"
40
+ puts "Email: #{individual.email}"
41
+ puts "Marital status: #{individual.marital_status}"
42
+ puts '#########################'
43
+ end
44
+
45
+ else
46
+ puts "Batch #{batch.id} has no transactions"
47
+ end
48
+ end
@@ -0,0 +1,28 @@
1
+ module ChurchCommunityBuilder
2
+
3
+ include Enumerable
4
+
5
+ class Address < ApiObject
6
+
7
+ # Type = {mailing: 'mailing', home: 'home', work: 'work', other: 'other'}
8
+
9
+ ccb_attr_accessor :type,
10
+ :street_address,
11
+ :city,
12
+ :state,
13
+ :zip,
14
+ :country,
15
+ :line_1,
16
+ :line_2,
17
+ :latitude,
18
+ :longitude
19
+
20
+
21
+ def initialize(json)
22
+ initialize_from_json_object(json) unless json.nil?
23
+ end
24
+
25
+
26
+ end
27
+
28
+ end
@@ -0,0 +1,116 @@
1
+ module ChurchCommunityBuilder
2
+
3
+ # This class is the base class for all ChurchCommunityBuilder objects and is meant to be inherited.
4
+ #
5
+ class ApiObject
6
+ attr_reader :error_messages, :marked_for_destruction
7
+
8
+
9
+ # Used to specify a list of getters and setters.
10
+ def self.ccb_attr_accessor(*vars)
11
+ @__ccb_attributes ||= []
12
+ @__ccb_attributes.concat(vars)
13
+ attr_accessor(*vars)
14
+ end
15
+
16
+
17
+ # A list of ccb_attr_accessors that have been specified.
18
+ def self.__ccb_attributes
19
+ @__ccb_attributes
20
+ end
21
+
22
+ # Initializes the current object from the JSON data that was loaded into the Hash
23
+ #
24
+ # @param object_attributes A Hash of values to load into the current object.
25
+ def initialize_from_json_object(object_attributes)
26
+ # puts "CALLER"
27
+ # puts caller[0]
28
+ # puts "DONE PUTTING CALLER"
29
+ if object_attributes.is_a?( Hash )
30
+ object_attributes.each do |key, value|
31
+
32
+ method_to_call = "#{key.to_s.downcase.gsub(' ', '_')}="
33
+
34
+ if respond_to?(method_to_call)
35
+ # puts "Sending :=> ".green + method_to_call.to_s + value.to_s
36
+ self.send(method_to_call, value)
37
+ else
38
+ # puts "Missing :=> ".red + method_to_call.to_s # Show the missing methods
39
+ end
40
+ end
41
+ end
42
+ end
43
+
44
+
45
+ # Returns the status of the current object.
46
+ def is_deleted?
47
+ @_deleted ||= false
48
+ end
49
+
50
+ # Gets the current object's attributes in a Hash.
51
+ #
52
+ # @return A hash of all the attributes.
53
+ def to_attributes
54
+ vals = {}
55
+ vals = {:marked_for_destruction => self.is_deleted?} if self.is_deleted?
56
+ self.class.__ccb_attributes.each do |tca|
57
+ rep = self.send(tca)
58
+ if rep.class == Array
59
+ rep.collect! { |r| r.respond_to?(:to_attributes) ? r.to_attributes : r }
60
+ end
61
+ vals[tca] = rep
62
+ end
63
+ vals
64
+ end
65
+
66
+
67
+ # Sets the current object's attributes from a hash
68
+ def set_attributes(attribute_data)
69
+ attribute_data.each { |key, value| self.send("#{key}=", value) if self.respond_to?("#{key}=") }
70
+ end
71
+
72
+
73
+ # # Save this object.
74
+ # #
75
+ # # @return True on success, otherwise false.
76
+ # def save
77
+ # writer = @writer_object.new(self.to_attributes)
78
+ # result = writer.save_object
79
+ # if result === false
80
+ # @error_messages = writer.error_messages
81
+ # else
82
+ # self.set_attributes(result)
83
+ # end
84
+ # result === false ? false : true
85
+ # end
86
+
87
+
88
+ # # Delete this object.
89
+ # #
90
+ # # @return True on success, otherwise false.
91
+ # def delete
92
+ # writer = @writer_object.new(self.to_attributes)
93
+ # result = writer.delete_object
94
+ # if result === false
95
+ # @error_messages = writer.error_messages
96
+ # else
97
+ # @_deleted = true
98
+ # end
99
+ # result === false ? false : true
100
+ # end
101
+
102
+ private
103
+
104
+ def _attr_underscore(str)
105
+ str.gsub(/::/, '/')
106
+ .gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
107
+ .gsub(/([a-z\d])([A-Z])/,'\1_\2')
108
+ .tr("-", "_")
109
+ .downcase
110
+ end
111
+
112
+ end
113
+
114
+ end
115
+
116
+