hydramata-works 0.0.1.prerelease

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 (188) 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 +36 -0
  8. data/Guardfile +36 -0
  9. data/LICENSE +15 -0
  10. data/README.md +36 -0
  11. data/Rakefile +47 -0
  12. data/TODO.md +74 -0
  13. data/VISION.md +19 -0
  14. data/app/forms/hydramata/works/entity_form.rb +92 -0
  15. data/app/forms/hydramata/works/validation_service.rb +78 -0
  16. data/app/models/hydramata/works/data_definition.rb +57 -0
  17. data/app/models/hydramata/works/entities.rb +11 -0
  18. data/app/models/hydramata/works/entity.rb +75 -0
  19. data/app/models/hydramata/works/predicate.rb +35 -0
  20. data/app/models/hydramata/works/predicate_presentation_sequences/storage.rb +29 -0
  21. data/app/models/hydramata/works/predicate_set.rb +44 -0
  22. data/app/models/hydramata/works/predicate_sets/storage.rb +45 -0
  23. data/app/models/hydramata/works/predicates.rb +14 -0
  24. data/app/models/hydramata/works/predicates/storage.rb +33 -0
  25. data/app/models/hydramata/works/presentation_structure.rb +29 -0
  26. data/app/models/hydramata/works/property.rb +72 -0
  27. data/app/models/hydramata/works/property_set.rb +89 -0
  28. data/app/models/hydramata/works/validations.rb +6 -0
  29. data/app/models/hydramata/works/value.rb +34 -0
  30. data/app/models/hydramata/works/work_type.rb +49 -0
  31. data/app/models/hydramata/works/work_types.rb +14 -0
  32. data/app/models/hydramata/works/work_types/storage.rb +42 -0
  33. data/app/parsers/hydramata/works/datastream_parser.rb +36 -0
  34. data/app/parsers/hydramata/works/datastream_parsers/rdf_ntriples_parser.rb +60 -0
  35. data/app/parsers/hydramata/works/datastream_parsers/simple_xml_parser.rb +27 -0
  36. data/app/parsers/hydramata/works/predicate_parser.rb +31 -0
  37. data/app/parsers/hydramata/works/predicate_parsers/simple_parser.rb +13 -0
  38. data/app/parsers/hydramata/works/validations_parser.rb +22 -0
  39. data/app/parsers/hydramata/works/value_parser.rb +26 -0
  40. data/app/parsers/hydramata/works/value_parsers.rb +27 -0
  41. data/app/parsers/hydramata/works/value_parsers/date_parser.rb +13 -0
  42. data/app/parsers/hydramata/works/value_parsers/interrogation_parser.rb +18 -0
  43. data/app/parsers/hydramata/works/value_parsers/simple_parser.rb +14 -0
  44. data/app/presenters/hydramata/works/base_presenter.rb +146 -0
  45. data/app/presenters/hydramata/works/dom_attributes_builder.rb +24 -0
  46. data/app/presenters/hydramata/works/entity_presenter.rb +67 -0
  47. data/app/presenters/hydramata/works/fieldset_presenter.rb +54 -0
  48. data/app/presenters/hydramata/works/property_presenter.rb +51 -0
  49. data/app/presenters/hydramata/works/value_presenter.rb +60 -0
  50. data/app/renderers/hydramata/works/entity_renderer.rb +45 -0
  51. data/app/views/hydramata/works/fieldsets/_edit.html.erb +4 -0
  52. data/app/views/hydramata/works/fieldsets/_show.html.erb +8 -0
  53. data/app/views/hydramata/works/fieldsets/_show.json.jbuilder +8 -0
  54. data/app/views/hydramata/works/properties/_edit.html.erb +12 -0
  55. data/app/views/hydramata/works/properties/_show.html.erb +3 -0
  56. data/app/views/hydramata/works/properties/_show.json.jbuilder +1 -0
  57. data/app/views/hydramata/works/works/_edit.html.erb +8 -0
  58. data/app/views/hydramata/works/works/_new.html.erb +8 -0
  59. data/app/views/hydramata/works/works/_show.html.erb +3 -0
  60. data/app/views/hydramata/works/works/_show.json.jbuilder +13 -0
  61. data/app/wranglers/hydramata/works/fedora_wrangler.rb +66 -0
  62. data/bin/rails +12 -0
  63. data/db/migrate/20140606132349_create_hydramata_work_predicates.rb +13 -0
  64. data/db/migrate/20140606132350_create_hydramata_work_types.rb +9 -0
  65. data/db/migrate/20140606132351_create_hydramata_work_predicate_sets.rb +13 -0
  66. data/db/migrate/20140606132352_create_hydramata_work_predicate_presentation_sequences.rb +12 -0
  67. data/db/migrate/20140623200635_add_validations_to_predicates.rb +5 -0
  68. data/db/migrate/20140627134133_adding_item_type_schema_dot_org_to_work_type.rb +5 -0
  69. data/db/migrate/20140627140840_adding_item_prop_schema_dot_org_to_predicate.rb +5 -0
  70. data/db/seeds.rb +36 -0
  71. data/documents/administrative-set-strawperson.md +45 -0
  72. data/documents/diagrams/hydramata-refactor-tasks.dot +88 -0
  73. data/documents/diagrams/hydramata-sip-dip-aip.dot +88 -0
  74. data/documents/diagrams/hydramata-work-architecture.dot +129 -0
  75. data/documents/diagrams/hydramata-work-subcomponents.dot +36 -0
  76. data/documents/diagrams/map-from-database-to-work-object.dot +44 -0
  77. data/documents/diagrams/map-from-fedora-to-work-object.dot +51 -0
  78. data/documents/diagrams/map-from-input-to-work-object.dot +37 -0
  79. data/documents/diagrams/map-from-work-object-to-database.dot +31 -0
  80. data/documents/diagrams/work-rendering.dot +53 -0
  81. data/documents/diagrams/work-structure.dot +32 -0
  82. data/documents/handling-work.md +224 -0
  83. data/documents/high-level-stories.md +105 -0
  84. data/documents/hydramata-components.md +82 -0
  85. data/documents/interface-between-work-and-permissions.md +131 -0
  86. data/documents/interface-between-work-and-workflow.md +6 -0
  87. data/documents/timeline.md +75 -0
  88. data/fs +3 -0
  89. data/gemfiles/rails4.1.gemfile +12 -0
  90. data/gemfiles/rails4.gemfile +13 -0
  91. data/hydramata-works.gemspec +43 -0
  92. data/lib/hydramata-works.rb +23 -0
  93. data/lib/hydramata/works/conversions.rb +21 -0
  94. data/lib/hydramata/works/conversions/exceptions.rb +18 -0
  95. data/lib/hydramata/works/conversions/predicate.rb +22 -0
  96. data/lib/hydramata/works/conversions/predicate_set.rb +28 -0
  97. data/lib/hydramata/works/conversions/presented_fieldsets.rb +28 -0
  98. data/lib/hydramata/works/conversions/presenter.rb +13 -0
  99. data/lib/hydramata/works/conversions/property.rb +31 -0
  100. data/lib/hydramata/works/conversions/property_set.rb +23 -0
  101. data/lib/hydramata/works/conversions/translation_key_fragment.rb +20 -0
  102. data/lib/hydramata/works/conversions/value.rb +20 -0
  103. data/lib/hydramata/works/conversions/work_type.rb +26 -0
  104. data/lib/hydramata/works/engine.rb +31 -0
  105. data/lib/hydramata/works/linters.rb +99 -0
  106. data/lib/hydramata/works/linters/implement_data_definition_interface_matcher.rb +17 -0
  107. data/lib/hydramata/works/linters/implement_entity_interface_matcher.rb +16 -0
  108. data/lib/hydramata/works/linters/implement_predicate_interface_matcher.rb +17 -0
  109. data/lib/hydramata/works/linters/implement_predicate_set_interface_matcher.rb +8 -0
  110. data/lib/hydramata/works/linters/implement_property_set_interface_matcher.rb +8 -0
  111. data/lib/hydramata/works/linters/implement_value_interface_matcher.rb +8 -0
  112. data/lib/hydramata/works/linters/implement_work_type_interface_matcher.rb +13 -0
  113. data/lib/hydramata/works/linters/interface_matcher_builder.rb +36 -0
  114. data/lib/hydramata/works/translator.rb +67 -0
  115. data/lib/hydramata/works/version.rb +5 -0
  116. data/lib/hydramata_works.rb +2 -0
  117. data/lib/tasks/hydramata_work_tasks.rake +4 -0
  118. data/run_each_spec_in_isolation +16 -0
  119. data/run_each_spec_in_isolation.txt +110 -0
  120. data/script/analyzer.rb +124 -0
  121. data/script/fast_specs +22 -0
  122. data/spec/features/fedora_to_in_memory_spec.rb +60 -0
  123. data/spec/features/format_and_view_path_overrides_spec.rb +72 -0
  124. data/spec/features/in_memory_to_output_buffer_spec.rb +109 -0
  125. data/spec/features/instantiate_entity_from_persisted_work_type_spec.rb +26 -0
  126. data/spec/features/new_user_input_to_in_memory_spec.rb +75 -0
  127. data/spec/features/translation_services_spec.rb +107 -0
  128. data/spec/features/validate_entity_based_on_work_type_structure_spec.rb +19 -0
  129. data/spec/fixtures/cassettes/fedora-object.yml +299 -0
  130. data/spec/fixtures/translations.yml +20 -0
  131. data/spec/forms/hydramata/works/entity_form_spec.rb +83 -0
  132. data/spec/forms/hydramata/works/validation_service_spec.rb +32 -0
  133. data/spec/lib/hydramata-work_spec.rb +14 -0
  134. data/spec/lib/hydramata/works/conversions/predicate_set_spec.rb +50 -0
  135. data/spec/lib/hydramata/works/conversions/predicate_spec.rb +43 -0
  136. data/spec/lib/hydramata/works/conversions/presented_fieldsets_spec.rb +52 -0
  137. data/spec/lib/hydramata/works/conversions/presenter_spec.rb +22 -0
  138. data/spec/lib/hydramata/works/conversions/property_set_spec.rb +42 -0
  139. data/spec/lib/hydramata/works/conversions/property_spec.rb +68 -0
  140. data/spec/lib/hydramata/works/conversions/translation_key_fragment_spec.rb +45 -0
  141. data/spec/lib/hydramata/works/conversions/value_spec.rb +36 -0
  142. data/spec/lib/hydramata/works/conversions/work_type_spec.rb +55 -0
  143. data/spec/lib/hydramata/works/translator_spec.rb +81 -0
  144. data/spec/models/hydramata/works/data_definition_spec.rb +53 -0
  145. data/spec/models/hydramata/works/entity_spec.rb +50 -0
  146. data/spec/models/hydramata/works/predicate_presentation_sequences/storage_spec.rb +15 -0
  147. data/spec/models/hydramata/works/predicate_set_spec.rb +63 -0
  148. data/spec/models/hydramata/works/predicate_sets/storage_spec.rb +37 -0
  149. data/spec/models/hydramata/works/predicate_spec.rb +16 -0
  150. data/spec/models/hydramata/works/predicates/storage_spec.rb +78 -0
  151. data/spec/models/hydramata/works/predicates_spec.rb +18 -0
  152. data/spec/models/hydramata/works/presentation_structure_spec.rb +27 -0
  153. data/spec/models/hydramata/works/property_set_spec.rb +135 -0
  154. data/spec/models/hydramata/works/property_spec.rb +74 -0
  155. data/spec/models/hydramata/works/value_spec.rb +61 -0
  156. data/spec/models/hydramata/works/work_type_spec.rb +45 -0
  157. data/spec/models/hydramata/works/work_types/storage_spec.rb +74 -0
  158. data/spec/models/hydramata/works/work_types_spec.rb +16 -0
  159. data/spec/parsers/hydramata/works/datastream_parser_spec.rb +29 -0
  160. data/spec/parsers/hydramata/works/datastream_parsers/rdf_ntriples_parser_spec.rb +65 -0
  161. data/spec/parsers/hydramata/works/datastream_parsers/simple_xml_parser_spec.rb +37 -0
  162. data/spec/parsers/hydramata/works/predicate_parser_spec.rb +30 -0
  163. data/spec/parsers/hydramata/works/predicate_parsers/simple_parser_spec.rb +20 -0
  164. data/spec/parsers/hydramata/works/validations_parser_spec.rb +31 -0
  165. data/spec/parsers/hydramata/works/value_parser_spec.rb +22 -0
  166. data/spec/parsers/hydramata/works/value_parsers/simple_parser_spec.rb +20 -0
  167. data/spec/parsers/hydramata/works/value_parsers_spec.rb +36 -0
  168. data/spec/presenters/hydramata/works/base_presenter_spec.rb +111 -0
  169. data/spec/presenters/hydramata/works/dom_attributes_builder_spec.rb +26 -0
  170. data/spec/presenters/hydramata/works/entity_presenter_spec.rb +51 -0
  171. data/spec/presenters/hydramata/works/fieldset_presenter_spec.rb +58 -0
  172. data/spec/presenters/hydramata/works/property_presenter_spec.rb +42 -0
  173. data/spec/presenters/hydramata/works/value_presenter_spec.rb +49 -0
  174. data/spec/renderers/hydramata/works/entity_renderer_spec.rb +25 -0
  175. data/spec/spec_active_record_helper.rb +30 -0
  176. data/spec/spec_fast_helper.rb +12 -0
  177. data/spec/spec_slow_helper.rb +56 -0
  178. data/spec/spec_view_helper.rb +14 -0
  179. data/spec/test_app_templates/lib/generators/test_app_generator.rb +21 -0
  180. data/spec/views/hydramata/works/fieldsets/_edit.html.erb_spec.rb +29 -0
  181. data/spec/views/hydramata/works/fieldsets/_show.html.erb_spec.rb +25 -0
  182. data/spec/views/hydramata/works/properties/_edit.html.erb_spec.rb +22 -0
  183. data/spec/views/hydramata/works/properties/_show.html.erb_spec.rb +22 -0
  184. data/spec/views/hydramata/works/works/_edit.html.erb_spec.rb +23 -0
  185. data/spec/views/hydramata/works/works/_new.html.erb_spec.rb +23 -0
  186. data/spec/views/hydramata/works/works/_show.html.erb_spec.rb +24 -0
  187. data/spec/wranglers/hydramata/works/fedora_wrangler_spec.rb +26 -0
  188. metadata +466 -0
@@ -0,0 +1,36 @@
1
+ require 'spec_fast_helper'
2
+ require 'hydramata/works/conversions/value'
3
+ require 'hydramata/works/linters/implement_value_interface_matcher'
4
+
5
+ module Hydramata
6
+ module Works
7
+ describe Conversions do
8
+ include Conversions
9
+
10
+ context '#Value' do
11
+ it 'should convert a Hash to a Value object' do
12
+ expect(Value(value: 'hello')).to implement_value_interface
13
+ end
14
+
15
+ it 'should convert an object that implements #to_value' do
16
+ object = double(to_value: Value.new(value: 'Value'))
17
+ expect(Value(object)).to eq(object.to_value)
18
+ end
19
+
20
+ it 'should convert a String to a Value object' do
21
+ expect(Value('hello')).to implement_value_interface
22
+ end
23
+
24
+ it 'should return the same Value if a Value is given' do
25
+ value = Value('hello')
26
+ expect(Value(value).object_id).to eq(value.object_id)
27
+ end
28
+
29
+ it 'should raise an error object is unexpected' do
30
+ expect { Value([]) }.to raise_error
31
+ end
32
+
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,55 @@
1
+ require 'spec_fast_helper'
2
+ require 'hydramata/works/conversions/work_type'
3
+ require 'hydramata/works/linters/implement_work_type_interface_matcher'
4
+
5
+ module Hydramata
6
+ module Works
7
+ describe Conversions do
8
+ include Conversions
9
+
10
+ context '#WorkType' do
11
+ it 'should not convert something that is not empty' do
12
+ expect{ WorkType(double(:empty? => false)) }.to raise_error
13
+ end
14
+ it 'should convert an empty value to a WorkType null object' do
15
+ expect(WorkType()).to implement_work_type_interface.with(:identity, 'unknown')
16
+ end
17
+
18
+ it 'should convert an Array to a WorkType null object' do
19
+ expect(WorkType([])).to implement_work_type_interface.with(:identity, 'unknown')
20
+ end
21
+
22
+ it 'should convert Nil to a WorkType null object' do
23
+ expect(WorkType(nil)).to implement_work_type_interface.with(:identity, 'unknown')
24
+ end
25
+
26
+ it 'should convert a String to a WorkType object' do
27
+ expect(WorkType('hello')).to implement_work_type_interface
28
+ end
29
+
30
+ it 'should convert a Symbol to a WorkType object' do
31
+ expect(WorkType(:hello)).to implement_work_type_interface
32
+ end
33
+
34
+ it 'should return the same work_type if a WorkType is given' do
35
+ work_type = WorkType(:hello)
36
+ expect(WorkType(work_type).object_id).to eq(work_type.object_id)
37
+ end
38
+
39
+ it 'should convert a "well-formed" Hash to a WorkType object' do
40
+ expect(WorkType(identity: 'hello')).to implement_work_type_interface
41
+ end
42
+
43
+ it 'should convert a "#to_work_type" to a WorkType object' do
44
+ stored_object = double('Object', to_work_type: WorkType.new)
45
+ expect(WorkType(stored_object)).to implement_work_type_interface
46
+ end
47
+
48
+ it 'should raise an error if the Hash is not "well-formed"' do
49
+ expect { WorkType(other: 'hello') }.to raise_error
50
+ end
51
+
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,81 @@
1
+ require 'spec_fast_helper'
2
+ require 'hydramata/works/translator'
3
+
4
+ module Hydramata
5
+ module Works
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', 'work'] }
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 'attempts to translate through each scope then finally via the base scope' do
30
+ expect(translation_service).to receive(:translate).
31
+ with('child', scope: (base_scope + scopes[0]), raise: true).
32
+ ordered.
33
+ and_raise(translation_service_error)
34
+ expect(translation_service).to receive(:translate).
35
+ with('child', scope: (base_scope + scopes[1]), raise: true).
36
+ ordered.
37
+ and_raise(translation_service_error)
38
+ expect(translation_service).to receive(:translate).
39
+ with('child', scope: base_scope, scopes: scopes).
40
+ ordered.
41
+ and_return('My Work Type')
42
+
43
+ expect(subject.translate('child', scopes: scopes)).to eq('My Work Type')
44
+ end
45
+
46
+ it 'translates through each scope until it finds a match then returns without processing more generic case' do
47
+ expect(translation_service).to receive(:translate).
48
+ with('child', scope: (base_scope + scopes[0]), raise: true).
49
+ ordered.
50
+ and_raise(translation_service_error)
51
+ expect(translation_service).to receive(:translate).
52
+ with('child', scope: (base_scope + scopes[1]), raise: true).
53
+ ordered.
54
+ and_return('Found Grandparent')
55
+ expect(translation_service).to_not receive(:translate).
56
+ with('child', scope: base_scope)
57
+
58
+ expect(subject.translate('child', scopes: scopes)).to eq('Found Grandparent')
59
+ end
60
+
61
+ it 'translates through each scope until it finds a match then returns without processing more generic case' do
62
+ expect(translation_service).to receive(:translate).
63
+ with('child', scope: (base_scope + scopes[0]), raise: true).
64
+ ordered.
65
+ and_raise(translation_service_error)
66
+ expect(translation_service).to receive(:translate).
67
+ with('child', scope: (base_scope + scopes[1]), raise: true).
68
+ ordered.
69
+ and_raise(translation_service_error)
70
+ expect(translation_service).to_not receive(:translate).
71
+ with('child', scope: base_scope, scopes: scopes).
72
+ ordered.
73
+ and_raise(translation_service_error)
74
+
75
+ expect { subject.translate('child', scopes: scopes) }.to raise_error
76
+ end
77
+ end
78
+
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,53 @@
1
+ # Instead of using spec_helper, I'm using the twice as fast custom helper
2
+ # for active record objects.
3
+ require 'spec_fast_helper'
4
+ require 'hydramata/works/data_definition'
5
+ require 'hydramata/works/linters/implement_data_definition_interface_matcher'
6
+
7
+ module Hydramata
8
+ module Works
9
+ describe DataDefinition do
10
+ subject { described_class.new(identity: 'My Identity') }
11
+ it { should implement_data_definition_interface }
12
+
13
+ it 'should initialize via attributes' do
14
+ expect(subject.identity).to eq('My Identity')
15
+ end
16
+
17
+ it 'should have a meaningful #to_s' do
18
+ expect(subject.to_s).to eq('My Identity')
19
+ end
20
+
21
+ context '#==' do
22
+ subject { described_class.new(identity: 'My Identity') }
23
+
24
+ it 'be true if class and identity is equal' do
25
+ other = described_class.new(identity: subject.identity)
26
+ expect(subject == other).to be_truthy
27
+ end
28
+
29
+ it 'be false if identity is equal but not class' do
30
+ other = double(identity: subject.identity)
31
+ expect(subject == other).to be_falsey
32
+ end
33
+
34
+ it 'be false if class is equal but not identity' do
35
+ other = subject.class.new(identity: "#{subject.identity}1")
36
+ expect(subject == other).to be_falsey
37
+ end
38
+ end
39
+
40
+ context '#to_translation_key_fragment' do
41
+ it 'should default to identity if no name is given for application usage' do
42
+ expect(subject.to_translation_key_fragment).to eq subject.identity
43
+ end
44
+
45
+ it 'should default to identity if no name is given for application usage' do
46
+ subject = described_class.new(identity: 'My Identity', name_for_application_usage: 'Twonky')
47
+ expect(subject.to_translation_key_fragment).to eq 'Twonky'
48
+ end
49
+ end
50
+
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,50 @@
1
+ require 'spec_fast_helper'
2
+ require 'hydramata/works/entity'
3
+ require 'hydramata/works/linters/implement_entity_interface_matcher'
4
+
5
+ module Hydramata
6
+ module Works
7
+ describe Entity do
8
+ subject { described_class.new }
9
+ it { should implement_entity_interface }
10
+
11
+ let(:predicate) { :title }
12
+ let(:value) { 'Hello' }
13
+ let(:property) { Property.new(predicate: predicate, value: value) }
14
+
15
+
16
+ context '#to_presenter' do
17
+ let(:presenter_builder) { double('Presenter Builder', call: :built) }
18
+ subject { described_class.new(presenter_builder: presenter_builder) }
19
+ it 'should call the presenter_builder' do
20
+ expect(subject.to_presenter).to eq(:built)
21
+ expect(presenter_builder).to have_received(:call).with(subject)
22
+ end
23
+ end
24
+
25
+ context '#has_property?' do
26
+ it 'changes from false to true when the property is added' do
27
+ expect { subject.properties << property }.
28
+ to change { subject.has_property?(predicate) }.
29
+ from(false).
30
+ to(true)
31
+ end
32
+ end
33
+
34
+ context '#properties' do
35
+ it 'can be appended' do
36
+ expect { subject.properties << property }.
37
+ to change { subject.properties.count }.
38
+ by(1)
39
+ end
40
+ end
41
+
42
+ context '#property' do
43
+ it 'returns matching predicates' do
44
+ subject.properties << property
45
+ expect(subject.properties[predicate]).to eq(property)
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,15 @@
1
+ # Instead of using spec_helper, I'm using the twice as fast custom helper
2
+ # for active record objects.
3
+ require 'spec_active_record_helper'
4
+ require 'hydramata/works/predicate_presentation_sequences/storage'
5
+
6
+ module Hydramata
7
+ module Works
8
+ module PredicatePresentationSequences
9
+
10
+ describe Storage do
11
+ subject { described_class.new }
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,63 @@
1
+ require 'spec_fast_helper'
2
+ require 'hydramata/works/predicate_set'
3
+ require 'hydramata/works/linters/implement_predicate_set_interface_matcher'
4
+
5
+ module Hydramata
6
+ module Works
7
+ describe PredicateSet do
8
+ subject { described_class.new(identity: 'My Identity') }
9
+ it { should implement_predicate_set_interface }
10
+
11
+ it 'should initialize via attributes' do
12
+ expect(subject.identity).to eq('My Identity')
13
+ end
14
+
15
+ it 'should initialize via attributes' do
16
+ expect(subject.identity).to eq('My Identity')
17
+ end
18
+
19
+ context 'comparability' do
20
+ let(:work_type) { 'Work Type' }
21
+ let(:identity) { 'Identity' }
22
+ subject { described_class.new(identity: 'Identity', work_type: work_type) }
23
+
24
+ it 'is != if they are different base classes' do
25
+ other = double(work_type: work_type, identity: identity)
26
+ expect(subject == other).to be_falsey
27
+ end
28
+
29
+ it 'is == if they are the same object' do
30
+ expect(subject == subject).to be_truthy
31
+ end
32
+
33
+ it 'is == if work type and identity are the same' do
34
+ other = described_class.new(identity: identity, work_type: work_type)
35
+ expect(subject == other).to be_truthy
36
+ end
37
+
38
+ it 'is != if work type is the same but not identity' do
39
+ other = described_class.new(identity: identity + 'not', work_type: work_type)
40
+ expect(subject == other).to be_falsey
41
+ end
42
+
43
+ it 'is != if identity is the same but not work type' do
44
+ other = described_class.new(identity: identity, work_type: work_type + 'not')
45
+ expect(subject == other).to be_falsey
46
+ end
47
+
48
+ it 'is "nil" when we are comparing against other objects' do
49
+ other = double("Other")
50
+ expect(subject <=> other).to be_nil
51
+ end
52
+
53
+ it 'is based on the array underlying array' do
54
+ other = described_class.new(identity: 'Z' + identity, work_type: 'A' + work_type)
55
+ # The other one is greater than this one
56
+ expect(subject <=> other).to eq(1)
57
+ end
58
+
59
+ end
60
+
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,37 @@
1
+ # Instead of using spec_helper, I'm using the twice as fast custom helper
2
+ # for active record objects.
3
+ require 'spec_active_record_helper'
4
+ require 'hydramata/works/work_type'
5
+ require 'hydramata/works/predicate_sets/storage'
6
+ require 'hydramata/works/linters/implement_predicate_set_interface_matcher'
7
+
8
+ module Hydramata
9
+ module Works
10
+ module PredicateSets
11
+
12
+ describe Storage do
13
+ it { should implement_predicate_set_interface }
14
+
15
+ let(:identity) { 'a predicate' }
16
+ let(:work_type) { WorkTypes::Storage.create(identity: 'a_work_type') }
17
+ subject do
18
+ described_class.create(
19
+ work_type: work_type,
20
+ identity: identity,
21
+ presentation_sequence: 1,
22
+ name_for_application_usage: 'predicate_set_name'
23
+ )
24
+ end
25
+
26
+ it 'belongs to a work_type' do
27
+ expect(subject.work_type).to eq(work_type)
28
+ end
29
+
30
+ it 'has #to_predicate_set' do
31
+ expect(described_class.new.to_predicate_set).to implement_predicate_set_interface
32
+ end
33
+
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,16 @@
1
+ # Instead of using spec_helper, I'm using the twice as fast custom helper
2
+ # for active record objects.
3
+ require 'spec_active_record_helper'
4
+ require 'hydramata/works/predicate'
5
+ require 'hydramata/works/linters/implement_predicate_interface_matcher'
6
+ require 'hydramata/works/linters/implement_data_definition_interface_matcher'
7
+
8
+ module Hydramata
9
+ module Works
10
+ describe Predicate do
11
+ subject { described_class.new }
12
+ it { should implement_predicate_interface }
13
+ it { should implement_data_definition_interface }
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,78 @@
1
+ # Instead of using spec_helper, I'm using the twice as fast custom helper
2
+ # for active record objects.
3
+ require 'spec_active_record_helper'
4
+ require 'hydramata/works/predicates/storage'
5
+ require 'hydramata/works/linters/implement_predicate_interface_matcher'
6
+
7
+ module Hydramata
8
+ module Works
9
+ module Predicates
10
+
11
+ describe Storage do
12
+ subject { described_class.new }
13
+
14
+ let(:identity) { 'http://hello.com/world' }
15
+ let(:predicate) do
16
+ described_class.create(
17
+ identity: identity,
18
+ name_for_application_usage: 'hello-world',
19
+ datastream_name: 'descMetadata',
20
+ value_coercer_name: 'SimpleParser',
21
+ value_parser_name: 'SimpleParser',
22
+ indexing_strategy: 'dsti',
23
+ validations: '{ "presence": { "on": "create" } }'
24
+ )
25
+ end
26
+
27
+ it { should implement_predicate_interface }
28
+
29
+ context '#to_predicate' do
30
+ it 'coerces itself to a predicate' do
31
+ expect(described_class.new.to_predicate).to implement_predicate_interface
32
+ end
33
+ end
34
+
35
+ context '.find_by_identity' do
36
+
37
+ it 'returns a Predicate object when identity exists' do
38
+ predicate # creating the object
39
+ expect(described_class.find_by_identity!(identity)).to implement_predicate_interface
40
+ end
41
+
42
+ it 'returns nil when identity is missing' do
43
+ # @TODO - Should this be a NullPredicate?
44
+ expect { described_class.find_by_identity!(identity) }.to raise_error
45
+ end
46
+ end
47
+
48
+ context '.existing_attributes_for' do
49
+ it 'should return the existing predicate attributes' do
50
+ predicate
51
+ keys = [
52
+ :id,
53
+ :identity,
54
+ :name_for_application_usage,
55
+ :datastream_name,
56
+ :value_coercer_name,
57
+ :value_parser_name,
58
+ :indexing_strategy
59
+ ]
60
+ actual_values = described_class.existing_attributes_for(identity).values_at(keys)
61
+ # Because date comparisons are a bit wonky
62
+ expect(actual_values).to eq(predicate.attributes.values_at(keys))
63
+ end
64
+
65
+ it 'should return the identity if a matching predicate was not found' do
66
+ expect(described_class.existing_attributes_for(identity)).to eq(identity: identity)
67
+ end
68
+
69
+ it 'should handle connection failed' do
70
+ expect(described_class).to receive(:find_by_identity!).and_raise(ActiveRecord::ConnectionNotEstablished)
71
+ expect(described_class.existing_attributes_for(identity)).to eq(identity: identity)
72
+ end
73
+ end
74
+
75
+ end
76
+ end
77
+ end
78
+ end