tsundere 0.1.5 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.5
1
+ 0.2.0
data/lib/tsundere.rb CHANGED
@@ -9,4 +9,13 @@ module Tsundere
9
9
  def self.included(base)
10
10
  base.extend ClassMethods
11
11
  end # self.included
12
- end # Tsundere
12
+ end # Tsundere
13
+
14
+ if defined? Rails and defined? ActiveSupport
15
+ ActiveSupport.on_load(:action_controller) do
16
+ include Tsundere
17
+ end #
18
+ ActiveSupport.on_load(:active_record) do
19
+ include Tsundere
20
+ end #
21
+ end # if
@@ -2,11 +2,14 @@
2
2
 
3
3
  module Tsundere
4
4
  module ClassMethods
5
- attr_reader :look_array, :look_table, :rank_table
5
+ attr_reader :look_array, :look_table, :fail_table
6
6
  attr_accessor :permission_table, :rank_table
7
7
 
8
8
  def attr_tsundere *attributes, opts
9
9
  attr_looker *attributes, opts
10
+ if defined? Rails and self.respond_to? :helper_method
11
+ helper_method :tsundere_for
12
+ end # if
10
13
  end # attr_tsundere
11
14
 
12
15
  def attr_looker *attributes, opts
@@ -23,6 +26,7 @@ module Tsundere
23
26
  def attr_modifier_thing *attributes, opts
24
27
  @rank_table ||= {}
25
28
  @permission_table ||= {}
29
+ @fail_table ||= {}
26
30
  [:looker, :toucher].each do |thing|
27
31
  @permission_table[thing] ||= {
28
32
  :array => [] ,
@@ -31,18 +35,22 @@ module Tsundere
31
35
  end # each thing
32
36
  type = opts[:type]
33
37
  perm = opts[:as]
38
+ fail = opts[:fail]
34
39
  case perm.class.to_s
35
40
  when 'Hash'
36
41
  perm.each do |key, lvl|
37
42
  @rank_table[key] = lvl
38
-
43
+ @fail_table[key] ||= fail
44
+ @fail_table[lvl] ||= fail
39
45
  ind = permission_table[type][:array].binary_search_raw([lvl, attributes]) { |a1, a2| a1.first <=> a2.first }
40
- permission_table[type][:array].insert(ind, [lvl, attributes]).sort! { |a1, a2| a1.first <=> a2.first }
46
+ permission_table[type][:array].insert(ind, [lvl, attributes]) # .sort! { |a1, a2| a1.first <=> a2.first }
41
47
  end # each perm
42
48
  when 'Fixnum', 'Integer', 'Float'
49
+ @fail_table[perm] ||= fail
43
50
  ind = permission_table[type][:array].binary_search_raw([perm, attributes]) { |a1, a2| a1.first <=> a2.first }
44
- permission_table[type][:array].insert(ind, [perm, attributes]).sort! { |a1, a2| a1.first <=> a2.first }
51
+ permission_table[type][:array].insert(ind, [perm, attributes]) # .sort! { |a1, a2| a1.first <=> a2.first }
45
52
  when 'String', 'Symbol'
53
+ @fail_table[perm] ||= fail
46
54
  attributes.each do |attr|
47
55
  (permission_table[type][:table][perm] ||= []) << attr
48
56
  end # each attr
@@ -8,24 +8,52 @@ module Tsundere
8
8
  end # initialize
9
9
 
10
10
  def method_missing meth, *args, &block
11
+ conditions = []
12
+ conditions << lambda do
13
+ :[] == meth and @parent.dere_for? @level, process_args( *args )
14
+ end
15
+ conditions << lambda do
16
+ :[]= == meth and @parent.dere_for? @level, process_args( *args[0..-2] )
17
+ end
18
+ conditions << lambda do
19
+ @parent.dere_for? @level, meth
20
+ end
11
21
  if @parent.respond_to? meth
12
- if @parent.dere_for? @level, meth
13
- @parent.send(meth, *args, &block) unless block.nil?
14
- @parent.send(meth, *args) if block.nil?
22
+ if conditions.inject(false) { |mem, c| mem or c.call }
23
+ case meth
24
+ when :[]
25
+ @parent[*args, &block] unless block.nil?
26
+ @parent[*args] if block.nil?
27
+ when :[]=
28
+ tail = args.pop
29
+
30
+ @parent[*args] = tail
31
+ else
32
+ @parent.send(meth, *args, &block) unless block.nil?
33
+ @parent.send(meth, *args) if block.nil?
34
+ end # meth
15
35
  else
16
- return "Sorry #{@level}, you can't #{meth} me!"
17
- end # if-else
36
+ return @parent.tsun_for @level
37
+ end # if conditions inject
18
38
  else
19
39
  super
20
- end
40
+ end # if has method
21
41
  end # method_missing
22
42
 
23
43
  def respond_to? meth
24
44
  if @parent.dere_for? @level, meth
25
45
  @parent.respond_to? meth
46
+ elsif :[] == meth or :[]= == meth
47
+ @parent.respond_to? meth
26
48
  else
27
49
  false
28
50
  end # if-dere
29
- end # meth
51
+ end # respond_to
52
+
53
+ private
54
+
55
+ def process_args *args
56
+ args.inject("") { |mem, arg| mem += arg.to_s }.to_sym
57
+ end # process_args
30
58
  end # imouto
31
59
  end # Tsundere
@@ -1,5 +1,6 @@
1
1
  # tsundere instance module
2
2
  module Tsundere
3
+
3
4
  def tsundere_for(duck)
4
5
  level = p_retrieve_level_or_rank duck
5
6
  Imouto.new self, level
@@ -22,7 +23,13 @@ module Tsundere
22
23
  end # if-else
23
24
  end # dere_for?
24
25
 
26
+ def tsun_for lvl
27
+ fail_msg = self.class.fail_table[lvl]
28
+ fail_msg ||= "Sorry #{lvl}, access is denied!"
29
+ end # tsun for
30
+
25
31
  private
32
+
26
33
  def p_retrieve_level_or_rank duck
27
34
  case duck.class.to_s
28
35
  when String.to_s, Fixnum.to_s, Float.to_s, Integer.to_s, Symbol.to_s
data/spec/imouto_spec.rb CHANGED
@@ -2,8 +2,8 @@ require 'spec_helper'
2
2
 
3
3
  class SchoolGirl
4
4
  include Tsundere
5
- attr_tsundere :show_up, :as => { :user => 1 }
6
- attr_tsundere :brush_teeth, :as => { :oniichan => 2 }
5
+ attr_tsundere :show_up, :fail => "you are a faggot", :as => { :user => 1 }
6
+ attr_tsundere :brush_teeth, :fanservice, :as => { :oniichan => 2 }
7
7
 
8
8
  def show_up
9
9
  1
@@ -12,6 +12,15 @@ class SchoolGirl
12
12
  def brush_teeth
13
13
  2
14
14
  end # brush
15
+
16
+ def []( k)
17
+ @internal[k]
18
+ end # getter
19
+
20
+ def []=( k, j)
21
+ @internal ||= {}
22
+ @internal[k] = j
23
+ end # setter
15
24
  end # StereotypicalLoli
16
25
 
17
26
  describe SchoolGirl do
@@ -31,4 +40,27 @@ describe SchoolGirl do
31
40
  @tsukihi.tsundere_for(:oniichan).should respond_to :brush_teeth
32
41
  @tsukihi.tsundere_for(:oniichan).should respond_to :show_up
33
42
  end # it
43
+ [:user, :oniichan].each do |character|
44
+ [:[], :[]=].each do |fun|
45
+ it "should have the getter" do
46
+ @tsukihi.should respond_to fun
47
+ end # it
48
+ it "should have the getter" do
49
+ @tsukihi.tsundere_for(character).should respond_to fun
50
+ end # it
51
+ end # each fun
52
+ end # each character
53
+ describe "[]" do
54
+ before :each do
55
+ @tsukihi.tsundere_for(:oniichan)[:fanservice] = true
56
+ end # each
57
+ it "should only fanservice oniichan" do
58
+ @tsukihi[:fanservice].should eq true
59
+ @tsukihi.tsundere_for(:oniichan)[:fanservice].should eq true
60
+ end # it
61
+ it "should not work for regular user" do
62
+ @tsukihi.tsundere_for(:user)[:fanservice].should =~ /faggot/i
63
+ end # it
64
+ end # []
65
+
34
66
  end # SchoolGirl
data/tsundere.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "tsundere"
8
- s.version = "0.1.5"
8
+ s.version = "0.2.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Thomas Chen", "Trevor Umeda"]
12
- s.date = "2012-12-12"
12
+ s.date = "2012-12-13"
13
13
  s.description = "Any given object can implement the tsundere interface. Once implemented, a tsundere object will behave differently based upon who is calling it."
14
14
  s.email = ["foxnewsnetwork@gmail.com", "FroggyP@gmail.com"]
15
15
  s.extra_rdoc_files = [
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tsundere
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-12-12 00:00:00.000000000 Z
13
+ date: 2012-12-13 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: debugger
@@ -165,7 +165,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
165
165
  version: '0'
166
166
  segments:
167
167
  - 0
168
- hash: -1684389261992049503
168
+ hash: 358892739405293387
169
169
  required_rubygems_version: !ruby/object:Gem::Requirement
170
170
  none: false
171
171
  requirements: