punk 0.0.3 → 0.2.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.
Files changed (150) hide show
  1. checksums.yaml +4 -4
  2. data/.editorconfig +9 -0
  3. data/.github/workflows/ship.yml +28 -0
  4. data/.github/workflows/test.yml +45 -0
  5. data/.rdoc_options +23 -0
  6. data/.rgignore +1 -0
  7. data/.rspec +2 -0
  8. data/.rubocop.yml +243 -0
  9. data/Gemfile +6 -6
  10. data/Gemfile.lock +18 -30
  11. data/README.md +8 -0
  12. data/Rakefile +7 -9
  13. data/VERSION +1 -1
  14. data/app/migrations/001_lets_punk.rb +3 -0
  15. data/app/routes/hello.rb +4 -0
  16. data/bin/punk +0 -1
  17. data/env/.gitignore +3 -0
  18. data/env/spec/test.sh +3 -0
  19. data/env/test.sh +5 -0
  20. data/lib/punk/actions/.keep +0 -0
  21. data/lib/punk/actions/groups/list.rb +24 -0
  22. data/lib/punk/actions/sessions/clear.rb +21 -0
  23. data/lib/punk/actions/sessions/create.rb +64 -0
  24. data/lib/punk/actions/sessions/list.rb +18 -0
  25. data/lib/punk/actions/sessions/verify.rb +24 -0
  26. data/lib/punk/actions/tenants/list.rb +18 -0
  27. data/lib/punk/actions/users/list_group.rb +18 -0
  28. data/lib/punk/actions/users/list_tenant.rb +18 -0
  29. data/lib/punk/actions/users/show.rb +18 -0
  30. data/lib/punk/commands/http.rb +3 -3
  31. data/lib/punk/commands/list.rb +12 -6
  32. data/lib/punk/config/defaults.json +3 -0
  33. data/lib/punk/config/schema.json +3 -0
  34. data/lib/punk/core/app.rb +6 -8
  35. data/lib/punk/core/commander.rb +9 -6
  36. data/lib/punk/core/exec.rb +2 -0
  37. data/lib/punk/core/load.rb +0 -1
  38. data/lib/punk/framework/command.rb +5 -1
  39. data/lib/punk/framework/plugins/validation.rb +0 -14
  40. data/lib/punk/framework/runnable.rb +1 -1
  41. data/lib/punk/helpers/loggable.rb +1 -1
  42. data/lib/punk/migrations/001_punk.rb +103 -0
  43. data/lib/punk/models/.keep +0 -0
  44. data/lib/punk/models/group.rb +20 -0
  45. data/lib/punk/models/group_user_metadata.rb +17 -0
  46. data/lib/punk/models/identity.rb +29 -0
  47. data/lib/punk/models/session.rb +89 -0
  48. data/lib/punk/models/tenant.rb +19 -0
  49. data/lib/punk/models/tenant_user_metadata.rb +17 -0
  50. data/lib/punk/models/user.rb +31 -0
  51. data/lib/punk/routes/groups.rb +31 -0
  52. data/lib/punk/routes/plivo.rb +4 -0
  53. data/lib/punk/routes/sessions.rb +108 -0
  54. data/lib/punk/routes/swagger.rb +9 -0
  55. data/lib/punk/routes/tenants.rb +29 -0
  56. data/lib/punk/routes/users.rb +36 -0
  57. data/lib/punk/services/.keep +0 -0
  58. data/lib/punk/services/challenge_claim.rb +46 -0
  59. data/lib/punk/services/create_identities.rb +25 -0
  60. data/lib/punk/services/generate_swagger.rb +25 -0
  61. data/lib/punk/services/prove_claim.rb +29 -0
  62. data/lib/punk/services/secret.rb +9 -0
  63. data/lib/punk/templates/groups/list.jbuilder +7 -0
  64. data/lib/punk/templates/plivo.slim +16 -0
  65. data/lib/punk/templates/sessions/list.jbuilder +6 -0
  66. data/lib/punk/templates/sessions/pending.jbuilder +4 -0
  67. data/lib/punk/templates/tenants/list.jbuilder +7 -0
  68. data/lib/punk/templates/tenants/list.slim +8 -0
  69. data/lib/punk/templates/users/list.jbuilder +7 -0
  70. data/lib/punk/templates/users/list.rcsv +4 -0
  71. data/lib/punk/templates/users/show.jbuilder +5 -0
  72. data/lib/punk/views/groups/list.rb +22 -0
  73. data/lib/punk/views/plivo_store.rb +15 -0
  74. data/lib/punk/views/sessions/list.rb +22 -0
  75. data/lib/punk/views/sessions/pending.rb +28 -0
  76. data/lib/punk/views/tenants/list.rb +22 -0
  77. data/lib/punk/views/users/list.rb +22 -0
  78. data/lib/punk/views/users/show.rb +22 -0
  79. data/lib/punk/workers/.keep +0 -0
  80. data/lib/punk/workers/expire_sessions.rb +9 -0
  81. data/lib/punk/workers/geocode_session_worker.rb +48 -0
  82. data/lib/punk/workers/identify_session_worker.rb +45 -0
  83. data/lib/punk/workers/secret.rb +18 -0
  84. data/lib/punk/workers/send_email_worker.rb +51 -0
  85. data/lib/punk/workers/send_sms_worker.rb +40 -0
  86. data/punk.gemspec +149 -16
  87. data/schema.psql +345 -0
  88. data/spec/actions/groups/punk/list_groups_action_spec.rb +36 -0
  89. data/spec/actions/sessions/punk/clear_session_action_spec.rb +29 -0
  90. data/spec/actions/sessions/punk/create_session_action_spec.rb +33 -0
  91. data/spec/actions/sessions/punk/list_sessions_action_spec.rb +26 -0
  92. data/spec/actions/sessions/punk/verify_session_action_spec.rb +59 -0
  93. data/spec/actions/tenants/punk/list_tenants_action_spec.rb +25 -0
  94. data/spec/actions/users/punk/list_group_users_action_spec.rb +26 -0
  95. data/spec/actions/users/punk/list_tenant_users_action_spec.rb +26 -0
  96. data/spec/factories/group.rb +12 -0
  97. data/spec/factories/group_user_metadata.rb +10 -0
  98. data/spec/factories/identity.rb +19 -0
  99. data/spec/factories/session.rb +12 -0
  100. data/spec/factories/tenant.rb +10 -0
  101. data/spec/factories/tenant_user_metadata.rb +10 -0
  102. data/spec/factories/user.rb +12 -0
  103. data/spec/lib/commands/auth_spec.rb +11 -0
  104. data/spec/lib/commands/generate_spec.rb +7 -0
  105. data/spec/lib/commands/http_spec.rb +23 -0
  106. data/spec/lib/commands/list_spec.rb +7 -0
  107. data/spec/lib/commands/swagger_spec.rb +7 -0
  108. data/spec/lib/engine/punk_env_spec.rb +13 -0
  109. data/spec/lib/engine/punk_exec_spec.rb +9 -0
  110. data/spec/lib/engine/punk_init_spec.rb +9 -0
  111. data/spec/lib/engine/punk_store_spec.rb +10 -0
  112. data/spec/lib/punk.env +7 -0
  113. data/spec/models/punk/group_spec.rb +50 -0
  114. data/spec/models/punk/group_user_metadata_spec.rb +61 -0
  115. data/spec/models/punk/identity_spec.rb +61 -0
  116. data/spec/models/punk/session_spec.rb +156 -0
  117. data/spec/models/punk/tenant_spec.rb +51 -0
  118. data/spec/models/punk/tenant_user_metadata_spec.rb +61 -0
  119. data/spec/models/punk/user_spec.rb +115 -0
  120. data/spec/routes/groups/get_groups_spec.rb +33 -0
  121. data/spec/routes/plivo/get_plivo_spec.rb +11 -0
  122. data/spec/routes/sessions/delete_session_spec.rb +11 -0
  123. data/spec/routes/sessions/get_sessions_spec.rb +30 -0
  124. data/spec/routes/sessions/patch_session_spec.rb +11 -0
  125. data/spec/routes/sessions/post_session_spec.rb +11 -0
  126. data/spec/routes/swagger/get_swagger_spec.rb +12 -0
  127. data/spec/routes/tenants/get_tenants_spec.rb +31 -0
  128. data/spec/routes/users/get_users_spec.rb +60 -0
  129. data/spec/services/punk/challenge_claim_service_spec.rb +7 -0
  130. data/spec/services/punk/create_identities_service_spec.rb +14 -0
  131. data/spec/services/punk/generate_swagger_service_spec.rb +7 -0
  132. data/spec/services/punk/prove_claim_service_spec.rb +7 -0
  133. data/spec/services/punk/secret_service_spec.rb +7 -0
  134. data/spec/spec_helper.rb +122 -0
  135. data/spec/vcr_cassettes/PUNK_GeocodeSessionWorker/updates_the_session_data.yml +57 -0
  136. data/spec/vcr_cassettes/PUNK_IdentifySessionWorker/updates_the_session_data.yml +112 -0
  137. data/spec/views/punk/plivo_store_spec.rb +7 -0
  138. data/spec/views/sessions/punk/list_sessions_view_spec.rb +7 -0
  139. data/spec/views/sessions/punk/pending_session_view_spec.rb +7 -0
  140. data/spec/views/tenants/punk/list_tenants_view_spec.rb +7 -0
  141. data/spec/views/users/punk/list_groups_view_spec.rb +7 -0
  142. data/spec/views/users/punk/list_users_view_spec.rb +7 -0
  143. data/spec/workers/punk/expire_sessions_worker_spec.rb +31 -0
  144. data/spec/workers/punk/geocode_session_worker_spec.rb +14 -0
  145. data/spec/workers/punk/identify_session_worker_spec.rb +15 -0
  146. data/spec/workers/punk/secret_worker_spec.rb +20 -0
  147. data/spec/workers/punk/send_email_worker_spec.rb +46 -0
  148. data/spec/workers/punk/send_sms_worker_spec.rb +33 -0
  149. metadata +169 -13
  150. data/lib/punk/views/all.rb +0 -4
data/README.md CHANGED
@@ -1,9 +1,17 @@
1
+ [![test](https://github.com/kranzky/punk/workflows/test/badge.svg)](https://github.com/kranzky/punk/actions?query=workflow%3Atest)
2
+ [![Coverage Status](https://coveralls.io/repos/github/kranzky/punk/badge.svg?branch=main)](https://coveralls.io/github/kranzky/punk?branch=main)
1
3
  [![Gem Version](https://badge.fury.io/rb/punk.svg)](https://badge.fury.io/rb/punk)
2
4
 
3
5
  # Punk!
4
6
 
5
7
  Punk! is an omakase web framework for rapid prototyping.
6
8
 
9
+ ## Release Process
10
+
11
+ 1. `rake version:bump:whatever`
12
+ 2. `rake git:release BRANCH=main`
13
+ 3. Create new release on GitHub to trigger ship workflow
14
+
7
15
  ## Copyright
8
16
 
9
17
  Copyright (c) 2021 Jason Hutchens. See LICENSE for further details.
data/Rakefile CHANGED
@@ -1,31 +1,29 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  require 'rubygems'
4
4
  require 'bundler'
5
5
  begin
6
6
  Bundler.setup(:default, :development)
7
7
  rescue Bundler::BundlerError => e
8
- $stderr.puts e.message
9
- $stderr.puts "Run `bundle install` to install missing gems"
8
+ warn e.message
9
+ warn "Run `bundle install` to install missing gems"
10
10
  exit e.status_code
11
11
  end
12
12
  require 'rake'
13
13
  require 'juwelier'
14
14
  Juwelier::Tasks.new do |gem|
15
- # gem is a Gem::Specification... see http://guides.rubygems.org/specification-reference/ for more options
16
15
  gem.name = "punk"
17
16
  gem.homepage = "https://github.com/kranzky/punk"
18
- gem.license = "UNLICENSE"
19
- gem.summary = %Q{Punk! is an omakase web framework for rapid prototyping.}
20
- gem.description = %Q{}
17
+ gem.license = "Unlicense"
18
+ gem.summary = "Punk! is an omakase web framework for rapid prototyping."
19
+ gem.description = ""
21
20
  gem.email = "lloyd@kranzky.com"
22
21
  gem.authors = ["Lloyd Kranzky"]
23
22
  gem.required_ruby_version = ">= 2.1"
24
- # dependencies defined in Gemfile
25
23
  end
26
24
  Juwelier::RubygemsDotOrgTasks.new
27
25
 
28
26
  require 'yard'
29
27
  YARD::Rake::YardocTask.new
30
28
 
31
- task :default => :clean
29
+ task default: :clean
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.3
1
+ 0.2.0
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../lib/punk/migrations/001_punk'
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ # route: GET /hello
4
+ PUNK.route('hello') { perform "world" }
data/bin/punk CHANGED
@@ -2,7 +2,6 @@
2
2
 
3
3
  # frozen_string_literal: true
4
4
 
5
- require 'rubygems'
6
5
  require 'bundler/setup'
7
6
  require 'commander/import'
8
7
  require_relative '../lib/punk'
@@ -0,0 +1,3 @@
1
+ production.sh
2
+ staging.sh
3
+ locals.sh
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env bash
2
+
3
+ export PUNK_TRACE=spec_test
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env bash
2
+
3
+ export DATABASE_URL='postgres://localhost/punk_test'
4
+ export MEMCACHIER_SERVERS='localhost:11211'
5
+ export COOKIE_SECRET='20b065932a09ca10a67b02a049695177bd9b1aa75bd2cf9755e62b9a7e64daeefebec4edc2a91b2be08f7899fa9e48aca6f67d4f045d34e83213566d7dde249c'
File without changes
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PUNK
4
+ class ListGroupsAction < Action
5
+ args :user, :tenant
6
+
7
+ def validate
8
+ validates_not_null :user
9
+ validates_not_empty :user
10
+ return if user.blank?
11
+ validates_not_null :tenant
12
+ validates_not_empty :tenant
13
+ return if tenant.blank?
14
+ validates_type User, :user
15
+ validates_type Tenant, :tenant
16
+ end
17
+
18
+ def process
19
+ # TODO: repository here
20
+ # an action takes arguments (that may be entities) and returns a view object
21
+ present ListGroupsView, groups: user.groups_dataset.where(tenant: tenant).all
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PUNK
4
+ class ClearSessionAction < Action
5
+ args :session
6
+
7
+ def validate
8
+ validates_not_null :session
9
+ validates_not_empty :session
10
+ return if session.blank?
11
+ validates_type Session, :session
12
+ validates_state :session, :active
13
+ validates_event :session, :clear
14
+ end
15
+
16
+ def process
17
+ session.clear!
18
+ present Info, message: "You have been logged out."
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'uri'
4
+ require 'phony'
5
+
6
+ module PUNK
7
+ class CreateSessionAction < Action
8
+ args :claim, :remote_addr, :user_agent
9
+
10
+ def validate
11
+ validates_not_null :claim
12
+ validates_not_empty :claim
13
+ validates_not_null :claim_type, message: "is not an email address or phone number"
14
+ validates_email :claim if claim_type == :email
15
+ validates_phone :claim if claim_type == :phone
16
+ validates_not_null :remote_addr
17
+ validates_not_empty :remote_addr
18
+ validates_not_null :user_agent
19
+ validates_not_empty :user_agent
20
+ end
21
+
22
+ def process
23
+ PUNK.db.transaction do
24
+ identity =
25
+ Identity.find_or_create(claim: _normalize_claim) do |i|
26
+ i.claim_type = claim_type
27
+ end
28
+ session = Session.create(identity: identity, remote_addr: remote_addr, user_agent: user_agent)
29
+ ChallengeClaimService.run(session: session)
30
+ IdentifySessionWorker.perform_async(session_id: session.id)
31
+ message =
32
+ case identity.claim_type
33
+ when :email
34
+ "We have sent a verification code to your email address. Please enter it to verify your identity."
35
+ when :phone
36
+ "We have sent a verification code to your phone number by SMS. Please enter it to verify your identity."
37
+ end
38
+ present PendingSessionView, session: session, message: message, status: 201
39
+ end
40
+ end
41
+
42
+ def claim_type
43
+ @claim_type ||= _guess_claim_type
44
+ end
45
+
46
+ private
47
+
48
+ def _guess_claim_type
49
+ return :email if URI::MailTo::EMAIL_REGEXP.match(claim)
50
+ return :phone if Phony.plausible?(claim)
51
+ end
52
+
53
+ def _normalize_claim
54
+ case claim_type
55
+ when :email
56
+ claim.downcase.strip
57
+ when :phone
58
+ phone = claim.strip
59
+ phone = "+1#{phone}" if phone !~ /^[+]/
60
+ "+#{Phony.normalize(phone)}"
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PUNK
4
+ class ListSessionsAction < Action
5
+ args :user
6
+
7
+ def validate
8
+ validates_not_null :user
9
+ validates_not_empty :user
10
+ return if user.blank?
11
+ validates_type User, :user
12
+ end
13
+
14
+ def process
15
+ present ListSessionsView, sessions: user.active_sessions.all
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PUNK
4
+ class VerifySessionAction < Action
5
+ args :session, :secret
6
+
7
+ def validate
8
+ validates_not_null :session
9
+ validates_not_empty :session
10
+ return if session.blank?
11
+ validates_not_null :secret
12
+ return if secret.blank?
13
+ validates_type Session, :session
14
+ validates_state :session, :pending
15
+ validates_event :session, :verify
16
+ end
17
+
18
+ def process
19
+ verify = ProveClaimService.run(session: session, secret: secret)
20
+ raise BadRequest, 'Secret is incorrect' unless verify.result == true
21
+ present Info, message: 'We have succesfully verified your identity. Welcome to GroupFire!'
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PUNK
4
+ class ListTenantsAction < Action
5
+ args :user
6
+
7
+ def validate
8
+ validates_not_null :user
9
+ validates_not_empty :user
10
+ return if user.blank?
11
+ validates_type User, :user
12
+ end
13
+
14
+ def process
15
+ present ListTenantsView, tenants: user.tenants_dataset.order(:name).all
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PUNK
4
+ class ListGroupUsersAction < Action
5
+ args :group
6
+
7
+ def validate
8
+ validates_not_null :group
9
+ validates_not_empty :group
10
+ return if group.blank?
11
+ validates_type Group, :group
12
+ end
13
+
14
+ def process
15
+ present ListUsersView, users: group.users
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PUNK
4
+ class ListTenantUsersAction < Action
5
+ args :tenant
6
+
7
+ def validate
8
+ validates_not_null :tenant
9
+ validates_not_empty :tenant
10
+ return if tenant.blank?
11
+ validates_type Tenant, :tenant
12
+ end
13
+
14
+ def process
15
+ present ListUsersView, users: tenant.users
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PUNK
4
+ class ShowUserAction < Action
5
+ args :user
6
+
7
+ def validate
8
+ validates_not_null :user
9
+ validates_not_empty :user
10
+ return if user.blank?
11
+ validates_type User, :user
12
+ end
13
+
14
+ def process
15
+ present ShowUserView, user: user
16
+ end
17
+ end
18
+ end
@@ -24,7 +24,7 @@ PUNK::Command.create "PATCH" do
24
24
  "PATH_INFO" => args[0],
25
25
  "CONTENT_TYPE" => "text/json",
26
26
  "SCRIPT_NAME" => "",
27
- "rack.input" => StringIO.new(args[1..].join)
27
+ "rack.input" => StringIO.new(args[1..-1].join)
28
28
  )
29
29
  end
30
30
  end
@@ -38,7 +38,7 @@ PUNK::Command.create "POST" do
38
38
  "PATH_INFO" => args[0],
39
39
  "CONTENT_TYPE" => "text/json",
40
40
  "SCRIPT_NAME" => "",
41
- "rack.input" => StringIO.new(args[1..].join)
41
+ "rack.input" => StringIO.new(args[1..-1].join)
42
42
  )
43
43
  end
44
44
  end
@@ -52,7 +52,7 @@ PUNK::Command.create "PUT" do
52
52
  "PATH_INFO" => args[0],
53
53
  "CONTENT_TYPE" => "text/json",
54
54
  "SCRIPT_NAME" => "",
55
- "rack.input" => StringIO.new(args[1..].join)
55
+ "rack.input" => StringIO.new(args[1..-1].join)
56
56
  )
57
57
  end
58
58
  end
@@ -4,25 +4,31 @@ PUNK::Command.create "list" do
4
4
  shortcut 'l'
5
5
  description "List routes, actions, models, views, services or workers"
6
6
 
7
+ option shortcut: :a, name: :all, description: "Include Punk!", type: nil
8
+
7
9
  def process
8
10
  case args.join(' ')
9
11
  when 'routes'
10
12
  PUNK.app
11
- PUNK::App.route_list
13
+ PUNK::App.route_list # TODO: exclude PUNK routes by default
12
14
  when 'actions'
13
- ObjectSpace.each_object(PUNK::Action.singleton_class).map(&:name).reject { |name| name.nil? || name =~ /^PUNK/ }
15
+ ObjectSpace.each_object(PUNK::Action.singleton_class).map(&:name).reject { |name| _hide?(name) }
14
16
  when 'models'
15
- ObjectSpace.each_object(PUNK::Model.singleton_class).map(&:name).reject { |name| name.nil? || name =~ /^PUNK/ }
17
+ ObjectSpace.each_object(PUNK::Model.singleton_class).map(&:name).reject { |name| _hide?(name) }
16
18
  when 'views'
17
- ObjectSpace.each_object(PUNK::View.singleton_class).map(&:name).reject { |name| name.nil? || name =~ /^PUNK/ }
19
+ ObjectSpace.each_object(PUNK::View.singleton_class).map(&:name).reject { |name| _hide?(name) }
18
20
  when 'services'
19
- ObjectSpace.each_object(PUNK::Service.singleton_class).select { |klass| klass.superclass == PUNK::Service }.map(&:name).reject { |name| name.nil? || name =~ /^PUNK/ }
21
+ ObjectSpace.each_object(PUNK::Service.singleton_class).select { |klass| klass.superclass == PUNK::Service }.map(&:name).reject { |name| _hide?(name) }
20
22
  when 'workers'
21
- ObjectSpace.each_object(PUNK::Worker.singleton_class).select { |klass| klass.superclass == PUNK::Worker }.map(&:name).reject { |name| name.nil? || name =~ /^PUNK/ }
23
+ ObjectSpace.each_object(PUNK::Worker.singleton_class).select { |klass| klass.superclass == PUNK::Worker }.map(&:name).reject { |name| _hide?(name) }
22
24
  when '', 'help'
23
25
  "? specify one of: routes, actions, models, views, services, workers"
24
26
  else
25
27
  "? unkown arguments: #{args.join(',')}"
26
28
  end
27
29
  end
30
+
31
+ def _hide?(name)
32
+ name.nil? || (name =~ /^PUNK/) && !opts[:all]
33
+ end
28
34
  end
@@ -30,6 +30,9 @@
30
30
  "api_key": "$USERSTACK_API_KEY",
31
31
  "use_ssl": false
32
32
  },
33
+ "ipstack": {
34
+ "api_key": "$IPSTACK_ACCESS_KEY"
35
+ },
33
36
  "db": {
34
37
  "url": "$DATABASE_URL"
35
38
  },
@@ -32,6 +32,9 @@
32
32
  "api_key": "String",
33
33
  "use_ssl": "Flag"
34
34
  },
35
+ "ipstack": {
36
+ "api_key": "String"
37
+ },
35
38
  "log": {
36
39
  "enabled!": "Flag",
37
40
  "type!": "Enum(stdout, stderr, file)",
@@ -23,7 +23,7 @@ module PUNK
23
23
 
24
24
  ROUTES = Tempfile.new("routes.json").path
25
25
  PUNK.profile_info("generate", path: ROUTES) do
26
- system "roda-parse_routes -f #{ROUTES} #{File.expand_path(File.join(PUNK.get.app.path, 'routes', '*'))}"
26
+ system "roda-parse_routes -f #{ROUTES} #{File.expand_path(File.join(PUNK.get.app.path, 'routes', '*'))} #{File.expand_path(File.join(__dir__, '..', 'routes', '*'))}"
27
27
  end
28
28
 
29
29
  class App < Roda
@@ -36,7 +36,7 @@ module PUNK
36
36
  if File.exist?(index_path)
37
37
  File.read(index_path)
38
38
  else
39
- <<~EOF
39
+ <<~INDEX_HTML
40
40
  <!DOCTYPE html>
41
41
  <html>
42
42
  <head>
@@ -47,7 +47,7 @@ module PUNK
47
47
  <p>Are you <a href="https://github.com/kranzky/lets-punk">ready</a> to rock?</p>
48
48
  </body>
49
49
  </html>
50
- EOF
50
+ INDEX_HTML
51
51
  end
52
52
 
53
53
  plugin :sessions, secret: [PUNK.get.cookie.secret].pack('H*'),
@@ -88,8 +88,7 @@ module PUNK
88
88
 
89
89
  def require_session!
90
90
  begin
91
- # TODO
92
- @_current_session = nil #Session[request.session['session_id']]
91
+ @_current_session = Session[request.session['session_id']]
93
92
  if @_current_session&.active?
94
93
  @_current_session.touch
95
94
  else
@@ -192,9 +191,8 @@ module PUNK
192
191
  name = "#{request.request_method} #{request.path}"
193
192
  logger.info "Started #{name} for #{request.ip}", params.deep_symbolize_keys.sanitize.inspect
194
193
  logger.trace request.env['HTTP_USER_AGENT']
195
- # TODO
196
- # logger.info "Started #{name} for #{request.ip || Session.default_values[:remote_addr].to_s}", params.deep_symbolize_keys.sanitize.inspect
197
- # logger.trace request.env['HTTP_USER_AGENT'] || Session.default_values[:user_agent]
194
+ logger.info "Started #{name} for #{request.ip || Session.default_values[:remote_addr].to_s}", params.deep_symbolize_keys.sanitize.inspect
195
+ logger.trace request.env['HTTP_USER_AGENT'] || Session.default_values[:user_agent]
198
196
  logger.trace request.env['HTTP_COOKIE']
199
197
  logger.push_tags(name)
200
198
  _set_cookie(request.env)