hydramata-core 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/.hound.yml +818 -0
  4. data/.rspec +2 -0
  5. data/.travis.yml +20 -0
  6. data/CONTRIBUTING.md +220 -0
  7. data/Gemfile +34 -0
  8. data/Guardfile +36 -0
  9. data/LICENSE +15 -0
  10. data/README.md +13 -0
  11. data/Rakefile +40 -0
  12. data/bin/rails +12 -0
  13. data/fs +3 -0
  14. data/gemfiles/rails4.1.gemfile +12 -0
  15. data/gemfiles/rails4.gemfile +13 -0
  16. data/hydramata-core.gemspec +35 -0
  17. data/lib/hydramata-core.rb +1 -0
  18. data/lib/hydramata/configuration.rb +17 -0
  19. data/lib/hydramata/core.rb +42 -0
  20. data/lib/hydramata/core/named_callbacks.rb +24 -0
  21. data/lib/hydramata/core/railtie.rb +14 -0
  22. data/lib/hydramata/core/runner.rb +58 -0
  23. data/lib/hydramata/core/translator.rb +72 -0
  24. data/lib/hydramata/core/version.rb +5 -0
  25. data/lib/hydramata/exceptions.rb +4 -0
  26. data/lib/hydramata/services.rb +21 -0
  27. data/lib/hydramata_core.rb +2 -0
  28. data/lib/tasks/hydramata_mecha_tasks.rake +4 -0
  29. data/run_each_spec_in_isolation +11 -0
  30. data/script/analyzer.rb +124 -0
  31. data/script/fast_specs +22 -0
  32. data/spec/README.md +10 -0
  33. data/spec/features/translation_services_spec.rb +35 -0
  34. data/spec/fixtures/core.translations.yml +8 -0
  35. data/spec/lib/hydramata-translations_spec.rb +7 -0
  36. data/spec/lib/hydramata/configuration_spec.rb +38 -0
  37. data/spec/lib/hydramata/core/named_callbacks_spec.rb +30 -0
  38. data/spec/lib/hydramata/core/runner_spec.rb +45 -0
  39. data/spec/lib/hydramata/core/translator_spec.rb +94 -0
  40. data/spec/lib/hydramata/services_spec.rb +27 -0
  41. data/spec/spec_fast_helper.rb +33 -0
  42. metadata +164 -0
data/spec/README.md ADDED
@@ -0,0 +1,10 @@
1
+ Congratulations, you are reading the README of the specs.
2
+
3
+ Why is this here? Because specs are an important subject.
4
+
5
+ One of my development foci for Hydramata::Core has been a focus on keeping the test suite's runtime healthy. Yes, each spec that I write adds time to the test suite, but I want that to be a linear growth.
6
+
7
+ In this directory you will find several files with filename pattern `spec_*_helper.rb`.
8
+ As I've worked through specs, my goal has been to use the fastest spec helper
9
+ possible.
10
+ This typically means striving to use the `spec_fast_helper.rb`, but acknowledging that may not be feasible.
@@ -0,0 +1,35 @@
1
+ require 'spec_fast_helper'
2
+ require 'i18n'
3
+ require 'hydramata/core/translator'
4
+
5
+ module Hydramata
6
+ module Core
7
+ describe 'Translation services' do
8
+
9
+ it 'allows overriding the :base_scope and nested lookup of scopes' do
10
+ result = Translator.translate('my_message_key', base_scope: ['other'], scopes: ['nested'], name: 'Jeremy')
11
+ expect(result).to eq('Thanks but no thanks Jeremy!')
12
+ end
13
+
14
+ it 'has a default :base_scope' do
15
+ result = Translator.translate('my_message_key', name: 'Jeremy')
16
+ expect(result).to eq('Thanks Jeremy!')
17
+ end
18
+
19
+ around do |example|
20
+ begin
21
+ # @TODO - The structure of the hash is not ideal. The order of keys is
22
+ # somewhat counter-intuitive.
23
+ old_backend = I18n.backend
24
+ I18n.backend = old_backend.clone
25
+ core = Psych.load_file(File.expand_path('../../fixtures/core.translations.yml', __FILE__))
26
+ I18n.backend.store_translations(:en, core.fetch('en'))
27
+ example.run
28
+ ensure
29
+ I18n.backend = old_backend
30
+ end
31
+ end
32
+
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,8 @@
1
+ en:
2
+ other:
3
+ my_message_key: 'No thank you %{name}!'
4
+ nested:
5
+ my_message_key: 'Thanks but no thanks %{name}!'
6
+ hydramata:
7
+ core:
8
+ my_message_key: 'Thanks %{name}!'
@@ -0,0 +1,7 @@
1
+ require 'spec_fast_helper'
2
+ require 'hydramata-core'
3
+
4
+ module Hydramata
5
+ describe Core do
6
+ end
7
+ end
@@ -0,0 +1,38 @@
1
+ require 'spec_fast_helper'
2
+ require 'active_support/lazy_load_hooks'
3
+
4
+ module Hydramata
5
+ class Configuration
6
+ end
7
+
8
+ module MockConfiguration
9
+ end
10
+
11
+ describe 'Configuration' do
12
+ it 'allows loading of additional modules' do
13
+ expect do
14
+ ActiveSupport.on_load(:hydramata_configuration) do
15
+ include MockConfiguration
16
+ end
17
+ require 'hydramata/configuration'
18
+ end.to change { Configuration.included_modules.include?(MockConfiguration) }.from(false).to(true)
19
+ end
20
+
21
+ context '#translator' do
22
+ subject { Configuration.new }
23
+ it 'defaults to something that will translate' do
24
+ expect(subject.translator).to respond_to(:translate)
25
+ end
26
+ it 'can be overridden by something that will translate' do
27
+ new_translator = double(translate: true)
28
+ expect { subject.translator = new_translator }.
29
+ to change { subject.translator }.
30
+ to(new_translator)
31
+ end
32
+ it 'requires a translator to have the proper methods' do
33
+ new_translator = double
34
+ expect { subject.translator = new_translator }.to raise_error
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_fast_helper'
2
+ require 'hydramata/core/named_callbacks'
3
+
4
+ module Hydramata
5
+ module Core
6
+ describe NamedCallbacks do
7
+ Given(:named_callback) { described_class.new }
8
+ Given(:context) { [ ] }
9
+ Given { named_callback.my_named_callback { |*a| context.replace(a) } }
10
+
11
+ describe "with a named callback" do
12
+ Given(:callback_name) { :my_named_callback }
13
+ When { named_callback.call(callback_name, 'a',:hello) }
14
+ Then { context == ['a', :hello] }
15
+ end
16
+
17
+ describe "with a named callback called by a string" do
18
+ Given(:callback_name) { 'my_named_callback' }
19
+ When { named_callback.call(callback_name, 'a',:hello) }
20
+ Then { context == ['a', :hello] }
21
+ end
22
+
23
+ describe "with a undeclared callback" do
24
+ When(:result) { named_callback.call(:undeclared_callback, 1, 2, 3) }
25
+ Then { result }
26
+ Then { context == [] }
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,45 @@
1
+ require 'spec_fast_helper'
2
+ require 'hydramata/core/runner'
3
+
4
+ module Hydramata
5
+ module Core
6
+
7
+ describe Runner do
8
+ Given(:context) { double(invoked: true, services: services) }
9
+ Given(:services) { double('Services') }
10
+ Given(:runner) {
11
+ described_class.new(context) do |on|
12
+ on.success { |a, b| context.invoked("SUCCESS", a, b) }
13
+ on.failure { |a, b| context.invoked("FAILURE", a, b) }
14
+ on.other { |a, b| context.invoked("OTHER", a, b) }
15
+ end
16
+ }
17
+
18
+ Invariant { runner.context == context }
19
+
20
+ context '#services' do
21
+ it 'delegates to the context' do
22
+ expect(runner.services).to eq(services)
23
+ end
24
+ end
25
+ context "#run" do
26
+ it 'is an abstract method' do
27
+ expect { runner.run }.to raise_error(NotImplementedError)
28
+ end
29
+ end
30
+
31
+ context "calling other" do
32
+ When(:result) { runner.callback(:other, :first, :second) }
33
+ Then { expect(context).to have_received(:invoked).with("OTHER", :first, :second) }
34
+ Then { result == [:first, :second] }
35
+ end
36
+
37
+ context "calling unknown" do
38
+ When(:result) { runner.callback(:unknown, :first, :second) }
39
+ Then { expect(context).to_not have_received(:invoked) }
40
+ Then { result == [:first, :second] }
41
+ end
42
+
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,94 @@
1
+ require 'spec_fast_helper'
2
+ require 'hydramata/core/translator'
3
+
4
+ module Hydramata
5
+ module Core
6
+ describe Translator do
7
+ subject do
8
+ described_class.new(
9
+ base_scope: base_scope,
10
+ translation_service: translation_service,
11
+ translation_service_error: translation_service_error
12
+ )
13
+ end
14
+ let(:base_scope) { ['hydramata', 'core'] }
15
+ let(:scopes) { [['grandparent', 'parent'], ['grandparent']] }
16
+ let(:translation_service) { double('TranslationService', translate: true) }
17
+ let(:translation_service_error) { ArgumentError }
18
+
19
+ context '#translate' do
20
+ it 'passes options to the default rendering' do
21
+ expect(translation_service).to receive(:translate).
22
+ with('child', scope: base_scope, default: 'default').
23
+ ordered.
24
+ and_return('With Default')
25
+
26
+ expect(subject.translate('child', default: 'default')).to eq('With Default')
27
+ end
28
+
29
+ it 'swallows defaults except on the final rendering' do
30
+ scopes = [['parent']]
31
+ expect(translation_service).to receive(:translate).
32
+ with('child', scope: (base_scope + scopes[0]), raise: true, other_key: 'other').
33
+ ordered.
34
+ and_raise(translation_service_error)
35
+ expect(translation_service).to receive(:translate).
36
+ with('child', scope: base_scope, other_key: 'other', default: 'Shine On').
37
+ ordered.
38
+ and_return('My Work Type')
39
+ expect(subject.translate('child', scopes: scopes, other_key: 'other', default: 'Shine On'))
40
+ end
41
+
42
+ it 'attempts to translate through each scope then finally via the base scope' do
43
+ expect(translation_service).to receive(:translate).
44
+ with('child', scope: (base_scope + scopes[0]), raise: true, other_key: 'other').
45
+ ordered.
46
+ and_raise(translation_service_error)
47
+ expect(translation_service).to receive(:translate).
48
+ with('child', scope: (base_scope + scopes[1]), raise: true, other_key: 'other').
49
+ ordered.
50
+ and_raise(translation_service_error)
51
+ expect(translation_service).to receive(:translate).
52
+ with('child', scope: base_scope, other_key: 'other').
53
+ ordered.
54
+ and_return('My Work Type')
55
+
56
+ expect(subject.translate('child', scopes: scopes, other_key: 'other')).to eq('My Work Type')
57
+ end
58
+
59
+ it 'translates through each scope until it finds a match then returns without processing more generic case' do
60
+ expect(translation_service).to receive(:translate).
61
+ with('child', scope: (base_scope + scopes[0]), raise: true).
62
+ ordered.
63
+ and_raise(translation_service_error)
64
+ expect(translation_service).to receive(:translate).
65
+ with('child', scope: (base_scope + scopes[1]), raise: true).
66
+ ordered.
67
+ and_return('Found Grandparent')
68
+ expect(translation_service).to_not receive(:translate).
69
+ with('child', scope: base_scope)
70
+
71
+ expect(subject.translate('child', scopes: scopes)).to eq('Found Grandparent')
72
+ end
73
+
74
+ it 'translates through each scope until it finds a match then returns without processing more generic case' do
75
+ expect(translation_service).to receive(:translate).
76
+ with('child', scope: (base_scope + scopes[0]), raise: true).
77
+ ordered.
78
+ and_raise(translation_service_error)
79
+ expect(translation_service).to receive(:translate).
80
+ with('child', scope: (base_scope + scopes[1]), raise: true).
81
+ ordered.
82
+ and_raise(translation_service_error)
83
+ expect(translation_service).to_not receive(:translate).
84
+ with('child', scope: base_scope).
85
+ ordered.
86
+ and_raise(translation_service_error)
87
+
88
+ expect { subject.translate('child', scopes: scopes) }.to raise_error
89
+ end
90
+ end
91
+
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_fast_helper'
2
+ require 'active_support/lazy_load_hooks'
3
+ module Hydramata
4
+ class Services
5
+ end
6
+
7
+ module MockServices
8
+ end
9
+
10
+ describe 'Services' do
11
+ it 'allows loading of additional modules' do
12
+ expect do
13
+ ActiveSupport.on_load(:hydramata_services) do
14
+ include MockServices
15
+ end
16
+ require 'hydramata/services'
17
+ end.to change { Services.included_modules.include?(MockServices) }.from(false).to(true)
18
+ end
19
+
20
+ context '#translator' do
21
+ Given(:context) { double('Context') }
22
+ Given(:service) { Services.new(context) }
23
+ Then { service.context == context }
24
+ end
25
+
26
+ end
27
+ end
@@ -0,0 +1,33 @@
1
+ # This helper provides at least a ~x3 speed increase over the 'spec_slow_helper'.
2
+ #
3
+ # The idea being that some tests have very few dependencies.
4
+ #
5
+ # Example:
6
+ # $ time rspec -r spec/spec_fast_helper.rb spec/lib/hydramata-work_spec.rb
7
+ #
8
+ # real 0m1.188s
9
+ # user 0m0.979s
10
+ # sys 0m0.204s
11
+ #
12
+ # Compared to `rspec -r spec/spec_slow_helper.rb ./path/to/spec.rb`
13
+ #
14
+ # Example:
15
+ # $ time rspec -r spec/spec_slow_helper.rb spec/lib/hydramata-work_spec.rb
16
+ #
17
+ # real 0m3.491s
18
+ # user 0m2.800s
19
+ # sys 0m0.667s
20
+
21
+ require 'rspec-given'
22
+ unless defined?(Rails) # If we are in a Rails context this is overkill.
23
+ Dir[File.expand_path('../../app/*', __FILE__)].each do |dir|
24
+ $LOAD_PATH << dir
25
+ end
26
+ $LOAD_PATH << File.expand_path('../../lib', __FILE__)
27
+
28
+ unless defined?(require_dependency)
29
+ def require_dependency(*files)
30
+ require *files
31
+ end
32
+ end
33
+ end
metadata ADDED
@@ -0,0 +1,164 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hydramata-core
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Jeremy Friesen
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-11-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec-given
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3.5'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.5'
41
+ - !ruby/object:Gem::Dependency
42
+ name: sqlite3
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubydora
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.7'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.7'
69
+ - !ruby/object:Gem::Dependency
70
+ name: database_cleaner
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.3'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.3'
83
+ description: ''
84
+ email:
85
+ - jeremy.n.friesen@gmail.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - ".gitignore"
91
+ - ".hound.yml"
92
+ - ".rspec"
93
+ - ".travis.yml"
94
+ - CONTRIBUTING.md
95
+ - Gemfile
96
+ - Guardfile
97
+ - LICENSE
98
+ - README.md
99
+ - Rakefile
100
+ - bin/rails
101
+ - fs
102
+ - gemfiles/rails4.1.gemfile
103
+ - gemfiles/rails4.gemfile
104
+ - hydramata-core.gemspec
105
+ - lib/hydramata-core.rb
106
+ - lib/hydramata/configuration.rb
107
+ - lib/hydramata/core.rb
108
+ - lib/hydramata/core/named_callbacks.rb
109
+ - lib/hydramata/core/railtie.rb
110
+ - lib/hydramata/core/runner.rb
111
+ - lib/hydramata/core/translator.rb
112
+ - lib/hydramata/core/version.rb
113
+ - lib/hydramata/exceptions.rb
114
+ - lib/hydramata/services.rb
115
+ - lib/hydramata_core.rb
116
+ - lib/tasks/hydramata_mecha_tasks.rake
117
+ - run_each_spec_in_isolation
118
+ - script/analyzer.rb
119
+ - script/fast_specs
120
+ - spec/README.md
121
+ - spec/features/translation_services_spec.rb
122
+ - spec/fixtures/core.translations.yml
123
+ - spec/lib/hydramata-translations_spec.rb
124
+ - spec/lib/hydramata/configuration_spec.rb
125
+ - spec/lib/hydramata/core/named_callbacks_spec.rb
126
+ - spec/lib/hydramata/core/runner_spec.rb
127
+ - spec/lib/hydramata/core/translator_spec.rb
128
+ - spec/lib/hydramata/services_spec.rb
129
+ - spec/spec_fast_helper.rb
130
+ homepage: https://github.com/ndlib/hydramata-core
131
+ licenses:
132
+ - APACHE2
133
+ metadata: {}
134
+ post_install_message:
135
+ rdoc_options: []
136
+ require_paths:
137
+ - lib
138
+ required_ruby_version: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - "~>"
141
+ - !ruby/object:Gem::Version
142
+ version: '2.0'
143
+ required_rubygems_version: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
148
+ requirements: []
149
+ rubyforge_project:
150
+ rubygems_version: 2.2.2
151
+ signing_key:
152
+ specification_version: 4
153
+ summary: ''
154
+ test_files:
155
+ - spec/README.md
156
+ - spec/features/translation_services_spec.rb
157
+ - spec/fixtures/core.translations.yml
158
+ - spec/lib/hydramata-translations_spec.rb
159
+ - spec/lib/hydramata/configuration_spec.rb
160
+ - spec/lib/hydramata/core/named_callbacks_spec.rb
161
+ - spec/lib/hydramata/core/runner_spec.rb
162
+ - spec/lib/hydramata/core/translator_spec.rb
163
+ - spec/lib/hydramata/services_spec.rb
164
+ - spec/spec_fast_helper.rb