oxy 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
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