leadtune 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -19,26 +19,6 @@ detailed below. Available configuration values include:
19
19
  * password
20
20
  * organization
21
21
 
22
- === Configuration File
23
-
24
- The configuration file can be specified when calling Prospect#new. If no
25
- file is specified, the gem will also look for +leadtune.yml+ in the
26
- current directory.
27
-
28
- ==== Format
29
-
30
- The configuration file is a YAML file, an example of which is:
31
- username: me@mycorp.com
32
- password: my_secret
33
- organization: MYC
34
-
35
- === Environment Variables
36
-
37
- Your LeadTune username, password, and organization can be specified in the
38
- +LEADTUNE_USERNAME+, +LEADTUNE_PASSWORD+, and +LEADTUNE_ORGANIZATION+
39
- environment variables. <em>These values take precedence over values read
40
- from the configuration file.</em>
41
-
42
22
  === Rack Initializer
43
23
 
44
24
  # config/initializers/leadtune.rb
@@ -46,23 +26,19 @@ from the configuration file.</em>
46
26
  Leadtune::Config.password = "my_secret"
47
27
  Leadtune::Config.organization = "MYC"
48
28
 
49
- <em>These values take precedence over values read from environment variables
50
- or configuration file.</em>
51
-
52
29
  === Factors Hash
53
30
 
54
31
  When initializing your Leadtune::Prospect, you can include your username,
55
32
  password, and organization along with any factors you wish to
56
- submit. <em>These values take precedence over values read from rack
57
- initializers, environment variables, or the configuration file.</em>
33
+ submit. <em>These values take precedence over values read from the rack
34
+ initializer.</em>
58
35
 
59
36
  === Instance Methods
60
37
 
61
38
  You can also set your username, password, and organization by calling the
62
39
  Leadtune::Prospect object's #username=, #password=, and #organization=
63
40
  methods. <em>These values take precedence over values read from the factors
64
- hash, rack initializers, environment variables, or the configuration
65
- file.</em>
41
+ hash and the rack initializer.</em>
66
42
 
67
43
  == Example Usage
68
44
 
@@ -97,9 +73,9 @@ An attempt was made to allow for an ActiveModel-like interface.
97
73
  ... and so on
98
74
  prospect.post
99
75
 
100
- == Automatic Environment Determination
76
+ == Automatic Environment Detection
101
77
 
102
- At initialization, an attempt is made to determine your application's current
78
+ At initialization, an attempt is made to detect your application's current
103
79
  environment. If a rack or rails production environment is detected, prospects
104
80
  will be posted to LeadTune's production host. Otherwise prospects will be
105
81
  posted to LeadTune's sandbox host. The application environment can be
data/Rakefile CHANGED
@@ -36,7 +36,4 @@ end
36
36
 
37
37
  task :hudson => [:spec, :rdoc,]
38
38
 
39
- task :default => [:spec, :cucumber,]
40
-
41
-
42
-
39
+ task :default => [:spec,]# :cucumber,]
@@ -16,10 +16,6 @@ module Leadtune
16
16
  @@organization = nil
17
17
  @@timeout = nil
18
18
 
19
- def initialize(config_file=nil)
20
- load_config_file_values(config_file)
21
- end
22
-
23
19
  def self.username=(username)
24
20
  @@username = username
25
21
  end
@@ -37,32 +33,27 @@ module Leadtune
37
33
  end
38
34
 
39
35
  def self.timeout=(timeout)
40
- @@timeout = timeout.to_i
36
+ @@timeout = timeout
41
37
  end
42
38
 
43
39
  def username
44
- @username ||= @@username || ENV["LEADTUNE_USERNAME"] || @config_file_values["username"]
40
+ @username ||= @@username
45
41
  end
46
42
 
47
43
  def password
48
- @password ||= @@password || ENV["LEADTUNE_PASSWORD"] || @config_file_values["password"]
44
+ @password ||= @@password
49
45
  end
50
46
 
51
47
  def timeout
52
- @timeout ||= (@@timeout ||
53
- ENV["LEADTUNE_TIMEOUT"] ||
54
- @config_file_values["timeout"] ||
55
- DEFAULT_TIMEOUT).to_i
48
+ @timeout ||= @@timeout || DEFAULT_TIMEOUT
56
49
  end
57
50
 
58
51
  def organization
59
- @@organization || ENV["LEADTUNE_ORGANIZATION"] || @config_file_values["organization"]
52
+ @@organization
60
53
  end
61
54
 
62
55
  def leadtune_host
63
- @leadtune_host ||= (ENV["LEADTUNE_HOST"] ||
64
- @config_file_values["host"] ||
65
- LEADTUNE_HOSTS[environment])
56
+ @leadtune_host ||= @@leadtune_host || LEADTUNE_HOSTS[environment]
66
57
  end
67
58
 
68
59
  def environment
@@ -83,28 +74,6 @@ module Leadtune
83
74
 
84
75
  private
85
76
 
86
- def load_config_file_values(config_file)
87
- @config_file_values = {}
88
-
89
- find_config_file(config_file) do |config_file|
90
- @config_file_values = YAML::load(config_file)
91
- end
92
- end
93
-
94
- def find_config_file(config_file)
95
- case config_file
96
- when String
97
- yield File.open(config_file)
98
- when File, StringIO
99
- yield config_file
100
- when nil
101
- if File.exist?("leadtune.yml")
102
- yield File.open("leadtune.yml")
103
- end
104
- end
105
- end
106
-
107
-
108
77
  DEFAULT_TIMEOUT = 5
109
78
  LEADTUNE_HOST_SANDBOX = "https://sandbox-appraiser.leadtune.com".freeze
110
79
  LEADTUNE_HOST_PRODUCTION = "https://appraiser.leadtune.com".freeze
@@ -29,18 +29,13 @@ module Leadtune
29
29
  class Prospect
30
30
  attr_accessor :decision #:nodoc:
31
31
 
32
- # Initialize a new Leadtune::Prospect object.
33
- #
34
- # [+config_file+] An optional filename or a file-like object
35
- # [+factors+] A hash of factors with which to initialize the Prospect
36
-
37
- def initialize(*args, &block)
32
+ def initialize(options_and_factors={}, &block)
38
33
  @factors = {}
39
34
  @decision = nil
40
- @config = Config.new(args.first)
35
+ @config = Config.new
41
36
  @rest = Rest.new(@config)
42
37
 
43
- load_options_and_factors(args.extract_options!)
38
+ load_options_and_factors(options_and_factors)
44
39
  block.call(self) if block_given?
45
40
  end
46
41
 
@@ -48,24 +43,24 @@ module Leadtune
48
43
  #
49
44
  # Raises a Leadtune::LeadtuneError if a non-2XX response is received.
50
45
 
51
- def self.get(options={}, &block)
52
- new(options, &block).get
46
+ def self.get(options_and_factors={}, &block)
47
+ new(options_and_factors, &block).get
53
48
  end
54
49
 
55
50
  # Post a prospect to the LeadTune Appraiser service.
56
51
  #
57
52
  # Raises a Leadtune::LeadtuneError if a non-2XX response is received.
58
53
 
59
- def self.post(options={}, &block)
60
- new(options, &block).post
54
+ def self.post(options_and_factors={}, &block)
55
+ new(options_and_factors, &block).post
61
56
  end
62
57
 
63
58
  # Update a prospect from the LeadTune Appraiser service.
64
59
  #
65
60
  # Raises a Leadtune::LeadtuneError if a non-2XX response is received.
66
61
 
67
- def self.put(options={}, &block)
68
- new(options, &block).put
62
+ def self.put(options_and_factors={}, &block)
63
+ new(options_and_factors, &block).put
69
64
  end
70
65
 
71
66
  # Get a prospect from the LeadTune Appraiser service.
@@ -159,6 +154,14 @@ module Leadtune
159
154
  @config.leadtune_host
160
155
  end
161
156
 
157
+ def timeout=(timeout) #:nodoc:
158
+ @config.timeout = timeout
159
+ end
160
+
161
+ def timeout #:nodoc:
162
+ @config.timeout
163
+ end
164
+
162
165
  def username=(username)
163
166
  @config.username = username
164
167
  end
@@ -167,18 +170,18 @@ module Leadtune
167
170
  @config.password = password
168
171
  end
169
172
 
170
- def response
173
+ def response #:nodoc:
171
174
  @rest.response
172
175
  end
173
176
 
174
- def payload
177
+ def payload #:nodoc:
175
178
  post_data.reject {|k,v| CURL_OPTIONS.include?(k)}
176
179
  end
177
180
 
178
181
 
179
182
  private
180
183
 
181
- CURL_OPTIONS = ["username", "password", "timeout", "leadtune_host",]
184
+ CURL_OPTIONS = ["username", "password", "timeout", "leadtune_host",] #:nodoc:
182
185
 
183
186
  def post_data #:nodoc:
184
187
  @factors.merge("decision" => @decision,
data/lib/leadtune/rest.rb CHANGED
@@ -89,7 +89,7 @@ module Leadtune
89
89
  params.merge!(:prospect_ref => @post_data["prospect_ref"])
90
90
  end
91
91
 
92
- URI.join(build_put_url, "?" + params.to_params).to_s
92
+ URI.join(build_put_url, "?" + Leadtune::Util.to_params(params)).to_s
93
93
  end
94
94
 
95
95
  def build_put_url #:nodoc:
@@ -0,0 +1,38 @@
1
+ # LeadTune API Ruby Gem
2
+ #
3
+ # http://github.com/leadtune/leadtune-ruby
4
+ # Eric Wollesen (mailto:devs@leadtune.com)
5
+ # Copyright 2010 LeadTune LLC
6
+
7
+ module Leadtune
8
+ class Util
9
+
10
+ # File merb/core_ext/hash.rb, line 87, with slight tweaks
11
+
12
+ def self.to_params(hash)
13
+ params = ''
14
+ stack = []
15
+
16
+ hash.each do |k, v|
17
+ if v.is_a?(Hash)
18
+ stack << [k,v]
19
+ else
20
+ params << "#{k}=#{v}&"
21
+ end
22
+ end
23
+
24
+ stack.each do |parent, sub_hash|
25
+ sub_hash.each do |k, v|
26
+ if v.is_a?(Hash)
27
+ stack << ["#{parent}[#{k}]", v]
28
+ else
29
+ params << "#{parent}[#{k}]=#{v}&"
30
+ end
31
+ end
32
+ end
33
+
34
+ params.chop! # trailing &
35
+ params
36
+ end
37
+ end
38
+ end
@@ -5,5 +5,5 @@
5
5
  # Copyright 2010 LeadTune LLC
6
6
 
7
7
  module Leadtune
8
- VERSION = "0.0.2"
8
+ VERSION = "0.0.3"
9
9
  end
data/lib/leadtune.rb CHANGED
@@ -7,10 +7,6 @@
7
7
  dir = File.dirname(__FILE__)
8
8
  $LOAD_PATH.unshift dir unless $LOAD_PATH.include?(dir)
9
9
 
10
- require "array_extensions"
11
- require "hash_extensions"
12
-
13
-
14
10
  # For details about the LeadTune API, see: http://leadtune.com/api
15
11
 
16
12
  module Leadtune #:nodoc:all
@@ -18,19 +14,24 @@ end
18
14
 
19
15
  # Raised when non-2XX responses are received.
20
16
  class Leadtune::LeadtuneError < RuntimeError
21
- attr_reader :code, :message
17
+
18
+ # HTTP status code
19
+ attr_reader :code
20
+
21
+ # Any body text included with the response
22
+ attr_reader :message
22
23
 
23
24
  def initialize(code, message)
24
25
  @code, @message = code, message
25
26
  end
26
27
 
27
- def to_s
28
+ def to_s #:nodoc:
28
29
  "#{@code} #{message}"
29
30
  end
30
31
  end
31
32
 
32
33
 
33
-
34
+ require "leadtune/util"
34
35
  require "leadtune/prospect"
35
36
  require "leadtune/rest"
36
37
  require "leadtune/appraisals"
@@ -6,18 +6,17 @@
6
6
 
7
7
  require "spec_helper"
8
8
 
9
- class Leadtune::Config
10
- def self.reset_class_vars
11
- @@timeout = nil
12
- @@organization = nil
13
- @@username = nil
14
- @@password = nil
15
- end
16
- end
17
-
18
9
  describe Leadtune::Config do
19
- before(:each) {Leadtune::Config.reset_class_vars}
20
- after(:each) {Leadtune::Config.reset_class_vars}
10
+ before(:each) {teardown_initializer}
11
+ after(:each) {teardown_initializer}
12
+
13
+ it "reads environment from APP_ENV" do
14
+ ENV["APP_ENV"] = "production"
15
+
16
+ subject.environment.should == :production
17
+
18
+ ENV.delete("APP_ENV")
19
+ end
21
20
 
22
21
  context("can set") do
23
22
  it "password" do
@@ -43,5 +42,11 @@ describe Leadtune::Config do
43
42
 
44
43
  Leadtune::Config.new.organization.should == "ORG"
45
44
  end
45
+
46
+ it "leadtune_host" do
47
+ Leadtune::Config.leadtune_host = "http://bad_url_for_test"
48
+
49
+ Leadtune::Config.new.leadtune_host.should == "http://bad_url_for_test"
50
+ end
46
51
  end
47
52
  end
@@ -15,21 +15,11 @@ describe Leadtune::Prospect do
15
15
  "email" => "bar@baz.com",
16
16
  "target_buyers" => ["AcmeU", "Bravo", "ConvU",],
17
17
  "event" => "offers_prepared",}) do |p|
18
- # use ||= so we won't override if loaded from ENV or config_file
18
+ # use ||= so we won't override if loaded from initializer
19
19
  p.organization ||= "Foo"
20
20
  end
21
21
  end
22
22
 
23
- context("w/ organization from config_file") do
24
- subject do
25
- Leadtune::Prospect.new(leadtune_config_file)
26
- end
27
-
28
- describe "#organization" do
29
- specify {subject.organization.should == "config_file_org"}
30
- end
31
- end
32
-
33
23
  context("when presented with an unrecognized factor") do
34
24
  it "creates a setter and a getter by that name" do
35
25
  fail "getter already exists" if subject.respond_to?(:my_new_factor)
@@ -43,41 +33,6 @@ describe Leadtune::Prospect do
43
33
  end
44
34
  end
45
35
 
46
- context("w/ organization from ENV") do
47
- before(:all) do
48
- setup_leadtune_env
49
- end
50
-
51
- after(:all) do
52
- teardown_leadtune_env
53
- end
54
-
55
- subject {Leadtune::Prospect.new}
56
-
57
- describe "#organization" do
58
- specify {subject.organization.should == "env_org"}
59
- end
60
- end
61
-
62
- context("w/ organization from ENV *AND* config_file") do
63
-
64
- before(:all) do
65
- setup_leadtune_env
66
- end
67
-
68
- after(:all) do
69
- teardown_leadtune_env
70
- end
71
-
72
- subject {Leadtune::Prospect.new(leadtune_config_file)}
73
-
74
- describe "#organization" do
75
- it "uses the ENV value over the config file" do
76
- subject.organization.should == "env_org"
77
- end
78
- end
79
- end
80
-
81
36
  describe "#get" do
82
37
  before(:each) do
83
38
  stub_request(:any, /.*leadtune.*/).to_return(:body => fake_curb_response)
@@ -114,13 +69,6 @@ describe Leadtune::Prospect do
114
69
 
115
70
  s.channel.should == "banner"
116
71
  end
117
-
118
- it "accepts a config_file as its (optional) first argument" do
119
- s = Leadtune::Prospect.new(leadtune_config_file, {:channel => "banner",})
120
-
121
- s.channel.should == "banner"
122
- s.organization.should == "config_file_org"
123
- end
124
72
  end
125
73
 
126
74
  describe("#target_buyers=") do
@@ -136,6 +84,17 @@ describe Leadtune::Prospect do
136
84
  end
137
85
  end
138
86
 
87
+ context("w/ organization from initializer") do
88
+ before(:each) {setup_initializer}
89
+ after(:each) {teardown_initializer}
90
+
91
+ describe("#organization") do
92
+ it "uses the initializer value" do
93
+ subject.organization.should == "init_org"
94
+ end
95
+ end
96
+ end
97
+
139
98
 
140
99
  private
141
100
 
@@ -14,94 +14,35 @@ describe Leadtune::Rest do
14
14
 
15
15
  subject {Leadtune::Rest.new(Leadtune::Config.new)}
16
16
 
17
- context("w/ username & password from config_file") do
18
-
19
- subject {Leadtune::Rest.new(rest_config)}
17
+ context("w/ username and password from initializer") do
20
18
 
21
19
  before(:each) do
22
20
  @curl_easy = null_curl_easy
21
+ setup_initializer
23
22
  end
24
23
 
25
- describe "#username" do
26
- it "uses the config_file value" do
27
- @curl_easy.should_receive(:username=).with("config@config.com")
28
-
29
- subject.get(mock_post_data)
30
- end
31
- end
32
-
33
- describe "#password" do
34
- it "uses the config_file value" do
35
- @curl_easy.should_receive(:password=).with("config_secret")
36
-
37
- subject.get(mock_post_data)
38
- end
39
- end
40
- end
41
-
42
- context("w/ username & password from ENV") do
43
- before(:all) do
44
- setup_leadtune_env
45
- end
46
-
47
- after(:all) do
48
- teardown_leadtune_env
49
- end
50
-
51
- before(:each) do
52
- @curl_easy = null_curl_easy
24
+ after(:each) do
25
+ teardown_initializer
53
26
  end
54
27
 
55
28
  describe "#username" do
56
- it "uses the ENV value" do
57
- @curl_easy.should_receive(:username=).with("env@env.com")
58
-
59
- subject.get(mock_post_data)
60
- end
61
- end
62
-
63
- describe "#password" do
64
- it "uses the ENV value" do
65
- @curl_easy.should_receive(:password=).with("env_secret")
66
-
67
- subject.get(mock_post_data)
68
- end
69
- end
70
- end
71
-
72
- context("w/ username & password from ENV *AND* config_file") do
73
-
74
- subject {Leadtune::Rest.new(rest_config)}
75
-
76
- before(:all) do
77
- setup_leadtune_env
78
- end
79
-
80
- after(:all) do
81
- teardown_leadtune_env
82
- end
83
-
84
- before(:each) do
85
- @curl_easy = null_curl_easy
86
- end
87
-
88
- describe "#username" do
89
- it "uses the ENV value over the config file" do
90
- @curl_easy.should_receive(:username=).with("env@env.com")
29
+ it "uses the initializer value" do
30
+ @curl_easy.should_receive(:username=).with("init_user")
91
31
 
92
32
  subject.get(mock_post_data)
93
33
  end
94
34
  end
95
35
 
96
36
  describe "#password" do
97
- it "uses the ENV value over the config file" do
98
- @curl_easy.should_receive(:password=).with("env_secret")
37
+ it "uses the initializer value" do
38
+ @curl_easy.should_receive(:password=).with("init_secret")
99
39
 
100
40
  subject.get(mock_post_data)
101
41
  end
102
42
  end
103
43
  end
104
44
 
45
+
105
46
  describe "#post (slow)" do
106
47
 
107
48
  before(:all) {WebMock.allow_net_connect!}
@@ -123,12 +64,6 @@ describe Leadtune::Rest do
123
64
  @curl_easy = null_curl_easy
124
65
  end
125
66
 
126
- it "is passed on to Curl::Easy" do
127
- @curl_easy.should_receive(:timeout=).with(5)
128
-
129
- subject.get(mock_post_data)
130
- end
131
-
132
67
  context("by default") do
133
68
  it "is 5" do
134
69
  @curl_easy.should_receive(:timeout=).with(5)
@@ -137,25 +72,15 @@ describe Leadtune::Rest do
137
72
  end
138
73
  end
139
74
 
140
- context("with timeout of 6 in ENV value") do
141
- before(:all) do
142
- ENV["LEADTUNE_TIMEOUT"] = "6"
75
+ context("with timeout of 7 in initializer") do
76
+ before(:each) do
77
+ setup_initializer
143
78
  end
144
79
 
145
- after(:all) do
146
- ENV.delete("LEADTUNE_TIMEOUT")
80
+ after(:each) do
81
+ teardown_initializer
147
82
  end
148
83
 
149
- it "is 6" do
150
- @curl_easy.should_receive(:timeout=).with(6)
151
-
152
- subject.get(mock_post_data)
153
- end
154
- end
155
-
156
- context("with timeout of 7 in config_file") do
157
- subject {Leadtune::Rest.new(rest_config)}
158
-
159
84
  it "is 7" do
160
85
  @curl_easy.should_receive(:timeout=).with(7)
161
86
 
@@ -199,15 +124,6 @@ describe Leadtune::Rest do
199
124
  curl_easy
200
125
  end
201
126
 
202
- def rest_config
203
- config_file = StringIO.new <<EOF
204
- username: config@config.com
205
- password: config_secret
206
- timeout: 7
207
- EOF
208
- Leadtune::Config.new(config_file)
209
- end
210
-
211
127
  def mock_server(code, &block)
212
128
  quietly do
213
129
  server = WEBrick::HTTPServer.new(:Port => THREADED_MOCK_SERVER_PORT)
data/spec/spec_helper.rb CHANGED
@@ -14,22 +14,19 @@ RSpec.configure do |config|
14
14
  config.include WebMock
15
15
  end
16
16
 
17
- def setup_leadtune_env
18
- ENV["LEADTUNE_USERNAME"] = "env@env.com"
19
- ENV["LEADTUNE_PASSWORD"] = "env_secret"
20
- ENV["LEADTUNE_ORGANIZATION"] = "env_org"
17
+ def setup_initializer
18
+ Leadtune::Config.username = "init_user"
19
+ Leadtune::Config.password = "init_secret"
20
+ Leadtune::Config.timeout = 7
21
+ Leadtune::Config.organization = "init_org"
22
+ Leadtune::Config.leadtune_host = "http://localhost.init"
21
23
  end
22
24
 
23
- def teardown_leadtune_env
24
- ENV.delete("LEADTUNE_USERNAME")
25
- ENV.delete("LEADTUNE_PASSWORD")
26
- ENV.delete("LEADTUNE_ORGANIZATION")
25
+ def teardown_initializer
26
+ Leadtune::Config.username = nil
27
+ Leadtune::Config.password = nil
28
+ Leadtune::Config.timeout = nil
29
+ Leadtune::Config.organization = nil
30
+ Leadtune::Config.leadtune_host = nil
27
31
  end
28
32
 
29
- def leadtune_config_file
30
- StringIO.new <<EOF
31
- username: config_file@config_file.com
32
- password: config_file_secret
33
- organization: config_file_org
34
- EOF
35
- end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: leadtune
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 25
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 2
10
- version: 0.0.2
9
+ - 3
10
+ version: 0.0.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Eric Wollesen
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-09-20 00:00:00 -06:00
18
+ date: 2010-09-21 00:00:00 -06:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -221,13 +221,12 @@ files:
221
221
  - README.rdoc
222
222
  - Rakefile
223
223
  - leadtune.gemspec
224
- - lib/array_extensions.rb
225
- - lib/hash_extensions.rb
226
224
  - lib/leadtune.rb
227
225
  - lib/leadtune/appraisals.rb
228
226
  - lib/leadtune/config.rb
229
227
  - lib/leadtune/prospect.rb
230
228
  - lib/leadtune/rest.rb
229
+ - lib/leadtune/util.rb
231
230
  - lib/leadtune/version.rb
232
231
  - spec/echo_server.rb
233
232
  - spec/get.rb
@@ -1,12 +0,0 @@
1
- # LeadTune API Ruby Gem
2
- #
3
- # http://github.com/leadtune/leadtune-ruby
4
- # Eric Wollesen (mailto:devs@leadtune.com)
5
- # Copyright 2010 LeadTune LLC
6
-
7
- class Array
8
- # stolen from ActiveSupport
9
- def extract_options!
10
- last.is_a?(::Hash) ? pop : {}
11
- end
12
- end
@@ -1,34 +0,0 @@
1
- # LeadTune API Ruby Gem
2
- #
3
- # http://github.com/leadtune/leadtune-ruby
4
- # Eric Wollesen (mailto:devs@leadtune.com)
5
- # Copyright 2010 LeadTune LLC
6
-
7
- class Hash
8
- # File merb/core_ext/hash.rb, line 87
9
- def to_params
10
- params = ''
11
- stack = []
12
-
13
- each do |k, v|
14
- if v.is_a?(Hash)
15
- stack << [k,v]
16
- else
17
- params << "#{k}=#{v}&"
18
- end
19
- end
20
-
21
- stack.each do |parent, hash|
22
- hash.each do |k, v|
23
- if v.is_a?(Hash)
24
- stack << ["#{parent}[#{k}]", v]
25
- else
26
- params << "#{parent}[#{k}]=#{v}&"
27
- end
28
- end
29
- end
30
-
31
- params.chop! # trailing &
32
- params
33
- end
34
- end