rspec-i18n 0.1.0
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/History.rdoc +9 -0
- data/License.txt +23 -0
- data/README.rdoc +64 -0
- data/Rakefile +27 -0
- data/TODO.txt +31 -0
- data/VERSION.yml +5 -0
- data/bin/rspec-i18n +2 -0
- data/examples/person_spec.rb +47 -0
- data/lib/spec-i18n/dsl/main.rb +22 -0
- data/lib/spec-i18n/dsl.rb +2 -0
- data/lib/spec-i18n/example/before_and_after_hooks.rb +51 -0
- data/lib/spec-i18n/example/example_group_methods.rb +17 -0
- data/lib/spec-i18n/example.rb +2 -0
- data/lib/spec-i18n/expectations/extensions/kernel.rb +9 -0
- data/lib/spec-i18n/expectations/extensions.rb +1 -0
- data/lib/spec-i18n/expectations.rb +1 -0
- data/lib/spec-i18n/languages.yml +54 -0
- data/lib/spec-i18n/parser/natural_language.rb +63 -0
- data/lib/spec-i18n/parser.rb +2 -0
- data/lib/spec-i18n/platform.rb +8 -0
- data/lib/spec-i18n/runner/configuration.rb +27 -0
- data/lib/spec-i18n/runner.rb +2 -0
- data/lib/spec-i18n/spec_language.rb +7 -0
- data/lib/spec-i18n.rb +10 -0
- data/spec/spec-i18n/dsl/main_spec.rb +23 -0
- data/spec/spec-i18n/example/before_and_after_hooks_spec.rb +129 -0
- data/spec/spec-i18n/example/example_group_methods_spec.rb +22 -0
- data/spec/spec-i18n/example_spec.rb +47 -0
- data/spec/spec-i18n/expectations/kernel_spec.rb +18 -0
- data/spec/spec-i18n/parser/natural_language_spec.rb +123 -0
- data/spec/spec-i18n/runner/configuration_spec.rb +51 -0
- data/spec/spec-i18n/runner/runner_spec.rb +21 -0
- data/spec/spec-i18n/spec_language_spec.rb +16 -0
- data/spec/spec.opts +3 -0
- data/spec/spec_helper.rb +40 -0
- metadata +118 -0
data/History.rdoc
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
=== Version 0.1.0
|
2
|
+
|
3
|
+
This is the first preview release of Rspec-i18n, a Internacionalization Development library for Ruby.
|
4
|
+
|
5
|
+
* Added translation to all the base keywords(describe, it, should, should_not,
|
6
|
+
before(:each), before(:all), before(:suite), after(:each), after(:all),
|
7
|
+
after(:suite))
|
8
|
+
* Added a languages.yml. Will be translated to all languages.
|
9
|
+
* Added a simple parser for the read the languages in languages.yml.
|
data/License.txt
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
The MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2009 Tomás D'Stefano
|
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 NONINFRINGEMENT.
|
19
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
20
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
21
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
22
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
23
|
+
|
data/README.rdoc
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
= Rspec-i18n
|
2
|
+
|
3
|
+
== Description
|
4
|
+
|
5
|
+
The Rspec-i18n gem provide a easy way to write specs in any language you
|
6
|
+
prefer. The Rspec-i18n was created for the purpose of teaching people who are
|
7
|
+
starting to developing applications but also serves to Production use.
|
8
|
+
I know that many people prefer to write code/specs in English =)
|
9
|
+
|
10
|
+
But if you don't prefer that, you'll like the Rspec-i18n.
|
11
|
+
|
12
|
+
== Synopsis
|
13
|
+
|
14
|
+
Rspec-i18n will supports any language you want(See languages.yml file). This is
|
15
|
+
Portuguese(Brazil):
|
16
|
+
|
17
|
+
require 'spec'
|
18
|
+
require 'spec-i18n'
|
19
|
+
|
20
|
+
Spec::Runner.configure do |config|
|
21
|
+
|
22
|
+
config.spec_language :pt
|
23
|
+
|
24
|
+
...
|
25
|
+
end
|
26
|
+
|
27
|
+
# In spec/pessoa_spec.rb
|
28
|
+
|
29
|
+
require 'spec_helper'
|
30
|
+
|
31
|
+
descreva Pessoa do
|
32
|
+
antes(:de_cada) do
|
33
|
+
@nome = "Tomas"
|
34
|
+
@pessoa = Pessoa.new(@nome)
|
35
|
+
end
|
36
|
+
|
37
|
+
exemplo "retornar o seu nome" do
|
38
|
+
@pessoa.nome.deve == @nome
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
== Examples
|
43
|
+
|
44
|
+
See more examples in the examples folder
|
45
|
+
|
46
|
+
== Listing the available languages
|
47
|
+
|
48
|
+
spec-i18n --language help (NOT YET IMPLEMENTED)
|
49
|
+
|
50
|
+
== Adding a new language or completing a existing one(based on Cucumber implementation)
|
51
|
+
|
52
|
+
1. Make a fork of Rspec-i18n and pull it down
|
53
|
+
2. Add your language keywords to languages.yml
|
54
|
+
3. Commit and push your changes - then send a pull request at Github
|
55
|
+
|
56
|
+
** OBS: Hints for better words in languages.yml are Welcome =D.
|
57
|
+
|
58
|
+
== Install
|
59
|
+
|
60
|
+
[sudo] gem install rspec-i18n
|
61
|
+
|
62
|
+
== TODO
|
63
|
+
|
64
|
+
See the TODO.txt file and see more details
|
data/Rakefile
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'rubygems'
|
3
|
+
require 'rake'
|
4
|
+
|
5
|
+
$:.unshift(File.dirname(__FILE__) + '/lib')
|
6
|
+
|
7
|
+
begin
|
8
|
+
require 'jeweler'
|
9
|
+
Jeweler::Tasks.new do |gemspec|
|
10
|
+
gemspec.name = "rspec-i18n"
|
11
|
+
gemspec.summary = "The internacionalization gem for Rspec"
|
12
|
+
gemspec.description = "A internacionalization tool written in Ruby"
|
13
|
+
gemspec.email = "tomasdestefi@gmail.com"
|
14
|
+
gemspec.homepage = "http://github.com/tomas-stefano/rspec-i18n"
|
15
|
+
gemspec.authors = ["Tomas D'Stefano"]
|
16
|
+
|
17
|
+
gemspec.add_dependency('rspec', '>= 1.2.9')
|
18
|
+
|
19
|
+
gemspec.add_development_dependency('rspec', '>= 1.2.9')
|
20
|
+
end
|
21
|
+
Jeweler::GemcutterTasks.new
|
22
|
+
rescue LoadError
|
23
|
+
puts("-" * 80)
|
24
|
+
puts "Jeweler not available. Install it with:
|
25
|
+
[sudo] gem install jeweler"
|
26
|
+
puts("-" * 80)
|
27
|
+
end
|
data/TODO.txt
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
== Refactoring
|
2
|
+
|
3
|
+
* The SpecI18n::Parser::NaturalLanguage.get(SpecI18n.spec_language) is duplicated in
|
4
|
+
some places - check a better way to implement this
|
5
|
+
* Simplified more and more tests!
|
6
|
+
* Find the right module for the example group specs(it/example) (I think =>
|
7
|
+
Spec::Example::ExampleGroupMethods but I think I was wrong)
|
8
|
+
|
9
|
+
== Future
|
10
|
+
|
11
|
+
* Translate all matchers
|
12
|
+
* Translate subjects
|
13
|
+
* Translate shared examples
|
14
|
+
* Put a #language header in the spec_helper file (Cucumber Style) instead load from config(maintain the two options)
|
15
|
+
* Create the directory features to test with Cucumber
|
16
|
+
* Make the describe/it i18n available from a class
|
17
|
+
|
18
|
+
Example:
|
19
|
+
# class StackSpec < Spec::ExampleGroup
|
20
|
+
# describe Stack, "with no elements"
|
21
|
+
#
|
22
|
+
# before
|
23
|
+
# @stack = Stack.new
|
24
|
+
# end
|
25
|
+
#
|
26
|
+
# it "should raise on pop" do
|
27
|
+
# lambda{ @stack.pop }.should raise_error
|
28
|
+
# end
|
29
|
+
# end
|
30
|
+
|
31
|
+
* Check a better way to manipulating the mocks and stubs for i18n (What do you think?)
|
data/VERSION.yml
ADDED
data/bin/rspec-i18n
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'spec-i18n'
|
2
|
+
|
3
|
+
Spec::Runner.configure do |config|
|
4
|
+
config.spec_language :pt
|
5
|
+
end
|
6
|
+
|
7
|
+
class Pessoa
|
8
|
+
attr_reader :idade
|
9
|
+
def initialize(nome, sobrenome, idade=0)
|
10
|
+
@nome = nome
|
11
|
+
@sobrenome = sobrenome
|
12
|
+
@idade = idade
|
13
|
+
end
|
14
|
+
|
15
|
+
def nome_completo
|
16
|
+
"#{@nome} #{@sobrenome}"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# Silly Tests
|
21
|
+
descreva Pessoa do
|
22
|
+
|
23
|
+
antes(:de_todos) do
|
24
|
+
@pessoa = Pessoa.new("Tomás", "D'Stefano")
|
25
|
+
end
|
26
|
+
|
27
|
+
antes(:de_cada) do
|
28
|
+
@pessoas = [@pessoa]
|
29
|
+
end
|
30
|
+
|
31
|
+
depois(:de_todos) do
|
32
|
+
@outras_pessoas = @pessoas.dup
|
33
|
+
end
|
34
|
+
|
35
|
+
depois(:de_cada) do
|
36
|
+
@outras_pessoas = []
|
37
|
+
end
|
38
|
+
|
39
|
+
exemplo "deve retornar o nome completo" do
|
40
|
+
@pessoa.nome_completo.deve == "Tomás D'Stefano"
|
41
|
+
end
|
42
|
+
|
43
|
+
especificar "a idade é opcional" do
|
44
|
+
Pessoa.new("Aaromn", "Monkey", 20).idade.deve == 20
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Spec
|
2
|
+
module DSL
|
3
|
+
module Main
|
4
|
+
|
5
|
+
# Register adverbs for the dsl keywords
|
6
|
+
#
|
7
|
+
# { "describe" => ["descreva", "contexto"]}
|
8
|
+
#
|
9
|
+
# Register alias for the language specified
|
10
|
+
def register_adverbs
|
11
|
+
language = SpecI18n::Parser::NaturalLanguage.get(SpecI18n.spec_language)
|
12
|
+
@adverbs = language.dsl_keywords
|
13
|
+
@adverbs.each do |key, values|
|
14
|
+
values.map { |value| alias_method value, key }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
include Spec::DSL::Main
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Spec
|
2
|
+
module Example
|
3
|
+
module BeforeAndAfterHooks
|
4
|
+
|
5
|
+
def register_hooks
|
6
|
+
language = SpecI18n::Parser::NaturalLanguage.get(SpecI18n.spec_language)
|
7
|
+
language.before_and_after_keywords.each do |key, values|
|
8
|
+
values.map { |value| alias_method value, key }
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def before_parts(scope)
|
13
|
+
if SpecI18n.spec_language
|
14
|
+
language = SpecI18n::Parser::NaturalLanguage.get(SpecI18n.spec_language)
|
15
|
+
scope = grep_the_scope(scope, language.hooks_params_keywords)
|
16
|
+
end
|
17
|
+
case scope
|
18
|
+
when :each; before_each_parts
|
19
|
+
when :all; before_all_parts
|
20
|
+
when :suite; before_suite_parts
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def after_parts(scope)
|
25
|
+
if SpecI18n.spec_language
|
26
|
+
language = SpecI18n::Parser::NaturalLanguage.get(SpecI18n.spec_language)
|
27
|
+
scope = grep_the_scope(scope, language.hooks_params_keywords)
|
28
|
+
end
|
29
|
+
case scope
|
30
|
+
when :each; after_each_parts
|
31
|
+
when :all; after_all_parts
|
32
|
+
when :suite; after_suite_parts
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# Receive a String Scope and return the scope in english for
|
37
|
+
# the rspec run the right method
|
38
|
+
def grep_the_scope(scope, hooks)
|
39
|
+
scopes = [:each, :all, :suite]
|
40
|
+
return scope if scopes.include?(scope)
|
41
|
+
|
42
|
+
hooks.each do |scope_in_english, language_hooks|
|
43
|
+
return scope_in_english.to_sym if language_hooks.include?(scope.to_s)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
include Spec::Example::BeforeAndAfterHooks
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Spec
|
2
|
+
module Example
|
3
|
+
module ExampleGroupMethods
|
4
|
+
|
5
|
+
def self.register_example_adverbs
|
6
|
+
language = SpecI18n::Parser::NaturalLanguage.get(SpecI18n.spec_language)
|
7
|
+
@adverbs = language.example_group_keywords
|
8
|
+
@adverbs.each do |key, values|
|
9
|
+
values.map do |value|
|
10
|
+
alias_method value, key
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
module Kernel
|
2
|
+
def register_expectations_keywords
|
3
|
+
language = SpecI18n::Parser::NaturalLanguage.get(SpecI18n.spec_language)
|
4
|
+
@adverbs = language.expectation_keywords
|
5
|
+
@adverbs.each do |key, values|
|
6
|
+
values.map { |value| alias_method value, key }
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'spec-i18n/expectations/extensions/kernel'
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'spec-i18n/expectations/extensions'
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# (based on Cucumber implementation)
|
4
|
+
# If you want several aliases for a keyword, just a separate them
|
5
|
+
# with a | character. Make sure there are no ambiguities in the keywords
|
6
|
+
|
7
|
+
"en":
|
8
|
+
name: English
|
9
|
+
nativo: English
|
10
|
+
describe: describe
|
11
|
+
it: it|specify
|
12
|
+
should: should
|
13
|
+
should_not: should_not
|
14
|
+
before: before
|
15
|
+
after: after
|
16
|
+
hooks:
|
17
|
+
each: each
|
18
|
+
all: all
|
19
|
+
suite: suite
|
20
|
+
matchers:
|
21
|
+
be_equal: be_equal
|
22
|
+
|
23
|
+
"pt":
|
24
|
+
name: Portuguese
|
25
|
+
nativo: português
|
26
|
+
describe: descreva|contexto
|
27
|
+
it: exemplo|especificar
|
28
|
+
should: deve
|
29
|
+
should_not: nao_deve
|
30
|
+
before: antes
|
31
|
+
after: depois
|
32
|
+
hooks:
|
33
|
+
each: de_cada|de_cada_exemplo
|
34
|
+
all: de_todos|de_todos_exemplos
|
35
|
+
suite: suite
|
36
|
+
matchers:
|
37
|
+
be_equal: ser_igual_a
|
38
|
+
|
39
|
+
# Please put the right words for this language! =D
|
40
|
+
"es":
|
41
|
+
name: Spanish
|
42
|
+
native: español
|
43
|
+
describe: describir
|
44
|
+
it: ejemplo
|
45
|
+
should: deberia
|
46
|
+
should_not: no_debe
|
47
|
+
before: antes
|
48
|
+
after: despues
|
49
|
+
hooks:
|
50
|
+
each: de_cada_ejemplo
|
51
|
+
all: de_todos_ejemplo
|
52
|
+
suite: suite
|
53
|
+
matchers:
|
54
|
+
be_equal: ser_igual_a
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module SpecI18n
|
2
|
+
module Parser
|
3
|
+
class NaturalLanguage
|
4
|
+
KEYWORDS_LANGUAGE = %w{ name native describe before after it should}
|
5
|
+
|
6
|
+
class << self
|
7
|
+
def get(language)
|
8
|
+
new(language)
|
9
|
+
end
|
10
|
+
|
11
|
+
def all
|
12
|
+
SpecI18n::SPEC_LANGUAGES.keys.sort.map { |language| get(language) }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
attr_reader :keywords
|
17
|
+
|
18
|
+
def initialize(language)
|
19
|
+
@keywords = SpecI18n::SPEC_LANGUAGES[language]
|
20
|
+
raise(LanguageNotFound, "Language #{language} Not Supported") if @keywords.nil?
|
21
|
+
@parser = nil
|
22
|
+
end
|
23
|
+
|
24
|
+
def dsl_keywords
|
25
|
+
spec_keywords("describe")
|
26
|
+
end
|
27
|
+
|
28
|
+
def expectation_keywords
|
29
|
+
language_adverbs = spec_keywords("should")
|
30
|
+
language_adverbs.merge(spec_keywords("should_not"))
|
31
|
+
end
|
32
|
+
|
33
|
+
def before_and_after_keywords
|
34
|
+
adverbs = spec_keywords("before")
|
35
|
+
adverbs.merge(spec_keywords("after"))
|
36
|
+
end
|
37
|
+
|
38
|
+
def hooks_params_keywords
|
39
|
+
hooks = {}
|
40
|
+
keywords['hooks'].each do |hook, value|
|
41
|
+
values = value.split('|')
|
42
|
+
hooks[hook] = values
|
43
|
+
end
|
44
|
+
hooks
|
45
|
+
end
|
46
|
+
|
47
|
+
def example_group_keywords
|
48
|
+
spec_keywords("it")
|
49
|
+
end
|
50
|
+
|
51
|
+
def spec_keywords(key, space=false)
|
52
|
+
raise "No #{key} in #{@keywords.inspect}" if @keywords[key].nil?
|
53
|
+
values = keywords[key].split('|')
|
54
|
+
{ key => values }
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
class LanguageNotFound < StandardError
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
module SpecI18n
|
4
|
+
version = YAML.load_file(File.dirname(__FILE__) + '/../../VERSION.yml')
|
5
|
+
SPEC_I18n_VERSION = [version[:major], version[:minor], version[:build]].compact.join(".")
|
6
|
+
SPEC_LANGUAGE_FILE = File.expand_path(File.dirname(__FILE__) + '/languages.yml')
|
7
|
+
SPEC_LANGUAGES = YAML.load_file(SPEC_LANGUAGE_FILE)
|
8
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Spec
|
2
|
+
module Runner
|
3
|
+
class Configuration
|
4
|
+
def spec_language(language)
|
5
|
+
@spec_language = language ? language.to_s : "en"
|
6
|
+
load_language
|
7
|
+
@spec_language
|
8
|
+
end
|
9
|
+
|
10
|
+
def language
|
11
|
+
@spec_language
|
12
|
+
end
|
13
|
+
|
14
|
+
# Load all Modules and Classes for the language specified
|
15
|
+
def load_language
|
16
|
+
Spec::DSL::Main.register_adverbs
|
17
|
+
Kernel.register_expectations_keywords
|
18
|
+
Spec::Example::ExampleGroupMethods.register_example_adverbs
|
19
|
+
Spec::Example::BeforeAndAfterHooks.register_hooks
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class UndefinedLanguageError < StandardError
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
data/lib/spec-i18n.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
include Spec::DSL
|
3
|
+
|
4
|
+
describe Main do
|
5
|
+
|
6
|
+
before(:each) do
|
7
|
+
@languages = ["en", "pt", "es"]
|
8
|
+
end
|
9
|
+
|
10
|
+
describe 'the manipulation of methods of the domain specific language' do
|
11
|
+
|
12
|
+
it "should have the methods of the dsl keywords of the language specified" do
|
13
|
+
@languages.each do |language|
|
14
|
+
Spec::Runner.configuration.spec_language(language)
|
15
|
+
dsl_keywords = SpecI18n::Parser::NaturalLanguage.get(language).dsl_keywords
|
16
|
+
dsl_keywords.values.flatten.each do |keyword|
|
17
|
+
Main.methods.should be_include(keyword)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Spec
|
4
|
+
module Example
|
5
|
+
describe BeforeAndAfterHooks do
|
6
|
+
|
7
|
+
before(:each) do
|
8
|
+
@languages = ["pt", "en", "es"]
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should include all i18n methods to Before and After Hooks" do
|
12
|
+
@languages.each do |language|
|
13
|
+
Spec::Runner.configuration.spec_language(language)
|
14
|
+
language = SpecI18n::Parser::NaturalLanguage.get(language)
|
15
|
+
language.before_and_after_keywords.keys.map do |keyword|
|
16
|
+
BeforeAndAfterHooks.methods.should be_include(keyword)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context "the before hook" do
|
22
|
+
|
23
|
+
it "should translate the :each parameters and parse options" do
|
24
|
+
@languages.each do |language|
|
25
|
+
Spec::Runner.configuration.spec_language(language)
|
26
|
+
language = SpecI18n::Parser::NaturalLanguage.get(language)
|
27
|
+
scope = language.hooks_params_keywords["each"].first
|
28
|
+
self.should_receive(:before_each_parts)
|
29
|
+
before_parts(scope)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should translate the :all scope and call the right method" do
|
34
|
+
@languages.each do |language|
|
35
|
+
Spec::Runner.configuration.spec_language(language)
|
36
|
+
language = SpecI18n::Parser::NaturalLanguage.get(language)
|
37
|
+
scope = language.hooks_params_keywords["all"].first
|
38
|
+
self.should_receive(:before_all_parts)
|
39
|
+
before_parts(scope)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should translate the :suite scope and call the right method" do
|
44
|
+
@languages.each do |language|
|
45
|
+
Spec::Runner.configuration.spec_language(language)
|
46
|
+
language = SpecI18n::Parser::NaturalLanguage.get(language)
|
47
|
+
scope = language.hooks_params_keywords["suite"].first.to_sym
|
48
|
+
self.should_receive(:before_suite_parts)
|
49
|
+
before_parts(scope)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context "the after hook" do
|
55
|
+
it "should translate the :all scope and call the right method" do
|
56
|
+
@languages.each do |language|
|
57
|
+
Spec::Runner.configuration.spec_language(language)
|
58
|
+
language = SpecI18n::Parser::NaturalLanguage.get(language)
|
59
|
+
scope = language.hooks_params_keywords["all"].first.to_sym
|
60
|
+
self.should_receive(:after_all_parts)
|
61
|
+
after_parts(scope)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
context "grep the scope and call the hook" do
|
67
|
+
|
68
|
+
before(:each) do
|
69
|
+
@pt = Spec::Runner.configuration.spec_language(:pt)
|
70
|
+
@language = SpecI18n::Parser::NaturalLanguage.get(@pt)
|
71
|
+
@hooks = @language.hooks_params_keywords
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should return the same scope if scope is in English" do
|
75
|
+
[:each, :all, :suite].each do |scope|
|
76
|
+
grep_the_scope(scope, @hooks).should == scope
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should grep the scope each" do
|
81
|
+
scopes = @hooks["each"]
|
82
|
+
scopes.each do |scope|
|
83
|
+
grep_the_scope(scope, @hooks).should == :each
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should grep the scope all" do
|
88
|
+
scopes = @hooks["all"]
|
89
|
+
scopes.each do |scope|
|
90
|
+
grep_the_scope(scope, @hooks).should == :all
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should grep the scope suite" do
|
95
|
+
scopes = @hooks["suite"]
|
96
|
+
scopes.each do |scope|
|
97
|
+
grep_the_scope(scope, @hooks).should == :suite
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
context "with Symbol scopes" do
|
102
|
+
|
103
|
+
it "should grep the scope :each" do
|
104
|
+
scopes = @hooks["each"].map { |hook| hook.to_sym }
|
105
|
+
scopes.each do |scope|
|
106
|
+
grep_the_scope(scope, @hooks).should == :each
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
it "should grep the scope :all" do
|
111
|
+
scopes = @hooks["all"].map { |hook| hook.to_sym }
|
112
|
+
scopes.each do |scope|
|
113
|
+
grep_the_scope(scope, @hooks).should == :all
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
it "should grep the scope :suite" do
|
118
|
+
scopes = @hooks["suite"].map { |hook| hook.to_sym }
|
119
|
+
scopes.each do |scope|
|
120
|
+
grep_the_scope(scope, @hooks).should == :suite
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
module Spec
|
4
|
+
module Example
|
5
|
+
describe ExampleGroupMethods do
|
6
|
+
|
7
|
+
before(:each) do
|
8
|
+
@languages = ["pt", "es", "en"]
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should include #it example translated methods" do
|
12
|
+
@languages.each do |language|
|
13
|
+
Spec::Runner.configuration.spec_language(language)
|
14
|
+
language = SpecI18n::Parser::NaturalLanguage.get(language)
|
15
|
+
language.example_group_keywords.values.flatten.each do |keyword|
|
16
|
+
pending "I don't know wich module is included the keywords (Is 2:43 AM - I'll relaxing in my couch)"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'spec-i18n'
|
2
|
+
|
3
|
+
Spec::Runner.configure do |config|
|
4
|
+
config.spec_language :pt
|
5
|
+
end
|
6
|
+
|
7
|
+
class Pessoa
|
8
|
+
attr_reader :idade
|
9
|
+
def initialize(nome, sobrenome, idade=0)
|
10
|
+
@nome = nome
|
11
|
+
@sobrenome = sobrenome
|
12
|
+
@idade = idade
|
13
|
+
end
|
14
|
+
|
15
|
+
def nome_completo
|
16
|
+
"#{@nome} #{@sobrenome}"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# Silly Tests
|
21
|
+
descreva Pessoa do
|
22
|
+
|
23
|
+
antes(:de_todos) do
|
24
|
+
@pessoa = Pessoa.new("Tomás", "D'Stefano")
|
25
|
+
end
|
26
|
+
|
27
|
+
antes(:de_cada) do
|
28
|
+
@pessoas = [@pessoa]
|
29
|
+
end
|
30
|
+
|
31
|
+
depois(:de_todos) do
|
32
|
+
@outras_pessoas = @pessoas.dup
|
33
|
+
end
|
34
|
+
|
35
|
+
depois(:de_cada) do
|
36
|
+
@outras_pessoas = []
|
37
|
+
end
|
38
|
+
|
39
|
+
exemplo "deve retornar o nome completo" do
|
40
|
+
@pessoa.nome_completo.deve == "Tomás D'Stefano"
|
41
|
+
end
|
42
|
+
|
43
|
+
especificar "a idade é opcional" do
|
44
|
+
Pessoa.new("Aaromn", "Monkey", 20).idade.deve == 20
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Object, "#should and #should_not" do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@languages = ["pt", "en", "es"]
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should have the 'should' and 'should_not' methods translated" do
|
10
|
+
@languages.each do |language|
|
11
|
+
Spec::Runner.configuration.spec_language(language)
|
12
|
+
language = SpecI18n::Parser::NaturalLanguage.get(language)
|
13
|
+
language.expectation_keywords.values.flatten.each do |keyword|
|
14
|
+
Kernel.methods.should be_include(keyword)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module SpecI18n
|
4
|
+
module Parser
|
5
|
+
describe NaturalLanguage do
|
6
|
+
|
7
|
+
before(:each) do
|
8
|
+
@pt = NaturalLanguage.get('pt')
|
9
|
+
@es = NaturalLanguage.get('es')
|
10
|
+
@en = NaturalLanguage.get('en')
|
11
|
+
end
|
12
|
+
|
13
|
+
context "get languages" do
|
14
|
+
|
15
|
+
it "should get the default language" do
|
16
|
+
NaturalLanguage.get("en").should_not be_nil
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should raise for the non existing language" do
|
20
|
+
language = "non_existing"
|
21
|
+
lambda {
|
22
|
+
NaturalLanguage.new(language)
|
23
|
+
}.should raise_error(LanguageNotFound, "Language #{language} Not Supported")
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
%w(describe before after it should).each do |keyword|
|
29
|
+
it "should have the #{keyword} keyword" do
|
30
|
+
@pt.keywords.keys.should be_include(keyword)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context "of dsl keywords" do
|
35
|
+
|
36
|
+
it "should return all the dsl keywords" do
|
37
|
+
@pt.dsl_keywords.should == {"describe" => [ "descreva", "contexto"] }
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should return the describe dsl keyword" do
|
41
|
+
lang = { "describe" => "descreva", :before => "antes" }
|
42
|
+
@pt.should_receive(:keywords).and_return(lang)
|
43
|
+
@pt.dsl_keywords.should == { "describe" => [ lang["describe"] ] }
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context "of expectations keywords" do
|
48
|
+
|
49
|
+
before(:each) do
|
50
|
+
@keywords = { "should" => ["deve"], "should_not" => ["nao_deve"] }
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should return the expectation keyword of the language" do
|
54
|
+
lang = {"describe" => "descreva", "should" => "deve", "should_not" => "nao_deve"}
|
55
|
+
@pt.should_receive(:keywords).twice.and_return(lang)
|
56
|
+
@pt.expectation_keywords.should == @keywords
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should return the expectation keywords of the current language" do
|
60
|
+
keywords = { "should" => ["deberia"], "should_not" => ["no_debe"]}
|
61
|
+
@es.expectation_keywords.should == keywords
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context "of before and after keywords" do
|
66
|
+
|
67
|
+
it "should return the hooks for the current language" do
|
68
|
+
keywords = { "before" => ["before"], "after" => ["after"]}
|
69
|
+
@en.before_and_after_keywords.should == keywords
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should return the hooks for the language" do
|
73
|
+
keywords = { "before" => ["antes"], "after" => ["depois"]}
|
74
|
+
@pt.before_and_after_keywords.should == keywords
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
context "of hooks keywords" do
|
79
|
+
|
80
|
+
it "should return the hooks parameters for the current language" do
|
81
|
+
keywords = { "each" => ["de_cada", "de_cada_exemplo"],
|
82
|
+
"all" => ["de_todos", "de_todos_exemplos"],
|
83
|
+
"suite" => ["suite"]}
|
84
|
+
@pt.hooks_params_keywords.should == keywords
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
context "of example group keywords" do
|
89
|
+
|
90
|
+
before(:each) do
|
91
|
+
@keywords = { "it" => ["exemplo", "especificar"] }
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should return the example group keywords for the current language" do
|
95
|
+
@pt.example_group_keywords.should == @keywords
|
96
|
+
end
|
97
|
+
|
98
|
+
it "should return the example group for the portuguese language" do
|
99
|
+
@keywords = { "it" => ["it", "specify"]}
|
100
|
+
@en.example_group_keywords.should == @keywords
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
context "of all matchers" do
|
105
|
+
it "should parse all matchers"
|
106
|
+
end
|
107
|
+
|
108
|
+
context "splitting the keys" do
|
109
|
+
it "should raise no found key" do
|
110
|
+
lambda {
|
111
|
+
@pt.spec_keywords("no_found")
|
112
|
+
}.should raise_error(RuntimeError)
|
113
|
+
end
|
114
|
+
|
115
|
+
it "should split correctly the keys" do
|
116
|
+
lang = { "describe" => "descreva|contexto" }
|
117
|
+
NaturalLanguage.instance_variable_set(:@keywords, lang["describe"])
|
118
|
+
@pt.spec_keywords("describe").should == { "describe" => ["descreva", "contexto"] }
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Spec
|
4
|
+
module Runner
|
5
|
+
describe Configuration do
|
6
|
+
with_sandboxed_options do
|
7
|
+
with_sandboxed_config do
|
8
|
+
describe "#spec_language" do
|
9
|
+
|
10
|
+
it "should default a english language for nil" do
|
11
|
+
config.spec_language(nil).should == "en"
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should return a pt language" do
|
15
|
+
config.spec_language(:pt).should == "pt"
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should return a es language using a Symbol" do
|
19
|
+
config.spec_language(:es).should == "es"
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should return a en language for the nil parameter" do
|
23
|
+
config.spec_language(nil)
|
24
|
+
config.language.should == "en"
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should set the portuguese language" do
|
28
|
+
config.spec_language(:pt)
|
29
|
+
config.language.should == "pt"
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should set the espanish language" do
|
33
|
+
config.spec_language(:es)
|
34
|
+
config.language.should == "es"
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "load language" do
|
40
|
+
before(:each) do
|
41
|
+
config.spec_language(:pt)
|
42
|
+
end
|
43
|
+
it "should load all the modules" do
|
44
|
+
config.load_language.should be_true
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Spec
|
4
|
+
describe Runner do
|
5
|
+
|
6
|
+
describe "the right language for the specs" do
|
7
|
+
|
8
|
+
before(:each) do
|
9
|
+
@language = :pt
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should assign the spec_language" do
|
13
|
+
Spec::Runner.configure do |config|
|
14
|
+
config.spec_language @language
|
15
|
+
end
|
16
|
+
Spec::Runner.configuration.language.should == @language.to_s
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe SpecI18n do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
include SpecI18n
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should assign the spec language constant" do
|
10
|
+
languages = ["pt", "es"]
|
11
|
+
languages.each do |language|
|
12
|
+
Spec::Runner.configuration.spec_language(language)
|
13
|
+
spec_language.should == language
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/spec/spec.opts
ADDED
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'ruby-debug'
|
3
|
+
require 'spec'
|
4
|
+
require 'spec-i18n'
|
5
|
+
|
6
|
+
$:.unshift(File.dirname(__FILE__), '../lib')
|
7
|
+
|
8
|
+
def with_sandboxed_options
|
9
|
+
attr_reader :options
|
10
|
+
|
11
|
+
before(:each) do
|
12
|
+
@original_rspec_options = ::Spec::Runner.options
|
13
|
+
::Spec::Runner.use(@options = ::Spec::Runner::Options.new(StringIO.new, StringIO.new))
|
14
|
+
end
|
15
|
+
|
16
|
+
after(:each) do
|
17
|
+
::Spec::Runner.use(@original_rspec_options)
|
18
|
+
end
|
19
|
+
|
20
|
+
yield
|
21
|
+
end
|
22
|
+
|
23
|
+
def with_sandboxed_config
|
24
|
+
attr_reader :config
|
25
|
+
|
26
|
+
before(:each) do
|
27
|
+
@config = ::Spec::Runner::Configuration.new
|
28
|
+
@original_configuration = ::Spec::Runner.configuration
|
29
|
+
spec_configuration = @config
|
30
|
+
::Spec::Runner.instance_eval {@configuration = spec_configuration}
|
31
|
+
end
|
32
|
+
|
33
|
+
after(:each) do
|
34
|
+
original_configuration = @original_configuration
|
35
|
+
::Spec::Runner.instance_eval {@configuration = original_configuration}
|
36
|
+
::Spec::Example::ExampleGroupFactory.reset
|
37
|
+
end
|
38
|
+
|
39
|
+
yield
|
40
|
+
end
|
metadata
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rspec-i18n
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Tomas D'Stefano
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-12-27 00:00:00 -02:00
|
13
|
+
default_executable: rspec-i18n
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: rspec
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 1.2.9
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rspec
|
27
|
+
type: :development
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.2.9
|
34
|
+
version:
|
35
|
+
description: A internacionalization tool written in Ruby
|
36
|
+
email: tomasdestefi@gmail.com
|
37
|
+
executables:
|
38
|
+
- rspec-i18n
|
39
|
+
extensions: []
|
40
|
+
|
41
|
+
extra_rdoc_files:
|
42
|
+
- README.rdoc
|
43
|
+
files:
|
44
|
+
- History.rdoc
|
45
|
+
- License.txt
|
46
|
+
- README.rdoc
|
47
|
+
- Rakefile
|
48
|
+
- TODO.txt
|
49
|
+
- VERSION.yml
|
50
|
+
- bin/rspec-i18n
|
51
|
+
- examples/person_spec.rb
|
52
|
+
- lib/spec-i18n.rb
|
53
|
+
- lib/spec-i18n/dsl.rb
|
54
|
+
- lib/spec-i18n/dsl/main.rb
|
55
|
+
- lib/spec-i18n/example.rb
|
56
|
+
- lib/spec-i18n/example/before_and_after_hooks.rb
|
57
|
+
- lib/spec-i18n/example/example_group_methods.rb
|
58
|
+
- lib/spec-i18n/expectations.rb
|
59
|
+
- lib/spec-i18n/expectations/extensions.rb
|
60
|
+
- lib/spec-i18n/expectations/extensions/kernel.rb
|
61
|
+
- lib/spec-i18n/languages.yml
|
62
|
+
- lib/spec-i18n/parser.rb
|
63
|
+
- lib/spec-i18n/parser/natural_language.rb
|
64
|
+
- lib/spec-i18n/platform.rb
|
65
|
+
- lib/spec-i18n/runner.rb
|
66
|
+
- lib/spec-i18n/runner/configuration.rb
|
67
|
+
- lib/spec-i18n/spec_language.rb
|
68
|
+
- spec/spec-i18n/dsl/main_spec.rb
|
69
|
+
- spec/spec-i18n/example/before_and_after_hooks_spec.rb
|
70
|
+
- spec/spec-i18n/example/example_group_methods_spec.rb
|
71
|
+
- spec/spec-i18n/example_spec.rb
|
72
|
+
- spec/spec-i18n/expectations/kernel_spec.rb
|
73
|
+
- spec/spec-i18n/parser/natural_language_spec.rb
|
74
|
+
- spec/spec-i18n/runner/configuration_spec.rb
|
75
|
+
- spec/spec-i18n/runner/runner_spec.rb
|
76
|
+
- spec/spec-i18n/spec_language_spec.rb
|
77
|
+
- spec/spec.opts
|
78
|
+
- spec/spec_helper.rb
|
79
|
+
has_rdoc: true
|
80
|
+
homepage: http://github.com/tomas-stefano/rspec-i18n
|
81
|
+
licenses: []
|
82
|
+
|
83
|
+
post_install_message:
|
84
|
+
rdoc_options:
|
85
|
+
- --charset=UTF-8
|
86
|
+
require_paths:
|
87
|
+
- lib
|
88
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
89
|
+
requirements:
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: "0"
|
93
|
+
version:
|
94
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - ">="
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: "0"
|
99
|
+
version:
|
100
|
+
requirements: []
|
101
|
+
|
102
|
+
rubyforge_project:
|
103
|
+
rubygems_version: 1.3.5
|
104
|
+
signing_key:
|
105
|
+
specification_version: 3
|
106
|
+
summary: The internacionalization gem for Rspec
|
107
|
+
test_files:
|
108
|
+
- spec/spec-i18n/dsl/main_spec.rb
|
109
|
+
- spec/spec-i18n/example/before_and_after_hooks_spec.rb
|
110
|
+
- spec/spec-i18n/example/example_group_methods_spec.rb
|
111
|
+
- spec/spec-i18n/example_spec.rb
|
112
|
+
- spec/spec-i18n/expectations/kernel_spec.rb
|
113
|
+
- spec/spec-i18n/parser/natural_language_spec.rb
|
114
|
+
- spec/spec-i18n/runner/configuration_spec.rb
|
115
|
+
- spec/spec-i18n/runner/runner_spec.rb
|
116
|
+
- spec/spec-i18n/spec_language_spec.rb
|
117
|
+
- spec/spec_helper.rb
|
118
|
+
- examples/person_spec.rb
|