hydramata-core 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.
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