ctx 2.1.3 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/README.md +18 -2
  2. data/lib/ctx.rb +41 -34
  3. metadata +21 -4
data/README.md CHANGED
@@ -1,7 +1,13 @@
1
1
  ctx
2
2
  ===
3
3
 
4
- Simple utility to limit method redefinition within the bounds of arbitrary logical scopes
4
+ Tired of waiting for refinements in ruby 2.0?
5
+
6
+ Or something like it?
7
+
8
+ Me, too.
9
+
10
+ So, this.
5
11
 
6
12
  Example
7
13
  ===
@@ -67,5 +73,15 @@ There are bugs. You'll find them.
67
73
  Caveats and such
68
74
  ===
69
75
 
70
- For whatever goofy reason, this stuff doesn't play well with rspec all the time, particularly if you override stuff the matchers are hoping to also override, like == or =~ on String, or whatnot. Don't do that right now unless you like stuff to break in inexplicable ways. Personally, I do like that kind of stuff, makes life interesting (kind of explains my dating choices, when you get right down to it), but anywhoo, honestly, it's your call.
76
+ For whatever reason, this stuff doesn't play well with rspec all the time,
77
+ particularly if you override stuff the matchers are hoping to also override,
78
+ like == or =~ on String, who knew?
79
+
80
+ *So, don't do that.*
81
+
82
+ ...not unless you like stuff to break in inexplicable ways.
83
+
84
+ Personally, I *do* like things breaking in inexplicable ways (why else would I write things like this?)
85
+ since makes life interesting (also kind of explains my dating choices, when you get right down to it),
86
+ but, honestly, it's your call.
71
87
 
data/lib/ctx.rb CHANGED
@@ -1,12 +1,6 @@
1
- module CTX
1
+ require 'mobj'
2
2
 
3
- class ::Array
4
- def return_first(&block)
5
- returned = nil
6
- each { |item| break if (returned = block.call(item)) }
7
- returned
8
- end
9
- end
3
+ module CTX
10
4
 
11
5
  class Context < Hash
12
6
  attr_reader :name
@@ -17,14 +11,13 @@ module CTX
17
11
  end
18
12
 
19
13
  class ::Object
20
- def sym() respond_to?(:to_sym) ? to_sym : to_s.to_sym end
21
14
  def ctxputs(*args)
22
- ctxs = @@contexts.map(&:name)[1..-1].join(":")
15
+ ctxs = @@contexts.map(&:name)[1..-1].reverse.join(":")
23
16
  ctxs = "[CTX #{ctxs}] " unless ctxs.empty?
24
17
  puts "#{ctxs}#{args.map(&:to_s).join(', ')}"
25
18
  end
26
19
  def ctxp(*args)
27
- ctxs = @@contexts.map(&:name)[1..-1].join(":")
20
+ ctxs = @@contexts.map(&:name)[1..-1].reverse.join(":")
28
21
  ctxs = "[CTX #{ctxs.empty? ? "-" : ctxs}]"
29
22
  puts "#{ctxs}\n#{args.map(&:inspect).join("\n")}"
30
23
  end
@@ -32,53 +25,67 @@ module CTX
32
25
  @@contexts ||= [Context.new(nil)]
33
26
  def ctx(context = :anonymous, &contextual)
34
27
  if contextual.nil?
35
- @@contexts.reverse.first
28
+ @@contexts.first
36
29
  else
37
- @@contexts.push(Context.new(context))
30
+ @@contexts.unshift(Context.new(context))
38
31
  instance_eval(&contextual)
39
- @@contexts.pop()
32
+ @@contexts.shift()
40
33
  end
41
34
  end
42
35
 
43
36
  end
44
37
 
45
- class ::Class
38
+ class Template < BasicObject
46
39
 
47
- def object_methods() self.instance_methods - Object.instance_methods end
48
- def class_methods() self.singleton_methods - Object.singleton_methods end
49
- def defined_methods() class_methods | object_methods end
40
+ attr_accessor :added
41
+ def initialize() @added ||= [] end
42
+ def singleton_method_added(name) added << name end
43
+
44
+ end
45
+
46
+ class ::Class
50
47
 
51
48
  attr_accessor :ctx_methods
52
49
 
53
50
  def ctx(context = :anonymous, &contextual)
54
51
  @ctx_methods ||= {}
55
52
 
56
- template = Class.new
57
- template.class_eval(&contextual)
53
+ template = Template.new
54
+ template.instance_exec(self, &contextual)
55
+
56
+ matching = template.added
58
57
 
59
- matching = self.object_methods & template.object_methods
60
58
  matching.each do |method_name|
61
59
  if ctx_methods[method_name].nil?
62
60
  ctx_methods[method_name] = {}
63
- ctx_methods[method_name][nil.sym] = instance_method(method_name)
61
+ if instance_methods(true).includes? method_name
62
+ ctx_methods[method_name][nil.sym] = instance_method(method_name)
63
+ elsif singleton_methods(true).include? method_name
64
+ ctx_methods[method_name][nil.sym] = singleton_class.instance_method(method_name)
65
+ end
64
66
  end
65
67
  end
66
68
 
67
69
  self.class_eval(&contextual)
68
70
 
69
- template.object_methods.each do |method_name|
70
- if ctx_methods[method_name].nil?
71
- ctx_methods[method_name] = {}
72
- end
73
-
74
- ctx_methods[method_name][context] = instance_method(method_name)
75
-
76
- define_method(method_name) do |*args|
77
- methods = self.class.ctx_methods[method_name]
78
- matched = @@contexts.reverse.return_first { |currentctx| methods[currentctx.name] }
79
- matched.bind(self).(*args)
71
+ matching.each do |method_name|
72
+ if instance_methods(true).includes? method_name
73
+ ctx_methods[method_name][context] = instance_method(method_name)
74
+ define_method(method_name) do |*args|
75
+ methods = self.class.ctx_methods[method_name]
76
+ matched = @@contexts.return_first { |currentctx| methods[currentctx.name] }
77
+ matched.bind(self).(*args)
78
+ end
79
+
80
+ elsif singleton_methods(true).include? method_name
81
+ ctx_methods[method_name][context] = singleton_class.instance_method(method_name)
82
+
83
+ define_singleton_method(method_name) do |*args|
84
+ methods = self.ctx_methods[method_name]
85
+ matched = @@contexts.return_first { |currentctx| methods[currentctx.name] }
86
+ matched.bind(self).(*args)
87
+ end
80
88
  end
81
-
82
89
  end
83
90
  end
84
91
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ctx
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.3
4
+ version: 2.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,8 +9,24 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-10 00:00:00.000000000 Z
12
+ date: 2012-11-11 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: mobj
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
14
30
  - !ruby/object:Gem::Dependency
15
31
  name: rspec
16
32
  requirement: !ruby/object:Gem::Requirement
@@ -59,7 +75,8 @@ dependencies:
59
75
  - - ! '>='
60
76
  - !ruby/object:Gem::Version
61
77
  version: '0'
62
- description: Contextual method define
78
+ description: Scoped and contextual method definition for use in writing more expressive
79
+ DSLs without screwing defintions in other pieces of code
63
80
  email: ctx@chipped.net
64
81
  executables: []
65
82
  extensions: []
@@ -90,5 +107,5 @@ rubyforge_project:
90
107
  rubygems_version: 1.8.24
91
108
  signing_key:
92
109
  specification_version: 3
93
- summary: Scoped define and context for use in writing more expressive DSLs
110
+ summary: Contextual method define
94
111
  test_files: []