keyremac 0.0.1 → 0.0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 56a85964a7ed2a53cffef78bb058925b6af0cd59
4
- data.tar.gz: cb87ed2b0ef6002a218c859f04f502c671260bb9
3
+ metadata.gz: e396e7b7adb1000fc741d5c0e9523d4f85c2770c
4
+ data.tar.gz: 8a6a3dbc853f7e6e6610dd5aa83845f0b24d25a8
5
5
  SHA512:
6
- metadata.gz: e8ff12e76d5080364666e61023c6269e0f91198aafce3f602fe50766201f2e48a1989440e45d1b622f5c0aa1587f7dad17f7a0c77970555dc775757a6da2f560
7
- data.tar.gz: f952a9b53d7d7a49e79e213e694b8ba5c20bfdba34e04cadc3fa662d7a5bab44daa6c11ea552fe4f2aa595b9557a7a61117d34433e184edb4c586e4877606cab
6
+ metadata.gz: 34b2966dc0dc2d735ff6dbeb17870c24464503493872d02a09278b15ada32812fa8703df1c2239f3d0d6c3f678ce330e1add475fb64bdce5a5aaedd57e892255
7
+ data.tar.gz: c08e1f5d867974e8f11cdea777aad2b7051884da4b3b999c1258f1f7d5029f6bf717b8a0c2eb2f6769add8f4f3718852f0e5530424f9cd44642b11a5f52da700
data/README.ja.md ADDED
@@ -0,0 +1,100 @@
1
+ # Keyremac
2
+
3
+ [![Build Status](https://travis-ci.org/keqh/keyremac.png?branch=master)](https://travis-ci.org/keqh/keyremac)
4
+
5
+ *Keyremac*はRubyでKeyRemap4MacBookの設定を行うgemです。
6
+ - 大量のcheckboxを扱うのが苦手な方や
7
+ - XMLを手で編集するのが好きではない方向けに
8
+ KeyRemap4MacBookの設定を行うDSLを提供します。
9
+
10
+ ## dependency
11
+
12
+ - KeyRemap4MacBook v7.0.0+
13
+ - https://pqrs.org/macosx/keyremap4macbook/
14
+ - ruby v2.0.0+
15
+
16
+ ## Installation
17
+
18
+ $ gem install keyremac --source http://github.com/keqh/keyremac/raw/master
19
+
20
+ ## Getting Started
21
+
22
+ ```bash
23
+ $ cat > private.rb
24
+ require 'keyremac'
25
+ :SPACE .to :TAB
26
+
27
+ $ ruby private.rb --dump
28
+ <?xml version="1.0" encoding="UTF-8"?>
29
+ <root>
30
+ <item>
31
+ <name>root_item</name>
32
+ <identifier>private.root_item</identifier>
33
+ <autogen>__KeyToKey__ KeyCode::SPACE, KeyCode::TAB</autogen>
34
+ <autogen>__KeyToKey__ KeyCode::TAB, KeyCode::SPACE</autogen>
35
+ <autogen>__KeyToKey__ KeyCode::COMMAND_R, KeyCode::ESCAPE</autogen>
36
+ </item>
37
+ </root>
38
+
39
+ $ ruby private.rb --reload
40
+ ```
41
+
42
+ ## Examples
43
+
44
+ ### simple KeyToKey
45
+
46
+ ```rb
47
+ :SPACE .to :TAB
48
+ ```
49
+
50
+ ### mods (cmd, ctrl, opt, shift, none)
51
+
52
+ ```rb
53
+ :m.cmd .to :VK_NONE
54
+ :j.ctrl .to :JIS_KANA
55
+ ```
56
+
57
+ ### key to keys
58
+
59
+ ```rb
60
+ :n.ctrl.cmd .to :JIS_EISUU, '['.cmd.shift
61
+ :p.ctrl.cmd .to :JIS_EISUU, ']'.cmd.shift
62
+ ```
63
+
64
+ ### app_only
65
+
66
+ ```rb
67
+ app "CHROME" do
68
+ :m.cmd.none .to :VK_NONE
69
+ end
70
+
71
+ # or
72
+
73
+ item app: "CHORME" do
74
+ ...
75
+ end
76
+ ```
77
+
78
+ ### inputsource_only
79
+
80
+ ```
81
+ item inputsource: "JAPANESE" do
82
+ :l .to :JIS_EISUU
83
+ end
84
+ ```
85
+
86
+ ### raw
87
+
88
+ ```
89
+ item_ do
90
+ name_ 'jis_to_us'
91
+ identifier_ 'private.jis_to_us'
92
+ autogen_ "__SetKeyboardType__ KeyboardType::MACBOOK"
93
+ :JIS_YEN .to :BACKQUOTE
94
+ :JIS_UNDERSCORE .to :BACKQUOTE
95
+ end
96
+ ```
97
+
98
+ - more examples: https://github.com/keqh/keyremac/tree/master/samples
99
+ - and specs: https://github.com/keqh/keyremac/tree/master/spec
100
+
data/README.md CHANGED
@@ -1,29 +1,97 @@
1
1
  # Keyremac
2
2
 
3
- TODO: Write a gem description
3
+ [![Build Status](https://travis-ci.org/keqh/keyremac.png?branch=master)](https://travis-ci.org/keqh/keyremac)
4
+
5
+ Keyremac is KeyRemap4MacBook settings generator.
6
+
7
+ ## dependency
8
+
9
+ - KeyRemap4MacBook v7.0.0+
10
+ - https://pqrs.org/macosx/keyremap4macbook/
11
+ - ruby v2.0.0+
4
12
 
5
13
  ## Installation
6
14
 
7
- Add this line to your application's Gemfile:
15
+ $ gem install keyremac
8
16
 
9
- gem 'keyremac'
17
+ ## Getting Started
10
18
 
11
- And then execute:
19
+ ```bash
20
+ $ cat > private.rb
21
+ require 'keyremac'
22
+ :SPACE .to :TAB
12
23
 
13
- $ bundle
24
+ $ ruby private.rb --dump
25
+ <?xml version="1.0" encoding="UTF-8"?>
26
+ <root>
27
+ <item>
28
+ <name>root_item</name>
29
+ <identifier>private.root_item</identifier>
30
+ <autogen>__KeyToKey__ KeyCode::SPACE, KeyCode::TAB</autogen>
31
+ <autogen>__KeyToKey__ KeyCode::TAB, KeyCode::SPACE</autogen>
32
+ <autogen>__KeyToKey__ KeyCode::COMMAND_R, KeyCode::ESCAPE</autogen>
33
+ </item>
34
+ </root>
14
35
 
15
- Or install it yourself as:
36
+ $ ruby private.rb --reload
37
+ ```
16
38
 
17
- $ gem install keyremac
39
+ ## Examples
40
+
41
+ ### simple KeyToKey
42
+
43
+ ```rb
44
+ :SPACE .to :TAB
45
+ ```
46
+
47
+ ### mods (cmd, ctrl, opt, shift, none)
48
+
49
+ ```rb
50
+ :m.cmd .to :VK_NONE
51
+ :j.ctrl .to :JIS_KANA
52
+ ```
53
+
54
+ ### key to keys
55
+
56
+ ```rb
57
+ :n.ctrl.cmd .to :JIS_EISUU, '['.cmd.shift
58
+ :p.ctrl.cmd .to :JIS_EISUU, ']'.cmd.shift
59
+ ```
60
+
61
+ ### app_only
62
+
63
+ ```rb
64
+ app "CHROME" do
65
+ :m.cmd.none .to :VK_NONE
66
+ end
67
+
68
+ # or
69
+
70
+ item app: "CHORME" do
71
+ ...
72
+ end
73
+ ```
74
+
75
+ ### inputsource_only
76
+
77
+ ```
78
+ item inputsource: "JAPANESE" do
79
+ :l .to :JIS_EISUU
80
+ end
81
+ ```
18
82
 
19
- ## Usage
83
+ ### raw
20
84
 
21
- TODO: Write usage instructions here
85
+ ```
86
+ item_ do
87
+ name_ 'jis_to_us'
88
+ identifier_ 'private.jis_to_us'
89
+ autogen_ "__SetKeyboardType__ KeyboardType::MACBOOK"
90
+ :JIS_YEN .to :BACKQUOTE
91
+ :JIS_UNDERSCORE .to :BACKQUOTE
92
+ end
93
+ ```
22
94
 
23
- ## Contributing
95
+ - more examples: https://github.com/keqh/keyremac/tree/master/samples
96
+ - and specs: https://github.com/keqh/keyremac/tree/master/spec
24
97
 
25
- 1. Fork it
26
- 2. Create your feature branch (`git checkout -b my-new-feature`)
27
- 3. Commit your changes (`git commit -am 'Add some feature'`)
28
- 4. Push to the branch (`git push origin my-new-feature`)
29
- 5. Create new Pull Request
data/keyremac.gemspec CHANGED
@@ -20,7 +20,6 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_development_dependency "bundler", "~> 1.3"
22
22
  spec.add_development_dependency "rake"
23
- spec.add_development_dependency "awesome_print"
24
23
 
25
24
  spec.add_dependency "builder"
26
25
  end
data/lib/keyremac.rb CHANGED
@@ -37,6 +37,7 @@ module Keyremac
37
37
  op.on('--dump', 'dump private.xml') { Keyremac::dump }
38
38
  op.on('--reload', 'reload private.xml') { Keyremac::reload }
39
39
  op.on('--ids', 'collect identifiers') { puts Keyremac::collect_identifiers }
40
+ op.on('--test', 'test') { `touch ~/test.txt` }
40
41
  }.parse!(ARGV.dup)
41
42
  end
42
43
  end
data/lib/keyremac/base.rb CHANGED
@@ -1,47 +1,45 @@
1
- require 'awesome_print'
2
1
  require 'builder'
3
2
 
4
3
  require 'keyremac/key'
5
4
 
6
5
  module Keyremac
7
- # focus
8
- # ====================================
6
+ module Focus
7
+ @@focus = []
9
8
 
10
- @@focus = []
9
+ def self.add(rule)
10
+ @@focus.last.add rule
11
+ end
11
12
 
12
- def self.focus
13
- @@focus
14
- end
13
+ def self.focus
14
+ @@focus
15
+ end
15
16
 
16
- def self.get_focus
17
- @@focus.last
18
- end
19
- def self.set_focus(container, &block)
20
- @@focus.push container
21
- yield
22
- @@focus.pop
17
+ def self.set_focus(container, &block)
18
+ @@focus.push container
19
+ yield
20
+ @@focus.pop
21
+ end
23
22
  end
24
23
 
25
- # autogen
26
- # ====================================
27
-
28
- class KeyToKey < Struct.new(:from, :to); end
29
- class KeyToConsumer < Struct.new(:from, :to); end
30
- class KeyOverlaidModifier # < Struct.new(:key, :mod, :keys)
31
- attr_reader :key, :mod, :keys, :repeat
32
- def initialize(key, mod, keys: [], repeat: false)
33
- @key = key
34
- @mod = mod
35
- @keys = keys == [] ? [key] : keys
36
- @repeat = repeat
37
- end
24
+ module Autogen
25
+ class KeyToKey < Struct.new(:from, :to); end
26
+ class KeyToConsumer < Struct.new(:from, :to); end
27
+ class KeyOverlaidModifier
28
+ attr_reader :key, :mod, :keys, :repeat
29
+ def initialize(key, mod, keys: [], repeat: false)
30
+ @key = key
31
+ @mod = mod
32
+ @keys = keys == [] ? [key] : keys
33
+ @repeat = repeat
34
+ end
38
35
 
39
- def repeat?
40
- @repeat
36
+ def repeat?
37
+ @repeat
38
+ end
41
39
  end
42
40
  end
43
41
 
44
- # container
42
+ # @group container
45
43
  # ====================================
46
44
 
47
45
  module Container
@@ -56,7 +54,7 @@ module Keyremac
56
54
  if method_name[-1] == '_'
57
55
  raw = Raw.new method_name.chomp('_')
58
56
  if block
59
- Keyremac.set_focus raw do
57
+ Keyremac::Focus.set_focus raw do
60
58
  raw.instance_eval(&block)
61
59
  end
62
60
  else
@@ -103,22 +101,29 @@ module Keyremac
103
101
 
104
102
  def initialize
105
103
  @root_item = Item.new 'root_item'
106
- Keyremac.focus.clear
107
- Keyremac.focus << @root_item
104
+ Keyremac::Focus.focus.clear
105
+ Keyremac::Focus.focus << @root_item
108
106
  @children = []
109
107
  end
110
108
 
109
+ # @param [String] app only tag
110
+ # @param [String] inputsource inputsource_only tag
111
+ # yield [] children
112
+ # @return [Item]
111
113
  def item(app: nil, inputsource: nil, &block)
112
114
  Item.new.tap { |item|
113
115
  item.only_ app if app
114
116
  item.inputsource_only_ inputsource if inputsource
115
117
  @children << item
116
- Keyremac.set_focus item do
118
+ Keyremac::Focus.set_focus item do
117
119
  item.instance_eval(&block)
118
120
  end
119
121
  }
120
122
  end
121
123
 
124
+ # @param [String] only
125
+ # @option options same as item method
126
+ # @return [Item]
122
127
  def app(only, **options, &block)
123
128
  options[:app] = only
124
129
  item(**options, &block)
@@ -135,8 +140,8 @@ module Keyremac
135
140
  @@root
136
141
  end
137
142
 
138
- def method_missing(method_name, *args, &block)
139
- @@root.send(method_name, *args, &block)
143
+ def method_missing(*args, &block)
144
+ @@root.send(*args, &block)
140
145
  end
141
146
  end
142
147
  end
@@ -0,0 +1,49 @@
1
+ module Keyremac
2
+ CONSUMER_KEYS = [
3
+ 'BRIGHTNESS_DOWN',
4
+ 'BRIGHTNESS_UP',
5
+ 'KEYBOARDLIGHT_OFF',
6
+ 'KEYBOARDLIGHT_LOW',
7
+ 'KEYBOARDLIGHT_HIGH',
8
+ 'MUSIC_PREV',
9
+ 'MUSIC_PLAY',
10
+ 'MUSIC_NEXT',
11
+ 'MUSIC_PREV_18',
12
+ 'MUSIC_NEXT_17',
13
+ 'VOLUME_MUTE',
14
+ 'VOLUME_DOWN',
15
+ 'VOLUME_UP',
16
+ 'EJECT',
17
+ 'POWER',
18
+ 'NUMLOCK',
19
+ 'VIDEO_MIRROR',
20
+ ]
21
+
22
+ SYMBOL_TABLE = {
23
+ '`' => 'BACKQUOTE',
24
+ '\\' => 'BACKSLASH',
25
+ '[' => 'BRACKET_LEFT',
26
+ ']' => 'BRACKET_RIGHT',
27
+ ',' => 'COMMA',
28
+ '.' => 'DOT',
29
+ '=' => 'EQUAL',
30
+ '-' => 'MINUS',
31
+ '\'' => 'QUOTE',
32
+ ';' => 'SEMICOLON',
33
+ '0' => 'KEY_0',
34
+ '1' => 'KEY_1',
35
+ '2' => 'KEY_2',
36
+ '3' => 'KEY_3',
37
+ '4' => 'KEY_4',
38
+ '5' => 'KEY_5',
39
+ '6' => 'KEY_6',
40
+ '7' => 'KEY_7',
41
+ '8' => 'KEY_8',
42
+ '9' => 'KEY_9',
43
+ }
44
+
45
+ SHIFT_TABLE = Hash[
46
+ %q[!@#$%^&*()_+~QWERTYUIOP{}ASDFGHJKL:"|ZXCVBNM<>?~].each_char.to_a.zip(
47
+ %q(1234567890-=`qwertyuiop[]asdfghjkl;'\zxcvbnm,./`).each_char.to_a
48
+ )]
49
+ end
data/lib/keyremac/dump.rb CHANGED
@@ -1,5 +1,7 @@
1
- module Keyremac
2
1
 
2
+ require 'keyremac/base'
3
+
4
+ module Keyremac
3
5
  # key
4
6
  # ===========================
5
7
 
@@ -32,24 +34,26 @@ module Keyremac
32
34
  # autogen
33
35
  # ===========================
34
36
 
35
- class KeyToKey
36
- def dump(xml)
37
- seqs = [from, *to].map{ |k| k.dump(xml) }.join(', ')
38
- xml.autogen "__KeyToKey__ #{seqs}"
37
+ module Autogen
38
+ class KeyToKey
39
+ def dump(xml)
40
+ seqs = [from, *to].map{ |k| k.dump(xml) }.join(', ')
41
+ xml.autogen "__KeyToKey__ #{seqs}"
42
+ end
39
43
  end
40
- end
41
44
 
42
- class KeyToConsumer
43
- def dump(xml)
44
- xml.autogen "__KeyToConsumer__ #{from.dump(xml)}, #{to.dump(xml)}"
45
+ class KeyToConsumer
46
+ def dump(xml)
47
+ xml.autogen "__KeyToConsumer__ #{from.dump(xml)}, #{to.dump(xml)}"
48
+ end
45
49
  end
46
- end
47
50
 
48
- class KeyOverlaidModifier
49
- def dump(xml)
50
- seqs = [key, mod, *keys].map { |k| k.dump(xml) }.join(', ')
51
- autogen = repeat ? '__KeyOverlaidModifierWithRepeat__' : '__KeyOverlaidModifier__'
52
- xml.autogen "#{autogen} #{seqs}"
51
+ class KeyOverlaidModifier
52
+ def dump(xml)
53
+ seqs = [key, mod, *keys].map { |k| k.dump(xml) }.join(', ')
54
+ autogen = repeat ? '__KeyOverlaidModifierWithRepeat__' : '__KeyOverlaidModifier__'
55
+ xml.autogen "#{autogen} #{seqs}"
56
+ end
53
57
  end
54
58
  end
55
59
 
data/lib/keyremac/key.rb CHANGED
@@ -1,58 +1,10 @@
1
1
 
2
2
  require 'keyremac/base'
3
+ require 'keyremac/constants'
3
4
 
4
5
  require 'set'
5
6
 
6
7
  module Keyremac
7
-
8
- CONSUMER_KEYS = [
9
- 'BRIGHTNESS_DOWN',
10
- 'BRIGHTNESS_UP',
11
- 'KEYBOARDLIGHT_OFF',
12
- 'KEYBOARDLIGHT_LOW',
13
- 'KEYBOARDLIGHT_HIGH',
14
- 'MUSIC_PREV',
15
- 'MUSIC_PLAY',
16
- 'MUSIC_NEXT',
17
- 'MUSIC_PREV_18',
18
- 'MUSIC_NEXT_17',
19
- 'VOLUME_MUTE',
20
- 'VOLUME_DOWN',
21
- 'VOLUME_UP',
22
- 'EJECT',
23
- 'POWER',
24
- 'NUMLOCK',
25
- 'VIDEO_MIRROR',
26
- ]
27
-
28
- SYMBOL_TABLE = {
29
- '`' => 'BACKQUOTE',
30
- '\\' => 'BACKSLASH',
31
- '[' => 'BRACKET_LEFT',
32
- ']' => 'BRACKET_RIGHT',
33
- ',' => 'COMMA',
34
- '.' => 'DOT',
35
- '=' => 'EQUAL',
36
- '-' => 'MINUS',
37
- '\'' => 'QUOTE',
38
- ';' => 'SEMICOLON',
39
- '0' => 'KEY_0',
40
- '1' => 'KEY_1',
41
- '2' => 'KEY_2',
42
- '3' => 'KEY_3',
43
- '4' => 'KEY_4',
44
- '5' => 'KEY_5',
45
- '6' => 'KEY_6',
46
- '7' => 'KEY_7',
47
- '8' => 'KEY_8',
48
- '9' => 'KEY_9',
49
- }
50
-
51
- SHIFT_TABLE = Hash[
52
- %q[!@#$%^&*()_+~QWERTYUIOP{}ASDFGHJKL:"|ZXCVBNM<>?~].each_char.to_a.zip(
53
- %q(1234567890-=`qwertyuiop[]asdfghjkl;'\zxcvbnm,./`).each_char.to_a
54
- )]
55
-
56
8
  module Keyable
57
9
  {
58
10
  ctrl: :VK_CONTROL,
@@ -66,21 +18,28 @@ module Keyremac
66
18
  define_method("#{k}?", -> { self.to_key.mods.include? v })
67
19
  }
68
20
 
21
+ def add_rule(autogen)
22
+ Keyremac::Focus.add autogen
23
+ autogen
24
+ end
25
+
26
+ # @param [Array<Keyable>] keys
27
+ # @return [KeyToKey]
28
+ # @return [KeyToConsumer]
69
29
  def to(*keys)
70
30
  key = keys.first.to_key
71
- autogen = if key.consumer_key?
72
- Keyremac::KeyToConsumer.new self.to_key, key
31
+ if key.consumer_key?
32
+ add_rule Autogen::KeyToConsumer.new(self.to_key, key)
73
33
  else
74
- Keyremac::KeyToKey.new self.to_key, keys.map(&:to_key)
34
+ add_rule Autogen::KeyToKey.new(self.to_key, keys.map(&:to_key))
75
35
  end
76
- Keyremac.get_focus.add autogen
77
- autogen
78
36
  end
79
37
 
38
+ # @param [Keyable] mod
39
+ # @options [Keyable] mod
40
+ # @return [KeyToOverlaidModifier]
80
41
  def overlaid(mod, keys: [], repeat: false)
81
- autogen = Keyremac::KeyOverlaidModifier.new self.to_key, mod.to_key, keys: keys.map(&:to_key), repeat: repeat
82
- Keyremac.get_focus.add autogen
83
- autogen
42
+ add_rule Autogen::KeyOverlaidModifier.new(self.to_key, mod.to_key, keys: keys.map(&:to_key), repeat: repeat)
84
43
  end
85
44
 
86
45
  def consumer_key?
@@ -1,3 +1,3 @@
1
1
  module Keyremac
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2.1"
3
3
  end
data/samples/sample.rb CHANGED
@@ -1,4 +1,4 @@
1
-
1
+ #!/usr/bin/env ruby -I ../lib -I lib
2
2
  require 'keyremac'
3
3
 
4
4
  item_ do
@@ -65,3 +65,13 @@ end
65
65
  app 'SUBLIME', inputsource: 'JAPANESE' do
66
66
  :TAB .to :i.ctrl
67
67
  end
68
+
69
+ # item do
70
+ # autogen_ "__KeyToKey__ KeyCode::Q, KeyCode::VK_OPEN_URL_SCRIPT_test"
71
+ # end
72
+
73
+ # vkopenurldef_ do
74
+ # name_ "KeyCode::VK_OPEN_URL_SCRIPT_test"
75
+ # url_ "file:///Users/keqh/Dropbox/personal/projects/KEYnoe/keyremac/samples/sample.rb --test"
76
+ # end
77
+
data/spec/dump_spec.rb CHANGED
@@ -1,6 +1,5 @@
1
1
 
2
2
  require 'minitest/autorun'
3
- require 'keyremac/base'
4
3
  require 'keyremac/dump'
5
4
 
6
5
  module MiniTest::Assertions
@@ -9,17 +8,42 @@ module MiniTest::Assertions
9
8
  actual = rule.dump(xml)
10
9
  assert actual == expected, message { diff expected, actual }
11
10
  end
11
+
12
+ def assert_item(expected, rule)
13
+ expected = <<-EOI
14
+ <item>
15
+ <name>a</name>
16
+ <identifier>private.a</identifier>
17
+ #{expected}
18
+ </item>
19
+ EOI
20
+ xml = Builder::XmlMarkup.new(indent: 2)
21
+ actual = rule.dump(xml)
22
+ assert actual == expected, message { diff expected, actual }
23
+ end
24
+
25
+ def assert_autogen(expected, rule)
26
+ xml = Builder::XmlMarkup.new(indent: 2)
27
+ actual = rule.dump(xml)
28
+ assert_match("autogen", actual)
29
+ assert_match(expected, actual)
30
+ end
31
+
32
+ def assert_tag(expected, rule)
33
+ xml = Builder::XmlMarkup.new(indent: 2)
34
+ actual = rule.dump(xml)
35
+ assert_match(expected, actual)
36
+ end
12
37
  end
13
38
  Object.infect_an_assertion :assert_xml, :must_be_xml
39
+ Object.infect_an_assertion :assert_item, :must_be_item
40
+ Object.infect_an_assertion :assert_autogen, :must_be_autogen
41
+ Object.infect_an_assertion :assert_tag, :must_contain_tag
14
42
 
15
- describe 'dump' do
16
- before do
17
- @root = Keyremac::Root.new
18
- @xml = Builder::XmlMarkup.new(indent: 2)
19
- Keyremac::Item.reset_identifier
20
- end
43
+ describe 'root' do
44
+ let(:root) { Keyremac::Root.new }
21
45
 
22
- it 'rootが出力される' do
46
+ it 'generates root tag' do
23
47
  expected = <<-EOR
24
48
  <?xml version="1.0" encoding="UTF-8"?>
25
49
  <root>
@@ -29,68 +53,30 @@ describe 'dump' do
29
53
  </item>
30
54
  </root>
31
55
  EOR
32
- @root.must_be_xml expected
33
- end
34
-
35
- it '任意のtagを書くことができる' do
36
- expected = "<hoge>\n</hoge>\n"
37
- @root.hoge_ {}.must_be_xml expected
56
+ root.must_be_xml expected
38
57
  end
58
+ end
39
59
 
40
- describe 'item' do
41
- ITEM = <<-EOI
42
- <item>
43
- <name>a</name>
44
- <identifier>private.a</identifier>
45
- %s
46
- </item>
47
- EOI
48
-
49
- it 'blank' do
50
- expected = <<-EOI
51
- <item>
52
- <name>a</name>
53
- <identifier>private.a</identifier>
54
- </item>
55
- EOI
56
- @root.item {}.must_be_xml expected
57
- end
58
-
59
- it 'raw' do
60
- expected = ITEM % "<autogen>__KeyToKey__ KeyCode::J, KeyCode::K</autogen>"
61
- @root.item {
62
- autogen_ '__KeyToKey__ KeyCode::J, KeyCode::K'
63
- }.must_be_xml expected
64
- end
65
-
66
- it 'app' do
67
- expected = ITEM % "<only>TERMINAL</only>"
68
- @root.item(app: 'TERMINAL') {}.must_be_xml expected
69
- end
60
+ describe 'raw' do
61
+ let(:root) { Keyremac::Root.new }
70
62
 
71
- it 'inputsource' do
72
- expected = ITEM % "<inputsource_only>JAPANESE</inputsource_only>"
73
- @root.item(inputsource: 'JAPANESE') {}.must_be_xml expected
74
- end
63
+ it 'can write any tags' do
64
+ root.hoge_ {}.must_contain_tag "hoge"
65
+ root.fuga_("").must_contain_tag "fuga"
75
66
  end
67
+ end
76
68
 
77
- describe 'app' do
78
- it 'raw' do
79
- expected = ITEM % "<only>TERMINAL</only>"
80
- @root.app('TERMINAL') {}.must_be_xml expected
81
- end
69
+ describe Keyremac::Key do
70
+ describe '#to' do
71
+ it { (:j .to :k).must_be_autogen "KeyToKey" }
72
+ it { (:j .to :k, :l).must_be_autogen "KeyToKey" }
73
+ it { (:F7.to:MUSIC_PREV).must_be_autogen "KeyToConsumer" }
82
74
  end
75
+ end
83
76
 
84
- describe 'to' do
85
- it 'basic' do
86
- expected = "<autogen>__KeyToKey__ KeyCode::J, KeyCode::K</autogen>\n"
87
- (:j .to :k).must_be_xml expected
88
- end
89
-
90
- it '複数' do
91
- expected = "<autogen>__KeyToKey__ KeyCode::J, KeyCode::K, KeyCode::L</autogen>\n"
92
- (:j .to :k, :l).must_be_xml expected
93
- end
77
+ describe 'root' do
78
+ before do
79
+ @root = Keyremac::Root.new
94
80
  end
95
81
 
96
82
  ROOT2 = <<-EOR
@@ -104,57 +90,68 @@ describe 'dump' do
104
90
  </root>
105
91
  EOR
106
92
 
107
- describe 'root直下' do
108
- it 'root直下にautogenを書くとroot_itemに追加される' do
109
- :j .to :k
110
- expected = ROOT2 % "<autogen>__KeyToKey__ KeyCode::J, KeyCode::K</autogen>"
111
- @root.dump.must_equal expected
112
- end
93
+ it 'can write toplevel key definition' do
94
+ :j .to :k
95
+ expected = ROOT2 % "<autogen>__KeyToKey__ KeyCode::J, KeyCode::K</autogen>"
96
+ @root.must_be_xml expected
113
97
  end
98
+ end
114
99
 
115
- describe 'mods' do
116
- it 'ctrl' do
117
- expected = "KeyCode::J, VK_CONTROL"
118
- :j.ctrl.must_be_xml expected
100
+ describe 'dump' do
101
+ before do
102
+ @root = Keyremac::Root.new
103
+ Keyremac::Item.reset_identifier
104
+ end
105
+
106
+ describe 'item' do
107
+ it 'generates item tag' do
108
+ contents = '__KeyToKey__ KeyCode::J, KeyCode::K'
109
+ @root.item { autogen_ contents }.must_be_item "<autogen>#{contents}</autogen>"
110
+ end
111
+
112
+ it 'generates item tag with only tag' do
113
+ @root.item(app: 'TERMINAL') {}.must_be_item "<only>TERMINAL</only>"
119
114
  end
120
115
 
121
- it 'none' do
122
- expected = "KeyCode::J, ModifierFlag::NONE"
123
- :j.none.must_be_xml expected
116
+ it 'generates item tag with inputsource_only tag' do
117
+ @root.item(inputsource: 'JAPANESE') {}.must_be_item "<inputsource_only>JAPANESE</inputsource_only>"
124
118
  end
125
119
 
126
- it '複数' do
127
- expected = "KeyCode::J, VK_CONTROL | VK_COMMAND"
128
- :j.ctrl.cmd.must_be_xml expected
120
+ it 'generates item tag with only tag' do
121
+ @root.app('TERMINAL') {}.must_be_item "<only>TERMINAL</only>"
129
122
  end
130
123
  end
131
124
 
132
- describe 'consumer' do
133
- it 'consumer_key' do
134
- expected = "ConsumerKeyCode::MUSIC_PREV"
135
- :MUSIC_PREV.to_key.must_be_xml expected
125
+ describe 'mods' do
126
+ it 'trails mod key' do
127
+ :j.ctrl.must_be_xml "KeyCode::J, VK_CONTROL"
128
+ end
129
+
130
+ it 'trails none flag' do
131
+ :j.none.must_be_xml "KeyCode::J, ModifierFlag::NONE"
136
132
  end
137
- it 'key_to_consumer' do
138
- expected = "<autogen>__KeyToConsumer__ KeyCode::F7, ConsumerKeyCode::MUSIC_PREV</autogen>\n"
139
- (:F7.to:MUSIC_PREV).must_be_xml expected
133
+
134
+ it 'trails mod keys' do
135
+ :j.ctrl.cmd.must_be_xml "KeyCode::J, VK_CONTROL | VK_COMMAND"
140
136
  end
141
137
  end
142
138
 
143
139
  describe 'key_overlaid_modifier' do
144
- it 'basic' do
145
- expected = "<autogen>__KeyOverlaidModifier__ KeyCode::JIS_EISUU, KeyCode::COMMAND_L, KeyCode::JIS_EISUU</autogen>\n"
146
- (:JIS_EISUU.overlaid:COMMAND_L).must_be_xml expected
140
+ it 'generates KeyOverlaidModifier' do
141
+ expected = "__KeyOverlaidModifier__ KeyCode::JIS_EISUU, KeyCode::COMMAND_L, KeyCode::JIS_EISUU"
142
+ (:JIS_EISUU.overlaid:COMMAND_L).must_be_autogen expected
147
143
  end
148
- it 'keys' do
149
- expected = "<autogen>__KeyOverlaidModifier__ KeyCode::CONTROL_L, KeyCode::CONTROL_L, KeyCode::JIS_EISUU, KeyCode::ESCAPE</autogen>\n"
144
+
145
+ it 'generates KeyOverlaidModifier with keys' do
146
+ expected = "__KeyOverlaidModifier__ KeyCode::CONTROL_L, KeyCode::CONTROL_L, KeyCode::JIS_EISUU, KeyCode::ESCAPE"
150
147
  autogen = :CONTROL_L .overlaid :CONTROL_L, keys: [:JIS_EISUU, :ESCAPE]
151
- autogen.must_be_xml expected
148
+ autogen.must_be_autogen expected
152
149
  end
153
150
 
154
- it 'repeat' do
155
- expected = "<autogen>__KeyOverlaidModifierWithRepeat__ KeyCode::SPACE, KeyCode::SHIFT_L, KeyCode::SPACE</autogen>\n"
151
+ it 'generates KeyOverlaidModifierWithRepeat' do
152
+ expected = "__KeyOverlaidModifierWithRepeat__ KeyCode::SPACE, KeyCode::SHIFT_L, KeyCode::SPACE"
156
153
  autogen = :SPACE .overlaid :SHIFT_L, repeat: true
157
- autogen.must_be_xml expected
154
+ autogen.must_be_autogen expected
158
155
  end
159
156
  end
160
157
  end
@@ -2,138 +2,136 @@
2
2
  require 'minitest/autorun'
3
3
  require 'keyremac/base'
4
4
 
5
- describe 'root' do
6
- before do
7
- @root = Keyremac::Root.new
5
+ module MiniTest::Assertions
6
+ def assert_add_child(rule)
7
+ expected = 1
8
+ actual = rule.children.length
9
+ assert expected == actual, message { diff expected, actual }
8
10
  end
11
+ end
12
+ Object.infect_an_assertion :assert_add_child, :must_add_child, :unary
9
13
 
10
- it '末尾に_で任意のtagを書くことができる' do
11
- @root.item_ 'hoge'
12
- @root.children.length.must_equal 1
13
- end
14
+ module Keyremac
15
+ describe Root do
16
+ let(:root) { Root.new }
14
17
 
15
- it '任意のtagはblockで入れ子にできる' do
16
- @root.item_ {
17
- name_ 'hoge'
18
- }
19
- @root.children.length.must_equal 1
20
- end
21
-
22
- describe 'item' do
23
- it '' do
24
- @root.item {}
25
- @root.children.length.must_equal 1
18
+ it 'includes any tags' do
19
+ root.item_('hoge')
20
+ root.must_add_child
26
21
  end
27
22
 
28
- it 'raw' do
29
- @root.item {
30
- autogen_ '__KeyToKey__ KeyCode::J, KeyCode::K'
31
- }
32
- @root.children.length.must_equal 1
23
+ it 'includes any tags' do
24
+ root.item_ { name_ 'hoge' }
25
+ root.must_add_child
33
26
  end
34
27
 
35
- it 'app' do
36
- @root.item(app: 'TERMINAL') { }
37
- @root.children.length.must_equal 1
28
+ it 'includes item' do
29
+ root.item {}
30
+ root.must_add_child
38
31
  end
39
32
 
40
- it 'inputsource' do
41
- @root.item(inputsource: 'JAPANESE') { }
42
- @root.children.length.must_equal 1
33
+ it 'includes app' do
34
+ root.app('dummy') { }
35
+ root.must_add_child
43
36
  end
44
37
  end
45
38
 
46
- describe 'app' do
47
- it 'raw' do
48
- container = @root.app('dummy') { }
49
- container.class.must_equal Keyremac::Item
50
- container.children.length.must_equal 1
51
- end
52
- end
39
+ describe 'container' do
40
+ let(:root) { Root.new }
53
41
 
54
- describe 'to' do
55
- it 'basic' do
56
- item = @root.item {
57
- :j .to :k
58
- }
59
- item.children.length.must_equal 1
60
- end
42
+ describe 'item' do
43
+ it 'can use item container' do
44
+ root.item { autogen_ '__KeyToKey__ KeyCode::J, KeyCode::K' }
45
+ root.must_add_child
46
+ end
61
47
 
62
- it 'root直下' do
63
- :j .to :k
64
- @root.root_item.children.length.must_equal 1
65
- end
48
+ it 'can use item container with app_only' do
49
+ root.item(app: 'TERMINAL') { }
50
+ root.must_add_child
51
+ end
66
52
 
67
- it '複数のkeyを渡せる' do
68
- :a .to :b, :c
69
- @root.root_item.children.length.must_equal 1
53
+ it 'can use item container with inputsource_only' do
54
+ root.item(inputsource: 'JAPANESE') { }
55
+ root.must_add_child
56
+ end
70
57
  end
71
- end
72
58
 
73
- describe 'overlaid' do
74
- it 'basic' do
75
- item = @root.item {
76
- :JIS_EISUU .overlaid :COMMAND_L
77
- }
78
- item.children.length.must_equal 1
59
+ describe 'app' do
60
+ it 'is the same as item container with app_only' do
61
+ container = root.app('dummy') { }
62
+ container.must_be_instance_of Item
63
+ end
79
64
  end
65
+ end
80
66
 
81
- it 'basic' do
82
- (:JIS_EISUU .overlaid :COMMAND_L).class.must_equal Keyremac::KeyOverlaidModifier
83
- end
67
+ describe 'autogen' do
68
+ let(:root) { Root.new }
84
69
 
85
- it 'keys' do
86
- autogen = :CONTROL_L .overlaid :CONTROL_L, keys: [:JIS_EISUU, :ESCAPE]
87
- autogen.class.must_equal Keyremac::KeyOverlaidModifier
70
+ describe 'to' do
71
+ it { root.item { :j .to :k }.must_add_child }
72
+ it { (:j .to :k).must_be_instance_of Autogen::KeyToKey }
73
+ it { (:a .to :b, :c).must_be_instance_of Autogen::KeyToKey }
88
74
  end
89
75
 
90
- it 'repeat: false' do
91
- autogen = :CONTROL_L .overlaid :CONTROL_L
92
- autogen.repeat?.must_equal false
93
- end
76
+ describe 'overlaid' do
77
+ it 'generates KeyOverlaidModifier' do
78
+ (:JIS_EISUU .overlaid :COMMAND_L).must_be_instance_of Autogen::KeyOverlaidModifier
79
+ end
94
80
 
95
- it 'repeat: true' do
96
- autogen = :CONTROL_L .overlaid :CONTROL_L, repeat: true
97
- autogen.repeat?.must_equal true
98
- end
99
- end
81
+ it 'generates KeyOverlaidModifier with keys' do
82
+ autogen = :CONTROL_L .overlaid :CONTROL_L, keys: [:JIS_EISUU, :ESCAPE]
83
+ autogen.class.must_equal Autogen::KeyOverlaidModifier
84
+ end
100
85
 
101
- describe 'mods' do
102
- [:ctrl, :shift, :opt, :cmd, :extra1].each { |mod|
103
- it mod do
104
- :j.send(mod).send("#{mod}?").must_equal true
86
+ it 'has repeat: false by default' do
87
+ autogen = :CONTROL_L .overlaid :CONTROL_L
88
+ autogen.wont_be :repeat?
105
89
  end
106
- }
107
- end
108
90
 
109
- describe 'key' do
110
- it '記号を入れると対応するKeyCodeに変換する' do
111
- ';'.to_key.code.must_equal 'SEMICOLON'
91
+ it 'enables repeat flag' do
92
+ autogen = :CONTROL_L .overlaid :CONTROL_L, repeat: true
93
+ autogen.must_be :repeat?
94
+ end
112
95
  end
113
96
 
114
- it 'shiftが必要なkeyは内部で分解する' do
115
- key = :J.to_key
116
- key.code.must_equal 'j'
117
- key.shift?.must_equal true
97
+ describe 'autogen' do
98
+ it { (:j .to :k).must_be_instance_of Autogen::KeyToKey }
99
+ it { (:F7 .to :MUSIC_PREV).must_be_instance_of Autogen::KeyToConsumer }
118
100
  end
119
101
 
120
- it '数値を適切にKeyCodeに変換する' do
121
- '1'.to_key.code.must_equal 'KEY_1'
102
+ describe 'overlaid' do
103
+ it 'can contain KeyOverlaidModifier' do
104
+ root.item { :JIS_EISUU .overlaid :COMMAND_L }.must_add_child
105
+ end
122
106
  end
123
107
  end
124
108
 
125
- describe 'consumer_key' do
126
- it 'basic' do
127
- :MUSIC_PREV.to_key.class.must_equal Keyremac::ConsumerKey
109
+ describe 'primitive' do
110
+ describe 'key' do
111
+ it { :a.to_key.must_be_kind_of Keyable }
112
+ it { 'a'.to_key.must_be_kind_of Keyable }
113
+
114
+ it 'decodes key + shift' do
115
+ key = :J.to_key
116
+ key.code.must_equal 'j'
117
+ key.must_be :shift?
118
+ end
119
+
120
+ it 'converts KEY_*' do
121
+ '1'.to_key.code.must_equal 'KEY_1'
122
+ end
128
123
  end
129
- end
130
124
 
131
- describe 'autogen' do
132
- it 'KeyToKey' do
133
- (:j .to :k).class.must_equal Keyremac::KeyToKey
125
+ describe 'consumer_key' do
126
+ it { :MUSIC_PREV.to_key.must_be_instance_of ConsumerKey }
134
127
  end
135
- it 'KeyToConsumer' do
136
- (:F7 .to :MUSIC_PREV).class.must_equal Keyremac::KeyToConsumer
128
+
129
+ describe 'mods' do
130
+ [:ctrl, :shift, :opt, :cmd, :extra1, :none].each { |mod|
131
+ it "adds #{mod} flag" do
132
+ :j.send(mod).must_be :"#{mod}?"
133
+ end
134
+ }
137
135
  end
138
136
  end
139
- end
137
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: keyremac
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - keqh
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-06-21 00:00:00.000000000 Z
11
+ date: 2013-06-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -38,20 +38,6 @@ dependencies:
38
38
  - - '>='
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
- - !ruby/object:Gem::Dependency
42
- name: awesome_print
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - '>='
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - '>='
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
41
  - !ruby/object:Gem::Dependency
56
42
  name: builder
57
43
  requirement: !ruby/object:Gem::Requirement
@@ -77,11 +63,13 @@ files:
77
63
  - .travis.yml
78
64
  - Gemfile
79
65
  - LICENSE.txt
66
+ - README.ja.md
80
67
  - README.md
81
68
  - Rakefile
82
69
  - keyremac.gemspec
83
70
  - lib/keyremac.rb
84
71
  - lib/keyremac/base.rb
72
+ - lib/keyremac/constants.rb
85
73
  - lib/keyremac/dump.rb
86
74
  - lib/keyremac/key.rb
87
75
  - lib/keyremac/version.rb
@@ -115,3 +103,4 @@ summary: KeyRemap4MacBook private.xml generator
115
103
  test_files:
116
104
  - spec/dump_spec.rb
117
105
  - spec/keyremac_spec.rb
106
+ has_rdoc: