active_record_pretty_key 0.1.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: fa0c741c251d8d3acde833ff8620ffbea369f74544d1feda3507684596d327de
4
+ data.tar.gz: 9be0117695b9d2268c7ba3e930a28983ea50fb19326ce5aabfc6e914bda3c8c5
5
+ SHA512:
6
+ metadata.gz: 4bd0c1ac8f56f770bd90e010467f3aae5e345f316554d657ef7086b7ff288825a5b9a2545c261c495bede196445b54f0566b5d8dd8d8e53ba17926f3bce167aa
7
+ data.tar.gz: 6c3e23c905e21f50d625dd22b84d26232f99222d473d79afc4f89e05db2ccc2f4830ccc8a6f1910fe4b5da5e00da733fc98c66664ce741c5a65341a2b38fa2b0
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.1
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveRecordPrettyKey
4
+ module Concern
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ before_create :generate_pretty_key
9
+ end
10
+
11
+ private
12
+
13
+ def generate_pretty_key
14
+ pk_attribute = self.class.primary_key
15
+ return if pk_attribute.nil? || self.class.attribute_types[pk_attribute].nil? || self.class.attribute_types[pk_attribute].type != :string
16
+
17
+ # Ensure PrettyKeyTicket is available
18
+ return unless defined?(ActiveRecordPrettyKey::PrettyKeyTicket)
19
+
20
+ self.assign_attributes(pk_attribute => ActiveRecordPrettyKey::PrettyKeyTicket.next_sqid) unless self.attributes[pk_attribute].present?
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveRecordPrettyKey
4
+ class PrettyKeyTicket < ActiveRecord::Base
5
+ self.table_name = "pretty_key_tickets"
6
+ @sqids = Sqids.new(
7
+ min_length: 4,
8
+ alphabet: defined?(Rails) && Rails.application.respond_to?(:credentials) ?
9
+ (Rails.application.credentials.dig(:sqids, :alphabet) || Sqids::DEFAULT_ALPHABET) :
10
+ Sqids::DEFAULT_ALPHABET,
11
+ )
12
+
13
+ # Generate a new unique ID that works with PostgreSQL, MySQL, and SQLite
14
+ def self.next_id
15
+ transaction do
16
+ # Detect database type
17
+ adapter = connection.adapter_name.downcase
18
+
19
+ if [ "postgresql", "postgis" ].include?(adapter)
20
+ # PostgreSQL approach
21
+ result = connection.execute(
22
+ "INSERT INTO pretty_key_tickets (stub) VALUES ('a')
23
+ ON CONFLICT (stub) DO UPDATE SET id = currval('pretty_key_tickets_id_seq')
24
+ RETURNING id"
25
+ )
26
+ result[0]["id"]
27
+ elsif [ "mysql", "mysql2" ].include?(adapter)
28
+ # MySQL approach
29
+ connection.execute("REPLACE INTO pretty_key_tickets (stub) VALUES ('a');")
30
+ connection.execute("SELECT LAST_INSERT_ID()").first[0]
31
+ else
32
+ # SQLite approach (and fallback for others)
33
+ connection.execute("REPLACE INTO pretty_key_tickets (stub) VALUES ('a');")
34
+ last.id
35
+ end
36
+ end
37
+ end
38
+
39
+ def self.next_sqid
40
+ @sqids.encode([ self.next_id ])
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveRecordPrettyKey
4
+ VERSION = File.read(
5
+ File.expand_path('../../VERSION', __dir__)
6
+ ).strip.freeze
7
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record"
4
+ require "active_support/concern"
5
+ require "sqids"
6
+ require_relative "active_record_pretty_key/pretty_key_ticket"
7
+ require_relative "active_record_pretty_key/concern"
8
+ # require_relative "active_record_pretty_key/version"
9
+
10
+
11
+ module ActiveRecordPrettyKey
12
+ class Error < StandardError; end
13
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails/generators"
4
+
5
+ module ActiveRecordPrettyKey
6
+ module Generators
7
+ class InstallGenerator < Rails::Generators::Base
8
+ source_root File.expand_path("templates", __dir__)
9
+ desc "Creates the tickets table migration for active_record_pretty_key"
10
+
11
+ def create_migration
12
+ template "create_tickets.erb", "db/migrate/#{Time.now.utc.strftime("%Y%m%d%H%M%S")}_create_pretty_key_tickets.rb"
13
+ end
14
+
15
+ private
16
+
17
+ def migration_version
18
+ if ActiveRecord::VERSION::MAJOR >= 5
19
+ "[#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}]"
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,11 @@
1
+ class CreatePrettyKeyTickets < ActiveRecord::Migration<%= migration_version %>
2
+ def change
3
+ create_table :pretty_key_tickets, id: :bigint do |t|
4
+ t.string :stub, limit: 1, null: false
5
+ end
6
+ add_index :pretty_key_tickets, :stub, unique: true
7
+
8
+ # Seed initial value
9
+ execute "INSERT INTO pretty_key_tickets (stub) VALUES ('a')"
10
+ end
11
+ end
metadata ADDED
@@ -0,0 +1,109 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: active_record_pretty_key
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Stuart Yamartino
8
+ - John Nagro
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 1980-01-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activerecord
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 6.0.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 6.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 6.0.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 6.0.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: sqids
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.1'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.1'
55
+ - !ruby/object:Gem::Dependency
56
+ name: thor
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.0'
69
+ description: ActiveRecordPrettyKey provides functionality to generate and manage pretty,
70
+ human-readable keys for ActiveRecord models.
71
+ email:
72
+ - stu@stuyam.com
73
+ - john.nagro@gmail.com
74
+ executables: []
75
+ extensions: []
76
+ extra_rdoc_files: []
77
+ files:
78
+ - VERSION
79
+ - lib/active_record_pretty_key.rb
80
+ - lib/active_record_pretty_key/concern.rb
81
+ - lib/active_record_pretty_key/pretty_key_ticket.rb
82
+ - lib/active_record_pretty_key/version.rb
83
+ - lib/generators/active_record_pretty_key/install/install_generator.rb
84
+ - lib/generators/active_record_pretty_key/install/templates/create_tickets.erb
85
+ homepage: https://github.com/noreastergroup/active_record_pretty_key
86
+ licenses:
87
+ - MIT
88
+ metadata:
89
+ homepage_uri: https://github.com/noreastergroup/active_record_pretty_key
90
+ source_code_uri: https://github.com/noreastergroup/active_record_pretty_key
91
+ changelog_uri: https://github.com/noreastergroup/active_record_pretty_key/blob/main/CHANGELOG.md
92
+ rdoc_options: []
93
+ require_paths:
94
+ - lib
95
+ required_ruby_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: 2.7.0
100
+ required_rubygems_version: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ requirements: []
106
+ rubygems_version: 3.6.7
107
+ specification_version: 4
108
+ summary: A gem for generating pretty keys in ActiveRecord models
109
+ test_files: []