punk 0.3.2 → 0.4.1

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 (138) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yml +1 -1
  3. data/.rdoc_options +0 -1
  4. data/.rubocop.yml +1091 -93
  5. data/.standard.yml +2 -0
  6. data/Gemfile +60 -61
  7. data/Gemfile.lock +64 -59
  8. data/README.md +7 -3
  9. data/Rakefile +9 -7
  10. data/VERSION +1 -1
  11. data/app/migrations/001_lets_punk.rb +1 -1
  12. data/app/routes/hello.rb +1 -1
  13. data/bin/punk +5 -5
  14. data/env/defaults.sh +3 -0
  15. data/lib/punk.rb +8 -9
  16. data/lib/punk/actions/sessions/create.rb +3 -3
  17. data/lib/punk/actions/sessions/verify.rb +2 -2
  18. data/lib/punk/commands/auth.rb +4 -4
  19. data/lib/punk/commands/generate.rb +5 -5
  20. data/lib/punk/commands/http.rb +4 -4
  21. data/lib/punk/commands/list.rb +10 -10
  22. data/lib/punk/core/app.rb +41 -41
  23. data/lib/punk/core/boot.rb +5 -5
  24. data/lib/punk/core/cli.rb +3 -3
  25. data/lib/punk/core/commander.rb +28 -28
  26. data/lib/punk/core/commands.rb +8 -8
  27. data/lib/punk/core/env.rb +27 -27
  28. data/lib/punk/core/exec.rb +8 -8
  29. data/lib/punk/core/interface.rb +19 -19
  30. data/lib/punk/core/load.rb +2 -2
  31. data/lib/punk/core/logger.rb +3 -3
  32. data/lib/punk/core/monkey.rb +1 -1
  33. data/lib/punk/core/pry.rb +2 -2
  34. data/lib/punk/core/settings.rb +4 -4
  35. data/lib/punk/core/version.rb +1 -1
  36. data/lib/punk/core/worker.rb +6 -6
  37. data/lib/punk/framework/all.rb +8 -8
  38. data/lib/punk/framework/model.rb +6 -5
  39. data/lib/punk/framework/plugins/all.rb +1 -1
  40. data/lib/punk/framework/plugins/validation.rb +8 -8
  41. data/lib/punk/framework/service.rb +5 -3
  42. data/lib/punk/framework/worker.rb +3 -3
  43. data/lib/punk/helpers/all.rb +5 -5
  44. data/lib/punk/helpers/loggable.rb +3 -3
  45. data/lib/punk/helpers/publishable.rb +1 -1
  46. data/lib/punk/helpers/renderable.rb +10 -10
  47. data/lib/punk/helpers/validatable.rb +7 -6
  48. data/lib/punk/migrations/001_punk.rb +12 -12
  49. data/lib/punk/models/group.rb +1 -1
  50. data/lib/punk/models/identity.rb +1 -1
  51. data/lib/punk/models/session.rb +7 -7
  52. data/lib/punk/models/tenant.rb +1 -1
  53. data/lib/punk/models/user.rb +2 -2
  54. data/lib/punk/plugins/all.rb +2 -2
  55. data/lib/punk/plugins/cors.rb +2 -2
  56. data/lib/punk/plugins/ssl.rb +1 -1
  57. data/lib/punk/routes/groups.rb +1 -1
  58. data/lib/punk/routes/plivo.rb +1 -1
  59. data/lib/punk/routes/sessions.rb +2 -2
  60. data/lib/punk/routes/swagger.rb +2 -2
  61. data/lib/punk/routes/tenants.rb +1 -1
  62. data/lib/punk/routes/users.rb +1 -1
  63. data/lib/punk/services/challenge_claim.rb +5 -5
  64. data/lib/punk/services/generate_swagger.rb +6 -6
  65. data/lib/punk/services/prove_claim.rb +1 -1
  66. data/lib/punk/startup/cache.rb +3 -3
  67. data/lib/punk/startup/database.rb +4 -4
  68. data/lib/punk/startup/environment.rb +6 -6
  69. data/lib/punk/startup/logger.rb +2 -2
  70. data/lib/punk/startup/task.rb +5 -5
  71. data/lib/punk/views/fail.rb +2 -2
  72. data/lib/punk/views/groups/list.rb +2 -2
  73. data/lib/punk/views/info.rb +2 -2
  74. data/lib/punk/views/plivo_store.rb +2 -2
  75. data/lib/punk/views/sessions/list.rb +2 -2
  76. data/lib/punk/views/sessions/pending.rb +2 -2
  77. data/lib/punk/views/tenants/list.rb +2 -2
  78. data/lib/punk/views/users/list.rb +2 -2
  79. data/lib/punk/views/users/show.rb +2 -2
  80. data/lib/punk/workers/geocode_session_worker.rb +3 -3
  81. data/lib/punk/workers/identify_session_worker.rb +1 -1
  82. data/lib/punk/workers/send_email_worker.rb +3 -3
  83. data/lib/punk/workers/send_sms_worker.rb +3 -3
  84. data/punk.gemspec +33 -31
  85. data/spec/actions/groups/punk/list_groups_action_spec.rb +9 -9
  86. data/spec/actions/sessions/punk/clear_session_action_spec.rb +11 -11
  87. data/spec/actions/sessions/punk/create_session_action_spec.rb +9 -9
  88. data/spec/actions/sessions/punk/list_sessions_action_spec.rb +8 -8
  89. data/spec/actions/sessions/punk/verify_session_action_spec.rb +24 -24
  90. data/spec/actions/tenants/punk/list_tenants_action_spec.rb +6 -6
  91. data/spec/actions/users/punk/list_group_users_action_spec.rb +6 -6
  92. data/spec/actions/users/punk/list_tenant_users_action_spec.rb +6 -6
  93. data/spec/factories/group.rb +1 -1
  94. data/spec/factories/group_user_metadata.rb +1 -1
  95. data/spec/factories/identity.rb +4 -4
  96. data/spec/factories/session.rb +1 -1
  97. data/spec/factories/tenant.rb +1 -1
  98. data/spec/factories/tenant_user_metadata.rb +1 -1
  99. data/spec/factories/user.rb +1 -1
  100. data/spec/lib/commands/generate_spec.rb +2 -2
  101. data/spec/lib/commands/list_spec.rb +2 -2
  102. data/spec/lib/commands/swagger_spec.rb +2 -2
  103. data/spec/lib/engine/punk_env_spec.rb +4 -4
  104. data/spec/lib/engine/punk_exec_spec.rb +2 -2
  105. data/spec/lib/engine/punk_init_spec.rb +2 -2
  106. data/spec/lib/engine/punk_store_spec.rb +2 -2
  107. data/spec/models/punk/group_spec.rb +4 -4
  108. data/spec/models/punk/group_user_metadata_spec.rb +2 -2
  109. data/spec/models/punk/identity_spec.rb +17 -17
  110. data/spec/models/punk/session_spec.rb +4 -4
  111. data/spec/models/punk/tenant_spec.rb +3 -3
  112. data/spec/models/punk/tenant_user_metadata_spec.rb +2 -2
  113. data/spec/models/punk/user_spec.rb +9 -9
  114. data/spec/routes/groups/get_groups_spec.rb +4 -4
  115. data/spec/routes/plivo/get_plivo_spec.rb +1 -1
  116. data/spec/routes/sessions/delete_session_spec.rb +1 -1
  117. data/spec/routes/sessions/get_sessions_spec.rb +5 -5
  118. data/spec/routes/sessions/patch_session_spec.rb +1 -1
  119. data/spec/routes/sessions/post_session_spec.rb +1 -1
  120. data/spec/routes/swagger/get_swagger_spec.rb +1 -1
  121. data/spec/routes/tenants/get_tenants_spec.rb +5 -5
  122. data/spec/routes/users/get_users_spec.rb +6 -6
  123. data/spec/services/punk/challenge_claim_service_spec.rb +2 -2
  124. data/spec/services/punk/create_identities_service_spec.rb +1 -1
  125. data/spec/services/punk/generate_swagger_service_spec.rb +2 -2
  126. data/spec/services/punk/prove_claim_service_spec.rb +2 -2
  127. data/spec/services/punk/secret_service_spec.rb +2 -2
  128. data/spec/spec_helper.rb +27 -27
  129. data/spec/views/punk/plivo_store_spec.rb +2 -2
  130. data/spec/views/sessions/punk/list_sessions_view_spec.rb +2 -2
  131. data/spec/views/sessions/punk/pending_session_view_spec.rb +2 -2
  132. data/spec/views/tenants/punk/list_tenants_view_spec.rb +2 -2
  133. data/spec/views/users/punk/list_groups_view_spec.rb +2 -2
  134. data/spec/views/users/punk/list_users_view_spec.rb +2 -2
  135. data/spec/workers/punk/geocode_session_worker_spec.rb +2 -2
  136. data/spec/workers/punk/identify_session_worker_spec.rb +3 -3
  137. data/spec/workers/punk/send_email_worker_spec.rb +1 -1
  138. metadata +24 -22
data/README.md CHANGED
@@ -1,6 +1,8 @@
1
+ [![Ruby Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://github.com/testdouble/standard)
1
2
  [![test](https://github.com/kranzky/punk/workflows/test/badge.svg)](https://github.com/kranzky/punk/actions?query=workflow%3Atest)
2
3
  [![Coverage Status](https://coveralls.io/repos/github/kranzky/punk/badge.svg?branch=main)](https://coveralls.io/github/kranzky/punk?branch=main)
3
4
  [![Gem Version](https://badge.fury.io/rb/punk.svg)](https://badge.fury.io/rb/punk)
5
+ [![Western Australia](https://corona.kranzky.com/oc/anz/au/wa/badge.svg)](https://corona.kranzky.com?region=oc&subregion=anz&country=au&state=wa)
4
6
 
5
7
  # Punk!
6
8
 
@@ -8,9 +10,11 @@ Punk! is an omakase web framework for rapid prototyping.
8
10
 
9
11
  ## Release Process
10
12
 
11
- 1. `rake version:bump:whatever`
12
- 2. `rake git:release BRANCH=main`
13
- 3. Create new release on GitHub to trigger ship workflow
13
+ 1. `rake standard:fix`
14
+ 2. `rake version:bump:whatever`
15
+ 3. `rake gemspec:release BRANCH=main`
16
+ 4. `rake git:release BRANCH=main`
17
+ 5. Create new release on GitHub to trigger ship workflow
14
18
 
15
19
  ## Copyright
16
20
 
data/Rakefile CHANGED
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rubygems'
4
- require 'bundler'
3
+ require "rubygems"
4
+ require "bundler"
5
5
  begin
6
6
  Bundler.setup(:default, :development)
7
7
  rescue Bundler::BundlerError => e
@@ -9,8 +9,8 @@ rescue Bundler::BundlerError => e
9
9
  warn "Run `bundle install` to install missing gems"
10
10
  exit e.status_code
11
11
  end
12
- require 'rake'
13
- require 'juwelier'
12
+ require "rake"
13
+ require "juwelier"
14
14
  Juwelier::Tasks.new do |gem|
15
15
  gem.name = "punk"
16
16
  gem.homepage = "https://github.com/kranzky/punk"
@@ -19,11 +19,13 @@ Juwelier::Tasks.new do |gem|
19
19
  gem.description = ""
20
20
  gem.email = "lloyd@kranzky.com"
21
21
  gem.authors = ["Lloyd Kranzky"]
22
- gem.required_ruby_version = ">= 2.1"
22
+ gem.required_ruby_version = ">= 2.6"
23
23
  end
24
24
  Juwelier::RubygemsDotOrgTasks.new
25
25
 
26
- require 'yard'
26
+ require "yard"
27
27
  YARD::Rake::YardocTask.new
28
28
 
29
- task default: :clean
29
+ require "standard/rake"
30
+
31
+ task default: [:clean, "standard:fix"]
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.2
1
+ 0.4.1
@@ -1,3 +1,3 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../../lib/punk/migrations/001_punk'
3
+ require_relative "../../lib/punk/migrations/001_punk"
data/app/routes/hello.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # route: GET /hello
4
- PUNK.route('hello') { perform "world" }
4
+ PUNK.route("hello") { perform "world" }
data/bin/punk CHANGED
@@ -2,15 +2,15 @@
2
2
 
3
3
  # frozen_string_literal: true
4
4
 
5
- require 'bundler/setup'
6
- require 'commander/import'
7
- require_relative '../lib/punk'
5
+ require "bundler/setup"
6
+ require "commander/import"
7
+ require_relative "../lib/punk"
8
8
 
9
- PUNK.init(task: 'script', config: { app: { name: 'Punk!' } }).config
9
+ PUNK.init(task: "script", config: {app: {name: "Punk!"}}).config
10
10
 
11
11
  program :name, PUNK.get.app.name
12
12
  program :version, PUNK.version
13
- program :description, 'An omakase web framework for rapid prototyping.'
13
+ program :description, "An omakase web framework for rapid prototyping."
14
14
 
15
15
  PUNK.commands(:commander)
16
16
 
data/env/defaults.sh ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env bash
2
+
3
+ export RACK_ENV=development
data/lib/punk.rb CHANGED
@@ -1,25 +1,24 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'bootsnap'
3
+ require "bootsnap"
4
4
 
5
- env = ENV.fetch('PUNK_ENV') { ENV.store('PUNK_ENV', 'development') }
5
+ env = ENV.fetch("PUNK_ENV") { ENV.store("PUNK_ENV", "development") }
6
6
 
7
7
  if defined?(Bootsnap)
8
+ # TODO: update gem and check setup options
8
9
  Bootsnap.setup(
9
- cache_dir: 'tmp/cache',
10
- development_mode: env == 'development',
10
+ cache_dir: "tmp/cache",
11
+ development_mode: env == "development",
11
12
  load_path_cache: true,
12
- autoload_paths_cache: true,
13
- disable_trace: false,
14
13
  compile_cache_iseq: true,
15
14
  compile_cache_yaml: true
16
15
  )
17
16
  end
18
17
 
19
18
  module PUNK
20
- def self.init(task: 'server', path: './app', config: {})
21
- require_relative 'punk/core/interface'
22
- raise InternalServerError, 'Cannot call PUNK.init multiple times!' if state != :included
19
+ def self.init(task: "server", path: "./app", config: {})
20
+ require_relative "punk/core/interface"
21
+ raise InternalServerError, "Cannot call PUNK.init multiple times!" if state != :included
23
22
  store.args = OpenStruct.new(
24
23
  task: task,
25
24
  path: path,
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'uri'
4
- require 'phony'
3
+ require "uri"
4
+ require "phony"
5
5
 
6
6
  module PUNK
7
7
  class CreateSessionAction < Action
@@ -56,7 +56,7 @@ module PUNK
56
56
  claim.downcase.strip
57
57
  when :phone
58
58
  phone = claim.strip
59
- phone = "+1#{phone}" if phone !~ /^[+]/
59
+ phone = "+1#{phone}" unless /^[+]/.match?(phone)
60
60
  "+#{Phony.normalize(phone)}"
61
61
  end
62
62
  end
@@ -17,8 +17,8 @@ module PUNK
17
17
 
18
18
  def process
19
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!'
20
+ raise BadRequest, "Secret is incorrect" unless verify.result == true
21
+ present Info, message: "We have succesfully verified your identity. Welcome to GroupFire!"
22
22
  end
23
23
  end
24
24
  end
@@ -15,7 +15,7 @@ PUNK::Command.create "login" do
15
15
  "PATH_INFO" => "/sessions",
16
16
  "CONTENT_TYPE" => "text/json",
17
17
  "SCRIPT_NAME" => "",
18
- "rack.input" => StringIO.new({ claim: claim }.to_json)
18
+ "rack.input" => StringIO.new({claim: claim}.to_json)
19
19
  )
20
20
  response = ActiveSupport::JSON.decode(response[-1].first).deep_symbolize_keys
21
21
  return if response[:errors].present?
@@ -23,17 +23,17 @@ PUNK::Command.create "login" do
23
23
  authenticated = false
24
24
  while authenticated == false
25
25
  SemanticLogger.flush
26
- secret = ask("Secret: ") { |q| q.echo = '*' }
26
+ secret = ask("Secret: ") { |q| q.echo = "*" }
27
27
  response =
28
28
  PUNK.app.call(
29
29
  "REQUEST_METHOD" => "PATCH",
30
30
  "PATH_INFO" => "/sessions/#{slug}",
31
31
  "CONTENT_TYPE" => "text/json",
32
32
  "SCRIPT_NAME" => "",
33
- "rack.input" => StringIO.new({ secret: secret }.to_json)
33
+ "rack.input" => StringIO.new({secret: secret}.to_json)
34
34
  )
35
35
  response = ActiveSupport::JSON.decode(response[-1].first).deep_symbolize_keys
36
- break if response[:errors].present? && response[:errors].first != 'Secret is incorrect'
36
+ break if response[:errors].present? && response[:errors].first != "Secret is incorrect"
37
37
  authenticated = response[:message].present?
38
38
  end
39
39
  response[:message]
@@ -1,17 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  PUNK::Command.create "generate" do
4
- shortcut 'g'
4
+ shortcut "g"
5
5
  description "Generate routes, actions, models, views, services or workers"
6
6
 
7
7
  def process
8
- case args.join(' ')
9
- when 'route', 'action', 'model', 'view', 'service', 'worker', 'scaffold'
8
+ case args.join(" ")
9
+ when "route", "action", "model", "view", "service", "worker", "scaffold"
10
10
  "TBD"
11
- when '', 'help'
11
+ when "", "help"
12
12
  "? specify one of: routes, actions, models, views, services, scaffold"
13
13
  else
14
- "? unkown arguments: #{args.join(',')}"
14
+ "? unkown arguments: #{args.join(",")}"
15
15
  end
16
16
  end
17
17
  end
@@ -4,7 +4,7 @@ PUNK::Command.create "GET" do
4
4
  description "Perform a HTTP GET request"
5
5
 
6
6
  def process
7
- path, query = args[0].split('?')
7
+ path, query = args[0].split("?")
8
8
  PUNK.app.call(
9
9
  "REQUEST_METHOD" => "GET",
10
10
  "PATH_INFO" => path,
@@ -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..-1].join)
27
+ "rack.input" => StringIO.new(args[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..-1].join)
41
+ "rack.input" => StringIO.new(args[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..-1].join)
55
+ "rack.input" => StringIO.new(args[1..].join)
56
56
  )
57
57
  end
58
58
  end
@@ -1,30 +1,30 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  PUNK::Command.create "list" do
4
- shortcut 'l'
4
+ shortcut "l"
5
5
  description "List routes, actions, models, views, services or workers"
6
6
 
7
7
  option shortcut: :a, name: :all, description: "Include Punk!", type: nil
8
8
 
9
9
  def process
10
- case args.join(' ')
11
- when 'routes'
10
+ case args.join(" ")
11
+ when "routes"
12
12
  PUNK.app
13
13
  PUNK::App.route_list # TODO: exclude PUNK routes by default
14
- when 'actions'
14
+ when "actions"
15
15
  ObjectSpace.each_object(PUNK::Action.singleton_class).map(&:name).reject { |name| _hide?(name) }
16
- when 'models'
16
+ when "models"
17
17
  ObjectSpace.each_object(PUNK::Model.singleton_class).map(&:name).reject { |name| _hide?(name) }
18
- when 'views'
18
+ when "views"
19
19
  ObjectSpace.each_object(PUNK::View.singleton_class).map(&:name).reject { |name| _hide?(name) }
20
- when 'services'
20
+ when "services"
21
21
  ObjectSpace.each_object(PUNK::Service.singleton_class).select { |klass| klass.superclass == PUNK::Service }.map(&:name).reject { |name| _hide?(name) }
22
- when 'workers'
22
+ when "workers"
23
23
  ObjectSpace.each_object(PUNK::Worker.singleton_class).select { |klass| klass.superclass == PUNK::Worker }.map(&:name).reject { |name| _hide?(name) }
24
- when '', 'help'
24
+ when "", "help"
25
25
  "? specify one of: routes, actions, models, views, services, workers"
26
26
  else
27
- "? unkown arguments: #{args.join(',')}"
27
+ "? unkown arguments: #{args.join(",")}"
28
28
  end
29
29
  end
30
30
 
data/lib/punk/core/app.rb CHANGED
@@ -1,16 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'roda'
4
- require 'sidekiq/web'
5
- require 'sidekiq/cron/web'
6
- require 'rack/protection'
3
+ require "roda"
4
+ require "sidekiq/web"
5
+ require "sidekiq/cron/web"
6
+ require "rack/protection"
7
7
 
8
- require_relative '../plugins/all'
8
+ require_relative "../plugins/all"
9
9
 
10
10
  # don't use rack session for sidekiq (we do our own auth when routing)
11
11
  Sidekiq::Web.set(:sessions, false)
12
12
  # TODO: need custom roda route csrf in sidekiq web forms
13
- Sidekiq::Web.use(::Rack::Protection, use: :none, logging: true, logger: SemanticLogger['PUNK::RPT'])
13
+ Sidekiq::Web.use(::Rack::Protection, use: :none, logging: true, logger: SemanticLogger["PUNK::RPT"])
14
14
 
15
15
  module PUNK
16
16
  def self.route(name, &block)
@@ -23,15 +23,15 @@ 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', '*'))} #{File.expand_path(File.join(__dir__, '..', '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
30
30
  include Loggable
31
31
 
32
32
  REMOTE = PUNK.env.staging? || PUNK.env.production?
33
- PUBLIC = File.join(PUNK.get.app.path, '..', 'www')
34
- index_path = File.join(PUBLIC, 'index.html')
33
+ PUBLIC = File.join(PUNK.get.app.path, "..", "www")
34
+ index_path = File.join(PUBLIC, "index.html")
35
35
  INDEX =
36
36
  if File.exist?(index_path)
37
37
  File.read(index_path)
@@ -50,7 +50,7 @@ module PUNK
50
50
  INDEX_HTML
51
51
  end
52
52
 
53
- plugin :sessions, secret: [PUNK.get.cookie.secret].pack('H*'),
53
+ plugin :sessions, secret: [PUNK.get.cookie.secret].pack("H*"),
54
54
  key: PUNK.get.cookie.key,
55
55
  max_seconds: 1.year.to_i,
56
56
  max_idle_sessions: 1.month.to_i,
@@ -70,12 +70,12 @@ module PUNK
70
70
  plugin :path_rewriter
71
71
  plugin :slash_path_empty
72
72
  plugin :multi_route
73
- plugin :type_routing, types: { csv: 'text/csv' }, default_type: :json
73
+ plugin :type_routing, types: {csv: "text/csv"}, default_type: :json
74
74
  plugin :route_list, file: ROUTES
75
75
  plugin :disallow_file_uploads
76
76
  plugin :public, root: PUBLIC
77
77
 
78
- plugin :default_headers, 'Content-Type' => 'text/html', 'Content-Security-Policy' => "default-src 'self';img-src *", 'Strict-Transport-Security' => 'max-age=16070400;', 'X-Frame-Options' => 'deny', 'X-Content-Type-Options' => 'nosniff', 'X-XSS-Protection' => '1; mode=block'
78
+ plugin :default_headers, "Content-Type" => "text/html", "Content-Security-Policy" => "default-src 'self';img-src *", "Strict-Transport-Security" => "max-age=16070400;", "X-Frame-Options" => "deny", "X-Content-Type-Options" => "nosniff", "X-XSS-Protection" => "1; mode=block"
79
79
 
80
80
  plugin :error_handler
81
81
  plugin :not_found
@@ -83,24 +83,24 @@ module PUNK
83
83
 
84
84
  request_delegate :root, :on, :is, :get, :post, :redirect, :patch, :delete
85
85
 
86
- rewrite_path(/\A\/?\z/, '/index.html')
87
- rewrite_path(/\A\/api\/?\z/, '/api/index.html')
86
+ rewrite_path(/\A\/?\z/, "/index.html")
87
+ rewrite_path(/\A\/api\/?\z/, "/api/index.html")
88
88
 
89
89
  def require_session!
90
90
  begin
91
- @_current_session = Session[request.session['session_id']]
91
+ @_current_session = Session[request.session["session_id"]]
92
92
  if @_current_session&.active?
93
93
  @_current_session.touch
94
94
  else
95
95
  clear_session
96
96
  @_current_session = nil
97
97
  end
98
- rescue StandardError => e
98
+ rescue => e
99
99
  exception(e)
100
100
  raise Unauthorized, e.message
101
101
  end
102
- raise Unauthorized, 'Session does not exist' if @_current_session.nil?
103
- PUNK.logger.info "require_session!", { current_session: current_session.inspect, current_identity: current_identity.inspect, current_user: current_user.inspect }.inspect
102
+ raise Unauthorized, "Session does not exist" if @_current_session.nil?
103
+ PUNK.logger.info "require_session!", {current_session: current_session.inspect, current_identity: current_identity.inspect, current_user: current_user.inspect}.inspect
104
104
  end
105
105
 
106
106
  def require_anonymous!
@@ -109,9 +109,9 @@ module PUNK
109
109
  end
110
110
 
111
111
  def require_tenant!
112
- raise Unauthorized, 'Session does not exist' if @_current_session.nil?
112
+ raise Unauthorized, "Session does not exist" if @_current_session.nil?
113
113
  @_current_tenant = current_user.tenants_dataset[id: params[:tenant_id]]
114
- PUNK.logger.info "require_tenant!", { current_tenant: @_current_tenant.inspect }.inspect
114
+ PUNK.logger.info "require_tenant!", {current_tenant: @_current_tenant.inspect}.inspect
115
115
  end
116
116
 
117
117
  def args
@@ -145,17 +145,17 @@ module PUNK
145
145
  end
146
146
 
147
147
  PUNK_CONTENT_TYPE_LOOKUP = {
148
- csv: 'text/csv',
149
- html: 'text/html',
150
- json: 'application/json',
151
- xml: 'application/xml'
148
+ csv: "text/csv",
149
+ html: "text/html",
150
+ json: "application/json",
151
+ xml: "application/xml"
152
152
  }.freeze
153
153
  def render(view)
154
154
  raise InternalServerError, "Not a view: #{view}" unless view.is_a?(View)
155
155
  format = request.requested_type
156
156
  view.profile_info("render", format: format) do
157
157
  response.status = view.status if view.is_a?(Fail)
158
- response['Content-Type'] = PUNK_CONTENT_TYPE_LOOKUP[format]
158
+ response["Content-Type"] = PUNK_CONTENT_TYPE_LOOKUP[format]
159
159
  view.render(format)
160
160
  end
161
161
  end
@@ -164,7 +164,7 @@ module PUNK
164
164
  exception(e, current_user: current_user)
165
165
  case e
166
166
  when BadRequest
167
- present Fail, message: 'Bad Request', error_messages: [e.message], status: 400
167
+ present Fail, message: "Bad Request", error_messages: [e.message], status: 400
168
168
  when Unauthorized
169
169
  present Fail, message: "Unauthorized", error_messages: [e.message], status: 401
170
170
  when Forbidden
@@ -190,10 +190,10 @@ module PUNK
190
190
  @_started = Time.now.utc
191
191
  name = "#{request.request_method} #{request.path}"
192
192
  logger.info "Started #{name} for #{request.ip}", params.deep_symbolize_keys.sanitize.inspect
193
- logger.trace request.env['HTTP_USER_AGENT']
193
+ logger.trace request.env["HTTP_USER_AGENT"]
194
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]
196
- logger.trace request.env['HTTP_COOKIE']
195
+ logger.trace request.env["HTTP_USER_AGENT"] || Session.default_values[:user_agent]
196
+ logger.trace request.env["HTTP_COOKIE"]
197
197
  logger.push_tags(name)
198
198
  _set_cookie(request.env)
199
199
  end
@@ -203,14 +203,14 @@ module PUNK
203
203
  name = logger.pop_tags(1).join
204
204
  duration = 1000.0 * (Time.now.utc - @_started)
205
205
  logger.pop_tags
206
- logger.trace((headers.present? ? headers['Set-Cookie'] : nil) || "(no cookie set)")
206
+ logger.trace((headers.present? ? headers["Set-Cookie"] : nil) || "(no cookie set)")
207
207
  logger.info message: "Completed #{name} status #{status}", duration: duration
208
208
  _store_cookie(headers)
209
209
  end
210
210
 
211
211
  route do |r|
212
212
  r.public
213
- r.on 'jobs' do
213
+ r.on "jobs" do
214
214
  require_session!
215
215
  r.run Sidekiq::Web
216
216
  end
@@ -222,26 +222,26 @@ module PUNK
222
222
  def _set_cookie(headers)
223
223
  return if REMOTE
224
224
  return if headers.blank?
225
- return if headers['HTTP_USER_AGENT'].present?
226
- return if headers['HTTP_COOKIE'].present?
227
- cookie_file = 'tmp/.cookie-jar'
228
- cookie_file += '-test' if PUNK.env.test?
225
+ return if headers["HTTP_USER_AGENT"].present?
226
+ return if headers["HTTP_COOKIE"].present?
227
+ cookie_file = "tmp/.cookie-jar"
228
+ cookie_file += "-test" if PUNK.env.test?
229
229
  cookie = File.read(cookie_file) if File.exist?(cookie_file)
230
230
  return if cookie.blank?
231
- headers['HTTP_COOKIE'] = cookie
231
+ headers["HTTP_COOKIE"] = cookie
232
232
  end
233
233
 
234
234
  def _store_cookie(headers)
235
235
  return if REMOTE
236
236
  return if headers.blank?
237
- cookie = headers['Set-Cookie']
237
+ cookie = headers["Set-Cookie"]
238
238
  return if cookie.blank?
239
- cookie_file = 'tmp/.cookie-jar'
240
- cookie_file += '-test' if PUNK.env.test?
241
- if cookie =~ /max-age=0/
239
+ cookie_file = "tmp/.cookie-jar"
240
+ cookie_file += "-test" if PUNK.env.test?
241
+ if /max-age=0/.match?(cookie)
242
242
  File.delete(cookie_file)
243
243
  else
244
- File.open(cookie_file, 'w') { |file| file << cookie }
244
+ File.open(cookie_file, "w") { |file| file << cookie }
245
245
  end
246
246
  end
247
247
  end