oxy 0.1.4 → 0.1.5

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: f8a7625f338127548d91d41d4e8b764a6e3a1014
4
- data.tar.gz: e89478f9b9d9c9d4d3fc3edea133212c0a403151
3
+ metadata.gz: 02a23f55b9b4cf46d59ef0f671a472a225153ac8
4
+ data.tar.gz: a2e6b315527a05744f8bc523d6066118cbcc186d
5
5
  SHA512:
6
- metadata.gz: a17585335722e4519d79197fe7856bcc6b2a099b7fb836cf20797b94d8a63fb57e61bd288d5e1c32778aac2ca7102200719b32d6950559f0f8fb15dc7a3f76ee
7
- data.tar.gz: 6c01096e3f53919248603bdf4c8f1ab69164729883fa288a23431224f415fe6a9659f7ed1d2cac9d6431553e16ea78ecc30ee320af533e953c794d023ce09aa9
6
+ metadata.gz: 9497cc4a6a0342b8005970df6005cdd3093dc9f7a5f31115d0b1f9f2daa172ec324125c60c5658d19ee0f928ddcb7a671439c4fd7853ab0ac40752a319894b87
7
+ data.tar.gz: de94ce90f57007c111b57c666dbddc3cdac9bc0ad73e323c4d3b292bcc259fc5f5c0ac0b361fd80fc67ae3204a8a6a3e6ea88a370e598f5b4e717e321231b637
data/.gitignore CHANGED
@@ -7,3 +7,65 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
+
11
+ # Created by https://www.gitignore.io/api/osx
12
+
13
+ ### OSX ###
14
+ *.DS_Store
15
+ .AppleDouble
16
+ .LSOverride
17
+
18
+ # Icon must end with two \r
19
+ Icon
20
+
21
+ # Thumbnails
22
+ ._*
23
+
24
+ # Files that might appear in the root of a volume
25
+ .DocumentRevisions-V100
26
+ .fseventsd
27
+ .Spotlight-V100
28
+ .TemporaryItems
29
+ .Trashes
30
+ .VolumeIcon.icns
31
+ .com.apple.timemachine.donotpresent
32
+
33
+ # Directories potentially created on remote AFP share
34
+ .AppleDB
35
+ .AppleDesktop
36
+ Network Trash Folder
37
+ Temporary Items
38
+ .apdisk
39
+
40
+ # End of https://www.gitignore.io/api/osx
41
+
42
+ # Created by https://www.gitignore.io/api/osx
43
+
44
+ ### OSX ###
45
+ *.DS_Store
46
+ .AppleDouble
47
+ .LSOverride
48
+
49
+ # Icon must end with two \r
50
+ Icon
51
+
52
+ # Thumbnails
53
+ ._*
54
+
55
+ # Files that might appear in the root of a volume
56
+ .DocumentRevisions-V100
57
+ .fseventsd
58
+ .Spotlight-V100
59
+ .TemporaryItems
60
+ .Trashes
61
+ .VolumeIcon.icns
62
+ .com.apple.timemachine.donotpresent
63
+
64
+ # Directories potentially created on remote AFP share
65
+ .AppleDB
66
+ .AppleDesktop
67
+ Network Trash Folder
68
+ Temporary Items
69
+ .apdisk
70
+
71
+ # End of https://www.gitignore.io/api/osx
data/bin/console CHANGED
@@ -7,8 +7,8 @@ require "oxy"
7
7
  # with your gem easier. You can also use a different console, if you like.
8
8
 
9
9
  # (If you use this, don't forget to add pry to your Gemfile!)
10
- # require "pry"
11
- # Pry.start
10
+ require "pry"
11
+ Pry.start
12
12
 
13
- require "irb"
14
- IRB.start(__FILE__)
13
+ # require "irb"
14
+ # IRB.start(__FILE__)
@@ -0,0 +1,2 @@
1
+ # Submission model
2
+ Submission = Struct.new(:email_address, :first_name, :last_name)
@@ -0,0 +1,68 @@
1
+ require "httparty"
2
+
3
+ class Submissions
4
+ include HTTParty
5
+
6
+ format :json
7
+
8
+ def self.find_by(email_address)
9
+ # fabricate lookup key based on MD5 hash of the email address
10
+ lookup_key = to_lookup_key(email_address)
11
+ # fetch response from Firebase
12
+ response = get("/submissions/#{lookup_key}.json", default_options)
13
+ # parse it into JSON
14
+ parse(response)
15
+ end
16
+
17
+ def self.find_submission(email_address)
18
+ # fabricate lookup key based on MD5 hash of the email address
19
+ lookup_key = to_lookup_key(email_address)
20
+ # fetch response from Firebase
21
+ response = get("/submissions/#{lookup_key}.json", default_options)
22
+ # return response's parsed body
23
+ response.parsed_response
24
+ end
25
+
26
+ def self.push(submission)
27
+ # fabricate lookup key based on MD5
28
+ lookup_key = to_lookup_key(submission["email_address"])
29
+ # build body
30
+ json_string = { "#{lookup_key}" => submission }.to_json
31
+ # merge options
32
+ options = default_options.merge(:body => json_string)
33
+ # push the submission entry to Firebase
34
+ put("/submissions.json", options)
35
+ end
36
+
37
+ def self.drop(email_address = nil)
38
+ # prepare
39
+ path = "/submissions"
40
+ # fabricate lookup key based on MD5
41
+ if email_address
42
+ lookup_key = to_lookup_key(email_address)
43
+ path += "/#{lookup_key}"
44
+ end
45
+ # delete the entry
46
+ delete("#{path}.json", default_options)
47
+ end
48
+
49
+ private
50
+ def self.parse(response)
51
+ # yield nil if response is not parseable
52
+ return nil unless response && response.parsed_response
53
+ # parse it from JSON
54
+ JSON.parse(response.body, { :object_class => Submission })
55
+ end
56
+
57
+ def self.to_lookup_key(email_address)
58
+ Digest::MD5.hexdigest(email_address)
59
+ end
60
+
61
+ def self.default_options
62
+ {
63
+ :base_uri => ENV["FIREBASE_URL"],
64
+ :query => { :auth => ENV["FIREBASE_SECRET"] },
65
+ :headers => { "Content-Type" => "application/json" }
66
+ }
67
+ end
68
+ end
@@ -5,7 +5,7 @@ require "threaded"
5
5
  class Oxy::RSVP
6
6
  # The set of allowed fields. Requests that do not have fields
7
7
  # present in this list will not be eligible to be enqueued.
8
- ELIGIBLE_FORMS_FIELDS = ['email_address']
8
+ ELIGIBLE_FORMS_FIELDS = ['email_address', 'first_name', 'last_name']
9
9
 
10
10
  # ctor.
11
11
  def initialize(app, logger = $stderr)
@@ -17,10 +17,10 @@ class Oxy::RSVP
17
17
  def call(env)
18
18
  # instantiate the request object
19
19
  req = Rack::Request.new(env)
20
- if req.path == "/rsvp" && req.post? && valid_form(req.POST)
21
- # enqueue the new registration request
22
- Threaded.enqueue(GoogleContact, req.POST["email_address"], @logger)
23
- # redirect
20
+ if req.path == "/rsvp" && req.post?
21
+ # enqueue background processing for valid submissions only
22
+ Threaded.enqueue(Subscribe, req.POST, @logger) if valid_form(req.POST)
23
+ # redirect anyways
24
24
  [302, { "Location" => "/thank-you" }, []]
25
25
  else
26
26
  @app.call(env)
@@ -30,7 +30,7 @@ class Oxy::RSVP
30
30
  private
31
31
  # only request with eligible form fields are valid
32
32
  def valid_form(form)
33
- unless ELIGIBLE_FORMS_FIELDS.all? { |field| form.include?(field) }
33
+ unless form.all? { |key, _| ELIGIBLE_FORMS_FIELDS.include?(key) }
34
34
  @logger.write("[RSVP]: Received an invalid form ~> #{form.inspect}\n")
35
35
  return false
36
36
  end
@@ -0,0 +1,9 @@
1
+ # Very simple subscribe-alike module that uses Firebase to store the data
2
+ class Subscribe
3
+ def self.call(form, logger = $stderr)
4
+ # push new submission
5
+ Submissions.push(form)
6
+ # log the request
7
+ logger.write("[Oxy::Subscribe]: #{form["email_address"]} has requested to be subscribed...\n")
8
+ end
9
+ end
data/lib/oxy/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Oxy
2
- VERSION = "0.1.4"
2
+ VERSION = "0.1.5"
3
3
  end
data/lib/oxy.rb CHANGED
@@ -2,4 +2,6 @@ require "oxy/version"
2
2
 
3
3
  require "oxy/server"
4
4
  require "oxy/middleware/rsvp"
5
- require "oxy/google_contact"
5
+ require "oxy/module/subscribe"
6
+ require "oxy/firebase/submissions"
7
+ require "oxy/firebase/submission"
data/oxy.gemspec CHANGED
@@ -23,11 +23,11 @@ Gem::Specification.new do |spec|
23
23
  spec.add_runtime_dependency "rack-contrib", "~> 1.2"
24
24
  spec.add_runtime_dependency "puma", "~> 3.10"
25
25
  spec.add_runtime_dependency "threaded", "~> 0.0.4"
26
+ spec.add_runtime_dependency "httparty", "~> 0.15.6"
26
27
 
27
28
  spec.add_development_dependency "bundler", "~> 1.15"
28
29
  spec.add_development_dependency "rake", "~> 10.0"
29
30
  spec.add_development_dependency "minitest", "~> 5.0"
30
- spec.add_development_dependency "httparty"
31
31
  spec.add_development_dependency "rack-test"
32
32
 
33
33
  spec.add_development_dependency "pry"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oxy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pavel Tsurbeleu
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-11-04 00:00:00.000000000 Z
11
+ date: 2017-11-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: 0.0.4
69
+ - !ruby/object:Gem::Dependency
70
+ name: httparty
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.15.6
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.15.6
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: bundler
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -108,20 +122,6 @@ dependencies:
108
122
  - - "~>"
109
123
  - !ruby/object:Gem::Version
110
124
  version: '5.0'
111
- - !ruby/object:Gem::Dependency
112
- name: httparty
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - ">="
116
- - !ruby/object:Gem::Version
117
- version: '0'
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - ">="
123
- - !ruby/object:Gem::Version
124
- version: '0'
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: rack-test
127
127
  requirement: !ruby/object:Gem::Requirement
@@ -225,8 +225,10 @@ files:
225
225
  - bin/oxy
226
226
  - bin/setup
227
227
  - lib/oxy.rb
228
- - lib/oxy/google_contact.rb
228
+ - lib/oxy/firebase/submission.rb
229
+ - lib/oxy/firebase/submissions.rb
229
230
  - lib/oxy/middleware/rsvp.rb
231
+ - lib/oxy/module/subscribe.rb
230
232
  - lib/oxy/server.rb
231
233
  - lib/oxy/version.rb
232
234
  - oxy.gemspec
@@ -1,6 +0,0 @@
1
- # Create new contact
2
- class GoogleContact
3
- def self.call(email_address, logger = $stderr)
4
- logger.write("[GoogleContact]: #{email_address}...\n")
5
- end
6
- end