imprecations 0.0.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.
@@ -0,0 +1,6 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ *.sw[op]
6
+ .rake_tasks
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in imprecations.gemspec
4
+ gemspec
@@ -0,0 +1,28 @@
1
+ # Imprecations: Because that's what you'll be hurling at the screen
2
+
3
+ Imprecations recursively deprecates every instance method on a class/module as
4
+ well as all classes defined inside that class/module.
5
+
6
+ ## Installation
7
+
8
+ gem install imprecations
9
+
10
+ ## Usage
11
+
12
+ MyClass.imprecate
13
+ MyClass.my_method
14
+ #=> DEPRECATION WARNING: MyClass#my_method is deprecated!
15
+ #=> ...my_method does its thing...
16
+
17
+ ## Safety
18
+ Worried about deprecating too many things? Just do this:
19
+
20
+ require 'imprecations/safe'
21
+
22
+ And you're good to go!
23
+
24
+
25
+ ## Is it tested?
26
+ Of course!
27
+
28
+ Author/who to blame: Gabe Berke-Williams, 2011
@@ -0,0 +1,8 @@
1
+ require 'bundler/gem_tasks'
2
+
3
+ require 'rspec/core/rake_task'
4
+
5
+ RSpec::Core::RakeTask.new(:spec)
6
+
7
+ desc "Run specs"
8
+ task :default => :spec
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "imprecations/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "imprecations"
7
+ s.version = Imprecations::VERSION
8
+ s.authors = ["Gabe Berke-Williams"]
9
+ s.email = ["gabe@thoughtbot.com"]
10
+ s.homepage = "https://github.com/gabebw/imprecations/"
11
+ s.summary = %q{Deprecate ALL THE THINGS!}
12
+ s.description = [%q{Imprecations recursively deprecates every instance method},
13
+ %q{on a class/module as well as all classes defined inside that class/module.}].join(' ')
14
+
15
+ s.files = `git ls-files`.split("\n")
16
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
+ s.require_paths = ["lib"]
19
+
20
+ s.add_development_dependency('rspec', '~> 2.6.0')
21
+ end
@@ -0,0 +1,55 @@
1
+ require "imprecations/version"
2
+
3
+ module Imprecations
4
+ def imprecate
5
+ if [Object, Module, Kernel].include?(self)
6
+ raise "Imprecate *#{self}*?! Sorry, even I'm not that evil."
7
+ end
8
+
9
+ __imprecate(self)
10
+ self.imprecate_child_constants
11
+ end
12
+
13
+ def imprecate_child_constants
14
+ real_constants = self.constants.map{|c| self.const_get(c) }
15
+ class_constants = real_constants.select{|c| Class === c }
16
+ class_constants.each do |class_const|
17
+ class_const.imprecate
18
+ end
19
+ end
20
+
21
+ def __imprecate(constant)
22
+ unimprecated_instance_methods_for(constant).each do |meth|
23
+ namespaced_constant =
24
+ if self.superclass == Object
25
+ "#{constant}"
26
+ else
27
+ "#{self.superclass}::#{constant}"
28
+ end
29
+
30
+ constant.class_eval <<-EVIL
31
+ # Store a reference
32
+ alias :"__unimprecated_#{meth}" :"#{meth}"
33
+
34
+ # Undefine it so we can redefine it
35
+ undef_method(:"#{meth}")
36
+
37
+ def #{meth}
38
+ Imprecations.say("DEPRECATION WARNING: #{namespaced_constant}##{meth} is deprecated!")
39
+ __unimprecated_#{meth}()
40
+ end
41
+ EVIL
42
+ end
43
+ end
44
+
45
+ def unimprecated_instance_methods_for(constant)
46
+ methods = constant.instance_methods(false)
47
+ methods.reject{|meth| meth.to_s =~ /^__unimprecated/ }
48
+ end
49
+
50
+ def say(message)
51
+ puts message
52
+ end
53
+ end
54
+
55
+ include Imprecations
@@ -0,0 +1,4 @@
1
+ # Mwa ha ha ha
2
+ require 'imprecations'
3
+
4
+ Module.imprecate_child_constants
@@ -0,0 +1,3 @@
1
+ module Imprecations
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,70 @@
1
+ require 'spec_helper'
2
+
3
+ describe Imprecations, "#imprecate" do
4
+ before do
5
+ Object.send(:remove_const, :MyModule) if defined?(MyModule)
6
+ Object.send(:remove_const, :MyClass) if defined?(MyClass)
7
+
8
+ module MyModule; end
9
+
10
+ class MyClass
11
+ class MySubClass
12
+ def sub_one
13
+ end
14
+
15
+ class MyTripleSubClass
16
+ def triple_sub
17
+ end
18
+ end
19
+ end
20
+
21
+ def one; end
22
+ def two; end
23
+
24
+ def three
25
+ called_by_three
26
+ end
27
+
28
+ def called_by_three
29
+ end
30
+ end
31
+ end
32
+
33
+ it "is available on any Object" do
34
+ MyClass.should respond_to :imprecate
35
+ MyClass::MySubClass.should respond_to :imprecate
36
+ MyModule.should respond_to :imprecate
37
+ end
38
+
39
+ it "adds deprecation warnings for every instance method" do
40
+ Imprecations.should_receive(:say).with("DEPRECATION WARNING: MyClass#one is deprecated!")
41
+ Imprecations.should_receive(:say).with("DEPRECATION WARNING: MyClass#two is deprecated!")
42
+
43
+ MyClass.imprecate
44
+ instance = MyClass.new
45
+ instance.one
46
+ instance.two
47
+ end
48
+
49
+ it "recursively adds deprecation warnings for every instance method" do
50
+ Imprecations.should_receive(:say).with("DEPRECATION WARNING: MyClass::MySubClass::MyTripleSubClass#triple_sub is deprecated!")
51
+
52
+ MyClass.imprecate
53
+ MyClass::MySubClass::MyTripleSubClass.new.triple_sub
54
+ end
55
+
56
+ it "calls the original method" do
57
+ MyClass.any_instance.should_receive(:called_by_three)
58
+
59
+ MyClass.imprecate
60
+ MyClass.new.three
61
+ end
62
+
63
+ [Object, Module, Kernel].each do |important_class|
64
+ it "refuses to imprecate #{important_class}" do
65
+ lambda do
66
+ important_class.imprecate
67
+ end.should raise_error
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,4 @@
1
+ require 'imprecations'
2
+ require 'rspec/mocks'
3
+
4
+ include RSpec::Mocks::Methods
metadata ADDED
@@ -0,0 +1,69 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: imprecations
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Gabe Berke-Williams
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-09-08 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: &2153095880 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 2.6.0
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *2153095880
25
+ description: Imprecations recursively deprecates every instance method on a class/module
26
+ as well as all classes defined inside that class/module.
27
+ email:
28
+ - gabe@thoughtbot.com
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - .gitignore
34
+ - Gemfile
35
+ - README.md
36
+ - Rakefile
37
+ - imprecations.gemspec
38
+ - lib/imprecations.rb
39
+ - lib/imprecations/safe.rb
40
+ - lib/imprecations/version.rb
41
+ - spec/imprecations_spec.rb
42
+ - spec/spec_helper.rb
43
+ homepage: https://github.com/gabebw/imprecations/
44
+ licenses: []
45
+ post_install_message:
46
+ rdoc_options: []
47
+ require_paths:
48
+ - lib
49
+ required_ruby_version: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ required_rubygems_version: !ruby/object:Gem::Requirement
56
+ none: false
57
+ requirements:
58
+ - - ! '>='
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ requirements: []
62
+ rubyforge_project:
63
+ rubygems_version: 1.8.9
64
+ signing_key:
65
+ specification_version: 3
66
+ summary: Deprecate ALL THE THINGS!
67
+ test_files:
68
+ - spec/imprecations_spec.rb
69
+ - spec/spec_helper.rb