referral_box 0.1.1 → 0.1.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 867473469f84b50eb1d91c236e8b8dea1d704fe4e500988220bebe540ac1d7e2
4
- data.tar.gz: 0bc7e4a1e9ebfc8eeccd44852e935565f2b7d18a6e392d9ddff4212a2f66bf49
3
+ metadata.gz: cf16b9679f6e24b2be6b829656425f355ffd2e66bbbdf7fbc2ccc6054848d4c3
4
+ data.tar.gz: c3ef398f59824859c6397c25fa5a6e19f67331e100b746cb22b766d7ce9c4656
5
5
  SHA512:
6
- metadata.gz: 94996431776ddc4285e95d4d985b9a1db86a9f42a2516b483d93b319bbd72eb1aae6d7705f341969934f30f8c4e763c02b22f228737a285f695e7c2ffcb7c8f6
7
- data.tar.gz: 6d7f771dfdfd942c6503281b34783ee907474ebfa023866fa84d5890a87746148507113a4a375eaade80b151ac0480dcb615038a6b8e8ccbf15f370c1a33a8cf
6
+ metadata.gz: a3eb0fcfad35a71dd6306a58ee64377a96a37bc225e5e8ce2e406c7c368e5e2be85a0f62cec1253d657a3c2a2906580cfff489ef6baa4e842e1ca2ac62655dbc
7
+ data.tar.gz: b348dc01aec33cf0fb870c182a6d8d0b72a286abd95bbc332a14f44dcf0a8f98bcf8158337651fb7f1a196fe4784358ae53a85302e3e941997fffb39e0826074
data/CHANGELOG.md CHANGED
@@ -7,6 +7,25 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.1.3] - 2025-01-XX
11
+
12
+ ### Fixed
13
+ - **Migration Version Issue**: Fixed Rails migration version format to use "8.0" instead of "8"
14
+ - **Generator Compatibility**: Migration generator now works correctly with Rails 8.x applications
15
+
16
+ ## [0.1.2] - 2025-01-XX
17
+
18
+ ### Fixed
19
+ - **Migration Issue**: Fixed NOT NULL constraint error by making referrer_id nullable
20
+ - **Generator Improvements**: Removed interactive prompts, now reads configuration from initializer
21
+ - **Model Flexibility**: Generator automatically detects and uses the configured model class name
22
+ - **Migration Generation**: Creates proper migrations with correct table names and constraints
23
+
24
+ ### Changed
25
+ - Generator no longer asks questions - uses `reference_class_name` from initializer
26
+ - Migration adds `null: true` to referrer_id to prevent constraint violations
27
+ - Added unique index on referral_code column
28
+
10
29
  ## [0.1.1] - 2025-01-XX
11
30
 
12
31
  ### Fixed
@@ -11,21 +11,39 @@ module ReferralBox
11
11
  template "initializer.rb", "config/initializers/referral_box.rb"
12
12
  end
13
13
 
14
- def add_user_model_migration
15
- generate_migration = ask("Would you like to add referral_code and tier columns to your User model? (y/n)")
14
+ def add_model_migration
15
+ # Read the configuration to determine the model class name
16
+ model_class = get_model_class_name
16
17
 
17
- if generate_migration.downcase == 'y'
18
- generate "migration", "AddReferralBoxToUsers referral_code:string tier:string referrer:references"
19
- puts "Migration generated! Run 'rails db:migrate' to apply it."
18
+ if model_class.present?
19
+ generate_migration = "AddReferralBoxTo#{model_class.pluralize}"
20
+ migration_content = generate_migration_content(model_class)
21
+
22
+ create_file "db/migrate/#{Time.current.strftime('%Y%m%d%H%M%S')}_#{generate_migration.underscore}.rb", migration_content
23
+
24
+ puts "Migration generated for #{model_class} model!"
25
+ puts "Run 'rails db:migrate' to apply it."
26
+ else
27
+ puts "Warning: Could not determine model class name from configuration."
28
+ puts "Please manually create migration for your model."
20
29
  end
21
30
  end
22
31
 
23
- def add_user_model_methods
24
- user_class = ask("What is your user model class name? (default: User)")
25
- user_class = "User" if user_class.blank?
32
+ def add_model_methods
33
+ model_class = get_model_class_name
26
34
 
27
- template "user_model.rb", "app/models/#{user_class.downcase}.rb", skip: true
28
- puts "Please add the ReferralBox methods to your #{user_class} model manually."
35
+ if model_class.present?
36
+ model_file = "app/models/#{model_class.underscore}.rb"
37
+
38
+ if File.exist?(model_file)
39
+ inject_into_file model_file, after: "class #{model_class} < ApplicationRecord" do
40
+ "\n " + generate_model_methods(model_class)
41
+ end
42
+ puts "Added ReferralBox methods to #{model_class} model."
43
+ else
44
+ puts "Warning: #{model_file} not found. Please manually add ReferralBox methods to your #{model_class} model."
45
+ end
46
+ end
29
47
  end
30
48
 
31
49
  def show_instructions
@@ -34,12 +52,83 @@ module ReferralBox
34
52
  puts "="*60
35
53
  puts "\nNext steps:"
36
54
  puts "1. Run 'rails db:migrate' to create the database tables"
37
- puts "2. Add ReferralBox methods to your User model (see template)"
38
- puts "3. Configure ReferralBox in config/initializers/referral_box.rb"
39
- puts "4. Visit /referral_box to access the admin dashboard"
55
+ puts "2. Configure ReferralBox in config/initializers/referral_box.rb"
56
+ puts "3. Visit /referral_box to access the admin dashboard"
40
57
  puts "\nFor more information, see the documentation!"
41
58
  puts "="*60
42
59
  end
60
+
61
+ private
62
+
63
+ def get_model_class_name
64
+ # Try to read from existing initializer first
65
+ initializer_path = "config/initializers/referral_box.rb"
66
+
67
+ if File.exist?(initializer_path)
68
+ content = File.read(initializer_path)
69
+ if match = content.match(/config\.reference_class_name\s*=\s*['"]([^'"]+)['"]/)
70
+ return match[1]
71
+ end
72
+ end
73
+
74
+ # Default to 'User' if not found
75
+ 'User'
76
+ end
77
+
78
+ def generate_migration_content(model_class)
79
+ <<~MIGRATION
80
+ # frozen_string_literal: true
81
+
82
+ class AddReferralBoxTo#{model_class.pluralize} < ActiveRecord::Migration[#{get_rails_version}]
83
+ def change
84
+ add_column :#{model_class.underscore.pluralize}, :referral_code, :string
85
+ add_column :#{model_class.underscore.pluralize}, :tier, :string
86
+ add_reference :#{model_class.underscore.pluralize}, :referrer, null: true, foreign_key: { to_table: :#{model_class.underscore.pluralize} }
87
+
88
+ add_index :#{model_class.underscore.pluralize}, :referral_code, unique: true
89
+ end
90
+ end
91
+ MIGRATION
92
+ end
93
+
94
+ def get_rails_version
95
+ # Get the major and minor version (e.g., "8.0" instead of just "8")
96
+ major, minor = Rails.version.split('.')[0..1]
97
+ "#{major}.#{minor}"
98
+ end
99
+
100
+ def generate_model_methods(model_class)
101
+ <<~METHODS
102
+ has_many :referral_box_transactions, class_name: 'ReferralBox::Transaction', as: :user
103
+ has_many :referrals, class_name: '#{model_class}', foreign_key: 'referrer_id'
104
+ belongs_to :referrer, class_name: '#{model_class}', optional: true
105
+
106
+ before_create :generate_referral_code
107
+
108
+ def points_balance
109
+ ReferralBox.balance(self)
110
+ end
111
+
112
+ def current_tier
113
+ ReferralBox.tier(self)
114
+ end
115
+
116
+ def referral_link
117
+ "\#{Rails.application.routes.url_helpers.root_url}?ref=\#{referral_code}"
118
+ end
119
+
120
+ private
121
+
122
+ def generate_referral_code
123
+ return if referral_code.present?
124
+
125
+ loop do
126
+ self.referral_code = SecureRandom.alphanumeric(ReferralBox.configuration.referral_code_length).upcase
127
+ break unless #{model_class}.exists?(referral_code: referral_code)
128
+ end
129
+ end
130
+ METHODS
131
+ end
43
132
  end
44
133
  end
45
134
  end
@@ -2,7 +2,8 @@
2
2
 
3
3
  ReferralBox.configure do |config|
4
4
  # Define which model represents your app's user/customer
5
- config.reference_class_name = 'User' # or 'Customer', 'Account', etc.
5
+ # Change this to match your model: 'User', 'Customer', 'Account', 'Member', etc.
6
+ config.reference_class_name = 'User'
6
7
 
7
8
  # Custom earning rule - earn points based on events
8
9
  config.earning_rule = ->(user, event) do
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ReferralBox
4
- VERSION = "0.1.1"
4
+ VERSION = "0.1.3"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: referral_box
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kapil Dev Pal
@@ -16,56 +16,80 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 6.0.0
19
+ version: '6.0'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '9.0'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
27
  - - ">="
25
28
  - !ruby/object:Gem::Version
26
- version: 6.0.0
29
+ version: '6.0'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '9.0'
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: activerecord
29
35
  requirement: !ruby/object:Gem::Requirement
30
36
  requirements:
31
37
  - - ">="
32
38
  - !ruby/object:Gem::Version
33
- version: 6.0.0
39
+ version: '6.0'
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: '9.0'
34
43
  type: :runtime
35
44
  prerelease: false
36
45
  version_requirements: !ruby/object:Gem::Requirement
37
46
  requirements:
38
47
  - - ">="
39
48
  - !ruby/object:Gem::Version
40
- version: 6.0.0
49
+ version: '6.0'
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '9.0'
41
53
  - !ruby/object:Gem::Dependency
42
54
  name: actionview
43
55
  requirement: !ruby/object:Gem::Requirement
44
56
  requirements:
45
57
  - - ">="
46
58
  - !ruby/object:Gem::Version
47
- version: 6.0.0
59
+ version: '6.0'
60
+ - - "<"
61
+ - !ruby/object:Gem::Version
62
+ version: '9.0'
48
63
  type: :runtime
49
64
  prerelease: false
50
65
  version_requirements: !ruby/object:Gem::Requirement
51
66
  requirements:
52
67
  - - ">="
53
68
  - !ruby/object:Gem::Version
54
- version: 6.0.0
69
+ version: '6.0'
70
+ - - "<"
71
+ - !ruby/object:Gem::Version
72
+ version: '9.0'
55
73
  - !ruby/object:Gem::Dependency
56
74
  name: actionpack
57
75
  requirement: !ruby/object:Gem::Requirement
58
76
  requirements:
59
77
  - - ">="
60
78
  - !ruby/object:Gem::Version
61
- version: 6.0.0
79
+ version: '6.0'
80
+ - - "<"
81
+ - !ruby/object:Gem::Version
82
+ version: '9.0'
62
83
  type: :runtime
63
84
  prerelease: false
64
85
  version_requirements: !ruby/object:Gem::Requirement
65
86
  requirements:
66
87
  - - ">="
67
88
  - !ruby/object:Gem::Version
68
- version: 6.0.0
89
+ version: '6.0'
90
+ - - "<"
91
+ - !ruby/object:Gem::Version
92
+ version: '9.0'
69
93
  - !ruby/object:Gem::Dependency
70
94
  name: kaminari
71
95
  requirement: !ruby/object:Gem::Requirement
@@ -84,28 +108,28 @@ dependencies:
84
108
  name: rspec-rails
85
109
  requirement: !ruby/object:Gem::Requirement
86
110
  requirements:
87
- - - ">="
111
+ - - "~>"
88
112
  - !ruby/object:Gem::Version
89
113
  version: '5.0'
90
114
  type: :development
91
115
  prerelease: false
92
116
  version_requirements: !ruby/object:Gem::Requirement
93
117
  requirements:
94
- - - ">="
118
+ - - "~>"
95
119
  - !ruby/object:Gem::Version
96
120
  version: '5.0'
97
121
  - !ruby/object:Gem::Dependency
98
122
  name: factory_bot_rails
99
123
  requirement: !ruby/object:Gem::Requirement
100
124
  requirements:
101
- - - ">="
125
+ - - "~>"
102
126
  - !ruby/object:Gem::Version
103
127
  version: '6.0'
104
128
  type: :development
105
129
  prerelease: false
106
130
  version_requirements: !ruby/object:Gem::Requirement
107
131
  requirements:
108
- - - ">="
132
+ - - "~>"
109
133
  - !ruby/object:Gem::Version
110
134
  version: '6.0'
111
135
  - !ruby/object:Gem::Dependency
@@ -173,7 +197,6 @@ files:
173
197
  - db/migrate/002_create_referral_box_referral_logs.rb
174
198
  - lib/generators/referral_box/install/install_generator.rb
175
199
  - lib/generators/referral_box/install/templates/initializer.rb
176
- - lib/generators/referral_box/install/templates/user_model.rb
177
200
  - lib/referral_box.rb
178
201
  - lib/referral_box/configuration.rb
179
202
  - lib/referral_box/engine.rb
@@ -1,45 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class User < ApplicationRecord
4
- # Add these columns to your users table:
5
- # add_column :users, :referral_code, :string
6
- # add_column :users, :tier, :string
7
- # add_index :users, :referral_code, unique: true
8
-
9
- has_many :referral_box_transactions, class_name: 'ReferralBox::Transaction', as: :user
10
- has_many :referrals, class_name: 'User', foreign_key: 'referrer_id'
11
- belongs_to :referrer, class_name: 'User', optional: true
12
-
13
- before_create :generate_referral_code
14
-
15
- def points_balance
16
- ReferralBox.balance(self)
17
- end
18
-
19
- def current_tier
20
- ReferralBox.tier(self)
21
- end
22
-
23
- def referral_link
24
- "#{Rails.application.routes.url_helpers.root_url}?ref=#{referral_code}"
25
- end
26
-
27
- def total_referrals
28
- referrals.count
29
- end
30
-
31
- def successful_referrals
32
- referrals.joins(:referral_box_transactions).distinct.count
33
- end
34
-
35
- private
36
-
37
- def generate_referral_code
38
- return if referral_code.present?
39
-
40
- loop do
41
- self.referral_code = SecureRandom.alphanumeric(ReferralBox.configuration.referral_code_length).upcase
42
- break unless User.exists?(referral_code: referral_code)
43
- end
44
- end
45
- end