nigilist 0.1.0 → 1.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '03859e345e50ed0007f19d98268f1592f010926105ca8574d489c95b1cd62319'
4
- data.tar.gz: 9e116b02024911bd4c539f255e8cf44f60341b3633055d192273ce7d824446cf
3
+ metadata.gz: a586c6911dc9db595a024023cc0ce60a71fb4fc9dbc550206d13249bc6108d37
4
+ data.tar.gz: cea1e62f69d40782d265d169db670526083d92d98fc7287e9a271994268cc7e2
5
5
  SHA512:
6
- metadata.gz: 76bb2c37211677ce4bb4a7e691438d69a0421f5dcca715b5d45396887a32e20542d47725f0854c26bcf53a254e56ca05c1233ad4fdde36cb7df46eebf1413dec
7
- data.tar.gz: dca4da8b1109575a2ea6ab0b5ad503aebd6c66f8548492463e416ac17b55c872c6769554ff2438e972e6a0854bc5b983bacf36302e25f6c246dcc3a7c797600d
6
+ metadata.gz: cf85e5252552d1e1efdb39dfa22e37d0809c53253c60d63bc7cafb7335e0835eb318902f3b2b835d891830a87934befec057ad4fef995b6e206b7d704ce20aaa
7
+ data.tar.gz: cc5a1445e53c58daa7ec9ec98463f0bf8f7d31d0aa3e539e22033f29ed6e2730064584a4cac11aac945ed84ca987282449230a1685b7b871456c22ad27f887cb
@@ -1,4 +1,5 @@
1
1
  dist: trusty
2
2
  language: ruby
3
+ cache: bundler
3
4
  script:
4
5
  - bundle exec rake
@@ -0,0 +1,10 @@
1
+ ## 1.0.0
2
+
3
+ ### Features
4
+
5
+ - [**BREAKING**] For Ruby on Rails plural method call now return ActiveRecord's model null relation if model with same singular name exists, otherwise return `[]` ([#6](https://github.com/aishek/nihilist/pull/6))
6
+ - `respond_to?` now return `true` if method call handled by nigilist ([#6](https://github.com/aishek/nihilist/pull/6))
7
+
8
+ ### Fixes
9
+
10
+ - [**BREAKING**] Methods with plural name and underscore at the end (for example `monkeys_`) now return `nil` instead of `[]` ([#6](https://github.com/aishek/nihilist/pull/6))
data/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
  [![Code Climate](https://codeclimate.com/github/aishek/nihilist.svg)](https://codeclimate.com/github/aishek/nihilist)
6
6
 
7
7
 
8
- Nigilist is extremely useful for implement Null Object pattern. It allows null object to return `false` for all question-methods, `nil` for all non-bang-methods, `[]` for all methods in plural form without defining them.
8
+ Nigilist is extremely useful for implement Null Object pattern. It allows null object to return `false` for all question-methods, `nil` for all non-bang-methods, `[]` for all methods in plural form (and in Ruby on Rails null-relation for same name ActiveRecord model) without defining them.
9
9
 
10
10
  ## Installation
11
11
 
@@ -16,6 +16,9 @@ gem install nigilist
16
16
  ## Usage
17
17
 
18
18
  ```ruby
19
+ class Order < ActiveRecord::Base
20
+ end
21
+
19
22
  class Guest
20
23
  include Nigilist
21
24
 
@@ -24,16 +27,17 @@ class Guest
24
27
  end
25
28
 
26
29
  def locale
27
- 'ru'.freeze
30
+ 'ru'
28
31
  end
29
32
  end
30
33
 
31
34
  current_user = Guest.new
32
- current_user.admin? # false
33
- current_user.polite? # true
34
- current_user.address # nil
35
- current_user.locale # 'ru'
36
- current_user.planets # []
35
+ current_user.admin? # false — for all question methods
36
+ current_user.polite? # true — becase it is explicit defined
37
+ current_user.orders # Order.none — for all plural methods because same singular name ActiveRecord model exists
38
+ current_user.planets # [] — for all plural methods without because singular name ActiveRecord model doesn't exists
39
+ current_user.address # nil — for all non question, non plural and non bang methods
40
+ current_user.locale # 'ru' — becase it is explicit defined
37
41
  ```
38
42
 
39
43
  ### Explanation of Null Object pattern
@@ -51,15 +55,15 @@ current_user = current_session.user || Guest.new
51
55
  current_user.admin?
52
56
  ```
53
57
 
54
- So when your project grow and other methods got it place inside `User` model you have to define same methods in `Guest` model which contains no logic but only return `false` or `nil`.
58
+ So when your project grows and other methods got it place inside `User` model you have to define same methods in `Guest` model which contains no logic but only return `false` or `nil`. In that case Nigilist could be helpful.
55
59
 
56
60
  ## License
57
61
 
58
- Nigilist is free software, and may be redistributed under the terms specified in the LICENSE.txt file.
62
+ Nigilist is free software, and may be redistributed under the MIT License.
59
63
 
60
64
  ## Credits
61
65
 
62
- Gem nigilist is maintained by [Cifronomika](http://cifronomika.ru/).
66
+ Gem nigilist is maintained by [Cifronomika](https://cifronomika.com/).
63
67
 
64
68
  Contributors:
65
69
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 1.0.0
@@ -1,14 +1,31 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nigilist
2
4
  def method_missing(message, *args, &block)
3
5
  method_name = message.to_s
4
- if method_name.end_with?('?')
5
- false
6
- elsif method_name.split("_").last.end_with?('s')
7
- []
8
- elsif !method_name.end_with?('!')
9
- nil
10
- else
11
- super
6
+
7
+ return false if method_name.end_with?('?')
8
+
9
+ if method_name.end_with?('s') && method_name[-2..-1] != 'ss'
10
+ if defined?(Rails)
11
+ ar_relation_klass = method_name.singularize.camelize.safe_constantize
12
+ return ar_relation_klass.none if ar_relation_klass && ar_relation_klass.respond_to?(:none)
13
+ end
14
+
15
+ return []
12
16
  end
17
+
18
+ return nil unless method_name.end_with?('!')
19
+
20
+ super
21
+ end
22
+
23
+ def respond_to_missing?(message, include_private = false)
24
+ method_name = message.to_s
25
+
26
+ method_name.end_with?('?') ||
27
+ (method_name.end_with?('s') && method_name[-2..-1] != 'ss') ||
28
+ !method_name.end_with?('!') ||
29
+ super
13
30
  end
14
31
  end
@@ -2,17 +2,17 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: nigilist 0.1.0 ruby lib
5
+ # stub: nigilist 1.0.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "nigilist".freeze
9
- s.version = "0.1.0"
9
+ s.version = "1.0.0"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
12
  s.metadata = { "allowed_push_host" => "https://rubygems.org" } if s.respond_to? :metadata=
13
13
  s.require_paths = ["lib".freeze]
14
14
  s.authors = ["Alexandr Borisov".freeze]
15
- s.date = "2018-02-05"
15
+ s.date = "2019-07-10"
16
16
  s.description = "After include Nigilist module all ?-ends methods will return false, all non-!-ends methods will return nil.".freeze
17
17
  s.email = "ab@cifronomika.ru".freeze
18
18
  s.extra_rdoc_files = [
@@ -20,6 +20,7 @@ Gem::Specification.new do |s|
20
20
  ]
21
21
  s.files = [
22
22
  ".travis.yml",
23
+ "CHANGELOG.md",
23
24
  "Gemfile",
24
25
  "Gemfile.lock",
25
26
  "LISENCE.txt",
@@ -28,11 +29,12 @@ Gem::Specification.new do |s|
28
29
  "VERSION",
29
30
  "lib/nigilist.rb",
30
31
  "nigilist.gemspec",
32
+ "test/nihilist_on_rails_test.rb",
31
33
  "test/nihilist_test.rb"
32
34
  ]
33
35
  s.homepage = "https://github.com/aishek/nihilist".freeze
34
36
  s.licenses = ["MIT".freeze]
35
- s.rubygems_version = "2.7.3".freeze
37
+ s.rubygems_version = "3.0.3".freeze
36
38
  s.summary = "Nigilist simplifies NullObject pattern classes".freeze
37
39
 
38
40
  if s.respond_to? :specification_version then
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'minitest/autorun'
4
+ require 'minitest/pride'
5
+ require 'minitest/power_assert'
6
+
7
+ require 'nigilist'
8
+
9
+ class Guest
10
+ include Nigilist
11
+
12
+ def costs
13
+ {}
14
+ end
15
+ end
16
+
17
+ class NigilistRailsTest < Minitest::Test
18
+ def setup
19
+ Object.const_set('Rails', Module.new)
20
+
21
+ String.send(:define_method, :singularize) do self[0..-2] end
22
+ String.send(:define_method, :camelize) do capitalize end
23
+ String.send(:define_method, :safe_constantize) do
24
+ if self == 'Post'
25
+ return Class.new do
26
+ def self.none
27
+ :fake_active_record_null_relation
28
+ end
29
+ end
30
+ end
31
+ nil
32
+ end
33
+
34
+ @guest = Guest.new
35
+ end
36
+
37
+ def test_explicit_plural_method_without_active_record_model_return_its_value
38
+ assert { @guest.costs == {} }
39
+ end
40
+
41
+ def test_plural_method_without_active_record_model_return_empty_array
42
+ assert { @guest.planets == [] }
43
+ end
44
+
45
+ def test_plural_method_with_active_record_model_return_null_relation
46
+ assert { @guest.posts == :fake_active_record_null_relation }
47
+ end
48
+
49
+ def teardown
50
+ Object.send(:remove_const, 'Rails')
51
+
52
+ String.send(:remove_method, :singularize)
53
+ String.send(:remove_method, :camelize)
54
+ String.send(:remove_method, :safe_constantize)
55
+ end
56
+ end
@@ -7,12 +7,16 @@ require 'nigilist'
7
7
  class Guest
8
8
  include Nigilist
9
9
 
10
+ def hosts
11
+ :all
12
+ end
13
+
10
14
  def polite?
11
15
  true
12
16
  end
13
17
 
14
18
  def planet
15
- 'Earth'.freeze
19
+ 'Earth'
16
20
  end
17
21
  end
18
22
 
@@ -21,31 +25,55 @@ class NigilistTest < Minitest::Test
21
25
  @guest = Guest.new
22
26
  end
23
27
 
24
- def test_undefined_question_end_method_return_false
28
+ def test_question_end_method_return_false
25
29
  assert { @guest.admin? == false }
26
30
  end
27
31
 
28
- def test_defined_question_end_method_return_its_result
32
+ def test_explicit_defined_question_end_method_return_its_result
29
33
  assert { @guest.polite? == true }
30
34
  end
31
35
 
32
- def test_undefined_non_bang_end_method_return_nil
36
+ def test_non_bang_end_method_return_nil
33
37
  assert { @guest.name.nil? }
34
38
  end
35
39
 
36
- def test_defined_non_bang_end_method_return_its_result
40
+ def test_explicit_non_bang_end_method_return_its_result
37
41
  assert { @guest.planet == 'Earth' }
38
42
  end
39
43
 
40
- def test_undefined_plural_method_return_its_result
44
+ def test_plural_method_return_empty_array
41
45
  assert { @guest.planets == [] }
42
46
  end
43
47
 
44
- def test_undefined_plural_method_with_undersores_return_its_result
48
+ def test_plural_method_with_undersores_return_empty_array
45
49
  assert { @guest.planets_and_monkeys == [] }
46
50
  end
47
51
 
48
- def test_undefined_plural_method_with_undersore_at_the_end_return_its_result
49
- assert { @guest.monkeys_ == [] }
52
+ def test_explicit_plural_method_return_its_result
53
+ assert { @guest.hosts == :all }
54
+ end
55
+
56
+ def test_plural_method_with_undersore_at_the_end_return_nil
57
+ assert { @guest.monkeys_ == nil }
58
+ end
59
+
60
+ def test_method_with_doudle_s_ending_return_nil
61
+ assert { @guest.stress == nil }
62
+ end
63
+
64
+ def test_respond_to_plural_method
65
+ assert { @guest.respond_to?(:socks) }
66
+ end
67
+
68
+ def test_respond_to_question_method
69
+ assert { @guest.respond_to?(:intresting?) }
70
+ end
71
+
72
+ def test_respond_to_regular_method
73
+ assert { @guest.respond_to?(:mess) }
74
+ end
75
+
76
+ def test_does_not_respond_to_bang_method
77
+ assert { !@guest.respond_to?(:catch!) }
50
78
  end
51
79
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nigilist
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexandr Borisov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-02-05 00:00:00.000000000 Z
11
+ date: 2019-07-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -89,6 +89,7 @@ extra_rdoc_files:
89
89
  - README.md
90
90
  files:
91
91
  - ".travis.yml"
92
+ - CHANGELOG.md
92
93
  - Gemfile
93
94
  - Gemfile.lock
94
95
  - LISENCE.txt
@@ -97,6 +98,7 @@ files:
97
98
  - VERSION
98
99
  - lib/nigilist.rb
99
100
  - nigilist.gemspec
101
+ - test/nihilist_on_rails_test.rb
100
102
  - test/nihilist_test.rb
101
103
  homepage: https://github.com/aishek/nihilist
102
104
  licenses:
@@ -118,8 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
118
120
  - !ruby/object:Gem::Version
119
121
  version: '0'
120
122
  requirements: []
121
- rubyforge_project:
122
- rubygems_version: 2.7.3
123
+ rubygems_version: 3.0.3
123
124
  signing_key:
124
125
  specification_version: 4
125
126
  summary: Nigilist simplifies NullObject pattern classes