hydramata-works 0.0.1.prerelease
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/.hound.yml +818 -0
- data/.rspec +2 -0
- data/.travis.yml +20 -0
- data/CONTRIBUTING.md +220 -0
- data/Gemfile +36 -0
- data/Guardfile +36 -0
- data/LICENSE +15 -0
- data/README.md +36 -0
- data/Rakefile +47 -0
- data/TODO.md +74 -0
- data/VISION.md +19 -0
- data/app/forms/hydramata/works/entity_form.rb +92 -0
- data/app/forms/hydramata/works/validation_service.rb +78 -0
- data/app/models/hydramata/works/data_definition.rb +57 -0
- data/app/models/hydramata/works/entities.rb +11 -0
- data/app/models/hydramata/works/entity.rb +75 -0
- data/app/models/hydramata/works/predicate.rb +35 -0
- data/app/models/hydramata/works/predicate_presentation_sequences/storage.rb +29 -0
- data/app/models/hydramata/works/predicate_set.rb +44 -0
- data/app/models/hydramata/works/predicate_sets/storage.rb +45 -0
- data/app/models/hydramata/works/predicates.rb +14 -0
- data/app/models/hydramata/works/predicates/storage.rb +33 -0
- data/app/models/hydramata/works/presentation_structure.rb +29 -0
- data/app/models/hydramata/works/property.rb +72 -0
- data/app/models/hydramata/works/property_set.rb +89 -0
- data/app/models/hydramata/works/validations.rb +6 -0
- data/app/models/hydramata/works/value.rb +34 -0
- data/app/models/hydramata/works/work_type.rb +49 -0
- data/app/models/hydramata/works/work_types.rb +14 -0
- data/app/models/hydramata/works/work_types/storage.rb +42 -0
- data/app/parsers/hydramata/works/datastream_parser.rb +36 -0
- data/app/parsers/hydramata/works/datastream_parsers/rdf_ntriples_parser.rb +60 -0
- data/app/parsers/hydramata/works/datastream_parsers/simple_xml_parser.rb +27 -0
- data/app/parsers/hydramata/works/predicate_parser.rb +31 -0
- data/app/parsers/hydramata/works/predicate_parsers/simple_parser.rb +13 -0
- data/app/parsers/hydramata/works/validations_parser.rb +22 -0
- data/app/parsers/hydramata/works/value_parser.rb +26 -0
- data/app/parsers/hydramata/works/value_parsers.rb +27 -0
- data/app/parsers/hydramata/works/value_parsers/date_parser.rb +13 -0
- data/app/parsers/hydramata/works/value_parsers/interrogation_parser.rb +18 -0
- data/app/parsers/hydramata/works/value_parsers/simple_parser.rb +14 -0
- data/app/presenters/hydramata/works/base_presenter.rb +146 -0
- data/app/presenters/hydramata/works/dom_attributes_builder.rb +24 -0
- data/app/presenters/hydramata/works/entity_presenter.rb +67 -0
- data/app/presenters/hydramata/works/fieldset_presenter.rb +54 -0
- data/app/presenters/hydramata/works/property_presenter.rb +51 -0
- data/app/presenters/hydramata/works/value_presenter.rb +60 -0
- data/app/renderers/hydramata/works/entity_renderer.rb +45 -0
- data/app/views/hydramata/works/fieldsets/_edit.html.erb +4 -0
- data/app/views/hydramata/works/fieldsets/_show.html.erb +8 -0
- data/app/views/hydramata/works/fieldsets/_show.json.jbuilder +8 -0
- data/app/views/hydramata/works/properties/_edit.html.erb +12 -0
- data/app/views/hydramata/works/properties/_show.html.erb +3 -0
- data/app/views/hydramata/works/properties/_show.json.jbuilder +1 -0
- data/app/views/hydramata/works/works/_edit.html.erb +8 -0
- data/app/views/hydramata/works/works/_new.html.erb +8 -0
- data/app/views/hydramata/works/works/_show.html.erb +3 -0
- data/app/views/hydramata/works/works/_show.json.jbuilder +13 -0
- data/app/wranglers/hydramata/works/fedora_wrangler.rb +66 -0
- data/bin/rails +12 -0
- data/db/migrate/20140606132349_create_hydramata_work_predicates.rb +13 -0
- data/db/migrate/20140606132350_create_hydramata_work_types.rb +9 -0
- data/db/migrate/20140606132351_create_hydramata_work_predicate_sets.rb +13 -0
- data/db/migrate/20140606132352_create_hydramata_work_predicate_presentation_sequences.rb +12 -0
- data/db/migrate/20140623200635_add_validations_to_predicates.rb +5 -0
- data/db/migrate/20140627134133_adding_item_type_schema_dot_org_to_work_type.rb +5 -0
- data/db/migrate/20140627140840_adding_item_prop_schema_dot_org_to_predicate.rb +5 -0
- data/db/seeds.rb +36 -0
- data/documents/administrative-set-strawperson.md +45 -0
- data/documents/diagrams/hydramata-refactor-tasks.dot +88 -0
- data/documents/diagrams/hydramata-sip-dip-aip.dot +88 -0
- data/documents/diagrams/hydramata-work-architecture.dot +129 -0
- data/documents/diagrams/hydramata-work-subcomponents.dot +36 -0
- data/documents/diagrams/map-from-database-to-work-object.dot +44 -0
- data/documents/diagrams/map-from-fedora-to-work-object.dot +51 -0
- data/documents/diagrams/map-from-input-to-work-object.dot +37 -0
- data/documents/diagrams/map-from-work-object-to-database.dot +31 -0
- data/documents/diagrams/work-rendering.dot +53 -0
- data/documents/diagrams/work-structure.dot +32 -0
- data/documents/handling-work.md +224 -0
- data/documents/high-level-stories.md +105 -0
- data/documents/hydramata-components.md +82 -0
- data/documents/interface-between-work-and-permissions.md +131 -0
- data/documents/interface-between-work-and-workflow.md +6 -0
- data/documents/timeline.md +75 -0
- data/fs +3 -0
- data/gemfiles/rails4.1.gemfile +12 -0
- data/gemfiles/rails4.gemfile +13 -0
- data/hydramata-works.gemspec +43 -0
- data/lib/hydramata-works.rb +23 -0
- data/lib/hydramata/works/conversions.rb +21 -0
- data/lib/hydramata/works/conversions/exceptions.rb +18 -0
- data/lib/hydramata/works/conversions/predicate.rb +22 -0
- data/lib/hydramata/works/conversions/predicate_set.rb +28 -0
- data/lib/hydramata/works/conversions/presented_fieldsets.rb +28 -0
- data/lib/hydramata/works/conversions/presenter.rb +13 -0
- data/lib/hydramata/works/conversions/property.rb +31 -0
- data/lib/hydramata/works/conversions/property_set.rb +23 -0
- data/lib/hydramata/works/conversions/translation_key_fragment.rb +20 -0
- data/lib/hydramata/works/conversions/value.rb +20 -0
- data/lib/hydramata/works/conversions/work_type.rb +26 -0
- data/lib/hydramata/works/engine.rb +31 -0
- data/lib/hydramata/works/linters.rb +99 -0
- data/lib/hydramata/works/linters/implement_data_definition_interface_matcher.rb +17 -0
- data/lib/hydramata/works/linters/implement_entity_interface_matcher.rb +16 -0
- data/lib/hydramata/works/linters/implement_predicate_interface_matcher.rb +17 -0
- data/lib/hydramata/works/linters/implement_predicate_set_interface_matcher.rb +8 -0
- data/lib/hydramata/works/linters/implement_property_set_interface_matcher.rb +8 -0
- data/lib/hydramata/works/linters/implement_value_interface_matcher.rb +8 -0
- data/lib/hydramata/works/linters/implement_work_type_interface_matcher.rb +13 -0
- data/lib/hydramata/works/linters/interface_matcher_builder.rb +36 -0
- data/lib/hydramata/works/translator.rb +67 -0
- data/lib/hydramata/works/version.rb +5 -0
- data/lib/hydramata_works.rb +2 -0
- data/lib/tasks/hydramata_work_tasks.rake +4 -0
- data/run_each_spec_in_isolation +16 -0
- data/run_each_spec_in_isolation.txt +110 -0
- data/script/analyzer.rb +124 -0
- data/script/fast_specs +22 -0
- data/spec/features/fedora_to_in_memory_spec.rb +60 -0
- data/spec/features/format_and_view_path_overrides_spec.rb +72 -0
- data/spec/features/in_memory_to_output_buffer_spec.rb +109 -0
- data/spec/features/instantiate_entity_from_persisted_work_type_spec.rb +26 -0
- data/spec/features/new_user_input_to_in_memory_spec.rb +75 -0
- data/spec/features/translation_services_spec.rb +107 -0
- data/spec/features/validate_entity_based_on_work_type_structure_spec.rb +19 -0
- data/spec/fixtures/cassettes/fedora-object.yml +299 -0
- data/spec/fixtures/translations.yml +20 -0
- data/spec/forms/hydramata/works/entity_form_spec.rb +83 -0
- data/spec/forms/hydramata/works/validation_service_spec.rb +32 -0
- data/spec/lib/hydramata-work_spec.rb +14 -0
- data/spec/lib/hydramata/works/conversions/predicate_set_spec.rb +50 -0
- data/spec/lib/hydramata/works/conversions/predicate_spec.rb +43 -0
- data/spec/lib/hydramata/works/conversions/presented_fieldsets_spec.rb +52 -0
- data/spec/lib/hydramata/works/conversions/presenter_spec.rb +22 -0
- data/spec/lib/hydramata/works/conversions/property_set_spec.rb +42 -0
- data/spec/lib/hydramata/works/conversions/property_spec.rb +68 -0
- data/spec/lib/hydramata/works/conversions/translation_key_fragment_spec.rb +45 -0
- data/spec/lib/hydramata/works/conversions/value_spec.rb +36 -0
- data/spec/lib/hydramata/works/conversions/work_type_spec.rb +55 -0
- data/spec/lib/hydramata/works/translator_spec.rb +81 -0
- data/spec/models/hydramata/works/data_definition_spec.rb +53 -0
- data/spec/models/hydramata/works/entity_spec.rb +50 -0
- data/spec/models/hydramata/works/predicate_presentation_sequences/storage_spec.rb +15 -0
- data/spec/models/hydramata/works/predicate_set_spec.rb +63 -0
- data/spec/models/hydramata/works/predicate_sets/storage_spec.rb +37 -0
- data/spec/models/hydramata/works/predicate_spec.rb +16 -0
- data/spec/models/hydramata/works/predicates/storage_spec.rb +78 -0
- data/spec/models/hydramata/works/predicates_spec.rb +18 -0
- data/spec/models/hydramata/works/presentation_structure_spec.rb +27 -0
- data/spec/models/hydramata/works/property_set_spec.rb +135 -0
- data/spec/models/hydramata/works/property_spec.rb +74 -0
- data/spec/models/hydramata/works/value_spec.rb +61 -0
- data/spec/models/hydramata/works/work_type_spec.rb +45 -0
- data/spec/models/hydramata/works/work_types/storage_spec.rb +74 -0
- data/spec/models/hydramata/works/work_types_spec.rb +16 -0
- data/spec/parsers/hydramata/works/datastream_parser_spec.rb +29 -0
- data/spec/parsers/hydramata/works/datastream_parsers/rdf_ntriples_parser_spec.rb +65 -0
- data/spec/parsers/hydramata/works/datastream_parsers/simple_xml_parser_spec.rb +37 -0
- data/spec/parsers/hydramata/works/predicate_parser_spec.rb +30 -0
- data/spec/parsers/hydramata/works/predicate_parsers/simple_parser_spec.rb +20 -0
- data/spec/parsers/hydramata/works/validations_parser_spec.rb +31 -0
- data/spec/parsers/hydramata/works/value_parser_spec.rb +22 -0
- data/spec/parsers/hydramata/works/value_parsers/simple_parser_spec.rb +20 -0
- data/spec/parsers/hydramata/works/value_parsers_spec.rb +36 -0
- data/spec/presenters/hydramata/works/base_presenter_spec.rb +111 -0
- data/spec/presenters/hydramata/works/dom_attributes_builder_spec.rb +26 -0
- data/spec/presenters/hydramata/works/entity_presenter_spec.rb +51 -0
- data/spec/presenters/hydramata/works/fieldset_presenter_spec.rb +58 -0
- data/spec/presenters/hydramata/works/property_presenter_spec.rb +42 -0
- data/spec/presenters/hydramata/works/value_presenter_spec.rb +49 -0
- data/spec/renderers/hydramata/works/entity_renderer_spec.rb +25 -0
- data/spec/spec_active_record_helper.rb +30 -0
- data/spec/spec_fast_helper.rb +12 -0
- data/spec/spec_slow_helper.rb +56 -0
- data/spec/spec_view_helper.rb +14 -0
- data/spec/test_app_templates/lib/generators/test_app_generator.rb +21 -0
- data/spec/views/hydramata/works/fieldsets/_edit.html.erb_spec.rb +29 -0
- data/spec/views/hydramata/works/fieldsets/_show.html.erb_spec.rb +25 -0
- data/spec/views/hydramata/works/properties/_edit.html.erb_spec.rb +22 -0
- data/spec/views/hydramata/works/properties/_show.html.erb_spec.rb +22 -0
- data/spec/views/hydramata/works/works/_edit.html.erb_spec.rb +23 -0
- data/spec/views/hydramata/works/works/_new.html.erb_spec.rb +23 -0
- data/spec/views/hydramata/works/works/_show.html.erb_spec.rb +24 -0
- data/spec/wranglers/hydramata/works/fedora_wrangler_spec.rb +26 -0
- metadata +466 -0
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_fast_helper'
|
2
|
+
require 'hydramata/works/datastream_parser'
|
3
|
+
require 'hydramata/works/linters'
|
4
|
+
|
5
|
+
module Hydramata
|
6
|
+
module Works
|
7
|
+
describe DatastreamParser do
|
8
|
+
context '.parser_for' do
|
9
|
+
let(:a_parser) { double('A Parser') }
|
10
|
+
let(:parser_finder) { double('Parser Finder', call: a_parser) }
|
11
|
+
let(:datastream) { double('Datastream') }
|
12
|
+
let(:options) { { parser_finder: parser_finder, datastream: datastream } }
|
13
|
+
it 'should find the appropriate parser based on input options' do
|
14
|
+
expect(described_class.parser_for(options)).to eq(a_parser)
|
15
|
+
expect(parser_finder).to have_received(:call).with(options)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context '.call' do
|
20
|
+
let(:content) { '<fields>\n <depositor>Username-1</depositor>\n</fields>' }
|
21
|
+
let(:datastream) { double('Datastream', content: content, mimeType: 'text/xml') }
|
22
|
+
let(:options) { { datastream: datastream } }
|
23
|
+
it 'should find the appropriate parser based on input options' do
|
24
|
+
expect { |b| described_class.call(options, &b) }.to yield_with_args(predicate: 'depositor', value: 'Username-1')
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'spec_fast_helper'
|
2
|
+
require 'hydramata/works/datastream_parsers/rdf_ntriples_parser'
|
3
|
+
require 'hydramata/works/linters'
|
4
|
+
require 'rdf'
|
5
|
+
|
6
|
+
module Hydramata
|
7
|
+
module Works
|
8
|
+
module DatastreamParsers
|
9
|
+
describe RdfNtriplesParser do
|
10
|
+
it_behaves_like 'a datastream parser'
|
11
|
+
|
12
|
+
let(:rdf_subject) { 'info:fedora/und:f4752f8687n' }
|
13
|
+
let(:rdf_predicate) { 'http://purl.org/dc/terms/dateSubmitted' }
|
14
|
+
let(:rdf_object) { "\"#{rdf_object_value}\"^^<http://www.w3.org/2001/XMLSchema#date>" }
|
15
|
+
let(:rdf_object_value) { '2014-06-02Z' }
|
16
|
+
let(:data) { "<#{rdf_subject}> <#{rdf_predicate}> #{rdf_object} ." }
|
17
|
+
|
18
|
+
subject { described_class }
|
19
|
+
|
20
|
+
context '.match?' do
|
21
|
+
let(:ntriples_datastream) { double(content: data, mimeType: 'text/plain') }
|
22
|
+
let(:not_ntriples_datastream) { double(content: '', mimeType: 'application/xml') }
|
23
|
+
it 'should not match when no datastream is provided' do
|
24
|
+
expect(described_class.match?).to be_falsey
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'should match when an RDF ntriples datastream is provided' do
|
28
|
+
expect(described_class.match?(datastream: ntriples_datastream)).to eq(described_class)
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should not match when the data stream does not appear to be RDF ntriples' do
|
32
|
+
expect(described_class.match?(datastream: not_ntriples_datastream)).to be_falsey
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context 'with single value encountered' do
|
37
|
+
it 'should yield each encountered property' do
|
38
|
+
expect { |b| subject.call(data, &b) }.to yield_with_args(predicate: rdf_predicate, value: instance_of(RDF::Literal::Date))
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context 'with multiple values encountered' do
|
43
|
+
let(:rdf_object_1) { "\"#{rdf_object_value_1}\"^^<http://www.w3.org/2001/XMLSchema#date>" }
|
44
|
+
let(:rdf_object_2) { "\"#{rdf_object_value_2}\"^^<http://www.w3.org/2001/XMLSchema#date>" }
|
45
|
+
let(:rdf_object_value_1) { '2014-06-02Z' }
|
46
|
+
let(:rdf_object_value_2) { '2013-05-03Z' }
|
47
|
+
let(:data) do
|
48
|
+
[
|
49
|
+
"<#{rdf_subject}> <#{rdf_predicate}> #{rdf_object_1} .",
|
50
|
+
"<#{rdf_subject}> <#{rdf_predicate}> #{rdf_object_2} ."
|
51
|
+
].join("\n")
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'should yield each encountered property' do
|
55
|
+
expect { |b| subject.call(data, &b) }.
|
56
|
+
to yield_successive_args(
|
57
|
+
{ predicate: rdf_predicate, value: instance_of(RDF::Literal::Date) },
|
58
|
+
{ predicate: rdf_predicate, value: instance_of(RDF::Literal::Date) }
|
59
|
+
)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'spec_fast_helper'
|
2
|
+
require 'hydramata/works/datastream_parsers/simple_xml_parser'
|
3
|
+
require 'hydramata/works/linters'
|
4
|
+
|
5
|
+
module Hydramata
|
6
|
+
module Works
|
7
|
+
module DatastreamParsers
|
8
|
+
describe SimpleXmlParser do
|
9
|
+
it_behaves_like 'a datastream parser'
|
10
|
+
|
11
|
+
context '.call' do
|
12
|
+
let(:content) { '<fields>\n <depositor>Username-1</depositor>\n</fields>' }
|
13
|
+
it 'should find the appropriate parser based on input options' do
|
14
|
+
expect { |b| described_class.call(content, &b) }.to yield_with_args(predicate: 'depositor', value: 'Username-1')
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context '.match?' do
|
19
|
+
let(:xml_datastream) { double(content: '<xml>', mimeType: 'application/xml') }
|
20
|
+
let(:non_xml_datastream) { double(content: '', mimeType: 'text/plain') }
|
21
|
+
it 'should not match when no datastream is provided' do
|
22
|
+
expect(described_class.match?).to be_falsey
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should match when an RDF ntriples datastream is provided' do
|
26
|
+
expect(described_class.match?(datastream: xml_datastream)).to eq(described_class)
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should not match when the data stream does not appear to be RDF ntriples' do
|
30
|
+
expect(described_class.match?(datastream: non_xml_datastream)).to be_falsey
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'spec_fast_helper'
|
2
|
+
require 'hydramata/works/predicate_parser'
|
3
|
+
|
4
|
+
module Hydramata
|
5
|
+
module Works
|
6
|
+
describe PredicateParser do
|
7
|
+
|
8
|
+
let(:predicate) { double('Predicate') }
|
9
|
+
let(:value) { double('Value') }
|
10
|
+
|
11
|
+
context '.parser_for' do
|
12
|
+
let(:a_parser) { double('A Parser', call: true) }
|
13
|
+
let(:parser_finder) { double('Parser Finder', call: a_parser) }
|
14
|
+
let(:options) { { predicate: predicate, work_type: 'article', parser_finder: parser_finder, value: value } }
|
15
|
+
it 'should find the appropriate parser based on the predicate and work_type' do
|
16
|
+
expect(described_class.parser_for(options)).to eq(a_parser)
|
17
|
+
expect(parser_finder).to have_received(:call).with(options)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context '.call' do
|
22
|
+
let(:options) { { predicate: predicate, work_type: 'article', value: value } }
|
23
|
+
it 'coordinates with the parser_finder and calls the found parser' do
|
24
|
+
expect { |b| described_class.call(options, &b) }.to yield_with_args(value: value)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_fast_helper'
|
2
|
+
require 'hydramata/works/predicate_parsers/simple_parser'
|
3
|
+
require 'hydramata/works/linters'
|
4
|
+
|
5
|
+
module Hydramata
|
6
|
+
module Works
|
7
|
+
module PredicateParsers
|
8
|
+
describe SimpleParser do
|
9
|
+
it_behaves_like 'a predicate parser'
|
10
|
+
|
11
|
+
context '.call' do
|
12
|
+
let(:object) { double('Object') }
|
13
|
+
it 'makes no effort to to convert the object' do
|
14
|
+
expect { |b| described_class.call(object, &b) }.to yield_with_args(value: object)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_fast_helper'
|
2
|
+
require 'hydramata/works/validations_parser'
|
3
|
+
|
4
|
+
module Hydramata
|
5
|
+
module Works
|
6
|
+
describe ValidationsParser do
|
7
|
+
context '.call' do
|
8
|
+
it 'parses simple JSON' do
|
9
|
+
expect(described_class.call('{"presence": true}')).to eq({ 'presence' => true })
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'returns an empty hash when input is nil' do
|
13
|
+
expect(described_class.call(nil)).to eq({})
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'returns an empty hash when input is an empty string' do
|
17
|
+
expect(described_class.call('')).to eq({})
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'returns the same Hash if one is given' do
|
21
|
+
object = {a: 1}
|
22
|
+
expect(described_class.call(object).object_id).to eq(object.object_id)
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'raises an error on unexpected input' do
|
26
|
+
expect{ described_class.call(Object.new) }.to raise_error
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_fast_helper'
|
2
|
+
require 'hydramata/works/value_parser'
|
3
|
+
|
4
|
+
module Hydramata
|
5
|
+
module Works
|
6
|
+
describe ValueParser do
|
7
|
+
let(:predicate) { double('Predicate') }
|
8
|
+
let(:value) { double('Value') }
|
9
|
+
let(:a_parser) { double('A Parser', call: true) }
|
10
|
+
let(:parser_finder) { double('Parser Finder', call: a_parser) }
|
11
|
+
|
12
|
+
context '.call' do
|
13
|
+
let(:options) { { predicate: predicate, work_type: 'article', parser_finder: parser_finder, value: value } }
|
14
|
+
it 'coordinate with the parser_finder and calls the found parser' do
|
15
|
+
parsed_value = '1234'
|
16
|
+
expect(a_parser).to receive(:call).with(value).and_yield(value: parsed_value)
|
17
|
+
expect { |b| described_class.call(options, &b) }.to yield_with_args(value: parsed_value)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_fast_helper'
|
2
|
+
require 'hydramata/works/value_parsers/simple_parser'
|
3
|
+
require 'hydramata/works/linters'
|
4
|
+
|
5
|
+
module Hydramata
|
6
|
+
module Works
|
7
|
+
module ValueParsers
|
8
|
+
describe SimpleParser do
|
9
|
+
it_behaves_like 'a value parser'
|
10
|
+
|
11
|
+
context '.call' do
|
12
|
+
let(:object) { double('Object') }
|
13
|
+
it 'makes no effort to to convert the object' do
|
14
|
+
expect { |b| described_class.call(object, &b) }.to yield_with_args(value: object, raw_object: object)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_fast_helper'
|
2
|
+
require 'hydramata/works/value_parsers'
|
3
|
+
require 'hydramata/works/predicate'
|
4
|
+
|
5
|
+
module Hydramata
|
6
|
+
module Works
|
7
|
+
module ValueParsers
|
8
|
+
class MockParser
|
9
|
+
end
|
10
|
+
end
|
11
|
+
describe ValueParsers do
|
12
|
+
let(:predicate) { Predicate.new(value_parser_name: parser_class_name) }
|
13
|
+
|
14
|
+
context 'existing parser in ValueParsers namespace' do
|
15
|
+
let(:parser_class_name) { 'MockParser' }
|
16
|
+
it 'should use that' do
|
17
|
+
expect(described_class.find(predicate: predicate)).to eq ValueParsers::MockParser
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'an escaped namespace class' do
|
22
|
+
let(:parser_class_name) { '::Object' }
|
23
|
+
it 'will fallback to the simple parser' do
|
24
|
+
expect(described_class.find(predicate: predicate)).to eq ValueParsers::SimpleParser
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'a constant not in the namespace' do
|
29
|
+
let(:parser_class_name) { 'MissingParser' }
|
30
|
+
it 'will fallback to the simple parser' do
|
31
|
+
expect(described_class.find(predicate: predicate)).to eq ValueParsers::SimpleParser
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'spec_fast_helper'
|
2
|
+
require 'hydramata/works/base_presenter'
|
3
|
+
|
4
|
+
module Hydramata
|
5
|
+
module Works
|
6
|
+
class MockPresentable
|
7
|
+
attr_accessor :name
|
8
|
+
def initialize
|
9
|
+
yield(self) if block_given?
|
10
|
+
end
|
11
|
+
end
|
12
|
+
describe BasePresenter do
|
13
|
+
let(:name) { 'hello world' }
|
14
|
+
let(:object) { MockPresentable.new { |b| b.name = name } }
|
15
|
+
let(:translator) { double('Translator', t: true) }
|
16
|
+
subject { described_class.new(object, translator: translator) }
|
17
|
+
|
18
|
+
it 'should have #presenter_dom_class' do
|
19
|
+
expect(subject.presenter_dom_class).to eq('base')
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should return self for #to_presenter' do
|
23
|
+
expect(subject.to_presenter.object_id).to eq(subject.object_id)
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should have a friendly inspect message, because tracking it down could be a pain' do
|
27
|
+
expect(subject.inspect).to include("#{described_class}")
|
28
|
+
expect(subject.inspect).to include(object.inspect)
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should be an instance of the presented object\'s class' do
|
32
|
+
expect(subject.instance_of?(object.class)).to be_truthy
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'should also be an instance of the presenter class' do
|
36
|
+
expect(subject.instance_of?(described_class)).to be_truthy
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should translate attribute keys' do
|
40
|
+
subject.translate(:name)
|
41
|
+
expect(translator).to have_received(:t).with(:name, scopes: [], default: instance_of(Proc))
|
42
|
+
end
|
43
|
+
|
44
|
+
context '#dom_class' do
|
45
|
+
it 'extrapolates based on the named object' do
|
46
|
+
expect(subject.dom_class).to eq('hello-world')
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'allows a prefix' do
|
50
|
+
expect(subject.dom_class(prefix: 'edit')).to eq('edit-hello-world')
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'allows a suffix' do
|
54
|
+
expect(subject.dom_class(suffix: '1')).to eq('hello-world-1')
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'allows a prefix and a suffix' do
|
58
|
+
expect(subject.dom_class(prefix: 'edit', suffix: '1')).to eq('edit-hello-world-1')
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
context '#render' do
|
63
|
+
let(:template) { double('Template', render: true)}
|
64
|
+
|
65
|
+
it 'should delegate render to the template' do
|
66
|
+
subject.render(template: template)
|
67
|
+
expect(template).to have_received(:render).with(partial: 'hydramata/works/base/show', object: subject)
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'should handle a partial_prefixes rendering in less and less specificity' do
|
71
|
+
subject = described_class.new(object, translator: translator, partial_prefixes: ['article/required', 'article'], presentation_context: 'show', template_missing_exception: [RuntimeError, NoMethodError])
|
72
|
+
expect(template).to receive(:render).
|
73
|
+
with(partial: 'hydramata/works/base/article/required/show', object: subject).
|
74
|
+
ordered.
|
75
|
+
and_raise(NoMethodError)
|
76
|
+
expect(template).to receive(:render).
|
77
|
+
with(partial: 'hydramata/works/base/article/show', object: subject).
|
78
|
+
ordered.
|
79
|
+
and_raise(RuntimeError)
|
80
|
+
expect(template).to receive(:render).
|
81
|
+
with(partial: 'hydramata/works/base/show', object: subject).
|
82
|
+
ordered
|
83
|
+
subject.render(template: template)
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'should stop rendering chain once we sucessfully render a template' do
|
87
|
+
subject = described_class.new(object, translator: translator, partial_prefixes: ['article/required', 'article'], presentation_context: 'show', template_missing_exception: [RuntimeError, NoMethodError])
|
88
|
+
expect(template).to receive(:render).
|
89
|
+
with(partial: 'hydramata/works/base/article/required/show', object: subject).
|
90
|
+
ordered.
|
91
|
+
and_raise(NoMethodError)
|
92
|
+
expect(template).to receive(:render).
|
93
|
+
with(partial: 'hydramata/works/base/article/show', object: subject).
|
94
|
+
ordered
|
95
|
+
expect(template).to_not receive(:render).
|
96
|
+
with(partial: 'hydramata/works/base/show', object: subject)
|
97
|
+
subject.render(template: template)
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'should raise exception if we are rendering as general as possible' do
|
101
|
+
subject = described_class.new(object, translator: translator, presentation_context: 'show')
|
102
|
+
expect(template).to receive(:render).
|
103
|
+
with(partial: 'hydramata/works/base/show', object: subject).
|
104
|
+
and_raise(RuntimeError)
|
105
|
+
expect { subject.render(template: template) }.
|
106
|
+
to raise_error(RuntimeError)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'spec_fast_helper'
|
2
|
+
require 'hydramata/works/dom_attributes_builder'
|
3
|
+
|
4
|
+
module Hydramata
|
5
|
+
module Works
|
6
|
+
describe DomAttributesBuilder do
|
7
|
+
let(:context) { double }
|
8
|
+
|
9
|
+
it 'should append attributes' do
|
10
|
+
response = described_class.call(context, { class: ['hello'] }, { class: ['world'] } )
|
11
|
+
expect(response).to eq({ class: ['hello', 'world'] })
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should handle mixed array and string' do
|
15
|
+
response = described_class.call(context, { class: 'hello' }, { class: ['world'] } )
|
16
|
+
expect(response).to eq({ class: ['hello', 'world'] })
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should add new keys to returned value' do
|
20
|
+
response = described_class.call(context, { data_attribute: ['hello'] }, { class: ['world'] } )
|
21
|
+
expect(response).to eq({ data_attribute: ['hello'], class: ['world'] })
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'spec_fast_helper'
|
2
|
+
require 'hydramata/works/entity_presenter'
|
3
|
+
require 'hydramata/works/entity'
|
4
|
+
require 'hydramata/works/linters'
|
5
|
+
|
6
|
+
module Hydramata
|
7
|
+
module Works
|
8
|
+
describe EntityPresenter do
|
9
|
+
it_behaves_like 'a presented entity'
|
10
|
+
|
11
|
+
let(:presentation_structure) { double('PresentationStructure') }
|
12
|
+
let(:entity) { Entity.new(work_type: 'My Work Type') }
|
13
|
+
let(:presented_fieldset_builder) { double('Builder', call: true) }
|
14
|
+
let(:template) { double('Template', render: true) }
|
15
|
+
subject do
|
16
|
+
described_class.new(
|
17
|
+
entity: entity,
|
18
|
+
presentation_structure: presentation_structure,
|
19
|
+
presented_fieldset_builder: presented_fieldset_builder,
|
20
|
+
template_missing_exception: [RuntimeError]
|
21
|
+
)
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should have #container_content_tag_attributes' do
|
25
|
+
expect(subject.container_content_tag_attributes.keys).to eq([:class, :itemscope, :itemtype])
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should have #fieldsets that are extracted from the #entity and #presentation_structure' do
|
29
|
+
subject.fieldsets
|
30
|
+
expect(presented_fieldset_builder).to have_received(:call).with(entity: subject, presentation_structure: presentation_structure)
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should have a default partial prefixes' do
|
34
|
+
expect(subject.partial_prefixes).to eq([['my_work_type']])
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should render as per the template' do
|
38
|
+
expect(template).to receive(:render).
|
39
|
+
with(partial: 'hydramata/works/works/my_work_type/show', object: subject).
|
40
|
+
ordered.
|
41
|
+
and_raise(RuntimeError)
|
42
|
+
expect(template).to receive(:render).
|
43
|
+
with(partial: 'hydramata/works/works/show', object: subject).
|
44
|
+
ordered.
|
45
|
+
and_return('YES')
|
46
|
+
expect(subject.render(template: template)).to eq('YES')
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|