strong_concerns 0.0.1 → 0.0.2

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
  SHA1:
3
- metadata.gz: 75a98bd71d16b48974db53e3bc230af15cc81d33
4
- data.tar.gz: b1522672e6b6f715183a2aa73a277b154a53b5ff
3
+ metadata.gz: 26c6d7992012ae2a5204e3643a55de1bfbf98b43
4
+ data.tar.gz: b3344d68b073077ff1849f31cb34969bee7ca56d
5
5
  SHA512:
6
- metadata.gz: 79164fca65f96476f98464011eded01d4ef61d325b9d3e45a1cec575045352d6266075d8f6acb328c52505b74d2715316750ea4a36bbf61adbf7e42a78310833
7
- data.tar.gz: 1936e60103b2b2f62aadef95252547bfb7f91deda9a583fffb34191f3c720f01b77c30e43365bc2ef77d92784158897240fc7dbfd4469e94bcad8ff9732b7c02
6
+ metadata.gz: 0e406c4ff2eadf7c553fed7a263a6a16e0773a34acf2d55185d8afc1458f32287fc72c7e3f53cfc0ef035b0b5cbdf7e2ecf6600f949d325f7cae5187ce264c02
7
+ data.tar.gz: 6f172432785133c1e6cc7b3b4029aa04c58825dc73efd1e1b60951f506c58e54a1d2a3e3c11cee54a91a8d28c059eaad768d453faac544fcb621c99532de836a
data/README.md CHANGED
@@ -32,6 +32,12 @@ Or install it yourself as:
32
32
  ``` ruby
33
33
 
34
34
  module AgeAssertions
35
+
36
+ # list methods required for concern
37
+ def self.require_methods
38
+ %w[age]
39
+ end
40
+
35
41
  def young?
36
42
  age < options[:young]
37
43
  end
@@ -45,27 +51,46 @@ module AgeAssertions
45
51
  end
46
52
  end
47
53
 
54
+ module Searchable
55
+ def self.require_methods
56
+ %w[all]
57
+ end
58
+
59
+ def find_by_name(name)
60
+ all.select {|item| item.first_name =~ /#{name}/}
61
+ end
62
+ end
63
+
48
64
  class Person
49
65
 
50
66
  attr :age
67
+ attr :name
68
+
69
+ def self.all
70
+ [new('nicola', 33), new('ivan', 33)]
71
+ end
51
72
 
52
- def initialize(age)
53
- @age = age
73
+ def initialize( name, age)
74
+ @name, @age = name, age
54
75
  end
55
76
 
56
77
  extend StrongConcerns
57
78
 
58
79
  concern AgeAssertions,
59
- require_methods: %w[age],
60
80
  exports_methods: %w[young? reproductive?],
61
81
  old: 70,
62
82
  young: 14
83
+
84
+ class_concern Searchable,
85
+ exports_methods: %w[find_by_name]
63
86
  end
64
87
 
65
- nicola = Person.new('nicola', 'rhyzhikov', 33)
88
+ nicola = Person.new('nicola', 33)
66
89
  if nicola.reproductive?
67
90
  puts "Cool, make me a child!"
68
91
  end
92
+
93
+ Person.find_by_name('nicola') #=> Person(name: 'nicola')
69
94
  ```
70
95
 
71
96
  ## Contributing
@@ -1,3 +1,3 @@
1
1
  module StrongConcerns
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -2,7 +2,7 @@ require 'forwardable'
2
2
  require "strong_concerns/version"
3
3
 
4
4
  module StrongConcerns
5
- class Intermidiate
5
+ class Intermediate
6
6
  extend Forwardable
7
7
  attr_accessor :options
8
8
 
@@ -11,21 +11,40 @@ module StrongConcerns
11
11
  @options = options
12
12
  end
13
13
 
14
+ def method_missing(meth)
15
+ raise NameError.new("Looks like you not list method <#{meth}> in self.require_methods of concern or misspelled it")
16
+ end
17
+
14
18
  def inspect
15
- "Intermidiate<#{self.methods}>"
19
+ "Intermediate<#{self.methods}>"
16
20
  end
17
21
  end
18
22
 
19
- def concern(mod, options)
20
- intermidiate_class = Class.new(Intermidiate)
21
- intermidiate_class.send(:include, mod)
22
- meths = options.fetch(:require_methods)
23
- intermidiate_class.def_delegators :@__subject, *meths
23
+ def class_concern(mod, options)
24
+ intermediate_class = prepare_intermediate(mod)
25
+ options.fetch(:exports_methods).each do |meth|
26
+ self.define_singleton_method meth do |*args, &block|
27
+ ((@__strong_concerns ||= {})[mod.to_s] ||= intermediate_class.new(self, options)).send(meth,*args, &block)
28
+ end
29
+ end
30
+ end
24
31
 
32
+ def concern(mod, options)
33
+ intermediate_class = prepare_intermediate(mod)
25
34
  options.fetch(:exports_methods).each do |meth|
26
- define_method meth do |*args, &block|
27
- ((@__strong_concerns ||= {})[mod.to_s] ||= intermidiate_class.new(self, options)).send(meth,*args, &block)
35
+ self.send(:define_method, meth) do |*args, &block|
36
+ ((@__strong_concerns ||= {})[mod.to_s] ||= intermediate_class.new(self, options)).send(meth,*args, &block)
28
37
  end
29
38
  end
30
39
  end
40
+
41
+ private
42
+
43
+ def prepare_intermediate(mod)
44
+ Class.new(Intermediate).tap do |kls|
45
+ kls.send(:include, mod)
46
+ meths = mod.require_methods
47
+ kls.def_delegators :@__subject, *meths
48
+ end
49
+ end
31
50
  end
@@ -2,12 +2,20 @@ require 'spec_helper'
2
2
 
3
3
  describe StrongConcerns do
4
4
  module FullNamed
5
+ def self.require_methods
6
+ %w[first_name last_name]
7
+ end
8
+
5
9
  def full_name
6
10
  "#{first_name} #{last_name}"
7
11
  end
8
12
  end
9
13
 
10
14
  module AgeAssertions
15
+ def self.require_methods
16
+ %w[age]
17
+ end
18
+
11
19
  def young?
12
20
  age < options[:young]
13
21
  end
@@ -19,6 +27,21 @@ describe StrongConcerns do
19
27
  def old?
20
28
  age > options[:old]
21
29
  end
30
+
31
+ #should raise
32
+ def breaking
33
+ first_name
34
+ end
35
+ end
36
+
37
+ module Searchable
38
+ def self.require_methods
39
+ %w[all]
40
+ end
41
+
42
+ def find_by_name(name)
43
+ all.select {|item| item.first_name =~ /#{name}/}
44
+ end
22
45
  end
23
46
 
24
47
  class Person
@@ -33,16 +56,23 @@ describe StrongConcerns do
33
56
  @age = age
34
57
  end
35
58
 
59
+ def self.all
60
+ [
61
+ new('nicola','rhyzhikov', 33),
62
+ new('ivan','ivanov', 33)
63
+ ]
64
+ end
36
65
 
37
66
  extend StrongConcerns
38
67
 
68
+ class_concern Searchable,
69
+ exports_methods: %w[find_by_name]
70
+
39
71
  concern AgeAssertions,
40
- require_methods: %w[age],
41
- exports_methods: %w[young? reproductive?],
72
+ exports_methods: %w[young? reproductive? breaking],
42
73
  young: 14, old: 70
43
74
 
44
75
  concern FullNamed,
45
- require_methods: %w[first_name last_name],
46
76
  exports_methods: %w[full_name]
47
77
 
48
78
  end
@@ -52,6 +82,14 @@ describe StrongConcerns do
52
82
  nicola.full_name.should == "nicola rhyzhikov"
53
83
  nicola.should_not be_young
54
84
  nicola.should be_reproductive
85
+
86
+ -> {
87
+ nicola.breaking
88
+ }.should raise_error(/not list method/)
55
89
  end
56
90
  end
91
+
92
+ example do
93
+ Person.find_by_name('nicola').should_not be_empty
94
+ end
57
95
  end
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
10
10
  spec.email = ["niquola@gmail.com"]
11
11
  spec.description = %q{Gem **strong_concerns** is technically helping you to create concerns in a right way, minimizing and making explicit interface between object and concern.}
12
12
  spec.summary = %q{Gem **strong_concerns** is technically helping you to create concerns in a right way, minimizing and making explicit interface between object and concern.}
13
- spec.homepage = ""
13
+ spec.homepage = "https://github.com/niquola/strong_concerns"
14
14
  spec.license = "MIT"
15
15
 
16
16
  spec.files = `git ls-files`.split($/)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: strong_concerns
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - niquola
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-07-11 00:00:00.000000000 Z
11
+ date: 2013-07-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -56,7 +56,7 @@ files:
56
56
  - spec/spec_helper.rb
57
57
  - spec/strong_concerns_spec.rb
58
58
  - strong_concerns.gemspec
59
- homepage: ''
59
+ homepage: https://github.com/niquola/strong_concerns
60
60
  licenses:
61
61
  - MIT
62
62
  metadata: {}