metabolical 0.0.4 → 1.2.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 +7 -0
- data/Gemfile +3 -1
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/metabolical/scopes.rb +22 -22
- data/lib/metabolical/version.rb +1 -1
- data/lib/metabolical.rb +9 -2
- data/metabolical.gemspec +33 -21
- data/test/helper.rb +2 -3
- data/test/metabolical_test.rb +20 -20
- metadata +96 -67
- data/.rvmrc +0 -1
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: c64475964e6b37ea5502c264151add71cdcf0d956c8a32c484dfbb47d3b556b2
|
4
|
+
data.tar.gz: ccb3c4e1b41c619d27d723b52d8104a9797cc51e225a7619e7c47e10bee7ae23
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 8b56934b70a4419cf7d2ff4fbbb12e96b973922de87fa1c9cd28938131c97f6ddec7956569e4985895d75230968a602da00d72e1186a79b722b0a0bc12a2f356
|
7
|
+
data.tar.gz: bbc4edb0f271008bf4cc74dbedccc330a0f6171b8335c8bdf72855a44e9d3eabc3782c845b143fad6adea692f3b115e88f6eb39afef466a33f2ccd9f5ce0a05f
|
data/Gemfile
CHANGED
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "metabolical"
|
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(__FILE__)
|
data/bin/setup
ADDED
data/lib/metabolical/scopes.rb
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
module Metabolical
|
2
|
-
module
|
2
|
+
module AR4Scopes
|
3
3
|
def self.included(klass)
|
4
|
-
|
5
|
-
klass.send
|
6
|
-
klass.send
|
7
|
-
klass.send
|
8
|
-
klass.send
|
9
|
-
|
10
|
-
}
|
4
|
+
class_eval do
|
5
|
+
klass.send :scope, :with_meta, lambda {|k| joins(:metas).where("meta_data.key" => k) }
|
6
|
+
klass.send :scope, :with_metas, lambda { include(:metas) }
|
7
|
+
klass.send :scope, :with_meta_data, lambda{|k, v| where({"meta_data.key" => k, "meta_data.data" => v.to_yaml}).joins(:metas) }
|
8
|
+
klass.send :scope, :without_meta, lambda{|k|
|
9
|
+
joins("left join meta_data md on md.metabolized_id = #{klass.table_name}.#{klass.primary_key} and md.metabolized_type = '#{klass.to_s}' and md.key = '#{k}'").where("md.metabolized_id is null")
|
10
|
+
}
|
11
|
+
end
|
11
12
|
end
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
13
|
+
end
|
14
|
+
|
15
|
+
module AR3Scopes
|
16
|
+
def self.included(klass)
|
17
|
+
class_eval do
|
18
|
+
klass.send :named_scope, :with_meta, lambda{|k| joins([:meta]).where({"meta_data.key" => k}) }
|
19
|
+
klass.send :named_scope, :with_metas, includes(:meta)
|
20
|
+
klass.send :named_scope, :with_meta_data, lambda{|k, v| joins(:meta).where("meta_data.key" => k, "meta_data.data" => v.to_yaml)}
|
21
|
+
# TODO: find a better way to define this
|
22
|
+
# Arel provides a way to specify left joins by using
|
23
|
+
# join(left).on(... syntax
|
24
|
+
klass.send :named_scope, :without_meta, lambda{|k| {:joins => "left join meta_data md on md.metabolized_id = #{klass.table_name}.#{klass.primary_key} and md.metabolized_type = '#{klass.to_s}' and md.key = '#{k}'", :conditions => "md.metabolized_id is null"}
|
25
|
+
}
|
25
26
|
end
|
26
27
|
end
|
27
|
-
|
28
28
|
end
|
29
29
|
end
|
data/lib/metabolical/version.rb
CHANGED
data/lib/metabolical.rb
CHANGED
@@ -2,18 +2,25 @@ require 'metabolical/meta_datum'
|
|
2
2
|
require 'metabolical/scopes'
|
3
3
|
|
4
4
|
module Metabolical
|
5
|
+
class Error < StandardError; end
|
6
|
+
|
5
7
|
def self.included(klass)
|
6
8
|
klass.extend ClassMethods
|
7
9
|
end
|
8
10
|
|
9
11
|
module ClassMethods
|
10
12
|
def metabolize!
|
11
|
-
|
13
|
+
if self.respond_to?(:named_scope)
|
14
|
+
include Metabolical::AR3Scopes
|
15
|
+
else
|
16
|
+
include Metabolical::AR4Scopes
|
17
|
+
end
|
18
|
+
|
12
19
|
class_eval do
|
13
20
|
has_many :metas, :as => :metabolized, :class_name => 'Metabolical::MetaDatum' do
|
14
21
|
def [](key)
|
15
22
|
owner = (self.respond_to?(:proxy_association) ? self.proxy_association.owner : self.proxy_owner)
|
16
|
-
|
23
|
+
(owner.metas.loaded? && owner.metas.detect{|m| m.key == key} ) || find_by(key: key) || owner.metas.build(:key => key)
|
17
24
|
end
|
18
25
|
|
19
26
|
def []=(key, data)
|
data/metabolical.gemspec
CHANGED
@@ -1,26 +1,38 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
lib = File.expand_path("../lib", __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
3
|
require "metabolical/version"
|
4
4
|
|
5
|
-
Gem::Specification.new do |
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
s.rubyforge_project = "metabolical"
|
18
|
-
|
19
|
-
s.files = `git ls-files`.split("\n")
|
20
|
-
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
21
|
-
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
22
|
-
s.require_paths = ["lib"]
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "metabolical"
|
7
|
+
spec.version = Metabolical::VERSION
|
8
|
+
spec.platform = Gem::Platform::RUBY
|
9
|
+
spec.authors = ["Diego Scataglini"]
|
10
|
+
spec.email = ["dwebsubmit@gmail.com"]
|
11
|
+
spec.homepage = "https://github.com/dscataglini/Metabolical"
|
12
|
+
spec.summary = %q{Add arbitrary meta data to any AR object}
|
13
|
+
spec.description = %q{This is an ActiveRecord Model & mixin to add meta data to any AR object}
|
14
|
+
spec.license = "MIT"
|
15
|
+
spec.required_ruby_version = '>= 3.2.0'
|
23
16
|
|
24
|
-
|
17
|
+
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
18
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
19
|
+
end
|
20
|
+
|
21
|
+
spec.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
22
|
+
spec.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
23
|
+
spec.require_paths = ["lib"]
|
25
24
|
|
25
|
+
spec.add_runtime_dependency 'activerecord', '~> 6.0', '>= 6.0.0'
|
26
|
+
spec.add_development_dependency "bundler", "~> 2.1"
|
27
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
28
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
29
|
+
|
30
|
+
|
31
|
+
if spec.respond_to?(:metadata)
|
32
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
33
|
+
spec.metadata["source_code_uri"] = spec.homepage
|
34
|
+
else
|
35
|
+
raise "RubyGems 2.0 or newer is required to protect against " \
|
36
|
+
"public gem pushes."
|
37
|
+
end
|
26
38
|
end
|
data/test/helper.rb
CHANGED
@@ -1,10 +1,9 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'sqlite3'
|
3
3
|
require 'active_record'
|
4
|
-
require '
|
5
|
-
require 'shoulda'
|
4
|
+
require 'minitest/autorun'
|
6
5
|
|
7
|
-
TEST_ROOT = File.expand_path(File.dirname(__FILE__))
|
6
|
+
TEST_ROOT = File.expand_path(File.dirname(__FILE__) )
|
8
7
|
MODELS_ROOT = TEST_ROOT + "/models"
|
9
8
|
FIXTURES_ROOT = TEST_ROOT + "/fixtures"
|
10
9
|
MIGRATIONS_ROOT = TEST_ROOT + "/migrations"
|
data/test/metabolical_test.rb
CHANGED
@@ -1,52 +1,52 @@
|
|
1
1
|
require 'helper'
|
2
2
|
require 'models/user'
|
3
3
|
|
4
|
-
|
5
|
-
|
4
|
+
describe Metabolical do
|
5
|
+
describe "an ActiveRecord Object" do
|
6
6
|
|
7
|
-
|
8
|
-
|
7
|
+
describe "new record" do
|
8
|
+
before do
|
9
9
|
@user = User.new
|
10
10
|
end
|
11
11
|
|
12
|
-
|
12
|
+
after do
|
13
13
|
@user.destroy
|
14
14
|
end
|
15
15
|
|
16
|
-
should
|
16
|
+
it "should be able to assign a single meta before saving and retrieving it after save" do
|
17
17
|
@user.metas['foo'] = 'bar'
|
18
18
|
@user.save
|
19
19
|
assert_equal 'bar', @user.metas['foo'].data
|
20
20
|
end
|
21
21
|
|
22
|
-
should
|
22
|
+
it "should be able to assign a single meta before saving and retrieving it before save" do
|
23
23
|
@user.metas['foo'] = 'bar'
|
24
24
|
assert_equal 'bar', @user.metas['foo'].data
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
|
29
|
-
|
28
|
+
describe "saved record" do
|
29
|
+
before do
|
30
30
|
@user = User.new
|
31
31
|
@user.save
|
32
32
|
end
|
33
33
|
|
34
|
-
|
34
|
+
after do
|
35
35
|
@user.destroy
|
36
36
|
end
|
37
37
|
|
38
|
-
should
|
38
|
+
it "should be able to assign a single meta before re saving and retrieving it after save" do
|
39
39
|
@user.metas['foo'] = 'bar'
|
40
40
|
@user.save
|
41
41
|
assert_equal 'bar', @user.metas['foo'].data
|
42
42
|
end
|
43
43
|
|
44
|
-
should
|
44
|
+
it "should be able to assign a single meta before re saving and retrieving it before save" do
|
45
45
|
@user.metas['foo'] = 'baz'
|
46
46
|
assert_equal 'baz', @user.metas['foo'].data
|
47
47
|
end
|
48
48
|
|
49
|
-
should
|
49
|
+
it "should be able to retrieve after saving" do
|
50
50
|
@user.metas['foo'] = 'faz'
|
51
51
|
@user.save
|
52
52
|
user = User.find @user.id
|
@@ -55,8 +55,8 @@ class MetabolicalTest < Test::Unit::TestCase
|
|
55
55
|
|
56
56
|
end
|
57
57
|
|
58
|
-
|
59
|
-
|
58
|
+
describe "named scopes" do
|
59
|
+
before do
|
60
60
|
@foo_user = User.create(:name => 'foo_user', :metas => [Metabolical::MetaDatum.new(:key => "foo", :data => "bar")])
|
61
61
|
@bar_user = User.create(:name => 'bar_user',
|
62
62
|
:metas => [Metabolical::MetaDatum.new(:key => "bar", :data => "baz"),
|
@@ -64,26 +64,26 @@ class MetabolicalTest < Test::Unit::TestCase
|
|
64
64
|
@true_user = User.create(:name => 'true_user', :metas => [Metabolical::MetaDatum.new(:key => "bar", :data => true)])
|
65
65
|
end
|
66
66
|
|
67
|
-
|
67
|
+
after do
|
68
68
|
User.delete_all
|
69
69
|
end
|
70
70
|
|
71
|
-
should
|
71
|
+
it "should have with_meta scopes" do
|
72
72
|
assert_equal [@foo_user], User.with_meta("foo")
|
73
73
|
assert_equal [@bar_user, @true_user], User.with_meta("bar")
|
74
74
|
end
|
75
75
|
|
76
|
-
should
|
76
|
+
it "should have with_meta scopes that check for data" do
|
77
77
|
assert_equal [], User.with_meta_data("foo", "foo")
|
78
78
|
assert_equal [@foo_user], User.with_meta_data("foo", "bar"), "Should have brought back foo user"
|
79
79
|
assert_equal [@true_user], User.with_meta_data("bar", true), "Should have brought back true user"
|
80
80
|
end
|
81
81
|
|
82
|
-
should
|
82
|
+
it "should have with_metas scope that includes all metas" do
|
83
83
|
assert User.respond_to?(:with_metas)
|
84
84
|
end
|
85
85
|
|
86
|
-
should
|
86
|
+
it "should bring back objects without a certain meta" do
|
87
87
|
assert_equal [@foo_user], User.without_meta("bar")
|
88
88
|
end
|
89
89
|
|
metadata
CHANGED
@@ -1,53 +1,92 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: metabolical
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
- 4
|
10
|
-
version: 0.0.4
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.2.0
|
11
5
|
platform: ruby
|
12
|
-
authors:
|
6
|
+
authors:
|
13
7
|
- Diego Scataglini
|
14
|
-
autorequire:
|
8
|
+
autorequire:
|
15
9
|
bindir: bin
|
16
10
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
11
|
+
date: 2024-10-02 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activerecord
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '6.0'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 6.0.0
|
21
23
|
type: :runtime
|
22
24
|
prerelease: false
|
23
|
-
version_requirements:
|
24
|
-
|
25
|
-
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '6.0'
|
26
30
|
- - ">="
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 6.0.0
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: bundler
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '2.1'
|
40
|
+
type: :development
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - "~>"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '2.1'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rake
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '10.0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '10.0'
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: rspec
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '3.0'
|
68
|
+
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - "~>"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '3.0'
|
36
75
|
description: This is an ActiveRecord Model & mixin to add meta data to any AR object
|
37
|
-
email:
|
38
|
-
-
|
39
|
-
executables:
|
40
|
-
|
76
|
+
email:
|
77
|
+
- dwebsubmit@gmail.com
|
78
|
+
executables:
|
79
|
+
- console
|
80
|
+
- setup
|
41
81
|
extensions: []
|
42
|
-
|
43
82
|
extra_rdoc_files: []
|
44
|
-
|
45
|
-
|
46
|
-
- .gitignore
|
47
|
-
- .rvmrc
|
83
|
+
files:
|
84
|
+
- ".gitignore"
|
48
85
|
- Gemfile
|
49
86
|
- README.rdoc
|
50
87
|
- Rakefile
|
88
|
+
- bin/console
|
89
|
+
- bin/setup
|
51
90
|
- lib/metabolical.rb
|
52
91
|
- lib/metabolical/meta_datum.rb
|
53
92
|
- lib/metabolical/scopes.rb
|
@@ -57,42 +96,32 @@ files:
|
|
57
96
|
- test/metabolical_test.rb
|
58
97
|
- test/models/user.rb
|
59
98
|
- test/schema/schema.rb
|
60
|
-
homepage:
|
61
|
-
licenses:
|
62
|
-
|
63
|
-
|
99
|
+
homepage: https://github.com/dscataglini/Metabolical
|
100
|
+
licenses:
|
101
|
+
- MIT
|
102
|
+
metadata:
|
103
|
+
homepage_uri: https://github.com/dscataglini/Metabolical
|
104
|
+
source_code_uri: https://github.com/dscataglini/Metabolical
|
105
|
+
post_install_message:
|
64
106
|
rdoc_options: []
|
65
|
-
|
66
|
-
require_paths:
|
107
|
+
require_paths:
|
67
108
|
- lib
|
68
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
69
|
-
|
70
|
-
requirements:
|
109
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
110
|
+
requirements:
|
71
111
|
- - ">="
|
72
|
-
- !ruby/object:Gem::Version
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
- 8
|
77
|
-
- 7
|
78
|
-
version: 1.8.7
|
79
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
80
|
-
none: false
|
81
|
-
requirements:
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: 3.2.0
|
114
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
82
116
|
- - ">="
|
83
|
-
- !ruby/object:Gem::Version
|
84
|
-
|
85
|
-
segments:
|
86
|
-
- 0
|
87
|
-
version: "0"
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
88
119
|
requirements: []
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
summary: This is an ActiveRecord Model & mixin to add meta data to any AR object
|
95
|
-
test_files:
|
120
|
+
rubygems_version: 3.4.19
|
121
|
+
signing_key:
|
122
|
+
specification_version: 4
|
123
|
+
summary: Add arbitrary meta data to any AR object
|
124
|
+
test_files:
|
96
125
|
- test/helper.rb
|
97
126
|
- test/metabolical_test.rb
|
98
127
|
- test/models/user.rb
|
data/.rvmrc
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
rvm use 1.8.7
|