diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3ff048c --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.DS_Store +.envrc diff --git a/my_namespace-my_gem/lib/my_namespace/my_gem.rb b/my_namespace-my_gem/lib/my_namespace/my_gem.rb deleted file mode 100644 index 107e575..0000000 --- a/my_namespace-my_gem/lib/my_namespace/my_gem.rb +++ /dev/null @@ -1,14 +0,0 @@ -# frozen_string_literal: true - -require "http" - -require_relative "my_gem/version" - -module MyNamespace - module MyGem - def self.do_something - return "A" - return "B" - end - end -end diff --git a/my_namespace-my_gem/lib/my_namespace/my_gem/version.rb b/my_namespace-my_gem/lib/my_namespace/my_gem/version.rb deleted file mode 100644 index fd62862..0000000 --- a/my_namespace-my_gem/lib/my_namespace/my_gem/version.rb +++ /dev/null @@ -1,7 +0,0 @@ -# frozen_string_literal: true - -module MyNamespace - module MyGem - VERSION = "0.1.0" - end -end diff --git a/my_rails_app/Gemfile b/my_rails_app/Gemfile index 335cf19..cf64e5f 100644 --- a/my_rails_app/Gemfile +++ b/my_rails_app/Gemfile @@ -2,7 +2,7 @@ source "https://rubygems.org" ruby "3.3.0" -gem "my_namespace-my_gem", path: "../my_namespace-my_gem" +gem "my_root_namespace-my_namespace-my_gem", path: "../my_root_namespace-my_namespace-my_gem" # Bundle edge Rails instead: gem "rails", github: "rails/rails", branch: "main" gem "rails", "~> 7.1.3" diff --git a/my_rails_app/Gemfile.lock b/my_rails_app/Gemfile.lock index cdcb6a3..b8956ef 100644 --- a/my_rails_app/Gemfile.lock +++ b/my_rails_app/Gemfile.lock @@ -1,8 +1,9 @@ PATH - remote: ../my_namespace-my_gem + remote: ../my_root_namespace-my_namespace-my_gem specs: - my_namespace-my_gem (0.1.0) + my_root_namespace-my_namespace-my_gem (0.1.0) http + zeitwerk GEM remote: https://rubygems.org/ @@ -269,7 +270,7 @@ DEPENDENCIES bootsnap debug importmap-rails - my_namespace-my_gem! + my_root_namespace-my_namespace-my_gem! propshaft puma (>= 5.0) rails (~> 7.1.3) diff --git a/my_rails_app/app/controllers/dashboard_controller.rb b/my_rails_app/app/controllers/dashboard_controller.rb index 5e1eae2..0b8a694 100644 --- a/my_rails_app/app/controllers/dashboard_controller.rb +++ b/my_rails_app/app/controllers/dashboard_controller.rb @@ -1,5 +1,5 @@ class DashboardController < ApplicationController def show - render inline: MyNamespace::MyGem.do_something + render inline: MyRootNamespace::MyNamespace::MyGem.do_something end end \ No newline at end of file diff --git a/my_rails_app/app/utils/local_gem_reloading.rb b/my_rails_app/app/utils/local_gem_reloading.rb new file mode 100644 index 0000000..3e2074d --- /dev/null +++ b/my_rails_app/app/utils/local_gem_reloading.rb @@ -0,0 +1,28 @@ +class LocalGemReloading + def self.setup_reloading_for_local_zeitwerk_gem(gem_name, local_gems_folder) + gem_path = Pathname.new(File.join(local_gems_folder, gem_name, "lib")) + + parts = gem_name.split("-") + gem_root = parts.delete(parts.last) + gem_namespaces = parts.map(&:camelize) + + loader_tag = "#{[gem_namespaces.join("::"), gem_root.underscore].join('-')}" + + gem_loader = Zeitwerk::Registry.loaders.find { |loader| loader.tag == loader_tag } + + file_watcher = ActiveSupport::FileUpdateChecker.new(gem_path.glob('**/*')) do + gem_loader.reload + end + + Rails.application.reloaders << Class.new do + def initialize(file_watcher) + @file_watcher = file_watcher + end + + def updated? + @file_watcher.execute_if_updated + end + end.new(file_watcher) + true + end +end diff --git a/my_rails_app/config/environments/development.rb b/my_rails_app/config/environments/development.rb index 72b1036..ef6e81c 100644 --- a/my_rails_app/config/environments/development.rb +++ b/my_rails_app/config/environments/development.rb @@ -1,4 +1,5 @@ require "active_support/core_ext/integer/time" +require_relative "../../app/utils/local_gem_reloading" Rails.application.configure do # Settings specified here will take precedence over those in config/application.rb. @@ -71,4 +72,9 @@ # Raise error when a before_action's only/except options reference missing actions config.action_controller.raise_on_missing_callback_actions = true + + LocalGemReloading.setup_reloading_for_local_zeitwerk_gem( + "my_root_namespace-my_namespace-my_gem", + Rails.root.join("../") + ) end diff --git a/my_namespace-my_gem/.gitignore b/my_root_namespace-my_namespace-my_gem/.gitignore similarity index 100% rename from my_namespace-my_gem/.gitignore rename to my_root_namespace-my_namespace-my_gem/.gitignore diff --git a/my_namespace-my_gem/.rspec b/my_root_namespace-my_namespace-my_gem/.rspec similarity index 100% rename from my_namespace-my_gem/.rspec rename to my_root_namespace-my_namespace-my_gem/.rspec diff --git a/my_namespace-my_gem/Gemfile b/my_root_namespace-my_namespace-my_gem/Gemfile similarity index 100% rename from my_namespace-my_gem/Gemfile rename to my_root_namespace-my_namespace-my_gem/Gemfile diff --git a/my_root_namespace-my_namespace-my_gem/Gemfile.lock b/my_root_namespace-my_namespace-my_gem/Gemfile.lock new file mode 100644 index 0000000..fd2b5c6 --- /dev/null +++ b/my_root_namespace-my_namespace-my_gem/Gemfile.lock @@ -0,0 +1,59 @@ +PATH + remote: . + specs: + my_root_namespace-my_namespace-my_gem (0.1.0) + http + zeitwerk + +GEM + remote: https://rubygems.org/ + specs: + addressable (2.8.6) + public_suffix (>= 2.0.2, < 6.0) + base64 (0.2.0) + diff-lcs (1.5.1) + domain_name (0.6.20240107) + ffi (1.16.3) + ffi-compiler (1.0.1) + ffi (>= 1.0.0) + rake + http (5.2.0) + addressable (~> 2.8) + base64 (~> 0.1) + http-cookie (~> 1.0) + http-form_data (~> 2.2) + llhttp-ffi (~> 0.5.0) + http-cookie (1.0.5) + domain_name (~> 0.5) + http-form_data (2.3.0) + llhttp-ffi (0.5.0) + ffi-compiler (~> 1.0) + rake (~> 13.0) + public_suffix (5.0.4) + rake (13.1.0) + rspec (3.13.0) + rspec-core (~> 3.13.0) + rspec-expectations (~> 3.13.0) + rspec-mocks (~> 3.13.0) + rspec-core (3.13.0) + rspec-support (~> 3.13.0) + rspec-expectations (3.13.0) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.13.0) + rspec-mocks (3.13.0) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.13.0) + rspec-support (3.13.0) + zeitwerk (2.6.13) + +PLATFORMS + ruby + x86_64-darwin-21 + +DEPENDENCIES + my_root_namespace-my_namespace-my_gem! + rake (~> 13.0) + rspec (~> 3.0) + +BUNDLED WITH + 2.5.3 diff --git a/my_namespace-my_gem/README.md b/my_root_namespace-my_namespace-my_gem/README.md similarity index 100% rename from my_namespace-my_gem/README.md rename to my_root_namespace-my_namespace-my_gem/README.md diff --git a/my_namespace-my_gem/Rakefile b/my_root_namespace-my_namespace-my_gem/Rakefile similarity index 100% rename from my_namespace-my_gem/Rakefile rename to my_root_namespace-my_namespace-my_gem/Rakefile diff --git a/my_namespace-my_gem/bin/console b/my_root_namespace-my_namespace-my_gem/bin/console similarity index 100% rename from my_namespace-my_gem/bin/console rename to my_root_namespace-my_namespace-my_gem/bin/console diff --git a/my_namespace-my_gem/bin/setup b/my_root_namespace-my_namespace-my_gem/bin/setup similarity index 100% rename from my_namespace-my_gem/bin/setup rename to my_root_namespace-my_namespace-my_gem/bin/setup diff --git a/my_root_namespace-my_namespace-my_gem/lib/my_root_namespace/my_namespace/my_gem.rb b/my_root_namespace-my_namespace-my_gem/lib/my_root_namespace/my_namespace/my_gem.rb new file mode 100644 index 0000000..7e949ae --- /dev/null +++ b/my_root_namespace-my_namespace-my_gem/lib/my_root_namespace/my_namespace/my_gem.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +require "http" +require "zeitwerk" +loader = Zeitwerk::Loader.for_gem_extension(MyRootNamespace::MyNamespace) +loader.enable_reloading if ENV["LOCAL_GEM_RELOADING"] +loader.setup + +module MyRootNamespace + module MyNamespace + module MyGem + def self.do_something + Something.new.do + end + end + end +end diff --git a/my_root_namespace-my_namespace-my_gem/lib/my_root_namespace/my_namespace/my_gem/something.rb b/my_root_namespace-my_namespace-my_gem/lib/my_root_namespace/my_namespace/my_gem/something.rb new file mode 100644 index 0000000..6ca23b1 --- /dev/null +++ b/my_root_namespace-my_namespace-my_gem/lib/my_root_namespace/my_namespace/my_gem/something.rb @@ -0,0 +1,12 @@ +module MyRootNamespace + module MyNamespace + module MyGem + class Something + def do + return "A" + return "B" + end + end + end + end +end diff --git a/my_root_namespace-my_namespace-my_gem/lib/my_root_namespace/my_namespace/my_gem/version.rb b/my_root_namespace-my_namespace-my_gem/lib/my_root_namespace/my_namespace/my_gem/version.rb new file mode 100644 index 0000000..d752222 --- /dev/null +++ b/my_root_namespace-my_namespace-my_gem/lib/my_root_namespace/my_namespace/my_gem/version.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +module MyRootNamespace + module MyNamespace + module MyGem + VERSION = "0.1.0" + end + end +end diff --git a/my_namespace-my_gem/my_namespace-my_gem.gemspec b/my_root_namespace-my_namespace-my_gem/my_root_namespace-my_namespace-my_gem.gemspec similarity index 86% rename from my_namespace-my_gem/my_namespace-my_gem.gemspec rename to my_root_namespace-my_namespace-my_gem/my_root_namespace-my_namespace-my_gem.gemspec index fc4a907..cd16cb3 100644 --- a/my_namespace-my_gem/my_namespace-my_gem.gemspec +++ b/my_root_namespace-my_namespace-my_gem/my_root_namespace-my_namespace-my_gem.gemspec @@ -1,10 +1,10 @@ # frozen_string_literal: true -require_relative "lib/my_namespace/my_gem/version" +require_relative "lib/my_root_namespace/my_namespace/my_gem/version" Gem::Specification.new do |spec| - spec.name = "my_namespace-my_gem" - spec.version = MyNamespace::MyGem::VERSION + spec.name = "my_root_namespace-my_namespace-my_gem" + spec.version = MyRootNamespace::MyNamespace::MyGem::VERSION spec.authors = ["David"] spec.email = ["asmoo252@gmail.com"] @@ -33,6 +33,7 @@ Gem::Specification.new do |spec| # Uncomment to register a new dependency of your gem spec.add_dependency "http" + spec.add_dependency "zeitwerk" # For more information and examples about making a new gem, check out our # guide at: https://bundler.io/guides/creating_gem.html diff --git a/my_namespace-my_gem/sig/my_namespace/my_gem.rbs b/my_root_namespace-my_namespace-my_gem/sig/my_namespace/my_gem.rbs similarity index 100% rename from my_namespace-my_gem/sig/my_namespace/my_gem.rbs rename to my_root_namespace-my_namespace-my_gem/sig/my_namespace/my_gem.rbs diff --git a/my_namespace-my_gem/spec/my_namespace/my_gem_spec.rb b/my_root_namespace-my_namespace-my_gem/spec/my_namespace/my_gem_spec.rb similarity index 100% rename from my_namespace-my_gem/spec/my_namespace/my_gem_spec.rb rename to my_root_namespace-my_namespace-my_gem/spec/my_namespace/my_gem_spec.rb diff --git a/my_namespace-my_gem/spec/spec_helper.rb b/my_root_namespace-my_namespace-my_gem/spec/spec_helper.rb similarity index 100% rename from my_namespace-my_gem/spec/spec_helper.rb rename to my_root_namespace-my_namespace-my_gem/spec/spec_helper.rb