namespaced 0.1.0

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
+ SHA1:
3
+ metadata.gz: f14062b92ab081354dfcdf32dff97588c1222b95
4
+ data.tar.gz: a27af6de8bf5c2752569dfa14734eeb9d45ad271
5
+ SHA512:
6
+ metadata.gz: 612e894b369b28701be49418b5fc34ba41bd729a5553a7bf62788914e147de1ce0559c8eeee177190038b4b2aaf1e73b45bb49d34ef395f73ef0c4322c3e806b
7
+ data.tar.gz: 96c74fb43e9462c09dfeff91d37b6285ad3d1dab63840dd0282700376bd75d0a836412395ad9f0ccf7dae65cc03c981fb056c1689967fad78565184d9de2cf62
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.2.2
5
+ before_install: gem install bundler -v 1.12.5
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in namespaced.gemspec
4
+ gem 'activesupport'
5
+ gem 'activerecord'
6
+ gem 'sqlite3'
7
+
8
+ gemspec
data/README.md ADDED
@@ -0,0 +1,74 @@
1
+ # Namespaced
2
+
3
+ Declare ActiveRecord relations under namespaces for projects where models are segragated by feature.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'namespaced', git: 'https://github.com/rcpedro/namespaced.git'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install namespaced
20
+
21
+ ## Usage
22
+
23
+ Include the concern Namespaced into your ActiveRecord models:
24
+
25
+ ```ruby
26
+ class ApplicationRecord < ActiveRecord::Base
27
+ include Namespaced
28
+ end
29
+ ```
30
+
31
+ Declare namespaces for associations:
32
+
33
+ ```ruby
34
+ module Auth
35
+ class User < ApplicationRecord
36
+ namespace :school do
37
+ has_many :students
38
+ has_many :universities, through: :students
39
+
40
+ has_one :current_student, -> { where(status: 'active') }, class_name: 'Student'
41
+ has_one :current_university, through: :current_student, class_name: 'University'
42
+ end
43
+ end
44
+ end
45
+
46
+ module School
47
+ class University < ApplicationRecord
48
+ has_many :students
49
+
50
+ namespace :auth do
51
+ has_many :users, through: :students
52
+ end
53
+ end
54
+
55
+ class Student < ApplicationRecord
56
+ belongs_to :university
57
+
58
+ namespace :auth do
59
+ belongs_to :user
60
+ end
61
+ end
62
+ end
63
+ ```
64
+
65
+ ## Development
66
+
67
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
68
+
69
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
70
+
71
+ ## Contributing
72
+
73
+ Bug reports and pull requests are welcome on GitHub at https://github.com/rcpedro/namespaced.
74
+
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "namespaced"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/lib/namespaced.rb ADDED
@@ -0,0 +1,47 @@
1
+ require 'active_support/concern'
2
+ require 'namespaced/version'
3
+
4
+ module Namespaced
5
+ extend ActiveSupport::Concern
6
+
7
+ class_methods do
8
+ @@current_association_namespace = nil
9
+ @@current_association_namespace_lock = Mutex.new
10
+
11
+ def has_many(name, scope=nil, **options, &extension)
12
+ options[:class_name] = namespaced_klass_name(name, options, true) if namespaced?
13
+ super(name, scope, **options, &extension)
14
+ end
15
+
16
+ def has_one(name, scope=nil, **options)
17
+ options[:class_name] = namespaced_klass_name(name, options) if namespaced?
18
+ super(name, scope, options)
19
+ end
20
+
21
+ def belongs_to(name, scope=nil, **options)
22
+ options[:class_name] = namespaced_klass_name(name, options) if namespaced?
23
+ super(name, scope, options)
24
+ end
25
+
26
+ protected
27
+ def namespace(namespace, **options)
28
+ @@current_association_namespace_lock.synchronize do
29
+ @@current_association_namespace = namespace
30
+ yield
31
+ @@current_association_namespace = nil
32
+ end
33
+ end
34
+
35
+ def namespaced?
36
+ return @@current_association_namespace.present?
37
+ end
38
+
39
+ def namespaced_klass_name(model, options, plural=false)
40
+ model_name = options[:class_name]
41
+ model_name ||= (plural ? model.to_s.singularize : model.to_s).camelize
42
+ klass_name = @@current_association_namespace.to_s.camelize
43
+
44
+ return "#{klass_name}::#{model_name}"
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,3 @@
1
+ module Namespaced
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,32 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'namespaced/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "namespaced"
8
+ spec.version = Namespaced::VERSION
9
+ spec.authors = ["Rodette Pedro"]
10
+ spec.email = ["rodettecpedro@gmail.com"]
11
+
12
+ spec.summary = "Namespaced ActiveRecord Associations"
13
+ spec.description = "Declare namespaces for ActiveRecord associations."
14
+ spec.homepage = "https://github.com/rcpedro/namespaced"
15
+
16
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
17
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
18
+ if spec.respond_to?(:metadata)
19
+ spec.metadata['allowed_push_host'] = "https://rubygems.org"
20
+ else
21
+ raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
22
+ end
23
+
24
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
25
+ spec.bindir = "exe"
26
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
27
+ spec.require_paths = ["lib"]
28
+
29
+ spec.add_development_dependency "bundler", "~> 1.12"
30
+ spec.add_development_dependency "rake", "~> 10.0"
31
+ spec.add_development_dependency "rspec", "~> 3.0"
32
+ end
metadata ADDED
@@ -0,0 +1,97 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: namespaced
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Rodette Pedro
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2018-09-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.12'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.12'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ description: Declare namespaces for ActiveRecord associations.
56
+ email:
57
+ - rodettecpedro@gmail.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - ".gitignore"
63
+ - ".rspec"
64
+ - ".travis.yml"
65
+ - Gemfile
66
+ - README.md
67
+ - Rakefile
68
+ - bin/console
69
+ - bin/setup
70
+ - lib/namespaced.rb
71
+ - lib/namespaced/version.rb
72
+ - namespaced.gemspec
73
+ homepage: https://github.com/rcpedro/namespaced
74
+ licenses: []
75
+ metadata:
76
+ allowed_push_host: https://rubygems.org
77
+ post_install_message:
78
+ rdoc_options: []
79
+ require_paths:
80
+ - lib
81
+ required_ruby_version: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ required_rubygems_version: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ requirements: []
92
+ rubyforge_project:
93
+ rubygems_version: 2.4.5
94
+ signing_key:
95
+ specification_version: 4
96
+ summary: Namespaced ActiveRecord Associations
97
+ test_files: []