pco-url 1.3.0 → 1.4.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1a6bcb896c6899ae3d2c38e9e6f0bdf3a4101a38
4
- data.tar.gz: de4d8e15837e4d36336f8abdd69f26d588cf2683
3
+ metadata.gz: ed356d2dbbab3e8708ea65a815ca446bcd3e03f4
4
+ data.tar.gz: 9cd7d6c4b34c7a5ae5bbfd8c09d223e6eb41cb81
5
5
  SHA512:
6
- metadata.gz: 13b1f0a753ad9d5fdd13833f036101d0b852b94548e62c4a9c984cfa60b8a1f88d61b48333dcd9b953a2680f7f9ff260ca57183368937f96abeca51f2ff754a5
7
- data.tar.gz: 6f4d1334ab40d917974c7c0a55c6a50f66d4d13a8d3d9899ac03c48ebbeb7e767c82836be2688352feb27b700df560efd6589be78de038ba78fe63dd1c43ee2f
6
+ metadata.gz: ebdba2d53cc88b853682bde6c207878c6a5101050031327b6b43ddddf1f2e37f422118c5abc4abd34333b7ed220e9e6ad55c2252eb97e162d8049bf548299e01
7
+ data.tar.gz: aaaa5009648ba29dee52ab3d6065069d9494d48ac9b7b8e241a922f399170d91142947828eaae423d7e1c0010b5edb9e6a031ce678965851380a8e9f32f975dc
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2014 James Miller
1
+ Copyright (c) 2015 James Miller
2
2
 
3
3
  MIT License
4
4
 
data/circle.yml ADDED
@@ -0,0 +1,3 @@
1
+ machine:
2
+ ruby:
3
+ version: 2.2.1
@@ -1,5 +1,5 @@
1
1
  module PCO
2
2
  class URL
3
- VERSION = "1.3.0"
3
+ VERSION = "1.4.0"
4
4
  end
5
5
  end
data/lib/pco/url.rb CHANGED
@@ -1,48 +1,110 @@
1
1
  require "pco/url/version"
2
- require 'uri'
2
+ require "uri"
3
+ require "URLcrypt"
3
4
 
4
5
  module PCO
5
6
  class URL
6
-
7
7
  class << self
8
+ def decrypt_query_params(string)
9
+ URLcrypt.decrypt(string)
10
+ end
11
+
12
+ def parse(string)
13
+ if uri = URI.parse(string)
14
+ app_name = uri.host.match(/(\w+)(-staging)?/)[1]
15
+
16
+ if uri.query
17
+ if encrypted_part = encrypted_query_string(uri.query)
18
+ uri.query.sub!("_e=#{encrypted_part}", decrypt_query_params(encrypted_part))
19
+ end
20
+ end
21
+
22
+ new(app_name: app_name, path: uri.path, query: uri.query)
23
+ else
24
+ raise InvalidPCOURLString, "Unrecognized PCO::URL url string"
25
+ end
26
+ end
27
+
8
28
  def method_missing(method_name, *args)
9
- url_for_app_with_path(method_name, args)
29
+ path = args.map { |p| p.sub(/\A\/+/, "").sub(/\/+\Z/, "") }.join("/")
30
+ new(app_name: method_name, path: path).to_s
10
31
  end
11
32
 
12
33
  private
13
34
 
14
- def env
15
- ENV["DEPLOY_ENV"] || Rails.env
35
+ def encrypted_query_string(query_params)
36
+ if query_params =~ encrypted_params_regex
37
+ Regexp.last_match(:param)
38
+ end
16
39
  end
17
40
 
18
- def env_url(app_name)
19
- env_var = app_name.to_s.upcase + "_URL"
20
- ENV[env_var]
41
+ def encrypted_params_regex
42
+ /^_e=(?<param>[^\&]*)/
21
43
  end
44
+ end
22
45
 
23
- def url_for_app_with_path(app_name, paths)
24
- path = paths.map { |p| p.sub(/\A\/+/, "").sub(/\/+\Z/, "") }.join("/")
46
+ attr_reader :app_name
47
+ attr_reader :path
48
+ attr_reader :query
25
49
 
26
- URI::join(url_for_app(app_name), path).to_s
50
+ def initialize(app_name:, path: nil, query: nil, encrypt_query_params: false)
51
+ @app_name = app_name.to_s.gsub("_", "-")
52
+ @path = path
53
+
54
+ if query
55
+ @query = encrypt_query_params ? "_e=#{URLcrypt.encrypt(query)}" : query
27
56
  end
57
+ end
28
58
 
29
- def url_for_app(app_name)
30
- # Try "CHECK_INS_URL" then url_for_app("check-ins")
31
- return env_url(app_name) if env_url(app_name)
59
+ def scheme
60
+ # Try "CHECK_INS_URL" then url_for_app("check-ins")
61
+ return env_overridden_hostname.split("://")[0] if env_overridden_hostname
32
62
 
33
- app_name = app_name.to_s.gsub("_", "-")
34
- case env
35
- when "production"
36
- "https://#{app_name}.planningcenteronline.com"
37
- when "staging"
38
- "https://#{app_name}-staging.planningcenteronline.com"
39
- when "development"
40
- "http://#{app_name}.pco.dev"
41
- when "test"
42
- "http://#{app_name}.pco.test"
43
- end
63
+ case env
64
+ when "production", "staging"
65
+ "https"
66
+ else
67
+ "http"
44
68
  end
45
69
  end
46
70
 
71
+ def hostname
72
+ # Try "CHECK_INS_URL" then url_for_app("check-ins")
73
+ return env_overridden_hostname.split("://")[1] if env_overridden_hostname
74
+
75
+ case env
76
+ when "production"
77
+ "#{@app_name}.planningcenteronline.com"
78
+ when "staging"
79
+ "#{@app_name}-staging.planningcenteronline.com"
80
+ when "development"
81
+ "#{@app_name}.pco.dev"
82
+ when "test"
83
+ "#{@app_name}.pco.test"
84
+ end
85
+ end
86
+
87
+ def uri
88
+ query = @query ? "?#{@query}" : nil
89
+ url_string = "#{scheme}://#{hostname}/#{@path}#{query}".sub(/(\/)+$/,'')
90
+ URI(url_string)
91
+ end
92
+
93
+ def to_s
94
+ uri.to_s
95
+ end
96
+
97
+ private
98
+
99
+ def env
100
+ ENV["DEPLOY_ENV"] || Rails.env
101
+ end
102
+
103
+ def env_overridden_hostname
104
+ env_var = @app_name.to_s.upcase + "_URL"
105
+ ENV[env_var]
106
+ end
47
107
  end
108
+
109
+ class InvalidPCOURLString < StandardError; end
48
110
  end
data/pco-url.gemspec CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
8
8
  spec.version = PCO::URL::VERSION
9
9
  spec.authors = ["James Miller"]
10
10
  spec.email = ["bensie@gmail.com"]
11
- spec.summary = %q{Generate URLs for app PCO apps in all environments}
11
+ spec.summary = %q{Generate URLs for PCO apps in all environments}
12
12
  spec.homepage = "https://github.com/ministrycentered/pco-url"
13
13
  spec.license = "MIT"
14
14
 
@@ -17,6 +17,7 @@ Gem::Specification.new do |spec|
17
17
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
18
  spec.require_paths = ["lib"]
19
19
 
20
+ spec.add_dependency "urlcrypt", ">= 0.1.1"
20
21
  spec.add_development_dependency "bundler", "~> 1.7"
21
22
  spec.add_development_dependency "rake", "~> 10.0"
22
23
  spec.add_development_dependency "rspec", ">= 3.0.0", "< 4"
data/spec/pco_url_spec.rb CHANGED
@@ -7,10 +7,15 @@ Applications = [
7
7
  :check_ins,
8
8
  :people,
9
9
  :registrations,
10
- :resources
10
+ :resources,
11
+ :giving
11
12
  ]
12
13
 
13
14
  describe PCO::URL do
15
+ before :all do
16
+ URLcrypt.key = "984e9002e680dc9b9c2556434c47f7e4782191f52063277901e4a009797652e08f28be069dfb4d4a1e3c9ab09fedab59be2c9b6486748bf44030182815ee4987"
17
+ end
18
+
14
19
  describe "defaults" do
15
20
  describe "development" do
16
21
  before do
@@ -127,4 +132,83 @@ describe PCO::URL do
127
132
  end
128
133
  end
129
134
 
135
+ describe "encrypted params" do
136
+ subject { PCO::URL.new(app_name: "people", query: "foo=bar", encrypt_query_params: true) }
137
+
138
+ it "encrypts URL parameters" do
139
+ expect(subject.query).to_not eq("foo=bar")
140
+ end
141
+
142
+ it 'puts the encrypted params into the _e key' do
143
+ expect(subject.query).to match(/^_e=(.*)/)
144
+ end
145
+
146
+ it "encrypts and decrypts URL parameters" do
147
+ expect(URLcrypt.decrypt(subject.query.gsub("_e=", ""))).to eq("foo=bar")
148
+ end
149
+
150
+ it "decrypts using #decrypt_query_params" do
151
+ expect(PCO::URL.decrypt_query_params(subject.query.gsub("_e=", ""))).to eq("foo=bar")
152
+ end
153
+ end
154
+
155
+ describe '.parse' do
156
+ subject { PCO::URL.parse("https://people-staging.planningcenteronline.com") }
157
+
158
+ it 'returns a PCO::URL object' do
159
+ expect(subject.class).to eq(PCO::URL)
160
+ end
161
+
162
+ context 'when only a url string is passed' do
163
+ subject { PCO::URL.parse("http://people.pco.dev") }
164
+
165
+ it 'sets the app_name attr' do
166
+ expect(subject.app_name).to eq('people')
167
+ end
168
+
169
+ it 'strips -staging if supplied' do
170
+ expect(PCO::URL.parse("https://people-staging.plannincenteronline.com").app_name).
171
+ to eq('people')
172
+ end
173
+ end
174
+
175
+ context 'when a string and path is passed' do
176
+ subject { PCO::URL.parse("https://people.planningcenteronline.com/households/2.json") }
177
+
178
+ it 'sets the app_name and path attrs' do
179
+ expect(subject.app_name).to eq('people')
180
+ expect(subject.path).to eq('/households/2.json')
181
+ end
182
+ end
183
+
184
+ context 'when a string, path and query are passed' do
185
+ let(:pco_url) { PCO::URL.new(app_name: :people, path: 'households/2.html', query: 'full_access=1&total_control=1', encrypt_query_params: true) }
186
+
187
+ subject { PCO::URL.parse("https://people.planningcenteronline.com/households/2.html?full_access=1&total_control=1") }
188
+
189
+ it 'sets the app_name, path, and query attrs' do
190
+ expect(subject.app_name).to eq('people')
191
+ expect(subject.path).to eq('/households/2.html')
192
+ expect(subject.query).to eq('full_access=1&total_control=1')
193
+ end
194
+
195
+ context 'when the query is encrypted' do
196
+ subject { PCO::URL.parse(pco_url.to_s) }
197
+
198
+ it 'first decrypts the query' do
199
+ expect(pco_url.query).not_to eq('full_access=1&total_control=1')
200
+ expect(subject.query).to eq('full_access=1&total_control=1')
201
+ end
202
+ end
203
+
204
+ context "when part of the query string is encrypted" do
205
+ subject { PCO::URL.parse(pco_url.to_s + "&foo=bar") }
206
+
207
+ it "decrypts the encrypted portion and appends the unencrypted portion" do
208
+ expect(subject.query).to eq('full_access=1&total_control=1&foo=bar')
209
+ end
210
+ end
211
+ end
212
+ end
213
+
130
214
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pco-url
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Miller
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-29 00:00:00.000000000 Z
11
+ date: 2015-03-24 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: urlcrypt
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 0.1.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 0.1.1
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: bundler
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -70,6 +84,7 @@ files:
70
84
  - LICENSE.txt
71
85
  - README.md
72
86
  - Rakefile
87
+ - circle.yml
73
88
  - lib/pco/url.rb
74
89
  - lib/pco/url/version.rb
75
90
  - pco-url.gemspec
@@ -95,10 +110,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
95
110
  version: '0'
96
111
  requirements: []
97
112
  rubyforge_project:
98
- rubygems_version: 2.4.1
113
+ rubygems_version: 2.4.5
99
114
  signing_key:
100
115
  specification_version: 4
101
- summary: Generate URLs for app PCO apps in all environments
116
+ summary: Generate URLs for PCO apps in all environments
102
117
  test_files:
103
118
  - spec/pco_url_spec.rb
104
119
  - spec/spec_helper.rb