inqlude 0.7.0 → 0.7.1

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 (62) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +23 -0
  3. data/{README → README.md} +0 -0
  4. data/TODO +24 -9
  5. data/accessing-inqlude-data.md +55 -0
  6. data/inqlude.gemspec +2 -1
  7. data/lib/cli.rb +36 -4
  8. data/lib/creator.rb +17 -32
  9. data/lib/distros/suse.rb +2 -2
  10. data/lib/downloader.rb +37 -0
  11. data/lib/exceptions.rb +2 -0
  12. data/lib/inqlude.rb +21 -15
  13. data/lib/json_object.rb +104 -0
  14. data/lib/kde_frameworks_creator.rb +14 -10
  15. data/lib/kde_frameworks_release.rb +14 -13
  16. data/lib/library.rb +4 -4
  17. data/lib/manifest.rb +165 -28
  18. data/lib/manifest_handler.rb +14 -16
  19. data/lib/verifier.rb +23 -48
  20. data/lib/version.rb +1 -1
  21. data/lib/view.rb +29 -26
  22. data/manifest-format.md +15 -0
  23. data/spec/data/inqlude-all-karchive.json +31 -0
  24. data/spec/data/inqlude-all.json +120 -0
  25. data/spec/data/invalid-schema.manifest +4 -0
  26. data/spec/data/karchive-release-5.4.manifest +29 -0
  27. data/spec/data/karchive-release.manifest +7 -7
  28. data/spec/data/karchive.readme +0 -6
  29. data/spec/data/newlib/newlib.manifest +11 -4
  30. data/spec/data/rendertest-generic.manifest +4 -1
  31. data/spec/integration/cli_create_spec.rb +24 -0
  32. data/spec/integration/cli_general_spec.rb +19 -0
  33. data/spec/integration/cli_get_involved_spec.rb +14 -0
  34. data/spec/integration/cli_help_spec.rb +21 -0
  35. data/spec/integration/cli_list_spec.rb +23 -0
  36. data/spec/integration/cli_verify_spec.rb +37 -0
  37. data/spec/integration/cli_view_spec.rb +28 -0
  38. data/spec/integration/spec_helper.rb +2 -0
  39. data/spec/{creator_spec.rb → unit/creator_spec.rb} +8 -41
  40. data/spec/unit/downloader_spec.rb +32 -0
  41. data/spec/unit/json_object_spec.rb +273 -0
  42. data/spec/{kde_frameworks_creator_spec.rb → unit/kde_frameworks_creator_spec.rb} +13 -14
  43. data/spec/{kde_frameworks_release_spec.rb → unit/kde_frameworks_release_spec.rb} +14 -10
  44. data/spec/{library_spec.rb → unit/library_spec.rb} +7 -7
  45. data/spec/{manifest_handler_spec.rb → unit/manifest_handler_spec.rb} +21 -17
  46. data/spec/unit/manifest_spec.rb +301 -0
  47. data/spec/{rpm_manifestizer_spec.rb → unit/rpm_manifestizer_spec.rb} +0 -0
  48. data/spec/{settings_spec.rb → unit/settings_spec.rb} +0 -0
  49. data/spec/{spec_helper.rb → unit/spec_helper.rb} +10 -12
  50. data/spec/{verifier_spec.rb → unit/verifier_spec.rb} +24 -15
  51. data/spec/{view_spec.rb → unit/view_spec.rb} +38 -7
  52. data/view/all.html.haml +4 -4
  53. data/view/commercial.html.haml +1 -1
  54. data/view/development.html.haml +3 -3
  55. data/view/get.html.haml +11 -2
  56. data/view/group.html.haml +4 -4
  57. data/view/index.html.haml +1 -1
  58. data/view/library.html.haml +8 -9
  59. data/view/unreleased.html.haml +1 -1
  60. data/yes_ship_it.conf +3 -0
  61. metadata +67 -51
  62. data/spec/manifest_spec.rb +0 -63
@@ -0,0 +1,29 @@
1
+ {
2
+ "$schema": "http://inqlude.org/schema/release-manifest-v1#",
3
+ "name": "karchive",
4
+ "display_name": "KArchive",
5
+ "release_date": "2014-11-06",
6
+ "version": "5.4.0",
7
+ "summary": "Reading, creating, and manipulating file archives",
8
+ "urls": {
9
+ "homepage": "https://projects.kde.org/projects/frameworks/karchive",
10
+ "download": "http://download.kde.org/stable/frameworks/5.4/",
11
+ "vcs": "https://projects.kde.org/projects/frameworks/karchive/repository",
12
+ "mailing_list": "https://mail.kde.org/mailman/listinfo/kde-frameworks-devel"
13
+ },
14
+ "licenses": [
15
+ "LGPLv2.1+"
16
+ ],
17
+ "description": "KArchive provides classes for easy reading, creation and manipulation of\n\"archive\" formats like ZIP and TAR.\n\nIf also provides transparent compression and decompression of data, like the\nGZip format, via a subclass of QIODevice.",
18
+ "authors": [
19
+ "The KDE Community"
20
+ ],
21
+ "maturity": "stable",
22
+ "platforms": [
23
+ "Linux"
24
+ ],
25
+ "packages": {
26
+ "source": "http://download.kde.org/stable/frameworks/5.4/karchive-5.4.0.tar.xz"
27
+ },
28
+ "group": "kde-frameworks"
29
+ }
@@ -2,12 +2,14 @@
2
2
  "$schema": "http://inqlude.org/schema/release-manifest-v1#",
3
3
  "name": "karchive",
4
4
  "display_name": "KArchive",
5
+ "release_date": "2014-07-07",
6
+ "version": "5.0.0",
5
7
  "summary": "Reading, creating, and manipulating file archives",
6
8
  "urls": {
7
9
  "homepage": "https://projects.kde.org/projects/frameworks/karchive",
10
+ "download": "http://download.kde.org/stable/frameworks/5.0.0/",
8
11
  "vcs": "https://projects.kde.org/projects/frameworks/karchive/repository",
9
- "mailing_list": "https://mail.kde.org/mailman/listinfo/kde-frameworks-devel",
10
- "download": "http://download.kde.org/stable/frameworks/5.0.0/"
12
+ "mailing_list": "https://mail.kde.org/mailman/listinfo/kde-frameworks-devel"
11
13
  },
12
14
  "licenses": [
13
15
  "LGPLv2.1+"
@@ -16,14 +18,12 @@
16
18
  "authors": [
17
19
  "The KDE Community"
18
20
  ],
21
+ "maturity": "stable",
19
22
  "platforms": [
20
23
  "Linux"
21
24
  ],
22
- "group": "kde-frameworks",
23
- "maturity": "stable",
24
- "release_date": "2014-07-07",
25
- "version": "5.0.0",
26
25
  "packages": {
27
26
  "source": "http://download.kde.org/stable/frameworks/5.0.0/karchive-5.0.0.tar.xz"
28
- }
27
+ },
28
+ "group": "kde-frameworks"
29
29
  }
@@ -27,9 +27,3 @@ appropriate subclass of KArchive (eg: K7Zip for 7-Zip files). You may need to
27
27
  combine this with usage of KCompressionDevice (see the API documentation for the
28
28
  relevant KArchive subclass for details).
29
29
 
30
- ## Links
31
-
32
- - Home page: <https://projects.kde.org/projects/frameworks/karchive>
33
- - Mailing list: <https://mail.kde.org/mailman/listinfo/kde-frameworks-devel>
34
- - IRC channel: #kde-devel on Freenode
35
- - Git repository: <https://projects.kde.org/projects/frameworks/karchive/repository>
@@ -6,8 +6,15 @@
6
6
  "homepage": "http://new.example.org",
7
7
  "download": "http://new.example.org/download"
8
8
  },
9
- "licenses": ["GPLv3"],
9
+ "licenses": [
10
+ "GPLv3"
11
+ ],
10
12
  "description": "This is an awesome library. It's new.",
11
- "authors": ["Cornelius Schumacher <schumacher@kde.org>"],
12
- "platforms": [ "Linux", "Windows" ]
13
- }
13
+ "authors": [
14
+ "Cornelius Schumacher <schumacher@kde.org>"
15
+ ],
16
+ "platforms": [
17
+ "Linux",
18
+ "Windows"
19
+ ]
20
+ }
@@ -5,7 +5,10 @@
5
5
  "summary": "Test manifest for testing rendering",
6
6
  "urls": {
7
7
  "homepage": "https://example.org",
8
- "vcs": "https://example.org/git"
8
+ "vcs": "https://example.org/git",
9
+ "custom": {
10
+ "Special": "http://special.example.org"
11
+ }
9
12
  },
10
13
  "licenses": [
11
14
  "LGPLv2.1+"
@@ -0,0 +1,24 @@
1
+ require_relative "spec_helper"
2
+
3
+ include CliTester
4
+
5
+ describe "Command line interface" do
6
+ include GivenFilesystemSpecHelpers
7
+
8
+ use_given_filesystem
9
+
10
+ describe "create" do
11
+ it "creates new manifest" do
12
+
13
+ dir = given_directory
14
+
15
+ result = run_command(args: ["create", "--offline",
16
+ "--manifest_dir=#{dir}", "newlib", "42.1", "2015-06-13"],
17
+ working_directory: dir)
18
+ expect(result).to exit_with_success("")
19
+
20
+ expect(File.exist?(File.join(dir, "newlib", "newlib.2015-06-13.manifest"))).
21
+ to be(true)
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,19 @@
1
+ require_relative "spec_helper"
2
+
3
+ include CliTester
4
+
5
+ describe "Command line interface" do
6
+ describe "shows error" do
7
+ it "when command does not exist" do
8
+ expect(run_command(args: ["abc"])).to exit_with_success("", /abc/)
9
+ end
10
+
11
+ it "when global option does not exist" do
12
+ expect(run_command(args: ["--abc"])).to exit_with_success("", /--abc/)
13
+ end
14
+
15
+ it "when command option does not exist" do
16
+ expect(run_command(args: ["list", "--abc"])).to exit_with_success("", /--abc/)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,14 @@
1
+ require_relative "spec_helper"
2
+
3
+ include CliTester
4
+
5
+ describe "Command line interface" do
6
+ describe "get_involved" do
7
+ it "shows list of open issues" do
8
+ result = run_command(args: ["get_involved"])
9
+ expect(result.exit_code).to eq(0)
10
+ expect(result.stdout).to match("github.com/cornelius/inqlude/issues")
11
+ expect(result.stderr.empty?).to be(true)
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,21 @@
1
+ require_relative "spec_helper"
2
+
3
+ include CliTester
4
+
5
+ describe "Command line interface" do
6
+ describe "help" do
7
+ it "shows general help" do
8
+ result = run_command
9
+ expect(result.exit_code).to eq(0)
10
+ expect(result.stdout).to match(/Commands:/)
11
+ expect(result.stderr.empty?).to be(true)
12
+ end
13
+
14
+ it "shows help for command" do
15
+ result = run_command(args: ["help", "list"])
16
+ expect(result.exit_code).to eq(0)
17
+ expect(result.stdout).to match("inqlude list")
18
+ expect(result.stderr.empty?).to be(true)
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,23 @@
1
+ require_relative "spec_helper"
2
+
3
+ include CliTester
4
+
5
+ describe "Command line interface" do
6
+ include GivenFilesystemSpecHelpers
7
+
8
+ use_given_filesystem
9
+
10
+ describe "list" do
11
+ it "lists libraries" do
12
+
13
+ dir = given_directory do
14
+ given_directory_from_data("awesomelib")
15
+ given_directory_from_data("newlib")
16
+ end
17
+
18
+ result = run_command(args: ["list", "--remote", "--offline",
19
+ "--manifest_dir=#{dir}"])
20
+ expect(result).to exit_with_success("awesomelib (0.2.0)\nnewlib ()\n")
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,37 @@
1
+ require_relative "spec_helper"
2
+
3
+ include CliTester
4
+
5
+ describe "Command line interface" do
6
+ include GivenFilesystemSpecHelpers
7
+
8
+ use_given_filesystem(keep_files: true)
9
+
10
+ describe "verify" do
11
+ it "verifies single manifest" do
12
+ dir = given_directory do
13
+ given_directory_from_data("awesomelib")
14
+ end
15
+
16
+ result = run_command(args: ["verify",
17
+ File.join(dir, "awesomelib", "awesomelib.2013-09-08.manifest")])
18
+ expect(result).to exit_with_success("Verify manifest awesomelib.2013-09-08.manifest...ok\n")
19
+ end
20
+
21
+ it "verifies all manifests" do
22
+ dir = given_directory do
23
+ given_directory_from_data("awesomelib")
24
+ given_directory_from_data("newlib")
25
+ end
26
+
27
+ result = run_command(args: ["verify", "--offline", "--manifest_dir=#{dir}"])
28
+ expected_output = <<EOT
29
+ Verify manifest awesomelib.2013-09-08.manifest...ok
30
+ Verify manifest newlib.manifest...ok
31
+
32
+ 2 manifests checked. 2 ok, 0 with error.
33
+ EOT
34
+ expect(result).to exit_with_success(expected_output)
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,28 @@
1
+ require_relative "spec_helper"
2
+
3
+ include CliTester
4
+
5
+ describe "Command line interface" do
6
+ include GivenFilesystemSpecHelpers
7
+
8
+ use_given_filesystem
9
+
10
+ describe "view" do
11
+ it "generates view" do
12
+ dir = given_directory do
13
+ given_directory_from_data("awesomelib")
14
+ given_directory_from_data("newlib")
15
+ end
16
+
17
+ output_dir = given_directory
18
+
19
+ result = run_command(args: ["view", "--offline",
20
+ "--manifest_dir=#{dir}", "--output-dir=#{output_dir}"])
21
+ expect(result).to exit_with_success(/Creating web site/)
22
+
23
+ expect(File.exist?(File.join(output_dir, "index.html"))).to be(true)
24
+ expect(File.exist?(File.join(output_dir, "libraries", "awesomelib.html"))).to be(true)
25
+ expect(File.exist?(File.join(output_dir, "libraries", "newlib.html"))).to be(true)
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,2 @@
1
+ require "cli_tester"
2
+ require "given_filesystem/spec_helpers"
@@ -44,28 +44,12 @@ describe Creator do
44
44
 
45
45
  expect(mh.libraries.count).to eq 1
46
46
  m = mh.manifest "awesomelib"
47
- expect(m["name"]).to eq "awesomelib"
48
- expect(m["version"]).to eq "1.0"
49
- expect(m["release_date"]).to eq "2013-10-01"
50
- expect(m["summary"]).to eq "Awesome library"
47
+ expect(m.name).to eq "awesomelib"
48
+ expect(m.version).to eq "1.0"
49
+ expect(m.release_date).to eq "2013-10-01"
50
+ expect(m.summary).to eq "Awesome library"
51
51
 
52
52
  expect(mh.manifests.count).to eq 2
53
- mh.manifests.each do |manifest|
54
- if manifest["schema_type"] == "generic"
55
- if manifest["name"] == "commercial"
56
- expect(manifest.keys.count).to eq 13
57
- else
58
- expect(manifest.keys.count).to eq 12
59
- end
60
- elsif manifest["schema_type"] == "proprietary-release"
61
- expect(manifest.keys.count).to eq 15
62
- else
63
- expect(manifest.keys.count).to eq 17
64
- end
65
- end
66
-
67
- m = JSON File.read(manifest_filename)
68
- expect(m.keys.count).to eq 13
69
53
  end
70
54
 
71
55
  it "creates new manifest" do
@@ -82,21 +66,11 @@ describe Creator do
82
66
 
83
67
  expect(File.exists?(manifest_filename)).to be true
84
68
 
85
- mh = ManifestHandler.new settings
86
- mh.read_remote
69
+ m = Manifest.parse_file(manifest_filename)
87
70
 
88
- expect(mh.libraries.count).to eq 1
89
- m = mh.manifest "newawesomelib"
90
- expect(m["name"]).to eq "newawesomelib"
91
- expect(m["version"]).to eq "edge"
92
- expect(m["release_date"]).to eq "2013-09-01"
93
-
94
- v = Verifier.new settings
95
- result = v.verify m
96
- if !result.valid?
97
- result.print_result
98
- end
99
- expect(result.valid?).to be true
71
+ expect(m.name).to eq "newawesomelib"
72
+ expect(m.version).to eq "edge"
73
+ expect(m.release_date).to eq "2013-09-01"
100
74
  end
101
75
 
102
76
  it "creates new generic manifest" do
@@ -112,13 +86,6 @@ describe Creator do
112
86
  c.create_generic
113
87
 
114
88
  expect(File.exists?(manifest_filename)).to be true
115
-
116
- v = Verifier.new settings
117
- result = v.verify_file manifest_filename
118
- if !result.valid?
119
- result.print_result
120
- end
121
- expect(result.valid?).to be true
122
89
  end
123
90
 
124
91
  describe "#create_dir" do
@@ -0,0 +1,32 @@
1
+ require File.expand_path('../spec_helper', __FILE__)
2
+
3
+ include GivenFilesystemSpecHelpers
4
+
5
+ describe Downloader do
6
+
7
+ use_given_filesystem
8
+
9
+ include_context "manifest_files"
10
+
11
+ it "downloads source tarball" do
12
+ mh = ManifestHandler.new(settings)
13
+ mh.read_remote
14
+
15
+ output = double
16
+ expect(output).to receive(:puts).at_least(:once)
17
+
18
+ downloader = Downloader.new(mh, output)
19
+
20
+ expect(downloader).to receive(:read_from_url).and_return("dummy tarball")
21
+
22
+ path = given_directory
23
+
24
+ downloader.download("awesomelib", path)
25
+
26
+ tarball_path = File.join(path, "awesomelib-0.2.0.tar.gz")
27
+
28
+ expect(File.exists?(tarball_path)).to be true
29
+ expect(File.read(tarball_path)).to eq "dummy tarball"
30
+ end
31
+
32
+ end
@@ -0,0 +1,273 @@
1
+ require_relative "spec_helper.rb"
2
+
3
+ class MyObject < JsonObject
4
+ attribute :name
5
+ attribute :version
6
+
7
+ attribute :licenses
8
+
9
+ attribute :urls do
10
+ attribute :homepage
11
+ attribute :download
12
+ end
13
+
14
+ attribute :custom
15
+ end
16
+
17
+ class MyDerivedObject < MyObject
18
+ end
19
+
20
+ class MyOtherObject < JsonObject
21
+ attribute :hello
22
+ end
23
+
24
+ describe JsonObject do
25
+ describe "construction" do
26
+ it "works when two JsonObjects are defined" do
27
+ object = MyOtherObject.new
28
+
29
+ object.hello = "world"
30
+
31
+ expect(object.hello).to eq "world"
32
+ end
33
+
34
+ it "defines internal classes" do
35
+ object = MyObject.new
36
+
37
+ expect(object.urls).to be_a MyObject::Urls
38
+ end
39
+
40
+ it "inherits keys from super class" do
41
+ expect(MyDerivedObject.all_keys).to include(:name)
42
+ end
43
+
44
+ it "can instantiate sub class" do
45
+ object = MyDerivedObject.new
46
+
47
+ object.name = "Sub Jason"
48
+ expect(object.name).to eq "Sub Jason"
49
+ end
50
+ end
51
+
52
+ describe "attributes" do
53
+ it "defines accessors" do
54
+ object = MyObject.new
55
+
56
+ object.name = "Jason"
57
+ expect(object.name).to eq "Jason"
58
+
59
+ object.version = "1.2.3"
60
+ expect(object.version).to eq "1.2.3"
61
+
62
+ object.licenses = ["GPLv2", "LGPLv2.1"]
63
+ expect(object.licenses).to eq ["GPLv2", "LGPLv2.1"]
64
+
65
+ object.urls.homepage = "http://example.com"
66
+ expect(object.urls.homepage).to eq "http://example.com"
67
+ end
68
+
69
+ it "returns validity of objects" do
70
+ object = MyObject.new
71
+
72
+ expect(object.valid?).to be false
73
+ expect(object.urls.valid?).to be false
74
+
75
+ object.name = "Jason"
76
+
77
+ expect(object.valid?).to be true
78
+ expect(object.urls.valid?).to be false
79
+
80
+ object.urls.homepage = "http://example.com"
81
+
82
+ expect(object.valid?).to be true
83
+ expect(object.urls.valid?).to be true
84
+ end
85
+
86
+ it "returns nil for unset attribute" do
87
+ json = <<EOT
88
+ {
89
+ "name": "Jason"
90
+ }
91
+ EOT
92
+ object = MyDerivedObject.new.from_json(json)
93
+
94
+ expect(object.name).to eq "Jason"
95
+ expect(object.version).to be nil
96
+ end
97
+
98
+ it "raises exception for non-existing attribute" do
99
+ object = MyObject.new
100
+
101
+ expect {
102
+ object.invalid_attribute
103
+ }.to raise_error(NoMethodError)
104
+ end
105
+ end
106
+
107
+ describe "JSON" do
108
+ before(:all) do
109
+ @json = <<EOT
110
+ {
111
+ "name": "Jason",
112
+ "version": "1.2.3",
113
+ "licenses": [
114
+ "GPLv2",
115
+ "LGPLv2.1"
116
+ ],
117
+ "urls": {
118
+ "homepage": "http://example.com",
119
+ "download": "http://example.org/download"
120
+ }
121
+ }
122
+ EOT
123
+ @json.chomp!
124
+ end
125
+
126
+ describe "reads" do
127
+ it "from hash" do
128
+ hash = JSON(@json)
129
+
130
+ object = MyObject.new.from_hash(hash)
131
+ expect(object.class).to be MyObject
132
+ expect(object.name).to eq "Jason"
133
+ expect(object.urls.class).to eq MyObject::Urls
134
+ expect(object.urls.homepage).to eq "http://example.com"
135
+ end
136
+
137
+ it "from JSON" do
138
+ object = MyObject.new.from_json(@json)
139
+
140
+ expect(object.class).to be MyObject
141
+ expect(object.name).to eq "Jason"
142
+ expect(object.version).to eq "1.2.3"
143
+ expect(object.licenses).to eq ["GPLv2", "LGPLv2.1"]
144
+ expect(object.urls.homepage).to eq "http://example.com"
145
+ expect(object.urls.download).to eq "http://example.org/download"
146
+ end
147
+
148
+ it "skips schema id" do
149
+ json = <<EOT
150
+ {
151
+ "$schema": "abc:xyz",
152
+ "name": "Jason"
153
+ }
154
+ EOT
155
+ object = MyObject.new.from_json(json)
156
+
157
+ expect(object.name).to eq "Jason"
158
+ end
159
+
160
+ it "hashes as values" do
161
+ json = <<EOT
162
+ {
163
+ "$schema": "http://example.com/schema/myobject-v1#",
164
+ "name": "Jason",
165
+ "custom": {
166
+ "one": "1",
167
+ "two": "2"
168
+ }
169
+ }
170
+ EOT
171
+ object = MyObject.new.from_json(json)
172
+
173
+ expect(object.name).to eq "Jason"
174
+ expect(object.custom).to eq({ "one" => "1", "two" => "2" })
175
+ end
176
+
177
+ it "raises exception on unexpected attribute" do
178
+ json = <<EOT
179
+ {
180
+ "name": "Jason",
181
+ "invalid_attribute": "42"
182
+ }
183
+ EOT
184
+ object = MyObject.new
185
+ expect {
186
+ object.from_json(json)
187
+ }.to raise_error(NoMethodError)
188
+ end
189
+ end
190
+
191
+ describe "writes" do
192
+ it "to hash" do
193
+ object = MyObject.new
194
+ object.name = "Jason"
195
+ object.version = "1.2.3"
196
+ object.licenses = ["GPLv2", "LGPLv2.1"]
197
+ object.urls.homepage = "http://example.com"
198
+ object.urls.download = "http://example.org/download"
199
+
200
+ expected_hash = {
201
+ :name => "Jason",
202
+ :version => "1.2.3",
203
+ :licenses => ["GPLv2", "LGPLv2.1"],
204
+ :urls => {
205
+ :homepage => "http://example.com",
206
+ :download => "http://example.org/download"
207
+ }
208
+ }
209
+
210
+ expect(object.to_hash).to eq expected_hash
211
+ end
212
+
213
+ it "to JSON" do
214
+ expected_json = @json
215
+
216
+ object = MyObject.new
217
+ object.name = "Jason"
218
+ object.version = "1.2.3"
219
+ object.licenses = ["GPLv2", "LGPLv2.1"]
220
+ object.urls.homepage = "http://example.com"
221
+ object.urls.download = "http://example.org/download"
222
+
223
+ expect(object.to_json).to eq expected_json
224
+ end
225
+
226
+ it "only attributes which have a value" do
227
+ object = MyObject.new
228
+ object.name = "Jason"
229
+
230
+ expected_json = <<EOT
231
+ {
232
+ "name": "Jason"
233
+ }
234
+ EOT
235
+ expected_json.chomp!
236
+
237
+ expect(object.to_json).to eq expected_json
238
+ end
239
+
240
+ it "schema id" do
241
+ expected_json = <<EOT
242
+ {
243
+ "$schema": "http://example.com/schema/myobject-v1#",
244
+ "name": "Jason"
245
+ }
246
+ EOT
247
+ expected_json.chomp!
248
+
249
+ object = MyObject.new
250
+ object.schema_id = "http://example.com/schema/myobject-v1#"
251
+ object.name = "Jason"
252
+
253
+ expect(object.to_json).to eq expected_json
254
+ end
255
+
256
+ it "hashes as values" do
257
+ json = <<EOT
258
+ {
259
+ "name": "Jason",
260
+ "custom": {
261
+ "one": "1",
262
+ "two": "2"
263
+ }
264
+ }
265
+ EOT
266
+
267
+ object = MyObject.new.from_json(json)
268
+
269
+ expect(object.to_json).to eq json.chomp
270
+ end
271
+ end
272
+ end
273
+ end