active_hash 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +4 -0
- data/README.md +9 -3
- data/active_hash.gemspec +32 -12
- data/lib/active_file/base.rb +6 -20
- data/lib/active_hash/version.rb +1 -1
- data/lib/active_yaml/aliases.rb +1 -1
- data/lib/util/ruby_engine.rb +68 -0
- data/lib/util/ruby_version.rb +139 -0
- data/spec/active_hash/base_spec.rb +3 -3
- data/spec/active_yaml/base_spec.rb +21 -0
- data/spec/associations/associations_spec.rb +3 -1
- data/spec/enum/enum_spec.rb +1 -1
- data/spec/spec_helper.rb +2 -0
- metadata +4 -2
data/CHANGELOG
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
2013-07-15 (v1.0.1)
|
2
|
+
- Travis CI for ActiveHash + Ruby 2, 1.8.7, Rubinius and JRuby support (mattheworiordan)
|
3
|
+
- no longer need to call .all before executing `find_by_*` or `where` methods (mattheworiordan)
|
4
|
+
|
1
5
|
2013-06-24 (v1.0.0)
|
2
6
|
- save is a no-op on existing records, instead of raising an error (issue #63)
|
3
7
|
|
data/README.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# ActiveHash
|
2
2
|
|
3
|
+
[![Build Status](https://travis-ci.org/zilkey/active_hash.png?branch=master)](https://travis-ci.org/zilkey/active_hash)
|
4
|
+
|
3
5
|
ActiveHash is a simple base class that allows you to use a ruby hash as a readonly datasource for an ActiveRecord-like model.
|
4
6
|
|
5
7
|
ActiveHash assumes that every hash has an :id key, which is what you would probably store in a database. This allows you to seemlessly upgrade from ActiveHash objects to full ActiveRecord objects without having to change any code in your app, or any foreign keys in your database.
|
@@ -15,9 +17,13 @@ ActiveHash also ships with:
|
|
15
17
|
|
16
18
|
## Installation
|
17
19
|
|
18
|
-
|
20
|
+
Bundler:
|
21
|
+
|
22
|
+
gem 'active_hash'
|
23
|
+
|
24
|
+
Other:
|
19
25
|
|
20
|
-
|
26
|
+
gem install active_hash
|
21
27
|
|
22
28
|
## Usage
|
23
29
|
|
@@ -294,7 +300,7 @@ By default, this class will look for a yml file named "countries.yml" in the sam
|
|
294
300
|
|
295
301
|
The above example will look for the file "/u/data/sample.yml".
|
296
302
|
|
297
|
-
Since ActiveYaml just creates a hash from the YAML file, you will have all fields specified in YAML auto-defined for you
|
303
|
+
Since ActiveYaml just creates a hash from the YAML file, you will have all fields specified in YAML auto-defined for you. You can format your YAML as an array, or as a hash:
|
298
304
|
|
299
305
|
# array style
|
300
306
|
- id: 1
|
data/active_hash.gemspec
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
$:.push File.expand_path("../lib", __FILE__)
|
4
4
|
require "active_hash/version"
|
5
|
+
require "util/ruby_engine"
|
6
|
+
require "util/ruby_version"
|
5
7
|
|
6
8
|
Gem::Specification.new do |s|
|
7
9
|
s.name = %q{active_hash}
|
@@ -58,28 +60,46 @@ Gem::Specification.new do |s|
|
|
58
60
|
"spec/spec_helper.rb"
|
59
61
|
]
|
60
62
|
|
63
|
+
supported_rails_versions = if RubyVersion < '1.9.3'
|
64
|
+
[">= 2.2.2", "< 4"]
|
65
|
+
else
|
66
|
+
[">= 2.2.2"]
|
67
|
+
end
|
68
|
+
|
69
|
+
sqlite_gem = if RubyEngine.jruby?
|
70
|
+
if RubyVersion >= '1.9.3'
|
71
|
+
# Until 1.3.0 is released, we need to depend on a Beta version for JRuby and Rails 4
|
72
|
+
# https://github.com/jruby/activerecord-jdbc-adapter/issues/419#issuecomment-20567142
|
73
|
+
['activerecord-jdbcsqlite3-adapter', ['>= 1.3.0.beta2']]
|
74
|
+
else
|
75
|
+
['activerecord-jdbcsqlite3-adapter']
|
76
|
+
end
|
77
|
+
else
|
78
|
+
['sqlite3']
|
79
|
+
end
|
80
|
+
|
61
81
|
if s.respond_to? :specification_version then
|
62
82
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
63
83
|
s.specification_version = 3
|
64
84
|
|
65
85
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
66
|
-
s.add_runtime_dependency(%q<activesupport>,
|
86
|
+
s.add_runtime_dependency(%q<activesupport>, supported_rails_versions)
|
67
87
|
s.add_development_dependency(%q<rspec>, ["~> 2.2.0"])
|
68
|
-
s.add_development_dependency(
|
69
|
-
s.add_development_dependency(%q<activerecord>,
|
70
|
-
s.add_development_dependency(%q<appraisal
|
88
|
+
s.add_development_dependency(*sqlite_gem)
|
89
|
+
s.add_development_dependency(%q<activerecord>, supported_rails_versions)
|
90
|
+
s.add_development_dependency(%q<appraisal>)
|
71
91
|
else
|
72
|
-
s.add_dependency(%q<activesupport>,
|
92
|
+
s.add_dependency(%q<activesupport>, supported_rails_versions)
|
73
93
|
s.add_dependency(%q<rspec>, ["~> 2.2.0"])
|
74
|
-
s.add_dependency(
|
75
|
-
s.add_dependency(%q<activerecord>,
|
76
|
-
s.add_dependency(%q<appraisal
|
94
|
+
s.add_dependency(*sqlite_gem)
|
95
|
+
s.add_dependency(%q<activerecord>, supported_rails_versions)
|
96
|
+
s.add_dependency(%q<appraisal>)
|
77
97
|
end
|
78
98
|
else
|
79
|
-
s.add_dependency(%q<activesupport>,
|
99
|
+
s.add_dependency(%q<activesupport>, supported_rails_versions)
|
80
100
|
s.add_dependency(%q<rspec>, ["~> 2.2.0"])
|
81
|
-
s.add_dependency(
|
82
|
-
s.add_dependency(%q<activerecord>,
|
83
|
-
s.add_dependency(%q<appraisal
|
101
|
+
s.add_dependency(*sqlite_gem)
|
102
|
+
s.add_dependency(%q<activerecord>, supported_rails_versions)
|
103
|
+
s.add_dependency(%q<appraisal>)
|
84
104
|
end
|
85
105
|
end
|
data/lib/active_file/base.rb
CHANGED
@@ -10,16 +10,6 @@ module ActiveFile
|
|
10
10
|
|
11
11
|
class << self
|
12
12
|
|
13
|
-
def all(options={})
|
14
|
-
reload unless data_loaded
|
15
|
-
super
|
16
|
-
end
|
17
|
-
|
18
|
-
def where(options)
|
19
|
-
reload unless data_loaded
|
20
|
-
super
|
21
|
-
end
|
22
|
-
|
23
13
|
def delete_all
|
24
14
|
self.data_loaded = true
|
25
15
|
super
|
@@ -53,19 +43,15 @@ module ActiveFile
|
|
53
43
|
def extension
|
54
44
|
raise "Override Me"
|
55
45
|
end
|
46
|
+
protected :extension
|
56
47
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
def find_by_id(*args)
|
63
|
-
reload unless data_loaded
|
64
|
-
return super
|
48
|
+
[:find, :find_by_id, :all, :where, :method_missing].each do |method|
|
49
|
+
define_method(method) do |*args|
|
50
|
+
reload unless data_loaded
|
51
|
+
return super(*args)
|
52
|
+
end
|
65
53
|
end
|
66
54
|
|
67
|
-
protected :extension
|
68
|
-
|
69
55
|
end
|
70
56
|
end
|
71
57
|
|
data/lib/active_hash/version.rb
CHANGED
data/lib/active_yaml/aliases.rb
CHANGED
@@ -0,0 +1,68 @@
|
|
1
|
+
# Sourced from http://rbjl.net/35-how-to-properly-check-for-your-ruby-interpreter-version-and-os
|
2
|
+
# Extracted from http://rubyzucker.info/
|
3
|
+
# Copyright (c) 2010-2013 Jan Lelis <http://happycode.org> released under the MIT license
|
4
|
+
|
5
|
+
class RubyEngine
|
6
|
+
class << self
|
7
|
+
def interpreter
|
8
|
+
case
|
9
|
+
when RUBY_PLATFORM == 'parrot'
|
10
|
+
'cardinal'
|
11
|
+
when Object.constants.include?( :RUBY_ENGINE ) ||
|
12
|
+
Object.constants.include?( 'RUBY_ENGINE' )
|
13
|
+
if RUBY_ENGINE == 'ruby'
|
14
|
+
if RUBY_DESCRIPTION =~ /Enterprise/
|
15
|
+
'ree'
|
16
|
+
else
|
17
|
+
'mri'
|
18
|
+
end
|
19
|
+
else
|
20
|
+
RUBY_ENGINE.to_s # jruby, rbx, ironruby, macruby, etc.
|
21
|
+
end
|
22
|
+
else # probably 1.8
|
23
|
+
'mri'
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def is?(what)
|
28
|
+
what === interpreter
|
29
|
+
end
|
30
|
+
alias is is?
|
31
|
+
|
32
|
+
def to_s
|
33
|
+
interpreter
|
34
|
+
end
|
35
|
+
|
36
|
+
def mri?
|
37
|
+
RubyEngine.is? 'mri'
|
38
|
+
end
|
39
|
+
alias official_ruby? mri?
|
40
|
+
alias ruby? mri?
|
41
|
+
|
42
|
+
def jruby?
|
43
|
+
RubyEngine.is? 'jruby'
|
44
|
+
end
|
45
|
+
alias java? jruby?
|
46
|
+
|
47
|
+
def rubinius?
|
48
|
+
RubyEngine.is? 'rbx'
|
49
|
+
end
|
50
|
+
alias rbx? rubinius?
|
51
|
+
|
52
|
+
def ree?
|
53
|
+
RubyEngine.is? 'ree'
|
54
|
+
end
|
55
|
+
alias enterprise? ree?
|
56
|
+
|
57
|
+
def ironruby?
|
58
|
+
RubyEngine.is? 'ironruby'
|
59
|
+
end
|
60
|
+
alias iron_ruby? ironruby?
|
61
|
+
|
62
|
+
def cardinal?
|
63
|
+
RubyEngine.is? 'cardinal'
|
64
|
+
end
|
65
|
+
alias parrot? cardinal?
|
66
|
+
alias perl? cardinal?
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,139 @@
|
|
1
|
+
# Sourced from http://rbjl.net/35-how-to-properly-check-for-your-ruby-interpreter-version-and-os
|
2
|
+
# Extracted from http://rubyzucker.info/
|
3
|
+
# Copyright (c) 2010-2013 Jan Lelis <http://happycode.org> released under the MIT license
|
4
|
+
|
5
|
+
### usage examples
|
6
|
+
# RubyVersion
|
7
|
+
### check for the main version with a Float
|
8
|
+
# RubyVersion.is? 1.8
|
9
|
+
### use strings for exacter checking
|
10
|
+
# RubyVersion.is.above '1.8.7'
|
11
|
+
# RubyVersion.is.at_least '1.8.7' # or below, at_most, not
|
12
|
+
### you can use the common comparison operators
|
13
|
+
# RubyVersion >= '1.8.7'
|
14
|
+
# RubyVersion.is.between? '1.8.6', '1.8.7'
|
15
|
+
### relase date checks
|
16
|
+
# RubyVersion.is.older_than Date.today
|
17
|
+
# RubyVersion.is.newer_than '2009-08-19'
|
18
|
+
### accessors
|
19
|
+
# RubyVersion.major # e.g. => 1
|
20
|
+
# RubyVersion.minor # e.g. => 8
|
21
|
+
# RubyVersion.tiny # e.g. => 7
|
22
|
+
# RubyVersion.patchlevel # e.g. => 249
|
23
|
+
# RubyVersion.description # e.g. => "ruby 1.8.7 (2010-01-10 patchlevel 249) [i486-linux]"
|
24
|
+
|
25
|
+
require 'date'
|
26
|
+
require 'time'
|
27
|
+
|
28
|
+
module RubyVersion
|
29
|
+
class << self
|
30
|
+
def to_s
|
31
|
+
RUBY_VERSION
|
32
|
+
end
|
33
|
+
|
34
|
+
# comparable
|
35
|
+
def <=>(other)
|
36
|
+
value = case other
|
37
|
+
when Integer
|
38
|
+
RUBY_VERSION.to_i
|
39
|
+
when Float
|
40
|
+
RUBY_VERSION.to_f
|
41
|
+
when String
|
42
|
+
RUBY_VERSION
|
43
|
+
when Date,Time
|
44
|
+
other.class.parse(RUBY_RELEASE_DATE)
|
45
|
+
else
|
46
|
+
other = other.to_s
|
47
|
+
RUBY_VERSION
|
48
|
+
end
|
49
|
+
value <=> other
|
50
|
+
end
|
51
|
+
include Comparable
|
52
|
+
|
53
|
+
# chaining for dsl-like language
|
54
|
+
def is?(other = nil)
|
55
|
+
if other
|
56
|
+
RubyVersion == other
|
57
|
+
else
|
58
|
+
RubyVersion
|
59
|
+
end
|
60
|
+
end
|
61
|
+
alias is is?
|
62
|
+
|
63
|
+
# aliases
|
64
|
+
alias below <
|
65
|
+
alias below? <
|
66
|
+
alias at_most <=
|
67
|
+
alias at_most? <=
|
68
|
+
alias above >
|
69
|
+
alias above? >
|
70
|
+
alias at_least >=
|
71
|
+
alias at_least? >=
|
72
|
+
alias exactly ==
|
73
|
+
alias exactly? ==
|
74
|
+
def not(other)
|
75
|
+
self != other
|
76
|
+
end
|
77
|
+
alias not? not
|
78
|
+
alias between between?
|
79
|
+
|
80
|
+
# compare dates
|
81
|
+
def newer_than(other)
|
82
|
+
if other.is_a? Date or other.is_a? Time
|
83
|
+
RubyVersion > other
|
84
|
+
else
|
85
|
+
RUBY_RELEASE_DATE > other.to_s
|
86
|
+
end
|
87
|
+
end
|
88
|
+
alias newer_than? newer_than
|
89
|
+
|
90
|
+
def older_than(other)
|
91
|
+
if other.is_a? Date or other.is_a? Time
|
92
|
+
RubyVersion < other
|
93
|
+
else
|
94
|
+
RUBY_RELEASE_DATE < other.to_s
|
95
|
+
end
|
96
|
+
end
|
97
|
+
alias older_than? older_than
|
98
|
+
|
99
|
+
def released_today
|
100
|
+
RubyVersion.date == Date.today
|
101
|
+
end
|
102
|
+
alias released_today? released_today
|
103
|
+
|
104
|
+
# accessors
|
105
|
+
|
106
|
+
def major
|
107
|
+
RUBY_VERSION.to_i
|
108
|
+
end
|
109
|
+
alias main major
|
110
|
+
|
111
|
+
def minor
|
112
|
+
RUBY_VERSION.split('.')[1].to_i
|
113
|
+
end
|
114
|
+
alias mini minor
|
115
|
+
|
116
|
+
def tiny
|
117
|
+
RUBY_VERSION.split('.')[2].to_i
|
118
|
+
end
|
119
|
+
|
120
|
+
alias teeny tiny
|
121
|
+
|
122
|
+
def patchlevel
|
123
|
+
RUBY_PATCHLEVEL
|
124
|
+
end
|
125
|
+
|
126
|
+
def platform
|
127
|
+
RUBY_PLATFORM
|
128
|
+
end
|
129
|
+
|
130
|
+
def release_date
|
131
|
+
Date.parse RUBY_RELEASE_DATE
|
132
|
+
end
|
133
|
+
alias date release_date
|
134
|
+
|
135
|
+
def description
|
136
|
+
RUBY_DESCRIPTION
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
@@ -511,7 +511,7 @@ describe ActiveHash, "Base" do
|
|
511
511
|
it "raises a NoMethodError" do
|
512
512
|
lambda {
|
513
513
|
Country.find_by_name_and_shoe_size("US", 10)
|
514
|
-
}.should raise_error(NoMethodError,
|
514
|
+
}.should raise_error(NoMethodError, /undefined method `find_by_name_and_shoe_size' (?:for|on) Country/)
|
515
515
|
end
|
516
516
|
end
|
517
517
|
end
|
@@ -540,7 +540,7 @@ describe ActiveHash, "Base" do
|
|
540
540
|
it "raises a NoMethodError" do
|
541
541
|
lambda {
|
542
542
|
Country.find_by_name_and_shoe_size!("US", 10)
|
543
|
-
}.should raise_error(NoMethodError,
|
543
|
+
}.should raise_error(NoMethodError, /undefined method `find_by_name_and_shoe_size!' (?:for|on) Country/)
|
544
544
|
end
|
545
545
|
end
|
546
546
|
end
|
@@ -567,7 +567,7 @@ describe ActiveHash, "Base" do
|
|
567
567
|
it "doesn't blow up if you call a missing dynamic finder when fields haven't been set" do
|
568
568
|
proc do
|
569
569
|
Country.find_by_name("Foo")
|
570
|
-
end.should raise_error(NoMethodError,
|
570
|
+
end.should raise_error(NoMethodError, /undefined method `find_by_name' (?:for|on) Country/)
|
571
571
|
end
|
572
572
|
end
|
573
573
|
|
@@ -27,6 +27,15 @@ describe ActiveYaml::Base do
|
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
+
describe ".where" do
|
31
|
+
context "before the file is loaded" do
|
32
|
+
it "reads from the file and filters by where statement" do
|
33
|
+
State.where(:name => 'Oregon').should_not be_empty
|
34
|
+
State.count.should > 0
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
30
39
|
describe ".delete_all" do
|
31
40
|
context "when called before .all" do
|
32
41
|
it "causes all to not load data" do
|
@@ -95,4 +104,16 @@ describe ActiveYaml::Base do
|
|
95
104
|
|
96
105
|
end
|
97
106
|
|
107
|
+
describe 'meta programmed finders and properties for fields that exist in the YAML' do
|
108
|
+
|
109
|
+
it 'should have a finder method for each property' do
|
110
|
+
City.find_by_state('Oregon').should_not be_nil
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'should have a find all method for each property' do
|
114
|
+
City.find_all_by_state('Oregon').should_not be_nil
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
|
98
119
|
end
|
@@ -7,7 +7,9 @@ describe ActiveHash::Base, "associations" do
|
|
7
7
|
class Country < ActiveRecord::Base
|
8
8
|
extend ActiveHash::Associations::ActiveRecordExtensions
|
9
9
|
establish_connection :adapter => "sqlite3", :database => ":memory:"
|
10
|
-
connection.create_table(:countries, :force => true)
|
10
|
+
connection.create_table(:countries, :force => true) do |t|
|
11
|
+
t.string :name
|
12
|
+
end
|
11
13
|
end
|
12
14
|
|
13
15
|
class School < ActiveRecord::Base
|
data/spec/enum/enum_spec.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_hash
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -130,6 +130,8 @@ files:
|
|
130
130
|
- lib/active_yaml/base.rb
|
131
131
|
- lib/associations/associations.rb
|
132
132
|
- lib/enum/enum.rb
|
133
|
+
- lib/util/ruby_engine.rb
|
134
|
+
- lib/util/ruby_version.rb
|
133
135
|
- Gemfile
|
134
136
|
- spec/active_file/base_spec.rb
|
135
137
|
- spec/active_hash/base_spec.rb
|
@@ -152,7 +154,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
152
154
|
version: '0'
|
153
155
|
segments:
|
154
156
|
- 0
|
155
|
-
hash:
|
157
|
+
hash: 1166789792063015008
|
156
158
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
157
159
|
none: false
|
158
160
|
requirements:
|