concerning 1.0.2 → 1.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 454efdfc441f4945f845b6c1d73cbd5359c1d921
4
- data.tar.gz: 1fb3b505754eed97217ae9661d152bec8ab2a674
3
+ metadata.gz: 46300e9d1f6336b137f30a7ce604b609af70949b
4
+ data.tar.gz: 5af204914956c879ab923da970083186eed8ea5a
5
5
  SHA512:
6
- metadata.gz: e8d1462bf277d70644c760e45947e76813bcea4f76ad7828959d4bf55ff75787ffa90cc0dfb283618ae4a32c8ea3ad6427b2ac4cb3cfd5588d773dad76a74fae
7
- data.tar.gz: b0726d7cfdb19e3f0b1febc8dcbac4ffb3dc96a622fb31abd27a82ccc289402473a55b54b560309dbdffc675a38fb65ebc4e10d7231531c5fd5ecea3cfbcf506
6
+ metadata.gz: 8134f6abaf203e3d1d3e8397ceb14e2868307a07051f0f5dbffb6f72c7f32997537b5ff39361ef58b6aaf180a2039c3166d1967dd410149f5cabea568bfe28b9
7
+ data.tar.gz: 99bd868353c2e2d28e5f2b7c22ef2f4c03da6dafd5fbfb58b63325640a0ef61fcaf3005784b2a7eff4b1b27fb6f1ce9f83341320fea565f10c23afb1e8462dd3
data/lib/concerning.rb CHANGED
@@ -8,5 +8,5 @@
8
8
  begin
9
9
  require 'active_support/core_ext/module/concerning'
10
10
  rescue LoadError
11
- require 'concerning/module_extension'
11
+ require 'concerning/extension'
12
12
  end
@@ -1,3 +1,5 @@
1
+ require 'active_support/concern'
2
+
1
3
  class Module
2
4
  # We often find ourselves with a medium-sized chunk of behavior that we'd
3
5
  # like to extract, but only mix in to a single class.
@@ -113,35 +115,41 @@ class Module
113
115
  # * clean up junk drawer classes by encapsulating their concerns
114
116
  # * stop leaning on protected/private for "internal stuff" modularity
115
117
  module Concerning
116
- # Define a new concern and mix it in.
117
118
  def concerning(topic, &block)
118
119
  include concern(topic, &block)
119
120
  end
121
+ end
122
+ include Concerning # We do this mixin just for nice RDoc.
123
+ end
120
124
 
121
- # Add class methods via the concern.
122
- def class_methods(&block)
123
- const_set :ClassMethods, Module.new(&block)
124
- end
125
+ module Kernel
126
+ # A low-cruft shortcut to define a concern.
127
+ #
128
+ # concern :EventTracking do
129
+ # ...
130
+ # end
131
+ #
132
+ # module EventTracking
133
+ # extend ActiveSupport::Concern
134
+ #
135
+ # ...
136
+ # end
137
+ def concern(topic, &module_definition)
138
+ const_set topic, Module.new {
139
+ extend ActiveSupport::Concern
140
+ module_eval(&module_definition)
141
+ }
142
+ end
143
+ end
125
144
 
126
- # A low-cruft shortcut to define a concern.
127
- #
128
- # concern :EventTracking do
129
- # ...
130
- # end
131
- #
132
- # module EventTracking
133
- # extend ActiveSupport::Concern
134
- #
135
- # ...
136
- # end
137
- def concern(topic, &module_definition)
138
- require 'active_support/concern'
145
+ # Provide a class_methods alternative to ClassMethods since defining
146
+ # a constant within a block doesn't work as folks would expect.
147
+ ActiveSupport::Concern.module_eval do
148
+ def class_methods(&class_methods_module_definition)
149
+ mod = const_defined?(:ClassMethods) ?
150
+ const_get(:ClassMethods) :
151
+ const_set(:ClassMethods, Module.new)
139
152
 
140
- const_set topic, Module.new {
141
- extend ActiveSupport::Concern
142
- module_eval(&module_definition)
143
- }
144
- end
145
- end
146
- include Concerning
153
+ mod.module_eval(&class_methods_module_definition)
154
+ end unless method_defined? :class_methods
147
155
  end
@@ -0,0 +1 @@
1
+ CONCERNING_DEFERRED_TO_ACTIVE_SUPPORT = true
@@ -0,0 +1,100 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'minitest/autorun'
4
+ $VERBOSE = true
5
+
6
+ require 'concerning'
7
+
8
+ class ConcerningTest < Minitest::Test
9
+ def test_concerning_declares_a_concern_and_includes_it_immediately
10
+ klass = Class.new { concerning(:Foo) { } }
11
+ assert klass.ancestors.include?(klass::Foo), klass.ancestors.inspect
12
+ end
13
+ end
14
+
15
+ class ConcernTest < Minitest::Test
16
+ def test_concern_creates_a_module_extended_with_active_support_concern
17
+ klass = Class.new do
18
+ concern :Foo do
19
+ included { @foo = 1 }
20
+ def should_be_public; end
21
+ end
22
+ end
23
+
24
+ # Declares a concern but doesn't include it
25
+ assert_kind_of ActiveSupport::Concern, klass::Foo
26
+ assert !klass.ancestors.include?(klass::Foo), klass.ancestors.inspect
27
+
28
+ # Public method visibility by default
29
+ assert klass::Foo.public_instance_methods.map(&:to_s).include?('should_be_public')
30
+
31
+ # Calls included hook
32
+ assert_equal 1, Class.new { include klass::Foo }.instance_variable_get('@foo')
33
+ end
34
+
35
+ def test_may_be_defined_at_toplevel
36
+ mod = Kernel.concern(:Foo) { }
37
+ assert_equal mod, ::Foo
38
+ assert_kind_of ActiveSupport::Concern, ::Foo
39
+ assert !Object.ancestors.include?(::Foo), mod.ancestors.inspect
40
+ end
41
+
42
+ class Foo
43
+ concerning :Bar do
44
+ module ClassMethods
45
+ def will_be_orphaned; end
46
+ end
47
+
48
+ const_set :ClassMethods, Module.new {
49
+ def hacked_on; end
50
+ }
51
+
52
+ # Doesn't overwrite existing ClassMethods module.
53
+ class_methods do
54
+ def nicer_dsl; end
55
+ end
56
+
57
+ # Doesn't overwrite previous class_methods definitions.
58
+ class_methods do
59
+ def doesnt_clobber; end
60
+ end
61
+ end
62
+ end
63
+
64
+ def test_using_class_methods_blocks_instead_of_ClassMethods_module
65
+ assert !Foo.respond_to?(:will_be_orphaned)
66
+ assert Foo.respond_to?(:hacked_on)
67
+ assert Foo.respond_to?(:nicer_dsl)
68
+ assert Foo.respond_to?(:doesnt_clobber)
69
+
70
+ # Orphan in Foo::ClassMethods, not Bar::ClassMethods.
71
+ assert Foo.const_defined?(:ClassMethods)
72
+ assert Foo::ClassMethods.method_defined?(:will_be_orphaned)
73
+ end
74
+ end
75
+
76
+ # Put a fake Active Support implementation in the load path to verify that
77
+ # we defer to it when we can.
78
+ class ForwardCompatibilityWithRails41Test < Minitest::Test
79
+ def setup; expunge_loaded_features end
80
+ def teardown; expunge_loaded_features end
81
+
82
+ def test_check_for_active_support_implementation_before_providing_our_own
83
+ with_stubbed_active_support_in_load_path do
84
+ require 'concerning'
85
+ end
86
+ assert defined?(::CONCERNING_DEFERRED_TO_ACTIVE_SUPPORT)
87
+ end
88
+
89
+ private
90
+ def expunge_loaded_features
91
+ $LOADED_FEATURES.delete_if { |feature| feature =~ /concerning/ }
92
+ end
93
+
94
+ def with_stubbed_active_support_in_load_path
95
+ $LOAD_PATH.unshift File.expand_path('../active_support_stub', __FILE__)
96
+ yield
97
+ ensure
98
+ $LOAD_PATH.shift
99
+ end
100
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: concerning
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Kemper
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-19 00:00:00.000000000 Z
11
+ date: 2014-02-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -28,24 +28,26 @@ dependencies:
28
28
  name: minitest
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ~>
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: '5.1'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ~>
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: '5.1'
41
41
  description:
42
42
  email: jeremy@basecamp.com
43
43
  executables: []
44
44
  extensions: []
45
45
  extra_rdoc_files: []
46
46
  files:
47
- - ./lib/concerning/module_extension.rb
47
+ - ./lib/concerning/extension.rb
48
48
  - ./lib/concerning.rb
49
+ - ./test/active_support_stub/active_support/core_ext/module/concerning.rb
50
+ - ./test/concerning_test.rb
49
51
  homepage: https://github.com/basecamp/concerning
50
52
  licenses:
51
53
  - MIT
@@ -70,4 +72,6 @@ rubygems_version: 2.1.11
70
72
  signing_key:
71
73
  specification_version: 4
72
74
  summary: Separating small concerns
73
- test_files: []
75
+ test_files:
76
+ - ./test/active_support_stub/active_support/core_ext/module/concerning.rb
77
+ - ./test/concerning_test.rb