rails-saas-builder 0.9.1 → 0.9.2

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: 64d5d9b5bed88acac2449b7eed3c55dae27a67d9ee4466182125fd0ece98e676
4
- data.tar.gz: 115928cdba7390516837f6d9e169d4baa65d8f68c45021bb4ee9a4dd3e768632
3
+ metadata.gz: 3de2ac589ebfd2ff73aa36197c29470c5026a3b9ed7f3f628ca8a94497df1940
4
+ data.tar.gz: ebe2bd20c9b49d557427deb9c202ca680837e13e4377f1bd0d6345bdd386c0b5
5
5
  SHA512:
6
- metadata.gz: 962b88b8300c90680851fd0c6f8754f5d840875ace281659b16fd2195832041a3acdcd2e91167e3bbf9f8fcda535d3112eb894acc1e7c7ab38c8322092e70514
7
- data.tar.gz: f222b0912df9c0028afdcb282b18f9dda0674f83ebbba7f4f89a56350600106ad127884096141b82f81b8baeb28bfe364bd16d39c0c5a7e312b413c9cf51adc8
6
+ metadata.gz: 5ed10f420dc87fb4176b4c10c5e1b0ffc16e67f9ddace3c8c6e739f6af803f514788fcbc4f7ee23cd46c23f0b8a12688b57dc33d85362e2881fa57f83c954c2b
7
+ data.tar.gz: 75381ff463a7290a7ddba904fb2aca481fad4815861945ddc14578cfcf6a3bcc389410cc22e2e8cb56289bef49a37c6eb3ce922fed499c6e9a888960babef721
data/README.md CHANGED
@@ -84,6 +84,11 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, coding standards,
84
84
 
85
85
  To report a security vulnerability, please see [SECURITY.md](SECURITY.md). Do not open public issues for security concerns.
86
86
 
87
+ ## Related Projects
88
+
89
+ - [Rails SaaS Builder Pro](../rails-saas-builder-pro/) — Premium features gem extending the OSS core
90
+ - [RSB Website](../website/) — Project marketing & documentation site
91
+
87
92
  ## License
88
93
 
89
94
  Rails SaaS Builder is licensed under the [GNU Lesser General Public License v3.0](LICENSE).
data/Rakefile CHANGED
@@ -26,22 +26,32 @@ Rake::TestTask.new(:test_integration) do |t|
26
26
  t.verbose = false
27
27
  end
28
28
 
29
- desc 'Run tests for a single sub-gem: rake test_gem GEM=rsb-admin'
29
+ Rake::TestTask.new(:test_security) do |t|
30
+ t.libs << 'test'
31
+ t.pattern = 'test/security/**/*_test.rb'
32
+ t.verbose = false
33
+ end
34
+
35
+ desc 'Run tests for a single sub-gem: rake test_gem GEM=rsb-admin [TEST=path] [SEED=1234]'
30
36
  task :test_gem do
31
37
  gem_name = ENV['GEM'] || abort('Usage: rake test_gem GEM=rsb-admin')
32
38
  abort("Unknown gem: #{gem_name}") unless SUB_GEMS.include?(gem_name)
33
39
  Dir.chdir(gem_name) do
34
40
  sh 'bundle install --quiet'
35
41
  test_file = ENV['TEST']
42
+ seed = ENV['SEED']
36
43
  if test_file
37
- sh "bundle exec ruby -Itest #{test_file}"
44
+ cmd = "bundle exec ruby -Itest #{test_file}"
45
+ cmd += " -- --seed #{seed}" if seed
38
46
  else
39
- sh 'bundle exec rake test'
47
+ cmd = 'bundle exec rake test'
48
+ cmd += " TESTOPTS=\"--seed=#{seed}\"" if seed
40
49
  end
50
+ sh cmd
41
51
  end
42
52
  end
43
53
 
44
54
  desc 'Run all tests (sub-gems + integration)'
45
- task test: %i[test_subgems test_integration]
55
+ task test: %i[test_subgems test_integration test_security]
46
56
 
47
57
  task default: :test
data/lib/rsb/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RSB
4
- VERSION = '0.9.1'
4
+ VERSION = '0.9.2'
5
5
  end
@@ -94,6 +94,48 @@ module ReleaseHelper
94
94
  puts "\nPushing gems to RubyGems.org..."
95
95
  gem_paths.each { |path| push_gem(path) }
96
96
  end
97
+
98
+ # --- Extension gem helpers ---
99
+
100
+ def resolve_extension(gem_name)
101
+ gem_dir = File.join(root, gem_name)
102
+ unless File.directory?(gem_dir)
103
+ abort "Unknown extension gem: #{gem_name}. Directory '#{gem_dir}' not found."
104
+ end
105
+
106
+ gemspec = "#{gem_name}.gemspec"
107
+ unless File.exist?(File.join(gem_dir, gemspec))
108
+ abort "Cannot find gemspec: #{File.join(gem_dir, gemspec)}"
109
+ end
110
+
111
+ version_files = Dir.glob(File.join(gem_dir, 'lib', '**', 'version.rb'))
112
+ if version_files.empty?
113
+ abort "Cannot find version.rb for #{gem_name} in #{gem_dir}/lib/"
114
+ end
115
+
116
+ { dir: gem_dir, gemspec: gemspec, version_file: version_files.first }
117
+ end
118
+
119
+ def read_version(version_file)
120
+ content = File.read(version_file)
121
+ match = content.match(/VERSION\s*=\s*['"]([^'"]+)['"]/)
122
+ abort "Cannot extract VERSION from #{version_file}" unless match
123
+ match[1]
124
+ end
125
+
126
+ def update_version(version_file, new_version)
127
+ content = File.read(version_file)
128
+ updated = content.gsub(/VERSION\s*=\s*['"][^'"]+['"]/, "VERSION = '#{new_version}'")
129
+ File.write(version_file, updated)
130
+ puts " Updated #{version_file} → #{new_version}"
131
+ end
132
+
133
+ def ensure_gem_tests_pass!(gem_dir)
134
+ puts "Running tests for #{File.basename(gem_dir)}..."
135
+ return if system('bundle exec rake test', chdir: gem_dir)
136
+
137
+ abort 'Aborting: tests failed.'
138
+ end
97
139
  end
98
140
 
99
141
  desc 'Build and push all gems to RubyGems.org (no version bump)'
@@ -146,3 +188,64 @@ task :release, [:bump] do |_t, args|
146
188
  puts " - Tagged v#{new_version} and pushed to origin"
147
189
  puts '=' * 60
148
190
  end
191
+
192
+ desc 'Build and push an extension gem (no version bump): rake publish_ext[rsb-entitlements-stripe]'
193
+ task :publish_ext, [:gem_name] do |_t, args|
194
+ gem_name = args[:gem_name] || abort('Usage: rake publish_ext[gem_name]')
195
+ ext = ReleaseHelper.resolve_extension(gem_name)
196
+ version = ReleaseHelper.read_version(ext[:version_file])
197
+
198
+ puts "Publishing #{gem_name} v#{version}..."
199
+
200
+ gem_info = { name: gem_name, dir: gem_name, gemspec: ext[:gemspec] }
201
+ gem_path = ReleaseHelper.build_gem(gem_info)
202
+ ReleaseHelper.push_gem(gem_path)
203
+
204
+ puts "\nPublished #{gem_name} v#{version} successfully!"
205
+ end
206
+
207
+ desc 'Bump, build, push, tag extension gem: rake release_ext[rsb-entitlements-stripe,patch]'
208
+ task :release_ext, [:gem_name, :bump] do |_t, args|
209
+ gem_name = args[:gem_name] || abort('Usage: rake release_ext[gem_name,bump]')
210
+ bump = args[:bump] || 'patch'
211
+ ext = ReleaseHelper.resolve_extension(gem_name)
212
+ current = ReleaseHelper.read_version(ext[:version_file])
213
+ new_version = ReleaseHelper.next_version(current, bump)
214
+
215
+ puts "Release: #{gem_name} #{current} → #{new_version} (#{bump} bump)\n\n"
216
+
217
+ # Safety checks
218
+ ReleaseHelper.ensure_clean_git!
219
+ ReleaseHelper.ensure_on_master!
220
+ ReleaseHelper.ensure_gem_tests_pass!(ext[:dir])
221
+
222
+ # Bump version
223
+ puts "\nBumping version..."
224
+ ReleaseHelper.update_version(ext[:version_file], new_version)
225
+
226
+ # Git commit and tag
227
+ root = ReleaseHelper.root
228
+ relative_version_file = Pathname.new(ext[:version_file]).relative_path_from(Pathname.new(root)).to_s
229
+ tag = "#{gem_name}-v#{new_version}"
230
+
231
+ puts "\nCommitting version bump..."
232
+ system("git -C #{root} add #{relative_version_file}")
233
+ system("git -C #{root} commit -m 'Release #{gem_name} v#{new_version}'")
234
+ system("git -C #{root} tag -a #{tag} -m 'Release #{gem_name} v#{new_version}'")
235
+
236
+ # Build and push gem
237
+ gem_info = { name: gem_name, dir: gem_name, gemspec: ext[:gemspec] }
238
+ gem_path = ReleaseHelper.build_gem(gem_info)
239
+ ReleaseHelper.push_gem(gem_path)
240
+
241
+ # Push git
242
+ puts "\nPushing to origin..."
243
+ system("git -C #{root} push origin master")
244
+ system("git -C #{root} push origin #{tag}")
245
+
246
+ puts "\n#{'=' * 60}"
247
+ puts "Released #{gem_name} v#{new_version} successfully!"
248
+ puts " - Gem pushed to RubyGems.org"
249
+ puts " - Tagged #{tag} and pushed to origin"
250
+ puts '=' * 60
251
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails-saas-builder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 0.9.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aleksandr Marchenko
@@ -15,56 +15,56 @@ dependencies:
15
15
  requirements:
16
16
  - - '='
17
17
  - !ruby/object:Gem::Version
18
- version: 0.9.1
18
+ version: 0.9.2
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - '='
24
24
  - !ruby/object:Gem::Version
25
- version: 0.9.1
25
+ version: 0.9.2
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: rsb-auth
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
30
30
  - - '='
31
31
  - !ruby/object:Gem::Version
32
- version: 0.9.1
32
+ version: 0.9.2
33
33
  type: :runtime
34
34
  prerelease: false
35
35
  version_requirements: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - '='
38
38
  - !ruby/object:Gem::Version
39
- version: 0.9.1
39
+ version: 0.9.2
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: rsb-entitlements
42
42
  requirement: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - '='
45
45
  - !ruby/object:Gem::Version
46
- version: 0.9.1
46
+ version: 0.9.2
47
47
  type: :runtime
48
48
  prerelease: false
49
49
  version_requirements: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - '='
52
52
  - !ruby/object:Gem::Version
53
- version: 0.9.1
53
+ version: 0.9.2
54
54
  - !ruby/object:Gem::Dependency
55
55
  name: rsb-settings
56
56
  requirement: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - '='
59
59
  - !ruby/object:Gem::Version
60
- version: 0.9.1
60
+ version: 0.9.2
61
61
  type: :runtime
62
62
  prerelease: false
63
63
  version_requirements: !ruby/object:Gem::Requirement
64
64
  requirements:
65
65
  - - '='
66
66
  - !ruby/object:Gem::Version
67
- version: 0.9.1
67
+ version: 0.9.2
68
68
  description: 'Wrapper gem that includes all RSB sub-gems: settings, auth, entitlements,
69
69
  admin. Like how the rails gem wraps activerecord, actionpack, etc.'
70
70
  email: