briard 2.4.1 → 2.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/codeql-analysis.yml +72 -0
  3. data/.github/workflows/rubocop.yml +50 -0
  4. data/.rubocop.yml +144 -620
  5. data/.rubocop_todo.yml +76 -0
  6. data/CHANGELOG.md +22 -0
  7. data/Gemfile +2 -0
  8. data/Gemfile.lock +43 -6
  9. data/Rakefile +1 -1
  10. data/{bolognese.gemspec → briard.gemspec} +46 -38
  11. data/lib/briard/array.rb +2 -2
  12. data/lib/briard/author_utils.rb +79 -71
  13. data/lib/briard/cli.rb +12 -13
  14. data/lib/briard/crossref_utils.rb +73 -61
  15. data/lib/briard/datacite_utils.rb +132 -106
  16. data/lib/briard/doi_utils.rb +10 -10
  17. data/lib/briard/metadata.rb +96 -106
  18. data/lib/briard/metadata_utils.rb +87 -78
  19. data/lib/briard/readers/bibtex_reader.rb +65 -65
  20. data/lib/briard/readers/cff_reader.rb +88 -70
  21. data/lib/briard/readers/citeproc_reader.rb +90 -84
  22. data/lib/briard/readers/codemeta_reader.rb +68 -50
  23. data/lib/briard/readers/crosscite_reader.rb +2 -2
  24. data/lib/briard/readers/crossref_reader.rb +249 -210
  25. data/lib/briard/readers/datacite_json_reader.rb +3 -3
  26. data/lib/briard/readers/datacite_reader.rb +225 -189
  27. data/lib/briard/readers/npm_reader.rb +49 -42
  28. data/lib/briard/readers/ris_reader.rb +82 -80
  29. data/lib/briard/readers/schema_org_reader.rb +182 -159
  30. data/lib/briard/string.rb +1 -1
  31. data/lib/briard/utils.rb +4 -4
  32. data/lib/briard/version.rb +3 -1
  33. data/lib/briard/whitelist_scrubber.rb +11 -4
  34. data/lib/briard/writers/bibtex_writer.rb +14 -8
  35. data/lib/briard/writers/cff_writer.rb +33 -26
  36. data/lib/briard/writers/codemeta_writer.rb +19 -15
  37. data/lib/briard/writers/csv_writer.rb +6 -4
  38. data/lib/briard/writers/datacite_json_writer.rb +8 -2
  39. data/lib/briard/writers/jats_writer.rb +33 -28
  40. data/lib/briard/writers/rdf_xml_writer.rb +1 -1
  41. data/lib/briard/writers/ris_writer.rb +30 -18
  42. data/lib/briard/writers/turtle_writer.rb +1 -1
  43. data/lib/briard.rb +6 -6
  44. data/rubocop.sarif +0 -0
  45. data/spec/array_spec.rb +5 -5
  46. data/spec/author_utils_spec.rb +151 -132
  47. data/spec/datacite_utils_spec.rb +135 -83
  48. data/spec/doi_utils_spec.rb +168 -164
  49. data/spec/find_from_format_spec.rb +69 -69
  50. data/spec/fixtures/vcr_cassettes/Briard_Metadata/sanitize/onlies_keep_specific_tags.yml +65 -0
  51. data/spec/fixtures/vcr_cassettes/Briard_Metadata/sanitize/removes_a_tags.yml +65 -0
  52. data/spec/metadata_spec.rb +91 -90
  53. data/spec/readers/bibtex_reader_spec.rb +43 -38
  54. data/spec/readers/cff_reader_spec.rb +165 -153
  55. data/spec/readers/citeproc_reader_spec.rb +45 -40
  56. data/spec/readers/codemeta_reader_spec.rb +128 -115
  57. data/spec/readers/crosscite_reader_spec.rb +34 -24
  58. data/spec/readers/crossref_reader_spec.rb +1098 -939
  59. data/spec/readers/datacite_json_reader_spec.rb +53 -40
  60. data/spec/readers/datacite_reader_spec.rb +1541 -1337
  61. data/spec/readers/npm_reader_spec.rb +48 -43
  62. data/spec/readers/ris_reader_spec.rb +53 -47
  63. data/spec/readers/schema_org_reader_spec.rb +329 -267
  64. data/spec/spec_helper.rb +6 -5
  65. data/spec/utils_spec.rb +371 -347
  66. data/spec/writers/bibtex_writer_spec.rb +143 -143
  67. data/spec/writers/cff_writer_spec.rb +96 -90
  68. data/spec/writers/citation_writer_spec.rb +34 -33
  69. data/spec/writers/citeproc_writer_spec.rb +226 -224
  70. data/spec/writers/codemeta_writer_spec.rb +18 -16
  71. data/spec/writers/crosscite_writer_spec.rb +91 -73
  72. data/spec/writers/crossref_writer_spec.rb +99 -91
  73. data/spec/writers/csv_writer_spec.rb +70 -70
  74. data/spec/writers/datacite_json_writer_spec.rb +78 -68
  75. data/spec/writers/datacite_writer_spec.rb +417 -322
  76. data/spec/writers/jats_writer_spec.rb +177 -161
  77. data/spec/writers/rdf_xml_writer_spec.rb +68 -63
  78. data/spec/writers/ris_writer_spec.rb +162 -162
  79. data/spec/writers/turtle_writer_spec.rb +47 -47
  80. metadata +250 -160
  81. data/.github/workflows/release.yml +0 -47
@@ -3,64 +3,69 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  describe Briard::Metadata, vcr: true do
6
- let(:input) { fixture_path + "cgimp_package.json" }
6
+ subject { described_class.new(input: input, from: 'npm') }
7
7
 
8
- subject { Briard::Metadata.new(input: input, from: "npm") }
8
+ let(:input) { "#{fixture_path}cgimp_package.json" }
9
9
 
10
- context "get npm raw" do
11
- it "software" do
12
- expect(subject.raw).to eq(IO.read(input).strip)
10
+ context 'get npm raw' do
11
+ it 'software' do
12
+ expect(subject.raw).to eq(File.read(input).strip)
13
13
  end
14
14
  end
15
15
 
16
- context "get npm metadata" do
17
- it "minimal" do
16
+ context 'get npm metadata' do
17
+ it 'minimal' do
18
18
  expect(subject.valid?).to be false
19
19
  expect(subject.errors.first).to start_with("3:0: ERROR: Element '{http://datacite.org/schema/kernel-4}identifier'")
20
- #expect(subject.identifiers).to eq([{"identifier"=>"https://doi.org/10.5438/4k3m-nyvg", "identifierType"=>"DOI"}])
21
- #expect(subject.url).to eq("https://blog.datacite.org/eating-your-own-dog-food")
22
- expect(subject.types).to eq("bibtex"=>"misc", "citeproc"=>"article", "reourceType"=>"NPM Package", "resourceTypeGeneral"=>"Software", "ris"=>"GEN", "schemaOrg"=>"SoftwareSourceCode")
23
- expect(subject.creators).to eq([{"name"=>":(unav)", "nameType"=>"Organizational"}])
24
- expect(subject.titles).to eq([{"title"=>"fullstack_app"}])
25
- expect(subject.descriptions).to be_empty
26
- expect(subject.rights_list).to eq([{"rights"=>"ISC"}])
27
- expect(subject.version_info).to eq("1.0.0")
28
- #expect(subject.dates).to eq([{"date"=>"2016-12-20", "dateType"=>"Issued"}])
29
- #expect(subject.publication_year).to eq("2016")
20
+ # expect(subject.identifiers).to eq([{"identifier"=>"https://doi.org/10.5438/4k3m-nyvg", "identifierType"=>"DOI"}])
21
+ # expect(subject.url).to eq("https://blog.datacite.org/eating-your-own-dog-food")
22
+ expect(subject.types).to eq('bibtex' => 'misc', 'citeproc' => 'article',
23
+ 'reourceType' => 'NPM Package', 'resourceTypeGeneral' => 'Software', 'ris' => 'GEN', 'schemaOrg' => 'SoftwareSourceCode')
24
+ expect(subject.creators).to eq([{ 'name' => ':(unav)', 'nameType' => 'Organizational' }])
25
+ expect(subject.titles).to eq([{ 'title' => 'fullstack_app' }])
26
+ expect(subject.descriptions.empty?).to be(true)
27
+ expect(subject.rights_list).to eq([{ 'rights' => 'ISC' }])
28
+ expect(subject.version_info).to eq('1.0.0')
29
+ # expect(subject.dates).to eq([{"date"=>"2016-12-20", "dateType"=>"Issued"}])
30
+ # expect(subject.publication_year).to eq("2016")
30
31
  end
31
32
 
32
- it "minimal with description" do
33
- input = fixture_path + "cit_package.json"
34
- subject = Briard::Metadata.new(input: input, from: "npm")
33
+ it 'minimal with description' do
34
+ input = "#{fixture_path}cit_package.json"
35
+ subject = described_class.new(input: input, from: 'npm')
35
36
  expect(subject.valid?).to be false
36
37
  expect(subject.errors.first).to start_with("3:0: ERROR: Element '{http://datacite.org/schema/kernel-4}identifier'")
37
- #expect(subject.identifiers).to eq([{"identifier"=>"https://doi.org/10.5438/4k3m-nyvg", "identifierType"=>"DOI"}])
38
- #expect(subject.url).to eq("https://blog.datacite.org/eating-your-own-dog-food")
39
- expect(subject.types).to eq("bibtex"=>"misc", "citeproc"=>"article", "reourceType"=>"NPM Package", "resourceTypeGeneral"=>"Software", "ris"=>"GEN", "schemaOrg"=>"SoftwareSourceCode")
40
- expect(subject.creators).to eq([{"name"=>":(unav)", "nameType"=>"Organizational"}])
41
- expect(subject.titles).to eq([{"title"=>"CITapp"}])
42
- expect(subject.descriptions).to eq([{"description"=>"Concealed Information Test app", "descriptionType"=>"Abstract"}])
43
- expect(subject.version_info).to eq("1.1.0")
44
- #expect(subject.dates).to eq([{"date"=>"2016-12-20", "dateType"=>"Issued"}])
45
- #expect(subject.publication_year).to eq("2016")
38
+ # expect(subject.identifiers).to eq([{"identifier"=>"https://doi.org/10.5438/4k3m-nyvg", "identifierType"=>"DOI"}])
39
+ # expect(subject.url).to eq("https://blog.datacite.org/eating-your-own-dog-food")
40
+ expect(subject.types).to eq('bibtex' => 'misc', 'citeproc' => 'article',
41
+ 'reourceType' => 'NPM Package', 'resourceTypeGeneral' => 'Software', 'ris' => 'GEN', 'schemaOrg' => 'SoftwareSourceCode')
42
+ expect(subject.creators).to eq([{ 'name' => ':(unav)', 'nameType' => 'Organizational' }])
43
+ expect(subject.titles).to eq([{ 'title' => 'CITapp' }])
44
+ expect(subject.descriptions).to eq([{ 'description' => 'Concealed Information Test app',
45
+ 'descriptionType' => 'Abstract' }])
46
+ expect(subject.version_info).to eq('1.1.0')
47
+ # expect(subject.dates).to eq([{"date"=>"2016-12-20", "dateType"=>"Issued"}])
48
+ # expect(subject.publication_year).to eq("2016")
46
49
  end
47
50
 
48
- it "minimal with description" do
49
- input = fixture_path + "edam_package.json"
50
- subject = Briard::Metadata.new(input: input, from: "npm")
51
+ it 'minimal with description' do
52
+ input = "#{fixture_path}edam_package.json"
53
+ subject = described_class.new(input: input, from: 'npm')
51
54
  expect(subject.valid?).to be false
52
55
  expect(subject.errors.first).to start_with("3:0: ERROR: Element '{http://datacite.org/schema/kernel-4}identifier'")
53
- #expect(subject.identifiers).to eq([{"identifier"=>"https://doi.org/10.5438/4k3m-nyvg", "identifierType"=>"DOI"}])
54
- #expect(subject.url).to eq("https://blog.datacite.org/eating-your-own-dog-food")
55
- expect(subject.types).to eq("bibtex"=>"misc", "citeproc"=>"article", "reourceType"=>"NPM Package", "resourceTypeGeneral"=>"Software", "ris"=>"GEN", "schemaOrg"=>"SoftwareSourceCode")
56
- expect(subject.creators).to eq([{"affiliation"=>[], "familyName"=>"Brancotte", "givenName"=>"Bryan", "name"=>"Brancotte, Bryan", "nameIdentifiers"=>[], "nameType"=>"Personal"}])
57
- expect(subject.titles).to eq([{"title"=>"edam-browser"}])
58
- expect(subject.descriptions).to eq([{"description"=>
59
- + "The EDAM Browser is a client-side web-based visualization javascript widget. Its goals are to help describing bio-related resources and service with EDAM, and to facilitate and foster community contributions to EDAM.",
60
- "descriptionType"=>"Abstract"}])
61
- expect(subject.version_info).to eq("1.0.0")
62
- #expect(subject.dates).to eq([{"date"=>"2016-12-20", "dateType"=>"Issued"}])
63
- #expect(subject.publication_year).to eq("2016")
56
+ # expect(subject.identifiers).to eq([{"identifier"=>"https://doi.org/10.5438/4k3m-nyvg", "identifierType"=>"DOI"}])
57
+ # expect(subject.url).to eq("https://blog.datacite.org/eating-your-own-dog-food")
58
+ expect(subject.types).to eq('bibtex' => 'misc', 'citeproc' => 'article',
59
+ 'reourceType' => 'NPM Package', 'resourceTypeGeneral' => 'Software', 'ris' => 'GEN', 'schemaOrg' => 'SoftwareSourceCode')
60
+ expect(subject.creators).to eq([{ 'affiliation' => [], 'familyName' => 'Brancotte',
61
+ 'givenName' => 'Bryan', 'name' => 'Brancotte, Bryan', 'nameIdentifiers' => [], 'nameType' => 'Personal' }])
62
+ expect(subject.titles).to eq([{ 'title' => 'edam-browser' }])
63
+ expect(subject.descriptions).to eq([{ 'description' =>
64
+ + 'The EDAM Browser is a client-side web-based visualization javascript widget. Its goals are to help describing bio-related resources and service with EDAM, and to facilitate and foster community contributions to EDAM.',
65
+ 'descriptionType' => 'Abstract' }])
66
+ expect(subject.version_info).to eq('1.0.0')
67
+ # expect(subject.dates).to eq([{"date"=>"2016-12-20", "dateType"=>"Issued"}])
68
+ # expect(subject.publication_year).to eq("2016")
64
69
  end
65
70
  end
66
71
  end
@@ -3,73 +3,79 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  describe Briard::Metadata, vcr: true do
6
- let(:input) { fixture_path + "crossref.ris" }
6
+ subject { described_class.new(input: input) }
7
7
 
8
- subject { Briard::Metadata.new(input: input) }
8
+ let(:input) { "#{fixture_path}crossref.ris" }
9
9
 
10
- context "detect format" do
11
- it "extension" do
10
+ context 'detect format' do
11
+ it 'extension' do
12
12
  expect(subject.valid?).to be true
13
13
  end
14
14
 
15
- it "string" do
16
- Briard::Metadata.new(input: IO.read(input).strip)
15
+ it 'string' do
16
+ described_class.new(input: File.read(input).strip)
17
17
  expect(subject.valid?).to be true
18
- expect(subject.id).to eq("https://doi.org/10.7554/elife.01567")
18
+ expect(subject.id).to eq('https://doi.org/10.7554/elife.01567')
19
19
  end
20
20
  end
21
21
 
22
- context "get ris raw" do
23
- it "Crossref DOI" do
24
- expect(subject.raw).to eq(IO.read(input).strip)
22
+ context 'get ris raw' do
23
+ it 'Crossref DOI' do
24
+ expect(subject.raw).to eq(File.read(input).strip)
25
25
  end
26
26
  end
27
27
 
28
- context "get ris metadata" do
29
- it "Crossref DOI" do
28
+ context 'get ris metadata' do
29
+ it 'Crossref DOI' do
30
30
  expect(subject.valid?).to be true
31
- expect(subject.id).to eq("https://doi.org/10.7554/elife.01567")
32
- expect(subject.types).to eq("citeproc"=>"misc", "resourceTypeGeneral"=>"JournalArticle", "ris"=>"JOUR", "schemaOrg"=>"ScholarlyArticle")
33
- expect(subject.url).to eq("http://elifesciences.org/lookup/doi/10.7554/eLife.01567")
31
+ expect(subject.id).to eq('https://doi.org/10.7554/elife.01567')
32
+ expect(subject.types).to eq('citeproc' => 'misc', 'resourceTypeGeneral' => 'JournalArticle',
33
+ 'ris' => 'JOUR', 'schemaOrg' => 'ScholarlyArticle')
34
+ expect(subject.url).to eq('http://elifesciences.org/lookup/doi/10.7554/eLife.01567')
34
35
  expect(subject.creators.length).to eq(5)
35
- expect(subject.creators.first).to eq("nameType"=>"Personal",
36
- "name"=>"Sankar, Martial",
37
- "givenName"=>"Martial",
38
- "familyName"=>"Sankar",
39
- "nameIdentifiers" => [],
40
- "affiliation" => [])
41
- expect(subject.titles).to eq([{"title"=>"Automated quantitative histology reveals vascular morphodynamics during Arabidopsis hypocotyl secondary growth"}])
42
- expect(subject.descriptions.first["description"]).to start_with("Among various advantages, their small size makes model organisms preferred subjects of investigation.")
43
- expect(subject.dates).to eq([{"date"=>"2014", "dateType"=>"Issued"}])
44
- expect(subject.publication_year).to eq("2014")
45
- expect(subject.related_identifiers).to eq([{"id"=>"2050084X", "relatedIdentifierType"=>"ISSN", "relationType"=>"IsPartOf", "title"=>"eLife", "type"=>"Periodical"}])
46
- expect(subject.container).to eq("identifier"=>"2050084X", "title"=>"eLife", "type"=>"Journal", "volume"=>"3")
36
+ expect(subject.creators.first).to eq('nameType' => 'Personal',
37
+ 'name' => 'Sankar, Martial',
38
+ 'givenName' => 'Martial',
39
+ 'familyName' => 'Sankar',
40
+ 'nameIdentifiers' => [],
41
+ 'affiliation' => [])
42
+ expect(subject.titles).to eq([{ 'title' => 'Automated quantitative histology reveals vascular morphodynamics during Arabidopsis hypocotyl secondary growth' }])
43
+ expect(subject.descriptions.first['description']).to start_with('Among various advantages, their small size makes model organisms preferred subjects of investigation.')
44
+ expect(subject.dates).to eq([{ 'date' => '2014', 'dateType' => 'Issued' }])
45
+ expect(subject.publication_year).to eq('2014')
46
+ expect(subject.related_identifiers).to eq([{ 'id' => '2050084X',
47
+ 'relatedIdentifierType' => 'ISSN', 'relationType' => 'IsPartOf', 'title' => 'eLife', 'type' => 'Periodical' }])
48
+ expect(subject.container).to eq('identifier' => '2050084X', 'title' => 'eLife',
49
+ 'type' => 'Journal', 'volume' => '3')
47
50
  end
48
51
 
49
- it "DOI does not exist" do
50
- input = fixture_path + "pure.ris"
51
- doi = "10.7554/elife.01567"
52
- subject = Briard::Metadata.new(input: input, doi: doi)
52
+ it 'DOI does not exist' do
53
+ input = "#{fixture_path}pure.ris"
54
+ doi = '10.7554/elife.01567'
55
+ subject = described_class.new(input: input, doi: doi)
53
56
  expect(subject.valid?).to be false
54
- expect(subject.state).to eq("not_found")
55
- expect(subject.id).to eq("https://doi.org/10.7554/elife.01567")
56
- expect(subject.types).to eq("citeproc"=>"misc", "resourceTypeGeneral"=>"Dissertation", "ris"=>"THES", "schemaOrg"=>"Thesis")
57
- expect(subject.creators).to eq([{"nameType"=>"Personal", "name"=>"Toparlar, Y.", "givenName"=>"Y.", "familyName"=>"Toparlar", "nameIdentifiers" => [], "affiliation" => []}])
58
- expect(subject.titles).to eq([{"title"=>"A multiscale analysis of the urban heat island effect"}])
59
- expect(subject.descriptions.first["description"]).to start_with("Designing the climates of cities")
60
- expect(subject.dates).to eq([{"date"=>"2018-04-25", "dateType"=>"Issued"}, {"date"=>"2018-04-25", "dateType"=>"Created"}])
61
- expect(subject.publication_year).to eq("2018")
57
+ expect(subject.state).to eq('not_found')
58
+ expect(subject.id).to eq('https://doi.org/10.7554/elife.01567')
59
+ expect(subject.types).to eq('citeproc' => 'misc', 'resourceTypeGeneral' => 'Dissertation',
60
+ 'ris' => 'THES', 'schemaOrg' => 'Thesis')
61
+ expect(subject.creators).to eq([{ 'nameType' => 'Personal', 'name' => 'Toparlar, Y.',
62
+ 'givenName' => 'Y.', 'familyName' => 'Toparlar', 'nameIdentifiers' => [], 'affiliation' => [] }])
63
+ expect(subject.titles).to eq([{ 'title' => 'A multiscale analysis of the urban heat island effect' }])
64
+ expect(subject.descriptions.first['description']).to start_with('Designing the climates of cities')
65
+ expect(subject.dates).to eq([{ 'date' => '2018-04-25', 'dateType' => 'Issued' },
66
+ { 'date' => '2018-04-25', 'dateType' => 'Created' }])
67
+ expect(subject.publication_year).to eq('2018')
62
68
  end
63
69
 
64
- it "RIS with Dashes" do
65
- input = fixture_path + "ris_bug.ris"
66
- abs = "3D image based subject specific models of the ankle complex can be extremely significant in a wide variety of clinical and biomechanical applications such as evaluating the effect of ligament ruptures, diagnosing and comparing surgical procedures. However, there are very few computational models that can accurately capture the full 3D biomechanical properties of the ankle complex. One such computational model was introduced by our group in 2004 [1], and this model was partially validated with a very limited set of parameters for comparison. In the current study, we have developed an improvised version of this model and validated it on a subject to subject basis for a number of specimens. This is achieved by comparing a wide range of biomechanical parameters between the experiments and the simulation. Once, the model is validated, it can be used for a wide variety of clinical and surgical applications .Some applications include comparing the effects of surface morphology on the kinematics of the ankle joint, diagnosing and evaluation of ankle disorders like ligament tears and reconstruction surgeries. Previous experimental studies conducted to understand and validate the effect of morphological variations to kinematics involved invasive surgical procedures and hence could only be conducted in cadaveric foot. Hence a need for a dynamic model which could predict and recreate the kinematics of an ankle using only CT and, or MRI data was realized. Such a model could help in development and non-invasive testing of subject specific TAR. This thesis focusses on the subject specific validation of rigid body models of four specimens and an one-to-one validation based on Load-displacement curves, Range of Motion, Surface-to-surface interaction and Ligament straining patterns. Post validation of the MBS model in MSC ADAMS, the model is used to investigate the effect of axial loads, total ankle arthrodesis and the effect of varying surface morphologies on the behavior of the ankle joint complex. An in-depth comparative analysis on the use of a numerical model for the development and performance evaluation of an implant derived from the morphological parameters of the ankle joint is also presented."
67
- doi = "10.7554/elife.01567"
68
- subject = Briard::Metadata.new(input: input, doi: doi)
70
+ it 'RIS with Dashes' do
71
+ input = "#{fixture_path}ris_bug.ris"
72
+ abs = '3D image based subject specific models of the ankle complex can be extremely significant in a wide variety of clinical and biomechanical applications such as evaluating the effect of ligament ruptures, diagnosing and comparing surgical procedures. However, there are very few computational models that can accurately capture the full 3D biomechanical properties of the ankle complex. One such computational model was introduced by our group in 2004 [1], and this model was partially validated with a very limited set of parameters for comparison. In the current study, we have developed an improvised version of this model and validated it on a subject to subject basis for a number of specimens. This is achieved by comparing a wide range of biomechanical parameters between the experiments and the simulation. Once, the model is validated, it can be used for a wide variety of clinical and surgical applications .Some applications include comparing the effects of surface morphology on the kinematics of the ankle joint, diagnosing and evaluation of ankle disorders like ligament tears and reconstruction surgeries. Previous experimental studies conducted to understand and validate the effect of morphological variations to kinematics involved invasive surgical procedures and hence could only be conducted in cadaveric foot. Hence a need for a dynamic model which could predict and recreate the kinematics of an ankle using only CT and, or MRI data was realized. Such a model could help in development and non-invasive testing of subject specific TAR. This thesis focusses on the subject specific validation of rigid body models of four specimens and an one-to-one validation based on Load-displacement curves, Range of Motion, Surface-to-surface interaction and Ligament straining patterns. Post validation of the MBS model in MSC ADAMS, the model is used to investigate the effect of axial loads, total ankle arthrodesis and the effect of varying surface morphologies on the behavior of the ankle joint complex. An in-depth comparative analysis on the use of a numerical model for the development and performance evaluation of an implant derived from the morphological parameters of the ankle joint is also presented.'
73
+ doi = '10.7554/elife.01567'
74
+ subject = described_class.new(input: input, doi: doi)
69
75
  expect(subject.valid?).to be true
70
- expect(subject.id).to eq("https://doi.org/10.7554/elife.01567")
71
- expect(subject.titles).to eq([{"title"=>"Validation of an Image-based Subject-Specific Dynamic Model of the Ankle Joint Complex and its Applications to the Study of the Effect of Articular Surface Morphology on Ankle Joint Mechanics"}])
72
- expect(subject.descriptions.first["description"]).to eq(abs)
76
+ expect(subject.id).to eq('https://doi.org/10.7554/elife.01567')
77
+ expect(subject.titles).to eq([{ 'title' => 'Validation of an Image-based Subject-Specific Dynamic Model of the Ankle Joint Complex and its Applications to the Study of the Effect of Articular Surface Morphology on Ankle Joint Mechanics' }])
78
+ expect(subject.descriptions.first['description']).to eq(abs)
73
79
  end
74
80
  end
75
81
  end