redline 0.1.1 → 0.1.2

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/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2009 James Daniels
1
+ Copyright (c) 2010 MarginLeft, LLC
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
@@ -2,18 +2,43 @@
2
2
 
3
3
  Braintree via Redline: riding the rails
4
4
 
5
- Automatically makes creation/deletion/update scripts for your model, translating and syncing them with a Braintree customer profile.
5
+ Redline helps you with Braintree on Rails, it automatically makes creation/deletion/update scripts for your model, translating and syncing them with a Braintree customer profile. In the future I plan to increase the capabilities with helpers for Braintree models and light-weight subscription support, perhaps using Braintree's reoccurring billing.
6
6
 
7
- Planning on adding extremely light-weight subscription support.
7
+ == Getting started
8
8
 
9
+ Set up the gem dependancies in environment.rb:
10
+
11
+ config.gem 'braintree'
12
+ config.gem 'redline'
13
+
14
+ Run your install task:
15
+
16
+ $ rake gems:install
17
+
18
+ Configure Braintree normally in an initializer:
19
+
20
+ Braintree::Configuration.environment = CONFIG[:braintree][:environment].to_sym
21
+ Braintree::Configuration.merchant_id = CONFIG[:braintree][:merchant_id]
22
+ Braintree::Configuration.public_key = CONFIG[:braintree][:public_key]
23
+ Braintree::Configuration.private_key = CONFIG[:braintree][:private_key]
24
+
25
+ Add acts_as_braintree_customer and a column customer_id:integer to a model of your choice:
26
+
27
+ add_column :users, :customer_id, :integer
28
+
29
+ Class User < ActiveRecord::Base
30
+ acts_as_braintree_customer
31
+ end
32
+
33
+ == Example and configuration
34
+
35
+ acts_as_braintree_customer takes an optional series of attributes that represent an attribute[] mapper
9
36
 
10
37
  class User < ActiveRecord::Base
11
38
  acts_as_braintree_customer :business_name => :company, :firstname => :first_name, :lastname => :last_name
12
39
  attr_accessible :firstname, :lastname, :website, :email, :business_name, :password, :password_confirmation
13
40
  end
14
41
 
15
- acts_as_braintree_customer takes an optional series of attributes that represent an attribute[] mapper
16
-
17
42
  james = User.find(1) #=> <User id: 1, firstname: "James", lastname: "Daniels", business_name: "MarginLeft, LLC", email: 'james@jamesdaniels.net', website: 'http://www.marginleft.com', crypted_password: "45fres8...", persistence_token: "4jsdf88...", ...>
18
43
  james.customer #=> <Braintree::Customer id: "9999999", first_name: "James", last_name: "Daniels", company: "MarginLeft, LLC", email: "james@jamesdaniels.net", website: "http://www.marginleft.com", ..., addresses: [], credit_cards: []>
19
44
 
@@ -31,4 +56,4 @@ More to come.
31
56
 
32
57
  == Copyright
33
58
 
34
- Copyright (c) 2010 James Daniels. See LICENSE for details.
59
+ Copyright (c) 2010 MarginLeft, LLC. See LICENSE for details.
data/Rakefile CHANGED
@@ -7,12 +7,13 @@ begin
7
7
  gem.name = "redline"
8
8
  gem.summary = %Q{Braintree via redline: riding the rails}
9
9
  gem.description = %Q{Manual subscriptions via the Braintree gem}
10
- gem.email = "james@jamesdaniels.net"
10
+ gem.email = "james@marginleft.com"
11
11
  gem.homepage = "http://github.com/jamesdaniels/redline"
12
12
  gem.authors = ["James Daniels"]
13
13
  gem.add_development_dependency "rspec", ">= 1.2.9"
14
14
  gem.add_development_dependency "braintree"
15
15
  gem.add_development_dependency "activerecord"
16
+ gem.add_development_dependency "activesupport"
16
17
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
17
18
  end
18
19
  Jeweler::GemcutterTasks.new
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.1
1
+ 0.1.2
@@ -1,17 +1,8 @@
1
1
  require 'rubygems'
2
2
  require 'active_record'
3
3
 
4
- class Hash
5
- def rewrite mapping
6
- inject({}) do |rewritten_hash, (original_key, value)|
7
- rewritten_hash[mapping.fetch(original_key, original_key)] = value
8
- rewritten_hash
9
- end
10
- end
11
- end
12
-
13
4
  module RedLine
14
- def acts_as_braintree_customer(attribute_rewriting)
5
+ def acts_as_braintree_customer(attribute_rewriting = {})
15
6
  send :include, RedLine::Customer
16
7
  send 'braintree_customer=', attribute_rewriting
17
8
  end
@@ -30,7 +21,10 @@ module RedLine
30
21
  module InstanceMethods
31
22
  def braintree_customer_attributes
32
23
  wanted_attributes = Braintree::Customer._create_signature.reject{|a| a.is_a? Hash}.reject{|a| a == :id}
33
- attributes.symbolize_keys.rewrite(self.class.braintree_customer || {}).reject{|key, value| !wanted_attributes.include?(key)}
24
+ attributes.symbolize_keys.inject({}) do |rewritten_hash, (original_key, value)|
25
+ rewritten_hash[self.class.braintree_customer.fetch(original_key, original_key)] = value
26
+ rewritten_hash
27
+ end.reject{|key, value| !wanted_attributes.include?(key)}
34
28
  end
35
29
  def customer
36
30
  Braintree::Customer.find(customer_id)
@@ -5,13 +5,13 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{redline}
8
- s.version = "0.1.1"
8
+ s.version = "0.1.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["James Daniels"]
12
12
  s.date = %q{2010-01-19}
13
13
  s.description = %q{Manual subscriptions via the Braintree gem}
14
- s.email = %q{james@jamesdaniels.net}
14
+ s.email = %q{james@marginleft.com}
15
15
  s.extra_rdoc_files = [
16
16
  "LICENSE",
17
17
  "README.rdoc"
@@ -25,6 +25,10 @@ Gem::Specification.new do |s|
25
25
  "VERSION",
26
26
  "lib/redline.rb",
27
27
  "redline.gemspec",
28
+ "spec/db/database.yml",
29
+ "spec/db/models.rb",
30
+ "spec/db/schema.rb",
31
+ "spec/db/test.sqlite3",
28
32
  "spec/redline_spec.rb",
29
33
  "spec/spec.opts",
30
34
  "spec/spec_helper.rb"
@@ -35,7 +39,9 @@ Gem::Specification.new do |s|
35
39
  s.rubygems_version = %q{1.3.5}
36
40
  s.summary = %q{Braintree via redline: riding the rails}
37
41
  s.test_files = [
38
- "spec/redline_spec.rb",
42
+ "spec/db/models.rb",
43
+ "spec/db/schema.rb",
44
+ "spec/redline_spec.rb",
39
45
  "spec/spec_helper.rb"
40
46
  ]
41
47
 
@@ -47,15 +53,18 @@ Gem::Specification.new do |s|
47
53
  s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
48
54
  s.add_development_dependency(%q<braintree>, [">= 0"])
49
55
  s.add_development_dependency(%q<activerecord>, [">= 0"])
56
+ s.add_development_dependency(%q<activesupport>, [">= 0"])
50
57
  else
51
58
  s.add_dependency(%q<rspec>, [">= 1.2.9"])
52
59
  s.add_dependency(%q<braintree>, [">= 0"])
53
60
  s.add_dependency(%q<activerecord>, [">= 0"])
61
+ s.add_dependency(%q<activesupport>, [">= 0"])
54
62
  end
55
63
  else
56
64
  s.add_dependency(%q<rspec>, [">= 1.2.9"])
57
65
  s.add_dependency(%q<braintree>, [">= 0"])
58
66
  s.add_dependency(%q<activerecord>, [">= 0"])
67
+ s.add_dependency(%q<activesupport>, [">= 0"])
59
68
  end
60
69
  end
61
70
 
@@ -0,0 +1,3 @@
1
+ active_record_merge_test:
2
+ adapter: sqlite3
3
+ database: 'spec/db/test.sqlite3'
@@ -0,0 +1,15 @@
1
+ class User < ActiveRecord::Base
2
+
3
+ acts_as_braintree_customer
4
+
5
+ validates_presence_of :first_name, :last_name, :unused_attribute, :email
6
+
7
+ end
8
+
9
+ class ComplexUser < ActiveRecord::Base
10
+
11
+ acts_as_braintree_customer :firstname => :first_name, :lastname => :last_name
12
+
13
+ validates_presence_of :firstname, :lastname, :unused_attribute, :email
14
+
15
+ end
@@ -0,0 +1,16 @@
1
+ ActiveRecord::Schema.define(:version => 1) do
2
+ create_table :users, :force => true do |t|
3
+ t.column :first_name, :string
4
+ t.column :last_name, :string
5
+ t.column :email, :string
6
+ t.column :unused_attribute, :string
7
+ t.column :customer_id, :integer
8
+ end
9
+ create_table :complex_users, :force => true do |t|
10
+ t.column :firstname, :string
11
+ t.column :lastname, :string
12
+ t.column :email, :string
13
+ t.column :unused_attribute, :string
14
+ t.column :customer_id, :integer
15
+ end
16
+ end
Binary file
@@ -1,7 +1,70 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
 
3
- describe "Redline" do
4
- it "fails" do
5
- fail "hey buddy, you should probably rename this file and start specing for real"
6
- end
3
+ describe User do
4
+
5
+ def valid_user
6
+ Braintree::Customer.stub!('_create_signature').and_return([:first_name, :last_name, :email])
7
+ @user ||= User.new(
8
+ :first_name => 'James',
9
+ :last_name => 'Daniels',
10
+ :email => 'james@marginleft.com',
11
+ :unused_attribute => 'unused'
12
+ )
13
+ end
14
+
15
+ def mock_customer
16
+ @customer ||= mock(Braintree::Customer, :id => 1)
17
+ end
18
+
19
+ it "should have a empty braintree_customer" do
20
+ User.braintree_customer.should eql({})
21
+ end
22
+ it "should inherit the instance methods" do
23
+ expected_methods = %w(braintree_customer_attributes customer create_customer update_customer delete_customer)
24
+ (User.instance_methods & expected_methods).sort.should eql(expected_methods.sort)
25
+ end
26
+ it "should have proper braintree attributes" do
27
+ valid_user.braintree_customer_attributes.should eql({:first_name=>"James", :last_name=>"Daniels", :email=>"james@marginleft.com"})
28
+ end
29
+ it "should fire Braintree::Customer.create!" do
30
+ Braintree::Customer.should_receive('create!').with(valid_user.braintree_customer_attributes).and_return(mock_customer)
31
+ valid_user.save!
32
+ valid_user.customer_id.should eql(mock_customer.id)
33
+ end
34
+ it "should fire Braintree::Customer.update!" do
35
+ Braintree::Customer.stub!('create!').and_return(mock_customer)
36
+ Braintree::Customer.should_receive('update!').with(mock_customer.id, valid_user.braintree_customer_attributes.merge(:email => 'james@jamesdaniels.net')).and_return(true)
37
+ valid_user.save!
38
+ valid_user.update_attributes(:email => 'james@jamesdaniels.net')
39
+ valid_user.customer_id.should eql(mock_customer.id)
40
+ end
41
+ it "should fire Braintree::Customer.delete" do
42
+ Braintree::Customer.stub!('create!').and_return(mock_customer)
43
+ Braintree::Customer.stub!('find').and_return(true)
44
+ Braintree::Customer.should_receive('delete').with(mock_customer.id).and_return(true)
45
+ valid_user.save!
46
+ valid_user.destroy
47
+ end
48
+ it "should fire Braintree::Customer.find" do
49
+ Braintree::Customer.stub!('create!').and_return(mock_customer)
50
+ Braintree::Customer.stub!('update!').and_return(true)
51
+ Braintree::Customer.should_receive('find').with(mock_customer.id).and_return(true)
52
+ valid_user.save!
53
+ valid_user.customer
54
+ end
7
55
  end
56
+
57
+ describe ComplexUser do
58
+ it "should have a empty braintree_customer" do
59
+ ComplexUser.braintree_customer.should eql({:firstname=>:first_name, :lastname=>:last_name})
60
+ end
61
+ it "should have proper braintree attributes" do
62
+ Braintree::Customer.stub!('_create_signature').and_return([:first_name, :last_name, :email])
63
+ ComplexUser.new(
64
+ :firstname => 'James',
65
+ :lastname => 'Daniels',
66
+ :email => 'james@marginleft.com',
67
+ :unused_attribute => 'unused'
68
+ ).braintree_customer_attributes.should eql({:first_name=>"James", :last_name=>"Daniels", :email=>"james@marginleft.com"})
69
+ end
70
+ end
@@ -1,9 +1,30 @@
1
1
  $LOAD_PATH.unshift(File.dirname(__FILE__))
2
2
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
3
  require 'redline'
4
+ require 'active_record'
5
+ require 'active_record/fixtures'
6
+ require 'active_support'
4
7
  require 'spec'
5
8
  require 'spec/autorun'
6
9
 
10
+ # establish the database connection
11
+ ActiveRecord::Base.configurations = YAML::load(IO.read(File.dirname(__FILE__) + '/db/database.yml'))
12
+ ActiveRecord::Base.establish_connection('active_record_merge_test')
13
+
14
+ # load the schema
15
+ $stdout = File.open('/dev/null', 'w')
16
+ load(File.dirname(__FILE__) + "/db/schema.rb")
17
+ $stdout = STDOUT
18
+
19
+ # load the models
20
+ require File.dirname(__FILE__) + '/db/models'
21
+
22
+ # Fake Braintree, for stubbing
23
+ module Braintree
24
+ class Customer
25
+ end
26
+ end
27
+
7
28
  Spec::Runner.configure do |config|
8
29
 
9
30
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redline
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Daniels
@@ -42,8 +42,18 @@ dependencies:
42
42
  - !ruby/object:Gem::Version
43
43
  version: "0"
44
44
  version:
45
+ - !ruby/object:Gem::Dependency
46
+ name: activesupport
47
+ type: :development
48
+ version_requirement:
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: "0"
54
+ version:
45
55
  description: Manual subscriptions via the Braintree gem
46
- email: james@jamesdaniels.net
56
+ email: james@marginleft.com
47
57
  executables: []
48
58
 
49
59
  extensions: []
@@ -60,6 +70,10 @@ files:
60
70
  - VERSION
61
71
  - lib/redline.rb
62
72
  - redline.gemspec
73
+ - spec/db/database.yml
74
+ - spec/db/models.rb
75
+ - spec/db/schema.rb
76
+ - spec/db/test.sqlite3
63
77
  - spec/redline_spec.rb
64
78
  - spec/spec.opts
65
79
  - spec/spec_helper.rb
@@ -92,5 +106,7 @@ signing_key:
92
106
  specification_version: 3
93
107
  summary: "Braintree via redline: riding the rails"
94
108
  test_files:
109
+ - spec/db/models.rb
110
+ - spec/db/schema.rb
95
111
  - spec/redline_spec.rb
96
112
  - spec/spec_helper.rb