safe_finder 0.1.0 → 0.1.1
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 +4 -4
- data/.gitignore +1 -0
- data/README.md +23 -12
- data/lib/safe_finder.rb +1 -0
- data/lib/safe_finder/class_wrapper.rb +1 -1
- data/lib/safe_finder/generators/model_generator.rb +13 -0
- data/lib/safe_finder/generators/templates/models/null_object.rb +5 -0
- data/lib/safe_finder/null_object_generator.rb +0 -2
- data/lib/safe_finder/version.rb +1 -1
- data/safe_finder.gemspec +2 -0
- metadata +32 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1e21ddcab7d21480ced641a0530ed32e6837d09d
|
4
|
+
data.tar.gz: 8ec78514a069609faa307801108f4b480003bd5c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7349ae3e416784d2a62681b14d190dfd2e8c044edfc07ce026c69b874dee94feb5dc76ef6c21c4c983392fa0f4ef7dd41538df8e9f1c9a189acdda7747fc9cc7
|
7
|
+
data.tar.gz: c8af28a85c08425f4ac738c760b58371fda1e2c20b415715a8b72f5637647d1bcc6e8e0123cfab94d8e2147695745fbbb6cf9f92eb3cfe218f94f194301356df
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -3,11 +3,11 @@
|
|
3
3
|
[](https://codeclimate.com/github/st0012/SafeFinder/coverage)
|
4
4
|
# SafeFinder
|
5
5
|
|
6
|
-
SafeFinder
|
6
|
+
SafeFinder lets you define a model's `Null Object` through a simple DSL, and returns that when you don't find an instance of that model.
|
7
7
|
|
8
8
|
## Installation
|
9
9
|
|
10
|
-
Add this line to your application's Gemfile
|
10
|
+
Add this line to your application's `Gemfile`:
|
11
11
|
|
12
12
|
```ruby
|
13
13
|
gem 'safe_finder'
|
@@ -34,20 +34,20 @@ class Post < ActiveRecord::Base
|
|
34
34
|
end
|
35
35
|
```
|
36
36
|
|
37
|
-
Now you can query like this,
|
37
|
+
Now you can query like this, and if it doesn't find anything it returns a `Null Object`:
|
38
38
|
|
39
39
|
```ruby
|
40
|
-
# It returns a
|
41
|
-
null_object = Post.safely.find_by_title("
|
40
|
+
# It returns a Null Object
|
41
|
+
null_object = Post.safely.find_by_title("Not Exists")
|
42
42
|
|
43
43
|
null_object.class # NullPost
|
44
44
|
null_object.title # nil
|
45
45
|
null_object.content # nil
|
46
46
|
```
|
47
47
|
|
48
|
-
### Custom
|
48
|
+
### Custom Attributes and Methods
|
49
49
|
|
50
|
-
And you can
|
50
|
+
And you can customize the Null Object's attributes or methods using a DSL:
|
51
51
|
|
52
52
|
```ruby
|
53
53
|
class Post < ActiveRecord::Base
|
@@ -60,22 +60,28 @@ class Post < ActiveRecord::Base
|
|
60
60
|
end
|
61
61
|
```
|
62
62
|
|
63
|
-
|
63
|
+
```ruby
|
64
|
+
null_object = Post.safely.find_by_title("Not Exists")
|
65
|
+
null_object.title # "Null"
|
66
|
+
null_object.some_method # "Do Something"
|
67
|
+
```
|
68
|
+
|
69
|
+
### Get a Null Object directly
|
64
70
|
|
65
71
|
Just simply use:
|
66
72
|
```ruby
|
67
|
-
Post.null_object
|
73
|
+
Post.null_object # <NullPost:0x007fa8a4713be0>
|
68
74
|
```
|
69
75
|
|
70
76
|
### Inheritance
|
71
77
|
|
72
|
-
All
|
78
|
+
All `Null Object`s inherit `SafeFinder::NullObject`, so you can add it in
|
73
79
|
|
74
80
|
```
|
75
81
|
app/models/safe_finder/null_object.rb
|
76
82
|
```
|
77
83
|
|
78
|
-
to define general methods for every
|
84
|
+
to define general methods for every `Null Object`n
|
79
85
|
|
80
86
|
```ruby
|
81
87
|
module SafeFinder
|
@@ -87,10 +93,15 @@ module SafeFinder
|
|
87
93
|
end
|
88
94
|
```
|
89
95
|
|
96
|
+
```ruby
|
97
|
+
null_object = Post.null_object
|
98
|
+
null_object.hello # "Hello"
|
99
|
+
```
|
100
|
+
|
90
101
|
|
91
102
|
## TODOs
|
92
103
|
|
93
|
-
- Add association support, like `user.post` should also returns
|
104
|
+
- Add association support, like `user.post` should also returns `Null Object` when it's nil
|
94
105
|
- Add generator for `NullObject` model
|
95
106
|
- More use cases in readme
|
96
107
|
|
data/lib/safe_finder.rb
CHANGED
@@ -9,7 +9,7 @@ module SafeFinder
|
|
9
9
|
def method_missing(name, *arguments, &block)
|
10
10
|
result = wrapped_class.send(name, *arguments, &block)
|
11
11
|
result.nil? ? wrapped_class.null_object : result
|
12
|
-
rescue ActiveRecord::RecordNotFound
|
12
|
+
rescue ActiveRecord::RecordNotFound
|
13
13
|
wrapped_class.null_object
|
14
14
|
end
|
15
15
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require "rails/generators"
|
2
|
+
|
3
|
+
module SafeFinder
|
4
|
+
class ModelGenerator < Rails::Generators::Base
|
5
|
+
def self.source_root
|
6
|
+
File.expand_path(File.join(File.dirname(__FILE__), 'templates'))
|
7
|
+
end
|
8
|
+
|
9
|
+
def create_model
|
10
|
+
template "models/null_object.rb", File.join("app/models", "safe_finder", "null_object.rb")
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/lib/safe_finder/version.rb
CHANGED
data/safe_finder.gemspec
CHANGED
@@ -31,6 +31,8 @@ Gem::Specification.new do |spec|
|
|
31
31
|
spec.add_development_dependency "rake", "~> 10.0"
|
32
32
|
spec.add_development_dependency "rspec"
|
33
33
|
spec.add_development_dependency "sqlite3"
|
34
|
+
spec.add_development_dependency "generator_spec"
|
34
35
|
|
36
|
+
spec.add_dependency "rails", ">= 4.0"
|
35
37
|
spec.add_dependency "activerecord", ">= 4.0"
|
36
38
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: safe_finder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stan Loe
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-10-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -80,6 +80,34 @@ dependencies:
|
|
80
80
|
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: generator_spec
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rails
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '4.0'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '4.0'
|
83
111
|
- !ruby/object:Gem::Dependency
|
84
112
|
name: activerecord
|
85
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -112,6 +140,8 @@ files:
|
|
112
140
|
- bin/setup
|
113
141
|
- lib/safe_finder.rb
|
114
142
|
- lib/safe_finder/class_wrapper.rb
|
143
|
+
- lib/safe_finder/generators/model_generator.rb
|
144
|
+
- lib/safe_finder/generators/templates/models/null_object.rb
|
115
145
|
- lib/safe_finder/null_object.rb
|
116
146
|
- lib/safe_finder/null_object_generator.rb
|
117
147
|
- lib/safe_finder/version.rb
|