concerning 1.0.2 → 1.0.3

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: 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