agree2 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,4 @@
1
+ doc
2
+ pkg
3
+ *.log
4
+ .DS_Store
data/Rakefile CHANGED
@@ -40,50 +40,23 @@ namespace :spec do |ns|
40
40
  end
41
41
  end
42
42
 
43
- namespace :gem do |gem|
44
- File.open( 'agree2.gemspec') do |f|
45
- @gem=eval(f.read)
46
- @version=@gem.version.to_s
43
+ begin
44
+ require 'jeweler'
45
+ Jeweler::Tasks.new do |gemspec|
46
+ gemspec.name = "agree2"
47
+ gemspec.summary = "Ruby client library for Agree2"
48
+ gemspec.description = "Ruby library for creating and managing agreements on Agree2"
49
+ gemspec.email = "support@agree2.com"
50
+ gemspec.homepage = "http://agree2.com"
51
+ gemspec.authors = ["Pelle Braendgaard"]
52
+ gemspec.add_dependency('oauth', '>= 0.3.5')
53
+ gemspec.add_dependency("json", [">= 1.1.3"])
54
+ gemspec.add_dependency("activesupport", [">= 2.0.2"])
55
+
56
+ gemspec.rubyforge_project = 'agree2'
47
57
  end
48
-
49
- Rake::GemPackageTask.new @gem do |pkg|
50
- pkg.need_tar = true
51
- pkg.need_zip = true
52
- end
53
-
54
- desc 'Install the package as a gem.'
55
- task :install => [:clean, :package] do
56
- gem = Dir['pkg/*.gem'].first
57
- sh "sudo gem install --local #{gem}"
58
- end
59
-
60
-
61
- desc 'Package and upload the release to rubyforge.'
62
- task :release => [:clean, :package] do |t|
63
- pkg = "pkg/#{name}-#{@version}"
64
-
65
- if $DEBUG then
66
- puts "release_id = rf.add_release #{rubyforge_name.inspect}, #{name.inspect}, #{@version.inspect}, \"#{pkg}.tgz\""
67
- puts "rf.add_file #{rubyforge_name.inspect}, #{name.inspect}, release_id, \"#{pkg}.gem\""
68
- end
69
-
70
- rf = RubyForge.new.configure
71
- puts "Logging in"
72
- rf.login
73
-
74
- # c = rf.userconfig
75
- # c["release_notes"] = description if description
76
- # c["release_changes"] = changes if changes
77
- # c["preformatted"] = true
78
-
79
- files = ["#{pkg}.tgz",
80
- "#{pkg}.zip",
81
- "#{pkg}.gem"].compact
82
-
83
- puts "Releasing #{name} v. #{@version}"
84
- rf.add_release rubyforge_name, name, @version, *files
85
- end
86
-
58
+ rescue LoadError
59
+ puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
87
60
  end
88
61
 
89
62
  desc "Clean up all dirt"
@@ -94,4 +67,4 @@ task :clean => [ "rdoc:clobber_doc", "gem:clobber_package" ] do
94
67
  end
95
68
  end
96
69
 
97
- task :default=>[:spec]
70
+ task :default=>["spec:spec"]
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.2.0
@@ -0,0 +1,76 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{agree2}
5
+ s.version = "0.2.0"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Pelle Braendgaard"]
9
+ s.date = %q{2009-07-31}
10
+ s.description = %q{Ruby library for creating and managing agreements on Agree2}
11
+ s.email = %q{support@agree2.com}
12
+ s.extra_rdoc_files = [
13
+ "README.rdoc"
14
+ ]
15
+ s.files = [
16
+ ".gitignore",
17
+ "History.txt",
18
+ "License.txt",
19
+ "README.rdoc",
20
+ "Rakefile",
21
+ "VERSION",
22
+ "agree2.gemspec",
23
+ "certs/sf_bundle.crt",
24
+ "lib/agree2.rb",
25
+ "lib/agree2/agreement.rb",
26
+ "lib/agree2/base.rb",
27
+ "lib/agree2/client.rb",
28
+ "lib/agree2/party.rb",
29
+ "lib/agree2/proxy_collection.rb",
30
+ "lib/agree2/template.rb",
31
+ "lib/agree2/user.rb",
32
+ "spec/agreement_spec.rb",
33
+ "spec/client_spec.rb",
34
+ "spec/fixtures/agreement.json",
35
+ "spec/fixtures/party.json",
36
+ "spec/party_spec.rb",
37
+ "spec/proxy_collection_spec.rb",
38
+ "spec/spec_helper.rb",
39
+ "spec/template_spec.rb",
40
+ "spec/user_spec.rb"
41
+ ]
42
+ s.homepage = %q{http://agree2.com}
43
+ s.rdoc_options = ["--charset=UTF-8"]
44
+ s.require_paths = ["lib"]
45
+ s.rubyforge_project = %q{agree2}
46
+ s.rubygems_version = %q{1.3.5}
47
+ s.summary = %q{Ruby client library for Agree2}
48
+ s.test_files = [
49
+ "spec/agreement_spec.rb",
50
+ "spec/client_spec.rb",
51
+ "spec/party_spec.rb",
52
+ "spec/proxy_collection_spec.rb",
53
+ "spec/spec_helper.rb",
54
+ "spec/template_spec.rb",
55
+ "spec/user_spec.rb"
56
+ ]
57
+
58
+ if s.respond_to? :specification_version then
59
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
60
+ s.specification_version = 3
61
+
62
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
63
+ s.add_runtime_dependency(%q<oauth>, [">= 0.3.5"])
64
+ s.add_runtime_dependency(%q<json>, [">= 1.1.3"])
65
+ s.add_runtime_dependency(%q<activesupport>, [">= 2.0.2"])
66
+ else
67
+ s.add_dependency(%q<oauth>, [">= 0.3.5"])
68
+ s.add_dependency(%q<json>, [">= 1.1.3"])
69
+ s.add_dependency(%q<activesupport>, [">= 2.0.2"])
70
+ end
71
+ else
72
+ s.add_dependency(%q<oauth>, [">= 0.3.5"])
73
+ s.add_dependency(%q<json>, [">= 1.1.3"])
74
+ s.add_dependency(%q<activesupport>, [">= 2.0.2"])
75
+ end
76
+ end
@@ -0,0 +1,77 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIFBzCCA++gAwIBAgICAgEwDQYJKoZIhvcNAQEFBQAwaDELMAkGA1UEBhMCVVMx
3
+ JTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsT
4
+ KVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2
5
+ MTExNjAxMTU0MFoXDTI2MTExNjAxMTU0MFowgdwxCzAJBgNVBAYTAlVTMRAwDgYD
6
+ VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy
7
+ ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTkwNwYDVQQLEzBodHRwOi8vY2VydGlm
8
+ aWNhdGVzLnN0YXJmaWVsZHRlY2guY29tL3JlcG9zaXRvcnkxMTAvBgNVBAMTKFN0
9
+ YXJmaWVsZCBTZWN1cmUgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxETAPBgNVBAUT
10
+ CDEwNjg4NDM1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4qddo+1m
11
+ 72ovKzYf3Y3TBQKgyg9eGa44cs8W2lRKy0gK9KFzEWWFQ8lbFwyaK74PmFF6YCkN
12
+ bN7i6OUVTVb/kNGnpgQ/YAdKym+lEOez+FyxvCsq3AF59R019Xoog/KTc4KJrGBt
13
+ y8JIwh3UBkQXPKwBR6s+cIQJC7ggCEAgh6FjGso+g9I3s5iNMj83v6G3W1/eXDOS
14
+ zz4HzrlIS+LwVVAv+HBCidGTlopj2WYN5lhuuW2QvcrchGbyOY5bplhVc8tibBvX
15
+ IBY7LFn1y8hWMkpQJ7pV06gBy3KpdIsMrTrlFbYq32X43or174Q7+edUZQuAvUdF
16
+ pfBE2FM7voDxLwIDAQABo4IBRDCCAUAwHQYDVR0OBBYEFElLUifRG7zyoSFqYntR
17
+ QnqK19VWMB8GA1UdIwQYMBaAFL9ft9HO3R+G9FtVrNzXEMIOqYjnMBIGA1UdEwEB
18
+ /wQIMAYBAf8CAQAwOQYIKwYBBQUHAQEELTArMCkGCCsGAQUFBzABhh1odHRwOi8v
19
+ b2NzcC5zdGFyZmllbGR0ZWNoLmNvbTBMBgNVHR8ERTBDMEGgP6A9hjtodHRwOi8v
20
+ Y2VydGlmaWNhdGVzLnN0YXJmaWVsZHRlY2guY29tL3JlcG9zaXRvcnkvc2Zyb290
21
+ LmNybDBRBgNVHSAESjBIMEYGBFUdIAAwPjA8BggrBgEFBQcCARYwaHR0cDovL2Nl
22
+ cnRpZmljYXRlcy5zdGFyZmllbGR0ZWNoLmNvbS9yZXBvc2l0b3J5MA4GA1UdDwEB
23
+ /wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAhlK6sx+mXmuQpmQq/EWyrp8+s2Kv
24
+ 2x9nxL3KoS/HnA0hV9D4NiHOOiU+eHaz2d283vtshF8Mow0S6xE7cV+AHvEfbQ5f
25
+ wezUpfdlux9MlQETsmqcC+sfnbHn7RkNvIV88xe9WWOupxoFzUfjLZZiUTIKCGhL
26
+ Indf90XcYd70yysiKUQl0p8Ld3qhJnxK1w/C0Ty6DqeVmlsFChD5VV/Bl4t0zF4o
27
+ aRN+0AqNnQ9gVHrEjBs1D3R6cLKCzx214orbKsayUWm/EheSYBeqPVsJ+IdlHaek
28
+ KOUiAgOCRJo0Y577KM/ozS4OUiDtSss4fJ2ubnnXlSyokfOGASGRS7VApA==
29
+ -----END CERTIFICATE-----
30
+ -----BEGIN CERTIFICATE-----
31
+ MIIFEjCCBHugAwIBAgICAQwwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1Zh
32
+ bGlDZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu
33
+ Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24g
34
+ QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAe
35
+ BgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTA0MDYyOTE3MzkxNloX
36
+ DTI0MDYyOTE3MzkxNlowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVs
37
+ ZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAy
38
+ IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0A
39
+ MIIBCAKCAQEAtzLI/ulxpgSFrQwRZN/OTe/IAxiHP6Gr+zymn/DDodrU2G4rU5D7
40
+ JKQ+hPCe6F/s5SdE9SimP3ve4CrwyK9TL57KBQGTHo9mHDmnTfpatnMEJWbrd3/n
41
+ WcZKmSUUVOsmx/N/GdUwcI+vsEYq/63rKe3Xn6oEh6PU+YmlNF/bQ5GCNtlmPLG4
42
+ uYL9nDo+EMg77wZlZnqbGRg9/3FRPDAuX749d3OyXQZswyNWmiuFJpIcpwKz5D8N
43
+ rwh5grg2Peqc0zWzvGnK9cyd6P1kjReAM25eSl2ZyR6HtJ0awNVuEzUjXt+bXz3v
44
+ 1vd2wuo+u3gNHEJnawTY+Nbab4vyRKABqwIBA6OCAfMwggHvMB0GA1UdDgQWBBS/
45
+ X7fRzt0fhvRbVazc1xDCDqmI5zCB0gYDVR0jBIHKMIHHoYHBpIG+MIG7MSQwIgYD
46
+ VQQHExtWYWxpQ2VydCBWYWxpZGF0aW9uIE5ldHdvcmsxFzAVBgNVBAoTDlZhbGlD
47
+ ZXJ0LCBJbmMuMTUwMwYDVQQLEyxWYWxpQ2VydCBDbGFzcyAyIFBvbGljeSBWYWxp
48
+ ZGF0aW9uIEF1dGhvcml0eTEhMB8GA1UEAxMYaHR0cDovL3d3dy52YWxpY2VydC5j
49
+ b20vMSAwHgYJKoZIhvcNAQkBFhFpbmZvQHZhbGljZXJ0LmNvbYIBATAPBgNVHRMB
50
+ Af8EBTADAQH/MDkGCCsGAQUFBwEBBC0wKzApBggrBgEFBQcwAYYdaHR0cDovL29j
51
+ c3Auc3RhcmZpZWxkdGVjaC5jb20wSgYDVR0fBEMwQTA/oD2gO4Y5aHR0cDovL2Nl
52
+ cnRpZmljYXRlcy5zdGFyZmllbGR0ZWNoLmNvbS9yZXBvc2l0b3J5L3Jvb3QuY3Js
53
+ MFEGA1UdIARKMEgwRgYEVR0gADA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY2VydGlm
54
+ aWNhdGVzLnN0YXJmaWVsZHRlY2guY29tL3JlcG9zaXRvcnkwDgYDVR0PAQH/BAQD
55
+ AgEGMA0GCSqGSIb3DQEBBQUAA4GBAKVi8afCXSWlcD284ipxs33kDTcdVWptobCr
56
+ mADkhWBKIMuh8D1195TaQ39oXCUIuNJ9MxB73HZn8bjhU3zhxoNbKXuNSm8uf0So
57
+ GkVrMgfHeMpkksK0hAzc3S1fTbvdiuo43NlmouxBulVtWmQ9twPMHOKRUJ7jCUSV
58
+ FxdzPcwl
59
+ -----END CERTIFICATE-----
60
+ -----BEGIN CERTIFICATE-----
61
+ MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
62
+ IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
63
+ BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
64
+ aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
65
+ 9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy
66
+ NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
67
+ azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
68
+ YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
69
+ Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
70
+ cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY
71
+ dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9
72
+ WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS
73
+ v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v
74
+ UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu
75
+ IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC
76
+ W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd
77
+ -----END CERTIFICATE-----
@@ -1,6 +1,6 @@
1
1
  require 'net/https'
2
2
  require 'rubygems'
3
- gem 'oauth', ">= 0.2.4"
3
+ gem 'oauth', ">= 0.3.5"
4
4
  require 'oauth'
5
5
  gem 'json'
6
6
  gem 'activesupport'
@@ -20,15 +20,22 @@ require 'agree2/party'
20
20
  require 'agree2/template'
21
21
 
22
22
 
23
-
24
- # FireEagle addition to the <code>OAuth::Consumer</code> class. Taken from Yahoo FireEagle GEM
25
- class OAuth::Consumer
26
- alias_method :create_http_with_verify, :create_http
27
- # Monkey patch to silence the SSL warnings
28
- def create_http_without_verify #:nodoc:
29
- http_object = create_http_with_verify
30
- http_object.verify_mode = OpenSSL::SSL::VERIFY_NONE if uri.scheme=="https"
31
- http_object
23
+ if OAuth::VERSION=='0.3.5'
24
+ unless OAuth::Consumer.method_defined? :create_http_with_ca_file_option
25
+ class OAuth::Consumer
26
+ alias_method :create_http_without_ca_file_option, :create_http
27
+ # monkey patch with ca_file option from 0.3.6 to allow us to set the agree2 certs
28
+ def create_http_with_ca_file_option(_url = nil)
29
+ http_object = create_http_without_ca_file_option(_url)
30
+ if http_object.use_ssl && @options[:ca_file]
31
+ http_object.ca_file = @options[:ca_file]
32
+ http_object.verify_mode = OpenSSL::SSL::VERIFY_PEER
33
+ http_object.verify_depth = 5
34
+ end
35
+
36
+ http_object
37
+ end
38
+ alias_method :create_http, :create_http_with_ca_file_option
39
+ end
32
40
  end
33
- alias_method :create_http, :create_http_without_verify
34
- end
41
+ end
@@ -1,7 +1,10 @@
1
1
  module Agree2
2
2
  class Agreement<Base
3
3
  attr_serializable :permalink,:title,:body,:created_at,:updated_at,:smart_fields,:state,:active_version,
4
- :version,:digest,:finalized_at,:finalized_at,:terminated_at,:activated_at,:valid_to
4
+ :version,:digest,:finalized_at,:terminated_at,:activated_at,:valid_to
5
+
6
+ attr_read_only :permalink,:state,:created_at,:updated_at,:active_version,:version,
7
+ :digest,:finalized_at,:terminated_at,:activated_at
5
8
 
6
9
  alias_method :fields,:smart_fields
7
10
  # Returns the parties to the agreement
@@ -17,6 +20,17 @@ module Agree2
17
20
  permalink
18
21
  end
19
22
 
23
+ # state of the agreement
24
+ # draft, final, active, terminated
25
+ def state
26
+ @state||=load_state
27
+ end
28
+
29
+ # has agreement been signed by all parties?
30
+ def active?
31
+ state=='active'
32
+ end
33
+
20
34
  def respond_to?(symbol, include_priv = false) #:nodoc:
21
35
  return true if super symbol,include_priv
22
36
  return false if fields.nil?||fields.empty?
@@ -40,7 +54,7 @@ module Agree2
40
54
 
41
55
  def attributes_for_save #:nodoc:
42
56
  if new_record?
43
- {self.class.singular_name=>attributes}
57
+ super
44
58
  else
45
59
  {"fields"=>fields}
46
60
  end
@@ -67,5 +81,6 @@ module Agree2
67
81
  end
68
82
  end
69
83
 
84
+
70
85
  end
71
86
  end
@@ -17,6 +17,19 @@ module Agree2
17
17
  def serializable_attributes # :nodoc:
18
18
  read_inheritable_attribute("serializable_attributes")
19
19
  end
20
+
21
+ def attr_read_only(*attributes) #:nodoc:
22
+ attributes.map!{|a|a.to_sym}
23
+ write_inheritable_attribute("read_only_attributes",
24
+ Set.new(attributes) +
25
+ (read_only_attributes || []))
26
+ protected *attributes.collect{|a| "#{a.to_s}=".to_sym }
27
+ end
28
+
29
+ # Returns an array of all the attributes that have been made accessible to mass-assignment.
30
+ def read_only_attributes # :nodoc:
31
+ read_inheritable_attribute("read_only_attributes")
32
+ end
20
33
 
21
34
  def collection_path #:nodoc:
22
35
  "/#{collection_name}"
@@ -104,8 +117,17 @@ module Agree2
104
117
 
105
118
  protected
106
119
 
120
+ # Get the primary attributes of an object as a hash
121
+ def savable_attributes #:nodoc:
122
+ (self.class.serializable_attributes-self.class.read_only_attributes).inject({}) do |h,field|
123
+ value=self.send(field)
124
+ h[field]=value if value
125
+ h
126
+ end
127
+ end
128
+
107
129
  def attributes_for_save #:nodoc:
108
- {self.class.singular_name=>attributes}
130
+ {self.class.singular_name=>savable_attributes}
109
131
  end
110
132
 
111
133
  def decode(element) #:nodoc:
@@ -128,6 +150,12 @@ module Agree2
128
150
  @from_wire=true
129
151
  load_attributes(JSON.parse(json))
130
152
  end
153
+
154
+ # Loads the state of the object if supported. This is much quicker than downloading and parsing json
155
+ def load_state #:nodoc:
156
+ user.get(to_url+".state",{"Accept"=>"text/plain"})
157
+ end
158
+
131
159
  # private
132
160
  #
133
161
  # def method_missing(method_symbol, *arguments) #:nodoc:
@@ -42,7 +42,7 @@ module Agree2
42
42
  #
43
43
  # To get these register your application at: https://agree2.com/client_applications
44
44
  def initialize(key,secret)
45
- @consumer=OAuth::Consumer.new(key,secret,{:site=>AGREE2_URL})
45
+ @consumer=OAuth::Consumer.new(key,secret,{:site=>AGREE2_URL,:ca_file=>File.join(File.dirname(__FILE__), '..','..','certs','sf_bundle.crt')})
46
46
  end
47
47
 
48
48
  # initialize a new user object with the given token and secret. The user object is what you use to do most of the work.
@@ -63,8 +63,13 @@ module Agree2
63
63
  # @request_token = @client.get_request_token
64
64
  # redirect_to @request_token.authorize_url
65
65
  #
66
- def get_request_token
67
- consumer.get_request_token
66
+ # If you want to pass a callback_url you should do so here.
67
+ #
68
+ # @request_token = @client.get_request_token :oauth_callback => "http://example.com/cb"
69
+ # redirect_to @request_token.authorize_url
70
+ #
71
+ def get_request_token(request_options = {})
72
+ consumer.get_request_token request_options
68
73
  end
69
74
 
70
75
  # Exchange an Authorized RequestToken for a working user object
@@ -72,13 +77,16 @@ module Agree2
72
77
  # === Required Field
73
78
  #
74
79
  # * <tt>request_token</tt> The Request token created using get_request_token and authorized on Agree2 by your user
80
+ # * <tt>oauth_verifier</tt> The oauth_verifier passed to your callback url
75
81
  #
76
82
  # Example:
83
+ #
84
+ # @request_token = ClientRequestToken.find_by_token params[:oauth_token]
85
+ # @user_client = @client.user_from_request_token(@request_token,params[:oauth_verifier])
77
86
  #
78
- # @user_client = @client.user_from_request_token(@request_token)
79
87
  #
80
- def user_from_request_token(request_token)
81
- access_token=request_token.get_access_token
88
+ def user_from_request_token(request_token,oauth_verifier)
89
+ access_token=request_token.get_access_token(:oauth_verifier=>oauth_verifier)
82
90
  user(access_token.token,access_token.secret)
83
91
  rescue Net::HTTPServerException=>e
84
92
  if e.response.code=='401'
@@ -1,6 +1,8 @@
1
1
  module Agree2
2
2
  class Party<Base
3
- attr_serializable :id,:role,:email,:first_name,:last_name,:created_at,:updated_at,:organization_name
3
+ attr_serializable :id,:role,:email,:first_name,:last_name,:created_at,:updated_at,:organization_name,:status
4
+ attr_read_only :id,:status,:created_at,:updated_at
5
+
4
6
  alias_method :agreement,:container
5
7
 
6
8
  # Creates a one time signed url to redirect your user to their acceptance page. This url is only valid once. Call again to
@@ -10,6 +12,13 @@ module Agree2
10
12
  AGREE2_URL+user.client.consumer.create_signed_request(:get,path,user.access_token,{:scheme=>:query_string}).path
11
13
  end
12
14
 
15
+ # Status of party
16
+ # new|invited|accepted|declined
17
+ def status
18
+ @status||=load_state
19
+ end
20
+
21
+
13
22
  def self.validate_parties_hash(parties) #:nodoc:
14
23
  parties&&parties.each{|r,p| validate_party_hash(p)}
15
24
  true
@@ -15,24 +15,24 @@ module Agree2
15
15
  @templates||=Agree2::ProxyCollection.new self,'/masters','Template'
16
16
  end
17
17
 
18
- def get(path)
19
- handle_response @access_token.get(path,AGREE2_JSON_HEADERS)
18
+ def get(path,options={})
19
+ handle_response @access_token.get(path,{'Accept'=>'application/json'}.merge(options))
20
20
  end
21
21
 
22
- def head(path)
23
- handle_response @access_token.head(path,AGREE2_JSON_HEADERS)
22
+ def head(path,options={})
23
+ handle_response @access_token.head(path,options)
24
24
  end
25
25
 
26
- def post(path,data=nil)
27
- handle_response @access_token.post(path,(data ? data.to_json : nil),AGREE2_JSON_HEADERS)
26
+ def post(path,data=nil,options={})
27
+ handle_response @access_token.post(path,(data ? data.to_json : nil),AGREE2_JSON_HEADERS.merge(options))
28
28
  end
29
29
 
30
- def put(path,data=nil)
31
- handle_response @access_token.put(path,(data ? data.to_json : nil),AGREE2_JSON_HEADERS )
30
+ def put(path,data=nil,options={})
31
+ handle_response @access_token.put(path,(data ? data.to_json : nil),AGREE2_JSON_HEADERS.merge(options) )
32
32
  end
33
33
 
34
- def delete(path)
35
- handle_response @access_token.delete(path,AGREE2_JSON_HEADERS)
34
+ def delete(path,options={})
35
+ handle_response @access_token.delete(path,options)
36
36
  end
37
37
 
38
38
  # OAuth Stuff below here
@@ -12,7 +12,7 @@ describe Agree2::Agreement do
12
12
  end
13
13
 
14
14
  it "should have attribute hash" do
15
- @agreement.attributes.should=={:title=>"My Title",:body=>"My Body"}
15
+ @agreement.send(:savable_attributes).should=={:title=>"My Title",:body=>"My Body"}
16
16
  end
17
17
 
18
18
  it "should have a user" do
@@ -38,8 +38,8 @@ describe Agree2::Client do
38
38
  access_token=mock("access_token")
39
39
  access_token.stub!(:token).and_return('token')
40
40
  access_token.stub!(:secret).and_return('token_secret')
41
- request_token.should_receive(:get_access_token).and_return(access_token)
42
- user=@client.user_from_request_token(request_token)
41
+ request_token.should_receive(:get_access_token).with(:oauth_verifier=>"verifier").and_return(access_token)
42
+ user=@client.user_from_request_token(request_token,"verifier")
43
43
  user.client.should==@client
44
44
  user.access_token.consumer.should==@client.consumer
45
45
  user.token.should=="token"
@@ -107,7 +107,7 @@ describe Party do
107
107
  describe "Save to Server" do
108
108
  before(:each) do
109
109
  @user.should_receive(:put).with("/agreements/hello/parties/1102",
110
- {'party'=>@party.attributes}).and_return(@json)
110
+ {'party'=>@party.send(:savable_attributes)}).and_return(@json)
111
111
  end
112
112
 
113
113
  it "should save and return true" do
@@ -39,9 +39,14 @@ describe Agree2::User do
39
39
  @response.stub!(:body).and_return(@json)
40
40
  end
41
41
 
42
- [:get,:head,:delete].each do |m|
42
+ it "should perform http get" do
43
+ @token.should_receive(:get).with("/test",{'Accept'=>'application/json'}).and_return(@response)
44
+ @user.send(:get,"/test").should==@json
45
+ end
46
+
47
+ [:head,:delete].each do |m|
43
48
  it "should perform http #{m.to_s}" do
44
- @token.should_receive(m).with("/test",{'Content-Type'=>'application/json','Accept'=>'application/json'}).and_return(@response)
49
+ @token.should_receive(m).with("/test",{}).and_return(@response)
45
50
  @user.send(m,"/test").should==@json
46
51
  end
47
52
  end
metadata CHANGED
@@ -1,28 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: agree2
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pelle Braendgaard
8
- - Lau Taarnskov
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
11
 
13
- date: 2008-08-23 00:00:00 -04:00
12
+ date: 2009-07-31 00:00:00 -04:00
14
13
  default_executable:
15
14
  dependencies:
16
- - !ruby/object:Gem::Dependency
17
- name: ruby-hmac
18
- type: :runtime
19
- version_requirement:
20
- version_requirements: !ruby/object:Gem::Requirement
21
- requirements:
22
- - - ">="
23
- - !ruby/object:Gem::Version
24
- version: 0.3.1
25
- version:
26
15
  - !ruby/object:Gem::Dependency
27
16
  name: oauth
28
17
  type: :runtime
@@ -31,7 +20,7 @@ dependencies:
31
20
  requirements:
32
21
  - - ">="
33
22
  - !ruby/object:Gem::Version
34
- version: 0.2.4
23
+ version: 0.3.5
35
24
  version:
36
25
  - !ruby/object:Gem::Dependency
37
26
  name: json
@@ -53,38 +42,47 @@ dependencies:
53
42
  - !ruby/object:Gem::Version
54
43
  version: 2.0.2
55
44
  version:
56
- description: Agree2 Ruby client library
57
- email:
58
- - support@agree2.com
45
+ description: Ruby library for creating and managing agreements on Agree2
46
+ email: support@agree2.com
59
47
  executables: []
60
48
 
61
49
  extensions: []
62
50
 
63
51
  extra_rdoc_files:
64
- - History.txt
65
- - License.txt
66
52
  - README.rdoc
67
53
  files:
54
+ - .gitignore
68
55
  - History.txt
69
56
  - License.txt
70
57
  - README.rdoc
71
58
  - Rakefile
59
+ - VERSION
60
+ - agree2.gemspec
61
+ - certs/sf_bundle.crt
72
62
  - lib/agree2.rb
63
+ - lib/agree2/agreement.rb
73
64
  - lib/agree2/base.rb
74
65
  - lib/agree2/client.rb
75
- - lib/agree2/user.rb
76
- - lib/agree2/agreement.rb
77
66
  - lib/agree2/party.rb
78
67
  - lib/agree2/proxy_collection.rb
79
68
  - lib/agree2/template.rb
69
+ - lib/agree2/user.rb
70
+ - spec/agreement_spec.rb
71
+ - spec/client_spec.rb
72
+ - spec/fixtures/agreement.json
73
+ - spec/fixtures/party.json
74
+ - spec/party_spec.rb
75
+ - spec/proxy_collection_spec.rb
76
+ - spec/spec_helper.rb
77
+ - spec/template_spec.rb
78
+ - spec/user_spec.rb
80
79
  has_rdoc: true
81
- homepage: http://agree2.rubyforge.org
80
+ homepage: http://agree2.com
82
81
  licenses: []
83
82
 
84
83
  post_install_message:
85
84
  rdoc_options:
86
- - --main
87
- - README.rdoc
85
+ - --charset=UTF-8
88
86
  require_paths:
89
87
  - lib
90
88
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -102,17 +100,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
102
100
  requirements: []
103
101
 
104
102
  rubyforge_project: agree2
105
- rubygems_version: 1.3.2
103
+ rubygems_version: 1.3.5
106
104
  signing_key:
107
- specification_version: 2
108
- summary: Agree2 Ruby client library
105
+ specification_version: 3
106
+ summary: Ruby client library for Agree2
109
107
  test_files:
110
- - spec/spec_helper.rb
111
108
  - spec/agreement_spec.rb
112
109
  - spec/client_spec.rb
113
110
  - spec/party_spec.rb
114
111
  - spec/proxy_collection_spec.rb
112
+ - spec/spec_helper.rb
115
113
  - spec/template_spec.rb
116
114
  - spec/user_spec.rb
117
- - spec/fixtures/agreement.json
118
- - spec/fixtures/party.json