toki 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.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in toki.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Jussi Koljonen
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,89 @@
1
+ # Toki
2
+
3
+ Toki is a DSL that helps you to implement Ruby version, patchlevel, engine and platform specific code
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'toki'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install toki
18
+
19
+ ## Usage
20
+
21
+ ```ruby
22
+ require 'toki'
23
+
24
+ class Example
25
+ extend Toki
26
+
27
+ def self.ping
28
+ "pong"
29
+ end
30
+
31
+ # ruby 1.8.7 # => "123"
32
+ # ruby 2.0.0 # => "[1,2,3]"
33
+ def array_to_string
34
+ [1,2,3].to_s
35
+ end
36
+
37
+ # any mri version of ruby that is 1.9 or later
38
+ when_ruby :version => /^((?!1\.[0-8]).*?)$/, :engine => 'ruby' do
39
+ # also class methods can be defined
40
+ def self.ping
41
+ "PONG"
42
+ end
43
+ # applied only if ruby 1.9.x or later; overwrites array_to_string method
44
+ # ruby 2.0.0 # => "123"
45
+ def array_to_string
46
+ [1,2,3].join
47
+ end
48
+ end
49
+
50
+ # applied only if version and patchlevel matches
51
+ when_ruby :version => '1.8.7', :patchlevel => '371' do; end
52
+
53
+ # applied only if engine and version matches
54
+ when_ruby :engine => 'ruby', :version => '1.8.7' do; end
55
+ when_ruby :engine => 'jruby', :jruby_version => '1.7.6' do; end
56
+ when_ruby :engine => 'macruby', :macruby_version => '0.12' do; end
57
+ when_ruby :engine => 'rbx', :rbx_version => '2.1.1' do; end
58
+
59
+ # applied only if platform matches; :windows, :osx, :linux, :unix, :unknown
60
+ when_ruby :platform => :linux do; end
61
+ when_ruby :platform => /linux/ do; end
62
+
63
+ # alternative method to specify ruby version specific implementation
64
+ when_ruby_version '2.0.0' do; end
65
+ when_jruby_version '1.7.6' do; end
66
+ when_macruby_version '0.12' do; end
67
+ when_rbx_version '2.1.1' do; end
68
+ when_ruby_patchlevel '371' do; end
69
+ when_ruby_engine 'rbx' do; end
70
+ when_platform :osx do; end
71
+
72
+ end
73
+
74
+ # 1.8.7
75
+ puts Example.ping # => 'pong'
76
+ puts Example.new.array_to_string # => "123"
77
+
78
+ # 2.0.0
79
+ puts Example.ping # => 'gnop'
80
+ puts Example.new.array_to_string # => "123"
81
+ ```
82
+
83
+ ## Contributing
84
+
85
+ 1. Fork it
86
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
87
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
88
+ 4. Push to the branch (`git push origin my-new-feature`)
89
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
3
+ require "rake/testtask"
4
+
5
+ task :default => :test
6
+
7
+ desc "Run unit tests"
8
+ task :test do
9
+ Rake::TestTask.new { | task |
10
+ task.pattern = 'test/test_*.rb'
11
+ task.verbose = true
12
+ task.options = '-v'
13
+ task.warning = false
14
+ }
15
+ end
data/lib/toki.rb ADDED
@@ -0,0 +1,153 @@
1
+ require 'rbconfig'
2
+ require File.expand_path('../toki/version', __FILE__)
3
+
4
+ module Toki
5
+
6
+ def when_ruby(options, &block)
7
+ raise ArgumentError, "wrong argument type #{options.class} (expected Hash)" unless options.kind_of?(Hash)
8
+ apply_behaviour(&block) if options.all? do | key, value |
9
+ case key
10
+ when :version
11
+ when_ruby_version(value)
12
+ when :jruby_version
13
+ when_jruby_version(value)
14
+ when :macruby_version
15
+ when_macruby_version(value)
16
+ when :rbx_version
17
+ when_rbx_version(value)
18
+ when :engine
19
+ when_ruby_engine(value)
20
+ when :patchlevel
21
+ when_ruby_patchlevel(value)
22
+ when :platform
23
+ when_platform(value)
24
+ else
25
+ raise ArgumentError, "unsupported key #{key} for when_ruby options"
26
+ end
27
+ end
28
+ end
29
+
30
+ # JRUBY_VERSION
31
+ def when_jruby_version(pattern, &block)
32
+ if defined?(JRUBY_VERSION)
33
+ if pattern_matches_with?(JRUBY_VERSION, pattern)
34
+ apply_behaviour(&block)
35
+ else
36
+ false
37
+ end
38
+ else
39
+ # JRUBY_VERSION not defined
40
+ false
41
+ end
42
+ end
43
+
44
+ # MACRUBY_VERSION
45
+ def when_macruby_version(pattern, &block)
46
+ if defined?(MACRUBY_VERSION)
47
+ if pattern_matches_with?(MACRUBY_VERSION, pattern)
48
+ apply_behaviour(&block)
49
+ else
50
+ false
51
+ end
52
+ else
53
+ # MACRUBY_VERSION not defined
54
+ false
55
+ end
56
+ end
57
+
58
+ # Rubinius::VERSION
59
+ def when_rbx_version(pattern, &block)
60
+ if defined?(Rubinius)
61
+ if pattern_matches_with?(Rubinius::VERSION, pattern)
62
+ apply_behaviour(&block)
63
+ else
64
+ false
65
+ end
66
+ else
67
+ # Rubinius not defined
68
+ false
69
+ end
70
+ end
71
+
72
+ # RUBY_VERSION
73
+ def when_ruby_version(pattern, &block)
74
+ if pattern_matches_with?(RUBY_VERSION, pattern)
75
+ apply_behaviour(&block)
76
+ else
77
+ false
78
+ end
79
+ end
80
+
81
+ # RUBY_PATCHLEVEL
82
+ def when_ruby_patchlevel(pattern, &block)
83
+ if pattern_matches_with?(RUBY_PATCHLEVEL, pattern)
84
+ apply_behaviour(&block)
85
+ else
86
+ false
87
+ end
88
+ end
89
+
90
+ # RUBY_ENGINE
91
+ def when_ruby_engine(pattern, &block)
92
+ # ruby 1.8.7 does not have RUBY_ENGINE constant
93
+ ruby_engine = defined?(RUBY_ENGINE) ? RUBY_ENGINE : 'ruby'
94
+ if pattern_matches_with?(ruby_engine, pattern)
95
+ apply_behaviour(&block)
96
+ else
97
+ false
98
+ end
99
+ end
100
+
101
+ # RUBY_PLATFORM
102
+ def when_platform(pattern, &block)
103
+ case pattern
104
+ when Symbol
105
+ if pattern == detect_os
106
+ apply_behaviour(&block)
107
+ else
108
+ false
109
+ end
110
+ else
111
+ if pattern_matches_with?(RbConfig::CONFIG['host_os'], pattern)
112
+ apply_behaviour(&block)
113
+ else
114
+ false
115
+ end
116
+ end
117
+ end
118
+
119
+ private
120
+
121
+ def detect_os
122
+ case RbConfig::CONFIG['host_os']
123
+ when /mswin|msys|mingw|windows|win32|cygwin|bccwin|wince|emc/i
124
+ :windows
125
+ when /darwin|mac os/i
126
+ :osx
127
+ when /linux/i
128
+ :linux
129
+ when /solaris|sunos|bsd/i
130
+ :unix
131
+ else
132
+ :unknown
133
+ end
134
+ end
135
+
136
+ def pattern_matches_with?(constant, pattern)
137
+ constant.to_s =~ case pattern
138
+ when String, Integer
139
+ Regexp.union(pattern.to_s)
140
+ when Regexp
141
+ pattern
142
+ else
143
+ raise ArgumentError, "wrong argument type #{pattern.class} (expected String or Regexp)"
144
+ end
145
+ end
146
+
147
+ # apply behaviour to target class
148
+ def apply_behaviour(&block)
149
+ class_eval(&block) if block_given?
150
+ true
151
+ end
152
+
153
+ end # Toki
@@ -0,0 +1,3 @@
1
+ module Toki
2
+ VERSION = "0.0.1"
3
+ end
data/test/test_toki.rb ADDED
@@ -0,0 +1,161 @@
1
+ require 'test/unit'
2
+ require File.expand_path('../../lib/toki', __FILE__)
3
+
4
+ class TestToki < Test::Unit::TestCase
5
+
6
+ def setup
7
+ # do nothing
8
+ end
9
+
10
+ def teardown
11
+ # do nothing
12
+ end
13
+
14
+ def test_ruby_version
15
+ klass = Class.new do
16
+ extend Toki
17
+ def hello
18
+ nil
19
+ end
20
+ when_ruby :version => RUBY_VERSION do
21
+ def hello
22
+ "world"
23
+ end
24
+ end
25
+ end
26
+ instance = klass.new
27
+ assert_equal "world", instance.hello
28
+ end
29
+
30
+ def test_jruby_version
31
+ unless (jruby_version_defined = defined?(JRUBY_VERSION))
32
+ Object.const_set(:JRUBY_VERSION, '1.7.4')
33
+ end
34
+ klass = Class.new do
35
+ extend Toki
36
+ def hello
37
+ nil
38
+ end
39
+ when_ruby :jruby_version => '1.7.4' do
40
+ def hello
41
+ "world"
42
+ end
43
+ end
44
+ end
45
+ instance = klass.new
46
+ assert_equal "world", instance.hello
47
+ ensure
48
+ Object.send(:remove_const, :JRUBY_VERSION) unless jruby_version_defined
49
+ end
50
+
51
+ def test_rbx_version
52
+ unless (rbx_defined = defined?(Rubinius))
53
+ klass = Class.new
54
+ klass.const_set(:VERSION, '2.1.1')
55
+ Object.const_set(:Rubinius, klass)
56
+ end
57
+ klass = Class.new do
58
+ extend Toki
59
+ def hello
60
+ nil
61
+ end
62
+ when_ruby :rbx_version => '2.1.1' do
63
+ def hello
64
+ "world"
65
+ end
66
+ end
67
+ end
68
+ instance = klass.new
69
+ assert_equal "world", instance.hello
70
+ ensure
71
+ Object.send(:remove_const, :Rubinius) unless rbx_defined
72
+ end
73
+
74
+ def test_macruby_version
75
+ unless (macruby_version_defined = defined?(MACRUBY_VERSION))
76
+ Object.const_set(:MACRUBY_VERSION, '0.12')
77
+ end
78
+ klass = Class.new do
79
+ extend Toki
80
+ def hello
81
+ nil
82
+ end
83
+ when_ruby :macruby_version => '0.12' do
84
+ def hello
85
+ "world"
86
+ end
87
+ end
88
+ end
89
+ instance = klass.new
90
+ assert_equal "world", instance.hello
91
+ ensure
92
+ Object.send(:remove_const, :MACRUBY_VERSION) unless macruby_version_defined
93
+ end
94
+
95
+ def test_ruby_patchlevel
96
+ klass = Class.new do
97
+ extend Toki
98
+ def hello
99
+ nil
100
+ end
101
+ when_ruby :patchlevel => RUBY_PATCHLEVEL do
102
+ def hello
103
+ "world"
104
+ end
105
+ end
106
+ end
107
+ instance = klass.new
108
+ assert_equal "world", instance.hello
109
+ end
110
+
111
+ def test_ruby_engine
112
+ ruby_engine = defined?(RUBY_ENGINE) ? RUBY_ENGINE : 'ruby'
113
+ klass = Class.new do
114
+ extend Toki
115
+ def hello
116
+ nil
117
+ end
118
+ when_ruby :engine => ruby_engine do
119
+ def hello
120
+ "world"
121
+ end
122
+ end
123
+ end
124
+ instance = klass.new
125
+ assert_equal "world", instance.hello
126
+ end
127
+
128
+ def test_platform
129
+ klass = Class.new do
130
+ extend Toki
131
+ def hello
132
+ nil
133
+ end
134
+ when_ruby :platform => RbConfig::CONFIG['host_os'] do
135
+ def hello
136
+ "world"
137
+ end
138
+ end
139
+ end
140
+ instance = klass.new
141
+ assert_equal "world", instance.hello
142
+ end
143
+
144
+ def test_class_methods
145
+ klass = Class.new do
146
+ extend Toki
147
+ def self.hello
148
+ nil
149
+ end
150
+ when_ruby :version => Regexp.union(RUBY_VERSION) do
151
+ class << self
152
+ def hello
153
+ "world"
154
+ end
155
+ end
156
+ end
157
+ end
158
+ assert_equal "world", klass.hello
159
+ end
160
+
161
+ end
data/toki.gemspec ADDED
@@ -0,0 +1,17 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/toki/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Jussi Koljonen"]
6
+ gem.email = ["jussi.koljonen@gmail.com"]
7
+ gem.description = %q{Toki is a DSL that helps you to implement Ruby version, patchlevel, engine and platform specific code}
8
+ gem.summary = %q{Toki is a DSL that helps you to implement Ruby version, patchlevel, engine and platform specific code}
9
+ gem.homepage = "https://github.com/juskoljo/toki"
10
+
11
+ gem.files = `git ls-files`.split($\)
12
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
+ gem.name = "toki"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = Toki::VERSION
17
+ end
metadata ADDED
@@ -0,0 +1,74 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: toki
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Jussi Koljonen
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2013-10-26 00:00:00 Z
19
+ dependencies: []
20
+
21
+ description: Toki is a DSL that helps you to implement Ruby version, patchlevel, engine and platform specific code
22
+ email:
23
+ - jussi.koljonen@gmail.com
24
+ executables: []
25
+
26
+ extensions: []
27
+
28
+ extra_rdoc_files: []
29
+
30
+ files:
31
+ - .gitignore
32
+ - Gemfile
33
+ - LICENSE
34
+ - README.md
35
+ - Rakefile
36
+ - lib/toki.rb
37
+ - lib/toki/version.rb
38
+ - test/test_toki.rb
39
+ - toki.gemspec
40
+ homepage: https://github.com/juskoljo/toki
41
+ licenses: []
42
+
43
+ post_install_message:
44
+ rdoc_options: []
45
+
46
+ require_paths:
47
+ - lib
48
+ required_ruby_version: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ hash: 3
54
+ segments:
55
+ - 0
56
+ version: "0"
57
+ required_rubygems_version: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ hash: 3
63
+ segments:
64
+ - 0
65
+ version: "0"
66
+ requirements: []
67
+
68
+ rubyforge_project:
69
+ rubygems_version: 1.8.25
70
+ signing_key:
71
+ specification_version: 3
72
+ summary: Toki is a DSL that helps you to implement Ruby version, patchlevel, engine and platform specific code
73
+ test_files:
74
+ - test/test_toki.rb