activerecord-traits 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +4 -5
- data/activerecord-traits.gemspec +8 -9
- data/lib/activerecord-traits.rb +12 -4
- data/lib/traits/{concerns/association → association}/essay_shortcuts.rb +4 -1
- data/lib/traits/{concerns/association → association}/intermediate.rb +18 -10
- data/lib/traits/{concerns/association → association}/join.rb +4 -1
- data/lib/traits/{concerns/association → association}/macro.rb +4 -1
- data/lib/traits/{concerns/association → association}/members.rb +4 -1
- data/lib/traits/{concerns/association → association}/naming.rb +5 -2
- data/lib/traits/{concerns/association → association}/polymorphism.rb +4 -1
- data/lib/traits/{concerns/association → association}/read_only.rb +4 -1
- data/lib/traits/{concerns/association → association}/through.rb +4 -1
- data/lib/traits/association.rb +26 -11
- data/lib/traits/{concerns/attribute → attribute}/essay_shortcuts.rb +4 -1
- data/lib/traits/attribute/inheritance.rb +17 -0
- data/lib/traits/{concerns/attribute → attribute}/key.rb +4 -1
- data/lib/traits/{concerns/attribute → attribute}/naming.rb +6 -3
- data/lib/traits/{concerns/attribute → attribute}/polymorphism.rb +4 -1
- data/lib/traits/{concerns/attribute → attribute}/querying.rb +4 -1
- data/lib/traits/{concerns/attribute → attribute}/type.rb +5 -2
- data/lib/traits/attribute.rb +26 -11
- data/lib/traits/base.rb +4 -1
- data/lib/traits/descendants_listing.rb +15 -11
- data/lib/traits/list.rb +25 -20
- data/lib/traits/{concerns/model → model}/essay_shortcuts.rb +4 -1
- data/lib/traits/model/inheritance.rb +76 -0
- data/lib/traits/{concerns/model → model}/naming.rb +7 -2
- data/lib/traits/{concerns/model → model}/polymorphism.rb +5 -2
- data/lib/traits/{concerns/model → model}/querying.rb +16 -4
- data/lib/traits/model.rb +39 -23
- data/lib/traits/{engine.rb → railtie.rb} +6 -5
- data/lib/traits/utilities.rb +4 -1
- data/lib/traits/version.rb +5 -2
- metadata +44 -74
- data/Rakefile +0 -1
- data/lib/traits/concerns/attribute/sti.rb +0 -15
- data/lib/traits/concerns/model/sti.rb +0 -41
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bdc960c412f73aa79f3f666e6654185ce398b6a1
|
4
|
+
data.tar.gz: 5afb7670fe9cfe16ab7ab8cc31e650b1b6561590
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ff75cbae678809042dec2e2b0cdfdbf77f113bbf0f28efd804e0518abca5c4d34defd7b24c9f847031d68688ba25e825d4ffb5fbc886299e34d266f47a45a280
|
7
|
+
data.tar.gz: beb6ae1de4639e06c8f4dc4295bf499ee69a9671b513ee8b64b02101854a828fdf96257d122cfd14af4534496e058d1034600602dab8862deab0b371bfaab8d5
|
data/Gemfile
CHANGED
@@ -1,8 +1,7 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
1
4
|
source 'https://rubygems.org'
|
2
5
|
|
3
|
-
# Specify your gem's dependencies in
|
6
|
+
# Specify your gem's dependencies in activerecord-traits.gemspec
|
4
7
|
gemspec
|
5
|
-
|
6
|
-
gem 'essay', path: '~/Development/essay'
|
7
|
-
gem 'essay-globalize', path: '~/Development/essay-globalize'
|
8
|
-
gem 'essay-carrierwave', path: '~/Development/essay-carrierwave'
|
data/activerecord-traits.gemspec
CHANGED
@@ -1,13 +1,15 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
2
4
|
require File.expand_path('../lib/traits/version', __FILE__)
|
3
5
|
|
4
6
|
Gem::Specification.new do |s|
|
5
7
|
s.name = 'activerecord-traits'
|
6
8
|
s.version = Traits::VERSION
|
7
9
|
s.authors = ['Yaroslav Konoplov']
|
8
|
-
s.email = ['
|
9
|
-
s.summary = 'Type information of
|
10
|
-
s.description = 'Type information of
|
10
|
+
s.email = ['eahome00@gmail.com']
|
11
|
+
s.summary = 'Type information of activerecord models'
|
12
|
+
s.description = 'Type information of activerecord models, attributes and associations in good and clear manner'
|
11
13
|
s.homepage = 'http://github.com/yivo/activerecord-traits'
|
12
14
|
s.license = 'MIT'
|
13
15
|
|
@@ -16,9 +18,6 @@ Gem::Specification.new do |s|
|
|
16
18
|
s.test_files = `git ls-files -z -- {test,spec,features}/*`.split("\x0")
|
17
19
|
s.require_paths = ['lib']
|
18
20
|
|
19
|
-
s.add_dependency 'activesupport', '>= 3.
|
20
|
-
s.add_dependency 'activerecord',
|
21
|
-
|
22
|
-
s.add_dependency 'essay-globalize', '~> 1.0.0'
|
23
|
-
s.add_dependency 'essay-carrierwave', '~> 1.0.0'
|
24
|
-
end
|
21
|
+
s.add_dependency 'activesupport', '>= 3.0', '< 6.0'
|
22
|
+
s.add_dependency 'activerecord', '>= 3.0', '< 6.0'
|
23
|
+
end
|
data/lib/activerecord-traits.rb
CHANGED
@@ -1,10 +1,14 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
1
4
|
require 'active_support/all'
|
2
5
|
require 'active_record'
|
6
|
+
|
3
7
|
require 'essay'
|
4
|
-
require 'essay-globalize'
|
5
|
-
require 'essay-carrierwave'
|
8
|
+
require 'essay-globalize' if defined?(Globalize)
|
9
|
+
require 'essay-carrierwave' if defined?(CarrierWave)
|
6
10
|
|
7
|
-
require 'traits/
|
11
|
+
require 'traits/railtie'
|
8
12
|
require 'traits/utilities'
|
9
13
|
require 'traits/descendants_listing'
|
10
14
|
require 'traits/base'
|
@@ -36,9 +40,13 @@ module Traits
|
|
36
40
|
end
|
37
41
|
end
|
38
42
|
|
43
|
+
def self.each_attribute(&block)
|
44
|
+
each { |traits| traits.attributes.each(&block) }
|
45
|
+
end
|
46
|
+
|
39
47
|
def self.to_hash
|
40
48
|
each_with_object({}) do |traits, memo|
|
41
49
|
memo[traits.name] = traits.to_hash
|
42
50
|
end
|
43
51
|
end
|
44
|
-
end
|
52
|
+
end
|
@@ -1,3 +1,6 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
1
4
|
module Traits
|
2
5
|
class Association
|
3
6
|
module Intermediate
|
@@ -11,34 +14,39 @@ module Traits
|
|
11
14
|
end
|
12
15
|
|
13
16
|
def intermediate_table
|
14
|
-
if intermediate?
|
15
|
-
Arel::Table.new(reflection.join_table)
|
16
|
-
end
|
17
|
+
Arel::Table.new(reflection.join_table) if intermediate?
|
17
18
|
end
|
18
19
|
|
19
20
|
def intermediate_table_name
|
20
|
-
|
21
|
-
|
21
|
+
return unless intermediate?
|
22
|
+
unless @im_table_name
|
23
|
+
name = reflection.join_table
|
24
|
+
@im_table_name = name.kind_of?(String) ? name.to_sym : name
|
22
25
|
end
|
26
|
+
@im_table_name
|
23
27
|
end
|
24
28
|
|
25
29
|
def intermediate_to_key
|
26
|
-
|
30
|
+
if intermediate?
|
31
|
+
intermediate_table[intermediate_to_key_name]
|
32
|
+
end
|
27
33
|
end
|
28
34
|
|
29
35
|
def intermediate_to_key_name
|
30
36
|
if intermediate?
|
31
|
-
reflection.foreign_key.to_sym
|
37
|
+
@im_to_key_name ||= reflection.foreign_key.to_sym
|
32
38
|
end
|
33
39
|
end
|
34
40
|
|
35
41
|
def intermediate_from_key
|
36
|
-
|
42
|
+
if intermediate?
|
43
|
+
intermediate_table[intermediate_from_key_name]
|
44
|
+
end
|
37
45
|
end
|
38
46
|
|
39
47
|
def intermediate_from_key_name
|
40
48
|
if intermediate?
|
41
|
-
reflection.association_foreign_key.to_sym
|
49
|
+
@im_from_key_name ||= reflection.association_foreign_key.to_sym
|
42
50
|
end
|
43
51
|
end
|
44
52
|
|
@@ -52,4 +60,4 @@ module Traits
|
|
52
60
|
end
|
53
61
|
end
|
54
62
|
end
|
55
|
-
end
|
63
|
+
end
|
@@ -1,10 +1,13 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
1
4
|
module Traits
|
2
5
|
class Association
|
3
6
|
module Naming
|
4
7
|
delegate :name, to: :reflection
|
5
8
|
|
6
9
|
def plural_name
|
7
|
-
reflection.plural_name.to_sym
|
10
|
+
@plural_name ||= reflection.plural_name.to_sym
|
8
11
|
end
|
9
12
|
|
10
13
|
def to_hash
|
@@ -12,4 +15,4 @@ module Traits
|
|
12
15
|
end
|
13
16
|
end
|
14
17
|
end
|
15
|
-
end
|
18
|
+
end
|
data/lib/traits/association.rb
CHANGED
@@ -1,17 +1,20 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
1
4
|
module Traits
|
2
5
|
class Association < Base
|
3
6
|
end
|
4
7
|
end
|
5
8
|
|
6
|
-
require 'traits/
|
7
|
-
require 'traits/
|
8
|
-
require 'traits/
|
9
|
-
require 'traits/
|
10
|
-
require 'traits/
|
11
|
-
require 'traits/
|
12
|
-
require 'traits/
|
13
|
-
require 'traits/
|
14
|
-
require 'traits/
|
9
|
+
require 'traits/association/intermediate'
|
10
|
+
require 'traits/association/join'
|
11
|
+
require 'traits/association/macro'
|
12
|
+
require 'traits/association/members'
|
13
|
+
require 'traits/association/naming'
|
14
|
+
require 'traits/association/polymorphism'
|
15
|
+
require 'traits/association/read_only'
|
16
|
+
require 'traits/association/through'
|
17
|
+
require 'traits/association/essay_shortcuts'
|
15
18
|
|
16
19
|
module Traits
|
17
20
|
class Association
|
@@ -32,8 +35,20 @@ module Traits
|
|
32
35
|
@reflection = reflection
|
33
36
|
end
|
34
37
|
|
35
|
-
def
|
38
|
+
def inspect
|
36
39
|
"#{from.class_name}##{name}"
|
37
40
|
end
|
41
|
+
|
42
|
+
def to_s
|
43
|
+
name
|
44
|
+
end
|
45
|
+
|
46
|
+
def value_from(model)
|
47
|
+
model.send(name)
|
48
|
+
end
|
49
|
+
|
50
|
+
def validators
|
51
|
+
from_class.validators_on(name)
|
52
|
+
end
|
38
53
|
end
|
39
|
-
end
|
54
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Traits
|
5
|
+
class Attribute
|
6
|
+
module Inheritance
|
7
|
+
def inheritance_type?
|
8
|
+
(model.inheritance_base? || model.inheritance_derived?) and name == model.inheritance_attribute.name
|
9
|
+
end
|
10
|
+
alias sti_type? inheritance_type?
|
11
|
+
|
12
|
+
def to_hash
|
13
|
+
super.merge!(is_sti_type: sti_type?)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -1,12 +1,15 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
1
4
|
module Traits
|
2
5
|
class Attribute
|
3
6
|
module Naming
|
4
7
|
def name
|
5
|
-
column_definition.name.to_sym
|
8
|
+
@name ||= column_definition.name.to_sym
|
6
9
|
end
|
7
10
|
|
8
11
|
def quoted_name
|
9
|
-
model_class.connection.quote_column_name(name)
|
12
|
+
@quoted_name ||= model_class.connection.quote_column_name(name)
|
10
13
|
end
|
11
14
|
|
12
15
|
def to_hash
|
@@ -17,4 +20,4 @@ module Traits
|
|
17
20
|
end
|
18
21
|
end
|
19
22
|
end
|
20
|
-
end
|
23
|
+
end
|
@@ -1,8 +1,11 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
1
4
|
module Traits
|
2
5
|
class Attribute
|
3
6
|
module Type
|
4
7
|
def type
|
5
|
-
column_definition.type.to_sym
|
8
|
+
@type ||= column_definition.type.to_sym
|
6
9
|
end
|
7
10
|
|
8
11
|
def string?
|
@@ -56,4 +59,4 @@ module Traits
|
|
56
59
|
end
|
57
60
|
end
|
58
61
|
end
|
59
|
-
end
|
62
|
+
end
|
data/lib/traits/attribute.rb
CHANGED
@@ -1,15 +1,18 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
1
4
|
module Traits
|
2
5
|
class Attribute < Base
|
3
6
|
end
|
4
7
|
end
|
5
8
|
|
6
|
-
require 'traits/
|
7
|
-
require 'traits/
|
8
|
-
require 'traits/
|
9
|
-
require 'traits/
|
10
|
-
require 'traits/
|
11
|
-
require 'traits/
|
12
|
-
require 'traits/
|
9
|
+
require 'traits/attribute/key'
|
10
|
+
require 'traits/attribute/naming'
|
11
|
+
require 'traits/attribute/polymorphism'
|
12
|
+
require 'traits/attribute/querying'
|
13
|
+
require 'traits/attribute/inheritance'
|
14
|
+
require 'traits/attribute/type'
|
15
|
+
require 'traits/attribute/essay_shortcuts'
|
13
16
|
|
14
17
|
module Traits
|
15
18
|
class Attribute
|
@@ -18,7 +21,7 @@ module Traits
|
|
18
21
|
include Type
|
19
22
|
include Polymorphism
|
20
23
|
include Querying
|
21
|
-
include
|
24
|
+
include Inheritance
|
22
25
|
include EssayShortcuts
|
23
26
|
|
24
27
|
attr_reader :model_class, :column_definition
|
@@ -42,11 +45,23 @@ module Traits
|
|
42
45
|
end
|
43
46
|
|
44
47
|
def value_from(model_instance)
|
45
|
-
model_instance
|
48
|
+
model_instance.send(name)
|
46
49
|
end
|
47
50
|
|
48
|
-
def
|
51
|
+
def inspect
|
49
52
|
"#{model}##{name}"
|
50
53
|
end
|
54
|
+
|
55
|
+
def to_s
|
56
|
+
name
|
57
|
+
end
|
58
|
+
|
59
|
+
def association
|
60
|
+
model.associations.first_where(from_key_name: name)
|
61
|
+
end
|
62
|
+
|
63
|
+
def null?
|
64
|
+
column_definition.null
|
65
|
+
end
|
51
66
|
end
|
52
|
-
end
|
67
|
+
end
|
data/lib/traits/base.rb
CHANGED
@@ -1,27 +1,31 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
1
4
|
module Traits
|
2
5
|
module DescendantsListing
|
3
6
|
def active_record_descendants_loaded?
|
4
|
-
!!@
|
7
|
+
!!@ar_descendants_loaded
|
5
8
|
end
|
6
9
|
|
7
10
|
def load_active_record_descendants!
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
11
|
+
@ar_descendants_loaded ||= begin
|
12
|
+
# Railties are not necessary here
|
13
|
+
# Source: http://stackoverflow.com/questions/6497834/differences-between-railties-and-engines-in-ruby-on-rails-3
|
14
|
+
Rails::Engine.subclasses.map(&:instance).each { |i| i.eager_load! }
|
15
|
+
Rails.application.eager_load!
|
16
|
+
true
|
17
|
+
end
|
12
18
|
end
|
13
19
|
|
14
20
|
def invalidate_loaded_active_record_descendants!
|
15
|
-
@ar_descendants
|
21
|
+
@ar_descendants = nil
|
22
|
+
@ar_descendants_loaded = false
|
16
23
|
end
|
17
24
|
|
18
25
|
def active_record_descendants
|
19
26
|
@ar_descendants ||= begin
|
20
27
|
load_active_record_descendants!
|
21
|
-
|
22
|
-
|
23
|
-
descendants.reject! { |ar| excluded_active_record_descendant?(ar) }
|
24
|
-
descendants
|
28
|
+
ActiveRecord::Base.descendants.reject! { |ar| excluded_active_record_descendant?(ar) }
|
25
29
|
end
|
26
30
|
end
|
27
31
|
|
@@ -48,4 +52,4 @@ module Traits
|
|
48
52
|
/\AHABTM/,
|
49
53
|
/::Translation\Z/
|
50
54
|
]
|
51
|
-
end
|
55
|
+
end
|
data/lib/traits/list.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
1
4
|
module Traits
|
2
5
|
class List
|
3
6
|
include Enumerable
|
@@ -7,28 +10,14 @@ module Traits
|
|
7
10
|
end
|
8
11
|
|
9
12
|
def filter(hash)
|
10
|
-
select do |
|
11
|
-
hash.all?
|
12
|
-
returned = attr.send(method)
|
13
|
-
if expected.is_a?(Array)
|
14
|
-
expected.include?(returned)
|
15
|
-
else
|
16
|
-
returned == expected
|
17
|
-
end
|
18
|
-
end
|
13
|
+
select do |item|
|
14
|
+
hash.all? { |method, expected| compare(item, method, expected) }
|
19
15
|
end
|
20
16
|
end
|
21
17
|
|
22
18
|
def first_where(hash)
|
23
|
-
find do |
|
24
|
-
hash.all?
|
25
|
-
returned = attr.send(method)
|
26
|
-
if expected.is_a?(Array)
|
27
|
-
expected.include?(returned)
|
28
|
-
else
|
29
|
-
returned == expected
|
30
|
-
end
|
31
|
-
end
|
19
|
+
find do |item|
|
20
|
+
hash.all? { |method, expected| compare(item, method, expected) }
|
32
21
|
end
|
33
22
|
end
|
34
23
|
|
@@ -41,12 +30,28 @@ module Traits
|
|
41
30
|
end
|
42
31
|
|
43
32
|
def by_name(name)
|
44
|
-
name = name.
|
33
|
+
name = name.to_sym if name.kind_of?(String)
|
45
34
|
find { |attr| attr.name == name }
|
46
35
|
end
|
47
36
|
|
48
37
|
def to_hash
|
49
38
|
each_with_object({}) { |item, memo| memo[item.name] = item.to_hash }
|
50
39
|
end
|
40
|
+
|
41
|
+
protected
|
42
|
+
def compare(item, method, expected)
|
43
|
+
returned = item.send(method)
|
44
|
+
case expected
|
45
|
+
when Array then expected.include?(returned)
|
46
|
+
when Regexp then returned =~ expected
|
47
|
+
else returned == expected
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
class AttributeList < List
|
53
|
+
def primary_key
|
54
|
+
first_where(primary_key?: true)
|
55
|
+
end
|
51
56
|
end
|
52
|
-
end
|
57
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Traits
|
5
|
+
class Model
|
6
|
+
module Inheritance
|
7
|
+
def uses_inheritance?
|
8
|
+
inheritance_base? || inheritance_derived?
|
9
|
+
end
|
10
|
+
alias uses_sti? uses_inheritance?
|
11
|
+
|
12
|
+
def inheritance_base?
|
13
|
+
model_class.descends_from_active_record? &&
|
14
|
+
!model_class.abstract_class? &&
|
15
|
+
model_class.subclasses.any? { |subclass| subclass.superclass == model_class }
|
16
|
+
end
|
17
|
+
alias sti_base? inheritance_base?
|
18
|
+
|
19
|
+
def inheritance_derived?
|
20
|
+
!model_class.descends_from_active_record?
|
21
|
+
end
|
22
|
+
alias sti_derived? inheritance_derived?
|
23
|
+
|
24
|
+
def inheritance_attribute
|
25
|
+
attributes[model_class.inheritance_column]
|
26
|
+
end
|
27
|
+
alias sti_attribute inheritance_attribute
|
28
|
+
|
29
|
+
def inheritance_attribute_name
|
30
|
+
inheritance_attribute.name if uses_inheritance?
|
31
|
+
end
|
32
|
+
alias sti_attribute_name inheritance_attribute_name
|
33
|
+
|
34
|
+
# class File < ActiveRecord::Base
|
35
|
+
# end
|
36
|
+
#
|
37
|
+
# class Photo < File
|
38
|
+
# end
|
39
|
+
#
|
40
|
+
# class Video < File
|
41
|
+
# end
|
42
|
+
#
|
43
|
+
# class Portrait < Photo
|
44
|
+
# end
|
45
|
+
#
|
46
|
+
# File.traits.inheritance_chain => [File]
|
47
|
+
# Photo.traits.inheritance_chain => [File, Photo]
|
48
|
+
# Video.traits.inheritance_chain => [File, Video]
|
49
|
+
# Portrait.traits.inheritance_chain => [File, Photo, Portrait]
|
50
|
+
def inheritance_chain
|
51
|
+
Traits.load_active_record_descendants!
|
52
|
+
model_class = self.model_class
|
53
|
+
chain = [model_class]
|
54
|
+
until model_class.superclass == ActiveRecord::Base do
|
55
|
+
model_class = model_class.superclass
|
56
|
+
chain.unshift(model_class)
|
57
|
+
end
|
58
|
+
chain
|
59
|
+
end
|
60
|
+
alias sti_chain inheritance_chain
|
61
|
+
|
62
|
+
def inheritance_base
|
63
|
+
inheritance_chain[0]
|
64
|
+
end
|
65
|
+
|
66
|
+
def to_hash
|
67
|
+
super.merge!(
|
68
|
+
is_sti_base: sti_base?,
|
69
|
+
is_sti_derived: sti_derived?,
|
70
|
+
sti_attribute_name: sti_attribute_name,
|
71
|
+
sti_chain: sti_chain.map { |model_class| model_class.traits.name }
|
72
|
+
)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -1,3 +1,6 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
1
4
|
module Traits
|
2
5
|
class Model
|
3
6
|
module Naming
|
@@ -66,7 +69,9 @@ module Traits
|
|
66
69
|
# lookup_name(:underscore) => assets_photo
|
67
70
|
#
|
68
71
|
def lookup_name(namecase = :class)
|
69
|
-
namecase == :underscore ?
|
72
|
+
namecase == :underscore ?
|
73
|
+
@lookup_name_underscore_case ||= name.gsub('/', '_') :
|
74
|
+
@lookup_name_class_case ||= class_name.gsub('::', '')
|
70
75
|
end
|
71
76
|
|
72
77
|
def to_hash
|
@@ -80,4 +85,4 @@ module Traits
|
|
80
85
|
end
|
81
86
|
end
|
82
87
|
end
|
83
|
-
end
|
88
|
+
end
|
@@ -1,8 +1,11 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
1
4
|
module Traits
|
2
5
|
class Model
|
3
6
|
module Polymorphism
|
4
7
|
def polymorphic_type
|
5
|
-
model_class.base_class.name.to_sym
|
8
|
+
@polymorphic_type ||= model_class.base_class.name.to_sym
|
6
9
|
end
|
7
10
|
|
8
11
|
def to_hash
|
@@ -12,4 +15,4 @@ module Traits
|
|
12
15
|
end
|
13
16
|
end
|
14
17
|
end
|
15
|
-
end
|
18
|
+
end
|
@@ -1,8 +1,20 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
1
4
|
module Traits
|
2
5
|
class Model
|
3
6
|
module Querying
|
4
7
|
def primary_key_name
|
5
|
-
|
8
|
+
# Sometimes table doesn't have primary key.
|
9
|
+
# This might be many-to-many tables (HABTM).
|
10
|
+
@pk_name ||= begin
|
11
|
+
pk = model_class.primary_key
|
12
|
+
pk.kind_of?(String) ? pk.to_sym : pk
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def primary_key_attribute
|
17
|
+
@pk_attr ||= attributes[primary_key_name]
|
6
18
|
end
|
7
19
|
|
8
20
|
def arel
|
@@ -14,11 +26,11 @@ module Traits
|
|
14
26
|
end
|
15
27
|
|
16
28
|
def table_name
|
17
|
-
model_class.table_name
|
29
|
+
@table_name ||= model_class.table_name
|
18
30
|
end
|
19
31
|
|
20
32
|
def quoted_table_name
|
21
|
-
connection.quote_table_name(model_class.table_name)
|
33
|
+
@quote_table_name ||= connection.quote_table_name(model_class.table_name)
|
22
34
|
end
|
23
35
|
|
24
36
|
def to_hash
|
@@ -31,4 +43,4 @@ module Traits
|
|
31
43
|
end
|
32
44
|
end
|
33
45
|
end
|
34
|
-
end
|
46
|
+
end
|
data/lib/traits/model.rb
CHANGED
@@ -1,18 +1,21 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
1
4
|
module Traits
|
2
5
|
class Model < Base
|
3
6
|
end
|
4
7
|
end
|
5
8
|
|
6
|
-
require 'traits/
|
7
|
-
require 'traits/
|
8
|
-
require 'traits/
|
9
|
-
require 'traits/
|
10
|
-
require 'traits/
|
9
|
+
require 'traits/model/naming'
|
10
|
+
require 'traits/model/polymorphism'
|
11
|
+
require 'traits/model/inheritance'
|
12
|
+
require 'traits/model/querying'
|
13
|
+
require 'traits/model/essay_shortcuts'
|
11
14
|
|
12
15
|
module Traits
|
13
16
|
class Model
|
14
17
|
include Naming
|
15
|
-
include
|
18
|
+
include Inheritance
|
16
19
|
include Polymorphism
|
17
20
|
include Querying
|
18
21
|
include EssayShortcuts
|
@@ -45,34 +48,47 @@ module Traits
|
|
45
48
|
)
|
46
49
|
end
|
47
50
|
|
51
|
+
def descendants
|
52
|
+
Traits.load_active_record_descendants!
|
53
|
+
active_record.descendants
|
54
|
+
end
|
55
|
+
|
48
56
|
protected
|
49
57
|
|
50
58
|
# TODO Store, Storage, Virtual attributes
|
51
59
|
def inspect_attributes
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
60
|
+
if model_class.abstract_class?
|
61
|
+
Traits::AttributeList.new([])
|
62
|
+
else
|
63
|
+
columns = model_class.columns_hash.values
|
64
|
+
|
65
|
+
if features.translates_with_globalize?
|
66
|
+
globalize = features.globalize
|
67
|
+
tr_class = globalize.model_class_for_translations
|
68
|
+
tr_columns_hash = tr_class.columns_hash
|
69
|
+
|
70
|
+
columns += globalize.translated_attribute_names.map do |el|
|
71
|
+
tr_columns_hash[el.to_s]
|
72
|
+
end
|
73
|
+
end
|
58
74
|
|
59
|
-
|
60
|
-
|
75
|
+
list = columns.map do |column|
|
76
|
+
Traits::Attribute.new(model_class, column)
|
61
77
|
end
|
62
|
-
end
|
63
78
|
|
64
|
-
|
65
|
-
Traits::Attribute.new(model_class, column)
|
79
|
+
Traits::AttributeList.new(list)
|
66
80
|
end
|
67
|
-
|
68
|
-
Traits::List.new(list)
|
69
81
|
end
|
70
82
|
|
71
83
|
def inspect_associations
|
72
|
-
|
73
|
-
Traits::
|
84
|
+
if model_class.abstract_class?
|
85
|
+
Traits::List.new([])
|
86
|
+
else
|
87
|
+
list = model_class.reflections.map do |pair|
|
88
|
+
Traits::Association.new(model_class, pair.last)
|
89
|
+
end
|
90
|
+
Traits::List.new(list)
|
74
91
|
end
|
75
|
-
Traits::List.new(list)
|
76
92
|
end
|
77
93
|
end
|
78
|
-
end
|
94
|
+
end
|
@@ -1,8 +1,9 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
isolate_namespace Traits
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
4
3
|
|
5
|
-
|
4
|
+
module Traits
|
5
|
+
class Railtie < Rails::Railtie
|
6
|
+
initializer do |app|
|
6
7
|
unless app.config.cache_classes
|
7
8
|
ActionDispatch::Reloader.to_prepare do
|
8
9
|
Traits.invalidate_loaded_active_record_descendants!
|
@@ -10,4 +11,4 @@ module Traits
|
|
10
11
|
end
|
11
12
|
end
|
12
13
|
end
|
13
|
-
end
|
14
|
+
end
|
data/lib/traits/utilities.rb
CHANGED
data/lib/traits/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-traits
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yaroslav Konoplov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-10-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -16,73 +16,44 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 3.
|
19
|
+
version: '3.0'
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '6.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: 3.
|
29
|
+
version: '3.0'
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '6.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: 3.
|
34
|
-
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ">="
|
39
|
+
version: '3.0'
|
40
|
+
- - "<"
|
39
41
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: essay
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: 1.0.0
|
42
|
+
version: '6.0'
|
48
43
|
type: :runtime
|
49
44
|
prerelease: false
|
50
45
|
version_requirements: !ruby/object:Gem::Requirement
|
51
46
|
requirements:
|
52
|
-
- - "
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: 1.0.0
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: essay-globalize
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - "~>"
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: 1.0.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.0
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: essay-carrierwave
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - "~>"
|
47
|
+
- - ">="
|
74
48
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
76
|
-
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - "~>"
|
49
|
+
version: '3.0'
|
50
|
+
- - "<"
|
81
51
|
- !ruby/object:Gem::Version
|
82
|
-
version:
|
83
|
-
description: Type information of
|
52
|
+
version: '6.0'
|
53
|
+
description: Type information of activerecord models, attributes and associations
|
54
|
+
in good and clear manner
|
84
55
|
email:
|
85
|
-
-
|
56
|
+
- eahome00@gmail.com
|
86
57
|
executables: []
|
87
58
|
extensions: []
|
88
59
|
extra_rdoc_files: []
|
@@ -91,37 +62,36 @@ files:
|
|
91
62
|
- Gemfile
|
92
63
|
- LICENSE.txt
|
93
64
|
- README.md
|
94
|
-
- Rakefile
|
95
65
|
- activerecord-traits.gemspec
|
96
66
|
- lib/activerecord-traits.rb
|
97
67
|
- lib/traits/association.rb
|
68
|
+
- lib/traits/association/essay_shortcuts.rb
|
69
|
+
- lib/traits/association/intermediate.rb
|
70
|
+
- lib/traits/association/join.rb
|
71
|
+
- lib/traits/association/macro.rb
|
72
|
+
- lib/traits/association/members.rb
|
73
|
+
- lib/traits/association/naming.rb
|
74
|
+
- lib/traits/association/polymorphism.rb
|
75
|
+
- lib/traits/association/read_only.rb
|
76
|
+
- lib/traits/association/through.rb
|
98
77
|
- lib/traits/attribute.rb
|
78
|
+
- lib/traits/attribute/essay_shortcuts.rb
|
79
|
+
- lib/traits/attribute/inheritance.rb
|
80
|
+
- lib/traits/attribute/key.rb
|
81
|
+
- lib/traits/attribute/naming.rb
|
82
|
+
- lib/traits/attribute/polymorphism.rb
|
83
|
+
- lib/traits/attribute/querying.rb
|
84
|
+
- lib/traits/attribute/type.rb
|
99
85
|
- lib/traits/base.rb
|
100
|
-
- lib/traits/concerns/association/essay_shortcuts.rb
|
101
|
-
- lib/traits/concerns/association/intermediate.rb
|
102
|
-
- lib/traits/concerns/association/join.rb
|
103
|
-
- lib/traits/concerns/association/macro.rb
|
104
|
-
- lib/traits/concerns/association/members.rb
|
105
|
-
- lib/traits/concerns/association/naming.rb
|
106
|
-
- lib/traits/concerns/association/polymorphism.rb
|
107
|
-
- lib/traits/concerns/association/read_only.rb
|
108
|
-
- lib/traits/concerns/association/through.rb
|
109
|
-
- lib/traits/concerns/attribute/essay_shortcuts.rb
|
110
|
-
- lib/traits/concerns/attribute/key.rb
|
111
|
-
- lib/traits/concerns/attribute/naming.rb
|
112
|
-
- lib/traits/concerns/attribute/polymorphism.rb
|
113
|
-
- lib/traits/concerns/attribute/querying.rb
|
114
|
-
- lib/traits/concerns/attribute/sti.rb
|
115
|
-
- lib/traits/concerns/attribute/type.rb
|
116
|
-
- lib/traits/concerns/model/essay_shortcuts.rb
|
117
|
-
- lib/traits/concerns/model/naming.rb
|
118
|
-
- lib/traits/concerns/model/polymorphism.rb
|
119
|
-
- lib/traits/concerns/model/querying.rb
|
120
|
-
- lib/traits/concerns/model/sti.rb
|
121
86
|
- lib/traits/descendants_listing.rb
|
122
|
-
- lib/traits/engine.rb
|
123
87
|
- lib/traits/list.rb
|
124
88
|
- lib/traits/model.rb
|
89
|
+
- lib/traits/model/essay_shortcuts.rb
|
90
|
+
- lib/traits/model/inheritance.rb
|
91
|
+
- lib/traits/model/naming.rb
|
92
|
+
- lib/traits/model/polymorphism.rb
|
93
|
+
- lib/traits/model/querying.rb
|
94
|
+
- lib/traits/railtie.rb
|
125
95
|
- lib/traits/utilities.rb
|
126
96
|
- lib/traits/version.rb
|
127
97
|
homepage: http://github.com/yivo/activerecord-traits
|
@@ -144,8 +114,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
144
114
|
version: '0'
|
145
115
|
requirements: []
|
146
116
|
rubyforge_project:
|
147
|
-
rubygems_version: 2.
|
117
|
+
rubygems_version: 2.5.1
|
148
118
|
signing_key:
|
149
119
|
specification_version: 4
|
150
|
-
summary: Type information of
|
120
|
+
summary: Type information of activerecord models
|
151
121
|
test_files: []
|
data/Rakefile
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
require 'bundler/gem_tasks'
|
@@ -1,41 +0,0 @@
|
|
1
|
-
module Traits
|
2
|
-
class Model
|
3
|
-
module STI
|
4
|
-
def uses_sti?
|
5
|
-
sti_base? || sti_derived?
|
6
|
-
end
|
7
|
-
|
8
|
-
def sti_base?
|
9
|
-
model_class.descends_from_active_record? && model_class.subclasses.any? do |subclass|
|
10
|
-
subclass.superclass == model_class
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def sti_derived?
|
15
|
-
!model_class.descends_from_active_record?
|
16
|
-
end
|
17
|
-
|
18
|
-
def sti_attribute_name
|
19
|
-
model_class.inheritance_column.to_sym
|
20
|
-
end
|
21
|
-
|
22
|
-
def sti_chain
|
23
|
-
model_class = self.model_class
|
24
|
-
chain = [model_class]
|
25
|
-
until model_class.superclass == ActiveRecord::Base do
|
26
|
-
model_class = model_class.superclass
|
27
|
-
chain.unshift(model_class)
|
28
|
-
end
|
29
|
-
chain
|
30
|
-
end
|
31
|
-
|
32
|
-
def to_hash
|
33
|
-
super.merge!(
|
34
|
-
sti_base: sti_base?,
|
35
|
-
sti_derived: sti_derived?,
|
36
|
-
sti_attribute_name: sti_attribute_name
|
37
|
-
)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|