punk 0.3.2 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'semantic_logger'
3
+ require "semantic_logger"
4
4
 
5
5
  module PUNK
6
6
  include SemanticLogger::Loggable
@@ -22,9 +22,9 @@ module PUNK
22
22
 
23
23
  SemanticLogger.default_level =
24
24
  case PUNK.store.args.task
25
- when 'console', 'script'
25
+ when "console", "script"
26
26
  :info
27
- when 'spec'
27
+ when "spec"
28
28
  :debug
29
29
  else
30
30
  :trace
@@ -2,6 +2,6 @@
2
2
 
3
3
  class Hash
4
4
  def sanitize
5
- merge(slice(:password, :secret, 'password', 'secret').transform_values { "***" })
5
+ merge(slice(:password, :secret, "password", "secret").transform_values { "***" })
6
6
  end
7
7
  end
data/lib/punk/core/pry.rb CHANGED
@@ -22,9 +22,9 @@ ensure
22
22
  end
23
23
 
24
24
  def reload!
25
- ['actions', 'models', 'views', 'services', 'workers'].each do |dir|
25
+ ["actions", "models", "views", "services", "workers"].each do |dir|
26
26
  path = File.join(PUNK.get.app.path, dir)
27
- Dir.glob(File.join(path, '**/*.rb')).each { |file| load(file) }
27
+ Dir.glob(File.join(path, "**/*.rb")).each { |file| load(file) }
28
28
  end
29
29
  "Reloaded all actions, models, views, services and workers."
30
30
  ensure
@@ -1,10 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dot_hash'
3
+ require "dot_hash"
4
4
 
5
5
  module PUNK
6
6
  class Settings < DotHash::Settings
7
- alias key? has_key?
7
+ alias_method :key?, :has_key?
8
8
 
9
9
  delegate :inspect, to: :_inspect_hash
10
10
 
@@ -13,9 +13,9 @@ module PUNK
13
13
  if match && key?(match[1]) && !key?(key)
14
14
  value = execute(match[1], *args, &block)
15
15
  case match[2]
16
- when '?'
16
+ when "?"
17
17
  return value if value.is_a?(TrueClass) || value.is_a?(FalseClass)
18
- when '!'
18
+ when "!"
19
19
  raise InternalServerError, "Value is nil: #{key}" if value.nil?
20
20
  return value
21
21
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module PUNK
4
4
  def self.version
5
- File.read(File.join(__dir__, '..', '..', '..', 'VERSION'))
5
+ File.read(File.join(__dir__, "..", "..", "..", "VERSION"))
6
6
  end
7
7
  end
@@ -1,13 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../../punk'
4
- require 'sidekiq'
5
- require 'sidekiq-cron'
3
+ require_relative "../../punk"
4
+ require "sidekiq"
5
+ require "sidekiq-cron"
6
6
 
7
- PUNK.init(task: 'worker', config: { app: { name: 'Roadie' } }).exec
7
+ PUNK.init(task: "worker", config: {app: {name: "Roadie"}}).exec
8
8
 
9
- Sidekiq.logger = SemanticLogger['PUNK::SKQ']
9
+ Sidekiq.logger = SemanticLogger["PUNK::SKQ"]
10
10
  Sidekiq.logger.class.alias_method(:with_context, :tagged)
11
11
 
12
- path = File.expand_path(File.join(PUNK.get.app.path, '..', 'config', 'schedule.yml'))
12
+ path = File.expand_path(File.join(PUNK.get.app.path, "..", "config", "schedule.yml"))
13
13
  Sidekiq::Cron::Job.load_from_hash(YAML.load_file(path))
@@ -1,10 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'plugins/all'
4
- require_relative 'model'
5
- require_relative 'runnable'
6
- require_relative 'service'
7
- require_relative 'worker'
8
- require_relative 'action'
9
- require_relative 'view'
10
- require_relative 'command'
3
+ require_relative "plugins/all"
4
+ require_relative "model"
5
+ require_relative "runnable"
6
+ require_relative "service"
7
+ require_relative "worker"
8
+ require_relative "action"
9
+ require_relative "view"
10
+ require_relative "command"
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'aasm'
3
+ require "aasm"
4
4
 
5
5
  AASM::Configuration.hide_warnings = true
6
6
 
@@ -22,17 +22,18 @@ module PUNK
22
22
 
23
23
  plugin PUNK::Plugins::Validation
24
24
 
25
- def validate; end
25
+ def validate
26
+ end
26
27
 
27
28
  def inspect
28
29
  id.present? ? "#{id}|#{self}" : to_s
29
30
  end
30
31
 
31
- def self.sample_dataset(count=1)
32
- order(Sequel.lit('random()')).limit(count)
32
+ def self.sample_dataset(count = 1)
33
+ order(Sequel.lit("random()")).limit(count)
33
34
  end
34
35
 
35
- def self.sample(count=1)
36
+ def self.sample(count = 1)
36
37
  query = sample_dataset(count)
37
38
  count == 1 ? query.first : query.all
38
39
  end
@@ -1,3 +1,3 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'validation'
3
+ require_relative "validation"
@@ -1,28 +1,28 @@
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
  module Plugins
8
8
  module Validation
9
9
  module InstanceMethods
10
- def validates_url(atts, opts={})
11
- default = { message: "is not a URL" }
10
+ def validates_url(atts, opts = {})
11
+ default = {message: "is not a URL"}
12
12
  validatable_attributes(atts, default.merge(opts)) do |_name, value, message|
13
13
  message unless URI::DEFAULT_PARSER.make_regexp.match(value).to_a.compact.length > 2
14
14
  end
15
15
  end
16
16
 
17
- def validates_email(atts, opts={})
18
- default = { message: "is not an email address" }
17
+ def validates_email(atts, opts = {})
18
+ default = {message: "is not an email address"}
19
19
  validatable_attributes(atts, default.merge(opts)) do |_name, value, message|
20
20
  message unless URI::MailTo::EMAIL_REGEXP.match(value)
21
21
  end
22
22
  end
23
23
 
24
- def validates_phone(atts, opts={})
25
- default = { message: "is not a phone number" }
24
+ def validates_phone(atts, opts = {})
25
+ default = {message: "is not a phone number"}
26
26
  validatable_attributes(atts, default.merge(opts)) do |_name, value, message|
27
27
  message unless Phony.plausible?(value)
28
28
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'active_support/string_inquirer'
3
+ require "active_support/string_inquirer"
4
4
 
5
5
  module PUNK
6
6
  class Service < Runnable
@@ -34,9 +34,11 @@ module PUNK
34
34
  ActiveSupport::StringInquirer.new(@_state.to_s)
35
35
  end
36
36
 
37
- def on_success; end
37
+ def on_success
38
+ end
38
39
 
39
- def on_failure; end
40
+ def on_failure
41
+ end
40
42
 
41
43
  private
42
44
 
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'sidekiq'
3
+ require "sidekiq"
4
4
 
5
5
  module PUNK
6
6
  class Worker < Runnable
@@ -8,11 +8,11 @@ module PUNK
8
8
 
9
9
  def self.perform_now(**kwargs)
10
10
  worker = new
11
- worker.define_singleton_method :logger, -> { SemanticLogger['PUNK::SKQ'] }
11
+ worker.define_singleton_method :logger, -> { SemanticLogger["PUNK::SKQ"] }
12
12
  worker.send(:perform, **kwargs)
13
13
  end
14
14
 
15
- def perform(kwargs={})
15
+ def perform(kwargs = {})
16
16
  @_started = Time.now.utc
17
17
  logger.info "Started #{self.class.name}", kwargs.sanitize.inspect
18
18
  logger.push_tags(self.class.name)
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'active_support/concern'
3
+ require "active_support/concern"
4
4
 
5
- require_relative 'loggable'
6
- require_relative 'publishable'
7
- require_relative 'renderable'
8
- require_relative 'validatable'
5
+ require_relative "loggable"
6
+ require_relative "publishable"
7
+ require_relative "renderable"
8
+ require_relative "validatable"
@@ -20,8 +20,8 @@ module PUNK
20
20
  self.class.profile_trace(name, **kwargs, &block)
21
21
  end
22
22
 
23
- def exception(e, extra={})
24
- if ENV.key?('SENTRY_DSN')
23
+ def exception(e, extra = {})
24
+ if ENV.key?("SENTRY_DSN")
25
25
  ::Sentry.capture_exception(
26
26
  e,
27
27
  message: e.message,
@@ -45,7 +45,7 @@ module PUNK
45
45
  if trim || ignore.any? { |path| line =~ /#{path}/ }
46
46
  unless skip
47
47
  skip = true
48
- '...'
48
+ "..."
49
49
  end
50
50
  else
51
51
  skip = false
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'wisper'
3
+ require "wisper"
4
4
 
5
5
  module PUNK
6
6
  module Publishable
@@ -1,15 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'tilt'
3
+ require "tilt"
4
4
 
5
5
  module PUNK
6
6
  module Renderable
7
7
  FORMATS =
8
8
  {
9
- html: { renderer: :to_html, extension: 'slim' },
10
- json: { renderer: :to_json, extension: 'jbuilder' },
11
- csv: { renderer: :to_csv, extension: 'rcsv' },
12
- xml: { renderer: :to_xml, extension: 'xml.slim' }
9
+ html: {renderer: :to_html, extension: "slim"},
10
+ json: {renderer: :to_json, extension: "jbuilder"},
11
+ csv: {renderer: :to_csv, extension: "rcsv"},
12
+ xml: {renderer: :to_xml, extension: "xml.slim"}
13
13
  }.freeze
14
14
 
15
15
  def template(name)
@@ -21,19 +21,19 @@ module PUNK
21
21
  send(FORMATS[format][:renderer])
22
22
  end
23
23
 
24
- def to_html(options={})
24
+ def to_html(options = {})
25
25
  _render(:html, options)
26
26
  end
27
27
 
28
- def to_json(options={})
28
+ def to_json(options = {})
29
29
  _render(:json, options)
30
30
  end
31
31
 
32
- def to_csv(options={})
32
+ def to_csv(options = {})
33
33
  _render(:csv, options)
34
34
  end
35
35
 
36
- def to_xml(options={})
36
+ def to_xml(options = {})
37
37
  _render(:xml, options)
38
38
  end
39
39
 
@@ -52,7 +52,7 @@ module PUNK
52
52
  protected
53
53
 
54
54
  def _dir
55
- File.join(PUNK.get.app.path, 'templates')
55
+ File.join(PUNK.get.app.path, "templates")
56
56
  end
57
57
 
58
58
  private
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'sequel/plugins/validation_helpers'
4
- require_relative '../framework/plugins/validation'
3
+ require "sequel/plugins/validation_helpers"
4
+ require_relative "../framework/plugins/validation"
5
5
 
6
6
  module PUNK
7
7
  module Validatable
@@ -21,9 +21,10 @@ module PUNK
21
21
  errors.empty?
22
22
  end
23
23
 
24
- def validate; end
24
+ def validate
25
+ end
25
26
 
26
- def validates_not_empty(atts, opts=Sequel::OPTS)
27
+ def validates_not_empty(atts, opts = Sequel::OPTS)
27
28
  validatable_attributes_for_type(:not_empty, atts, opts) { |_a, v, m| validation_error_message(m) if v.blank? }
28
29
  end
29
30
 
@@ -42,13 +43,13 @@ module PUNK
42
43
  value =
43
44
  begin
44
45
  instance_variable_get(name)
45
- rescue StandardError
46
+ rescue
46
47
  nil
47
48
  end
48
49
  value ||=
49
50
  begin
50
51
  send(name)
51
- rescue StandardError
52
+ rescue
52
53
  nil
53
54
  end
54
55
  value
@@ -3,10 +3,10 @@
3
3
  def _tenants
4
4
  create_table :tenants do
5
5
  uuid :id, primary_key: true, default: Sequel.function(:gen_random_uuid)
6
- punk_state :state, null: false, default: 'created'
6
+ punk_state :state, null: false, default: "created"
7
7
  String :name, null: false, text: true
8
8
  String :icon, text: true
9
- jsonb :data, default: '{}'
9
+ jsonb :data, default: "{}"
10
10
  DateTime :created_at
11
11
  DateTime :updated_at
12
12
  end
@@ -15,12 +15,12 @@ end
15
15
  def _users
16
16
  create_table :users do
17
17
  uuid :id, primary_key: true, default: Sequel.function(:gen_random_uuid)
18
- punk_state :state, null: false, default: 'created'
18
+ punk_state :state, null: false, default: "created"
19
19
  String :name, null: false, text: true
20
20
  String :icon, text: true
21
21
  String :email, text: true, unique: true
22
22
  String :phone, text: true, unique: true
23
- jsonb :data, default: '{}'
23
+ jsonb :data, default: "{}"
24
24
  DateTime :created_at
25
25
  DateTime :updated_at
26
26
  end
@@ -38,10 +38,10 @@ end
38
38
  def _groups
39
39
  create_table :groups do
40
40
  uuid :id, primary_key: true, default: Sequel.function(:gen_random_uuid)
41
- punk_state :state, null: false, default: 'created'
41
+ punk_state :state, null: false, default: "created"
42
42
  String :name, null: false, text: true
43
43
  String :icon, text: true
44
- jsonb :data, default: '{}'
44
+ jsonb :data, default: "{}"
45
45
  DateTime :created_at
46
46
  DateTime :updated_at
47
47
  foreign_key :tenant_id, :tenants, null: false, type: :uuid
@@ -61,10 +61,10 @@ def _identities
61
61
  create_enum(:claim_type, %w[email phone])
62
62
  create_table :identities do
63
63
  uuid :id, primary_key: true, default: Sequel.function(:gen_random_uuid)
64
- punk_state :state, null: false, default: 'created'
64
+ punk_state :state, null: false, default: "created"
65
65
  claim_type :claim_type, null: false
66
66
  String :claim, text: true, null: false, unique: true
67
- jsonb :data, default: '{}'
67
+ jsonb :data, default: "{}"
68
68
  DateTime :created_at
69
69
  DateTime :updated_at
70
70
  foreign_key :user_id, :users, null: true, type: :uuid
@@ -76,13 +76,13 @@ def _sessions
76
76
  create_table :sessions do
77
77
  uuid :id, primary_key: true, default: Sequel.function(:gen_random_uuid)
78
78
  uuid :slug, default: Sequel.function(:gen_random_uuid)
79
- session_state :state, null: false, default: 'created'
79
+ session_state :state, null: false, default: "created"
80
80
  File :salt, text: true
81
81
  File :hash, text: true
82
82
  Integer :attempt_count, null: false, default: 0
83
- cidr :remote_addr, null: false, default: '127.0.0.1'
84
- String :user_agent, text: true, null: false, default: 'Mozilla/5.0 (compatible; Punk!; +https://punk.kranzky.com)'
85
- jsonb :data, default: '{}'
83
+ cidr :remote_addr, null: false, default: "127.0.0.1"
84
+ String :user_agent, text: true, null: false, default: "Mozilla/5.0 (compatible; Punk!; +https://punk.kranzky.com)"
85
+ jsonb :data, default: "{}"
86
86
  DateTime :created_at
87
87
  DateTime :updated_at
88
88
  foreign_key :identity_id, :identities, null: false, type: :uuid