picatrix 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,46 @@
1
+ require 'sinatra'
2
+ require 'sinatra/json'
3
+ require 'require_all'
4
+
5
+ require_all("./lib/picatrix/generated/*.rb")
6
+
7
+ class App < Sinatra::Base
8
+ set :public_folder => "public", :static => true
9
+
10
+ get '/' do
11
+ status, headers, body = call env.merge("PATH_INFO" => "/welcome/newest")
12
+ [status, headers, body]
13
+ end
14
+
15
+ get "/welcome/newest" do
16
+ json({"title"=>"View submissions", "description"=>"idk yet", "@meta"=>{"@title"=>"Submissions", "@description"=>"This resource represents submissions."}, "@controls"=>{"self"=>{"href"=>"http://localhost:9292/welcome/newest"}, "is:filter"=>{"href"=>"http://localhost:9292/submission_filter_template/filter?category={category}&has_photo={has_photo}", "isHrefTemplate"=>true, "title"=>"filter submissions by category", "description"=>"in addition to category, you can ensure the submission has a photo"}, "is:add"=>{"title"=>"add new submission", "encoding"=>"json", "href"=>"http://localhost:9292/submission_add_template/submit", "method"=>"POST", "template"=>{"title"=>"default title", "category"=>"cats", "photo_url"=>"http://cats.com"}}}, "submissions"=>[{"@controls"=>{"self"=>{"title"=>"submission 1", "href"=>"http://localhost:9292/view_submission/1"}}, "id"=>1, "category"=>"cats", "photo"=>"https://i.ytimg.com/vi/tntOCGkgt98/maxresdefault.jpg"}, {"@controls"=>{"self"=>{"title"=>"submission 2", "href"=>"http://localhost:9292/view_submission/2"}}, "id"=>2, "category"=>"cats", "photo"=>"https://i.ytimg.com/vi/icqDxNab3Do/maxresdefault.jpg"}]})
17
+ end
18
+
19
+ get "/submission_filter_template/filter" do
20
+ json({"title"=>"View submissions", "description"=>"idk yet", "@meta"=>{"@title"=>"Submissions", "@description"=>"This resource represents submissions."}, "@controls"=>{"self"=>{"href"=>"http://localhost:9292/welcome/newest"}, "is:filter"=>{"href"=>"http://localhost:9292/submission_filter_template/filter?category={category}&has_photo={has_photo}", "isHrefTemplate"=>true, "title"=>"filter submissions by category", "description"=>"in addition to category, you can ensure the submission has a photo"}, "is:add"=>{"title"=>"add new submission", "encoding"=>"json", "href"=>"http://localhost:9292/submission_add_template/submit", "method"=>"POST", "template"=>{"title"=>"default title", "category"=>"cats", "photo_url"=>"http://cats.com"}}}, "submissions"=>[{"@controls"=>{"self"=>{"title"=>"submission 1", "href"=>"http://localhost:9292/view_submission/1"}}, "id"=>1, "category"=>"cats", "photo"=>"https://i.ytimg.com/vi/tntOCGkgt98/maxresdefault.jpg"}, {"@controls"=>{"self"=>{"title"=>"submission 2", "href"=>"http://localhost:9292/view_submission/2"}}, "id"=>2, "category"=>"cats", "photo"=>"https://i.ytimg.com/vi/icqDxNab3Do/maxresdefault.jpg"}], "category"=>"#{params[:category]}", "has_photo"=>"#{params[:has_photo]}"})
21
+ end
22
+
23
+ post "/submission_add_template/submit" do
24
+ json({"@controls"=>{"self"=>{"title"=>"submission #{item_id}", "href"=>"http://localhost:9292/view_submission/#{item_id}"}, "up"=>{"title"=>"View submissions", "href"=>"http://localhost:9292/welcome/newest"}, "is:edit"=>{"title"=>"update category or photo url", "encoding"=>"json", "href"=>"http://localhost:9292/view_submission/#{item_id}", "method"=>"PATCH", "template"=>{"photo"=>"{new_url}", "category"=>"{new_category}"}}, "is:remove"=>{"title"=>"remove submission", "href"=>"http://localhost:9292/view_submission/#{item_id}", "method"=>"DELETE"}}, "id"=>"#{item.id}", "category"=>"#{item.category}", "photo"=>"#{item.photo}", :message=>0})
25
+ end
26
+
27
+ get "/view_submission/newest" do
28
+ json({"title"=>"View submissions", "description"=>"idk yet", "@meta"=>{"@title"=>"Submissions", "@description"=>"This resource represents submissions."}, "@controls"=>{"self"=>{"title"=>"submission #{item_id}", "href"=>"http://localhost:9292/view_submission/#{item_id}"}, "up"=>{"title"=>"View submissions", "href"=>"http://localhost:9292/welcome/newest"}, "is:edit"=>{"title"=>"update category or photo url", "encoding"=>"json", "href"=>"http://localhost:9292/view_submission/#{item_id}", "method"=>"PATCH", "template"=>{"photo"=>"{new_url}", "category"=>"{new_category}"}}, "is:remove"=>{"title"=>"remove submission", "href"=>"http://localhost:9292/view_submission/#{item_id}", "method"=>"DELETE"}}, "submissions"=>[{"@controls"=>{"self"=>{"title"=>"submission 1", "href"=>"http://localhost:9292/view_submission/1"}}, "id"=>1, "category"=>"cats", "photo"=>"https://i.ytimg.com/vi/tntOCGkgt98/maxresdefault.jpg"}, {"@controls"=>{"self"=>{"title"=>"submission 2", "href"=>"http://localhost:9292/view_submission/2"}}, "id"=>2, "category"=>"cats", "photo"=>"https://i.ytimg.com/vi/icqDxNab3Do/maxresdefault.jpg"}], "id"=>"#{item.id}", "category"=>"#{item.category}", "photo"=>"#{item.photo}"})
29
+ end
30
+
31
+ delete "/submission_delete_template/newest" do
32
+ json({"title"=>"View submissions", "description"=>"idk yet", "@meta"=>{"@title"=>"Submissions", "@description"=>"This resource represents submissions."}, "@controls"=>{"self"=>{"href"=>"http://localhost:9292/welcome/newest"}, "is:filter"=>{"href"=>"http://localhost:9292/submission_filter_template/filter?category={category}&has_photo={has_photo}", "isHrefTemplate"=>true, "title"=>"filter submissions by category", "description"=>"in addition to category, you can ensure the submission has a photo"}, "is:add"=>{"title"=>"add new submission", "encoding"=>"json", "href"=>"http://localhost:9292/submission_add_template/submit", "method"=>"POST", "template"=>{"title"=>"default title", "category"=>"cats", "photo_url"=>"http://cats.com"}}}, "submissions"=>[{"@controls"=>{"self"=>{"title"=>"submission 1", "href"=>"http://localhost:9292/view_submission/1"}}, "id"=>1, "category"=>"cats", "photo"=>"https://i.ytimg.com/vi/tntOCGkgt98/maxresdefault.jpg"}, {"@controls"=>{"self"=>{"title"=>"submission 2", "href"=>"http://localhost:9292/view_submission/2"}}, "id"=>2, "category"=>"cats", "photo"=>"https://i.ytimg.com/vi/icqDxNab3Do/maxresdefault.jpg"}], :message=>0})
33
+ end
34
+
35
+ patch "/submission_edit_template/self" do
36
+ json({"@controls"=>{"self"=>{"title"=>"submission #{item_id}", "href"=>"http://localhost:9292/view_submission/#{item_id}"}, "up"=>{"title"=>"View submissions", "href"=>"http://localhost:9292/welcome/newest"}, "is:edit"=>{"title"=>"update category or photo url", "encoding"=>"json", "href"=>"http://localhost:9292/view_submission/#{item_id}", "method"=>"PATCH", "template"=>{"photo"=>"{new_url}", "category"=>"{new_category}"}}, "is:remove"=>{"title"=>"remove submission", "href"=>"http://localhost:9292/view_submission/#{item_id}", "method"=>"DELETE"}}, "id"=>"#{item.id}", "category"=>"#{item.category}", "photo"=>"#{item.photo}", :message=>0})
37
+ end
38
+
39
+
40
+ get "/view_submission/:item_id" do
41
+ item_id = params[:item_id]
42
+ item = ViewSubmission.find(item_id)
43
+ json({"@controls"=>{"self"=>{"title"=>"submission #{item_id}", "href"=>"http://localhost:9292/view_submission/#{item_id}"}, "up"=>{"title"=>"View submissions", "href"=>"http://localhost:9292/welcome/newest"}, "is:edit"=>{"title"=>"update category or photo url", "encoding"=>"json", "href"=>"http://localhost:9292/view_submission/#{item_id}", "method"=>"PATCH", "template"=>{"photo"=>"{new_url}", "category"=>"{new_category}"}}, "is:remove"=>{"title"=>"remove submission", "href"=>"http://localhost:9292/view_submission/#{item_id}", "method"=>"DELETE"}}, "id"=>"#{item.id}", "category"=>"#{item.category}", "photo"=>"#{item.photo}"})
44
+ end
45
+
46
+ end
@@ -0,0 +1,88 @@
1
+ require 'sinatra'
2
+ require 'sinatra/json'
3
+ require 'require_all'
4
+
5
+ require_all("./lib/picatrix/generated/*.rb")
6
+
7
+ class App < Sinatra::Base
8
+ set :public_folder => "public", :static => true
9
+
10
+ get '/' do
11
+ status, headers, body = call env.merge("PATH_INFO" => "/welcome/newest")
12
+ [status, headers, body]
13
+ end
14
+
15
+ get "/welcome/newest" do
16
+ items = ViewSubmission.all
17
+ hashed_items = items.collect do |item|
18
+ item_id = item.id
19
+ category = item.category
20
+ photo = item.photo
21
+ {"@controls"=>{"self"=>{"title"=>"submission #{item_id}", "href"=>"http://localhost:9292/view_submission/#{item_id}"}}, "id"=>"#{item.id}", "category"=>"#{item.category}", "photo"=>"#{item.photo}"}
22
+ end
23
+ json({"title"=>"View submissions", "description"=>"idk yet", "@meta"=>{"@title"=>"Submissions", "@description"=>"This resource represents submissions."}, "@controls"=>{"self"=>{"href"=>"http://localhost:9292/welcome/newest"}, "is:filter"=>{"href"=>"http://localhost:9292/submission_filter_template/filter?category={category}&has_photo={has_photo}", "isHrefTemplate"=>true, "title"=>"filter submissions by category", "description"=>"in addition to category, you can ensure the submission has a photo"}, "is:add"=>{"title"=>"add new submission", "encoding"=>"json", "href"=>"http://localhost:9292/submission_add_template/submit", "method"=>"POST", "template"=>{"title"=>"default title", "category"=>"cats", "photo_url"=>"http://cats.com"}}}}.merge({"view_submissions" => hashed_items}))
24
+ end
25
+
26
+ get "/submission_filter_template/filter" do
27
+ items = ViewSubmission.all
28
+ hashed_items = items.collect do |item|
29
+ item_id = item.id
30
+ category = item.category
31
+ photo = item.photo
32
+ {"@controls"=>{"self"=>{"title"=>"submission #{item_id}", "href"=>"http://localhost:9292/view_submission/#{item_id}"}}, "id"=>"#{item.id}", "category"=>"#{item.category}", "photo"=>"#{item.photo}"}
33
+ end
34
+ json({"title"=>"View submissions", "description"=>"idk yet", "@meta"=>{"@title"=>"Submissions", "@description"=>"This resource represents submissions."}, "@controls"=>{"self"=>{"href"=>"http://localhost:9292/welcome/newest"}, "is:filter"=>{"href"=>"http://localhost:9292/submission_filter_template/filter?category={category}&has_photo={has_photo}", "isHrefTemplate"=>true, "title"=>"filter submissions by category", "description"=>"in addition to category, you can ensure the submission has a photo"}, "is:add"=>{"title"=>"add new submission", "encoding"=>"json", "href"=>"http://localhost:9292/submission_add_template/submit", "method"=>"POST", "template"=>{"title"=>"default title", "category"=>"cats", "photo_url"=>"http://cats.com"}}}, "category"=>"#{params[:category]}", "has_photo"=>"#{params[:has_photo]}"}.merge({"view_submissions" => hashed_items}))
35
+ end
36
+
37
+ post "/submission_add_template/submit" do
38
+ items = ViewSubmission.all
39
+ hashed_items = items.collect do |item|
40
+ item_id = item.id
41
+ category = item.category
42
+ photo = item.photo
43
+ {"@controls"=>{"self"=>{"title"=>"submission #{item_id}", "href"=>"http://localhost:9292/view_submission/#{item_id}"}}, "id"=>"#{item.id}", "category"=>"#{item.category}", "photo"=>"#{item.photo}"}
44
+ end
45
+ json({"@controls"=>{"self"=>{"title"=>"submission #{item_id}", "href"=>"http://localhost:9292/view_submission/#{item_id}"}, "up"=>{"title"=>"View submissions", "href"=>"http://localhost:9292/welcome/newest"}, "is:edit"=>{"title"=>"update category or photo url", "encoding"=>"json", "href"=>"http://localhost:9292/view_submission/#{item_id}", "method"=>"PATCH", "template"=>{"photo"=>"{new_url}", "category"=>"{new_category}"}}, "is:remove"=>{"title"=>"remove submission", "href"=>"http://localhost:9292/view_submission/#{item_id}", "method"=>"DELETE"}}, "id"=>"#{item.id}", "category"=>"#{item.category}", "photo"=>"#{item.photo}", :message=>0}.merge({"view_submissions" => hashed_items}))
46
+ end
47
+
48
+ get "/view_submission/newest" do
49
+ items = ViewSubmission.all
50
+ hashed_items = items.collect do |item|
51
+ item_id = item.id
52
+ category = item.category
53
+ photo = item.photo
54
+ {"@controls"=>{"self"=>{"title"=>"submission #{item_id}", "href"=>"http://localhost:9292/view_submission/#{item_id}"}}, "id"=>"#{item.id}", "category"=>"#{item.category}", "photo"=>"#{item.photo}"}
55
+ end
56
+ json({"title"=>"View submissions", "description"=>"idk yet", "@meta"=>{"@title"=>"Submissions", "@description"=>"This resource represents submissions."}, "@controls"=>{"self"=>{"title"=>"submission #{item_id}", "href"=>"http://localhost:9292/view_submission/#{item_id}"}, "up"=>{"title"=>"View submissions", "href"=>"http://localhost:9292/welcome/newest"}, "is:edit"=>{"title"=>"update category or photo url", "encoding"=>"json", "href"=>"http://localhost:9292/view_submission/#{item_id}", "method"=>"PATCH", "template"=>{"photo"=>"{new_url}", "category"=>"{new_category}"}}, "is:remove"=>{"title"=>"remove submission", "href"=>"http://localhost:9292/view_submission/#{item_id}", "method"=>"DELETE"}}, "id"=>"#{item.id}", "category"=>"#{item.category}", "photo"=>"#{item.photo}"}.merge({"view_submissions" => hashed_items}))
57
+ end
58
+
59
+ delete "/submission_delete_template/newest" do
60
+ items = ViewSubmission.all
61
+ hashed_items = items.collect do |item|
62
+ item_id = item.id
63
+ category = item.category
64
+ photo = item.photo
65
+ {"@controls"=>{"self"=>{"title"=>"submission #{item_id}", "href"=>"http://localhost:9292/view_submission/#{item_id}"}}, "id"=>"#{item.id}", "category"=>"#{item.category}", "photo"=>"#{item.photo}"}
66
+ end
67
+ json({"title"=>"View submissions", "description"=>"idk yet", "@meta"=>{"@title"=>"Submissions", "@description"=>"This resource represents submissions."}, "@controls"=>{"self"=>{"href"=>"http://localhost:9292/welcome/newest"}, "is:filter"=>{"href"=>"http://localhost:9292/submission_filter_template/filter?category={category}&has_photo={has_photo}", "isHrefTemplate"=>true, "title"=>"filter submissions by category", "description"=>"in addition to category, you can ensure the submission has a photo"}, "is:add"=>{"title"=>"add new submission", "encoding"=>"json", "href"=>"http://localhost:9292/submission_add_template/submit", "method"=>"POST", "template"=>{"title"=>"default title", "category"=>"cats", "photo_url"=>"http://cats.com"}}}, :message=>0}.merge({"view_submissions" => hashed_items}))
68
+ end
69
+
70
+ patch "/submission_edit_template/self" do
71
+ items = ViewSubmission.all
72
+ hashed_items = items.collect do |item|
73
+ item_id = item.id
74
+ category = item.category
75
+ photo = item.photo
76
+ {"@controls"=>{"self"=>{"title"=>"submission #{item_id}", "href"=>"http://localhost:9292/view_submission/#{item_id}"}}, "id"=>"#{item.id}", "category"=>"#{item.category}", "photo"=>"#{item.photo}"}
77
+ end
78
+ json({"@controls"=>{"self"=>{"title"=>"submission #{item_id}", "href"=>"http://localhost:9292/view_submission/#{item_id}"}, "up"=>{"title"=>"View submissions", "href"=>"http://localhost:9292/welcome/newest"}, "is:edit"=>{"title"=>"update category or photo url", "encoding"=>"json", "href"=>"http://localhost:9292/view_submission/#{item_id}", "method"=>"PATCH", "template"=>{"photo"=>"{new_url}", "category"=>"{new_category}"}}, "is:remove"=>{"title"=>"remove submission", "href"=>"http://localhost:9292/view_submission/#{item_id}", "method"=>"DELETE"}}, "id"=>"#{item.id}", "category"=>"#{item.category}", "photo"=>"#{item.photo}", :message=>0}.merge({"view_submissions" => hashed_items}))
79
+ end
80
+
81
+
82
+ get "/view_submission/:item_id" do
83
+ item_id = params[:item_id]
84
+ item = ViewSubmission.find(item_id)
85
+ json({"@controls"=>{"self"=>{"title"=>"submission #{item_id}", "href"=>"http://localhost:9292/view_submission/#{item_id}"}, "up"=>{"title"=>"View submissions", "href"=>"http://localhost:9292/welcome/newest"}, "is:edit"=>{"title"=>"update category or photo url", "encoding"=>"json", "href"=>"http://localhost:9292/view_submission/#{item_id}", "method"=>"PATCH", "template"=>{"photo"=>"{new_url}", "category"=>"{new_category}"}}, "is:remove"=>{"title"=>"remove submission", "href"=>"http://localhost:9292/view_submission/#{item_id}", "method"=>"DELETE"}}, "id"=>"#{item.id}", "category"=>"#{item.category}", "photo"=>"#{item.photo}"})
86
+ end
87
+
88
+ end
@@ -0,0 +1,24 @@
1
+ require 'ostruct'
2
+ class ViewSubmission
3
+ def self.find(item_id)
4
+ OpenStruct.new(
5
+ category: "cats",
6
+ photo: "http://imgur.com/r/cats/myEqIZx",
7
+ id: item_id
8
+ )
9
+ end
10
+ def self.all
11
+ [
12
+ OpenStruct.new(
13
+ category: "cats",
14
+ photo: "http://imgur.com/r/cats/myEqIZx",
15
+ id: 1
16
+ ),
17
+ OpenStruct.new(
18
+ category: "cats",
19
+ photo: "http://imgur.com/r/cats/myEqIZx",
20
+ id: 2
21
+ )
22
+ ]
23
+ end
24
+ end
@@ -0,0 +1,175 @@
1
+ require 'require_all'
2
+ require 'json'
3
+
4
+ module Picatrix
5
+ class Jenny
6
+ include Thor::Base
7
+ include Thor::Actions
8
+ attr_accessor :edges, :nodes, :app_name, :routes, :root,
9
+ :destination_stack, :options, :root_node_name,
10
+ :default_response, :assets, :addressable_items,
11
+ :generated
12
+
13
+ argument :name
14
+ source_root File.dirname(__FILE__)
15
+
16
+ def initialize(array = [], options = {}, app_name = "app")
17
+ @app_name = app_name
18
+ @options = options
19
+ @destination_stack = [self.class.source_root]
20
+ @default_response = { message: 0 }
21
+
22
+ hash = array.group_by {|e| e.keys.first}
23
+ @nodes = hash[:node].flat_map {|e| e[:node]}.reduce({}, :merge)
24
+ @edges = hash[:edge].flat_map {|e| e[:edge]}
25
+ # TODO need to adjust parser down below so i dont need to traverse this nonsense
26
+ @root_node_name = hash[:root].first.values.flatten.first.split("[").first.delete(" ")
27
+
28
+ @generated = []
29
+ # TODO for performance combine loops
30
+ @assets = assets
31
+ @addressable_items = addressable_items
32
+ @routes = routes
33
+ end
34
+
35
+ def just_do_it
36
+ @generated.each do |node_name|
37
+ require "./lib/picatrix/generated/#{node_name}.rb"
38
+ end
39
+ generate_app_file
40
+ end
41
+
42
+ private
43
+ def generate_app_file
44
+ template(
45
+ 'templates/app.rb',
46
+ File.join("generated/#{app_name}.rb")
47
+ )
48
+ end
49
+ def assets
50
+ @edges.collect do | edge|
51
+ source = edge.keys.first
52
+ properties = edge[source]
53
+ # if you dont have an inline asset, ignore
54
+ next unless properties[:inline]
55
+
56
+ # TODO ?
57
+ #link_relation = properties[:link_relation]
58
+ #path = "#{source}/#{link_relation.delete('"')}"
59
+
60
+ mason_path = "lib/picatrix/templates/mason/#{properties[:target]}.json"
61
+
62
+ if File.exist?(mason_path)
63
+ body = JSON.parse(
64
+ File.read(
65
+ mason_path
66
+ )
67
+ )
68
+ else
69
+ body = default_response
70
+ end
71
+ {
72
+ "#{properties[:target]}" => body
73
+ }
74
+ end.compact.reduce({}, :merge)
75
+ end
76
+ def routes
77
+ @edges.collect do |edge|
78
+ source = edge.keys.first
79
+ properties = edge[source]
80
+ # we dont need a route if it is inline represented
81
+ next if properties[:inline]
82
+
83
+ link_relation = properties[:link_relation]
84
+ path = "#{source}/#{link_relation.delete('"')}"
85
+
86
+ mason_path = "lib/picatrix/templates/mason/#{edge[source][:target]}.json"
87
+
88
+ if File.exist?(mason_path)
89
+ body = JSON.parse(
90
+ File.read(
91
+ mason_path
92
+ )
93
+ )
94
+ else
95
+ body = default_response
96
+ end
97
+
98
+ if source == root_node_name
99
+ @root = path
100
+ end
101
+
102
+ if (asset = assets[source]) && body.is_a?(Hash)
103
+ body.merge!(asset)
104
+ end
105
+
106
+ collections = @addressable_items.inject({}) do |memo, item|
107
+ memo["#{path}"] = {
108
+ name: "#{item[:type].pluralize}",
109
+ resource_name: "#{item[:type].camelcase}",
110
+ template: JSON.parse(
111
+ File.read("lib/picatrix/templates/mason/#{item[:type]}_min.json")
112
+ )
113
+ }
114
+ memo
115
+ end
116
+
117
+ {
118
+ path: path,
119
+ method: properties[:method],
120
+ # danger danger danger will robinson we are unescaping here!
121
+ body: body.to_s.delete("\\"),
122
+ collection: collections["#{path}"]
123
+ }
124
+ end.compact!
125
+ end
126
+ def addressable_items
127
+ @nodes.collect do |node|
128
+ node_name = node.first
129
+ node_properties = node.last
130
+
131
+ if node_properties[:type] == "item"
132
+ item_path = "#{node_name}/:item_id"
133
+ mason_path = "lib/picatrix/templates/mason/#{node_name}.json"
134
+ schema_path = "lib/picatrix/schemas/#{node_name}_item.json"
135
+
136
+ if File.exist?(mason_path)
137
+ body = JSON.parse(
138
+ File.read(
139
+ mason_path
140
+ )
141
+ )
142
+ else
143
+ body = default_response
144
+ end
145
+
146
+ if File.exist?(schema_path)
147
+ schema = JSON.parse(
148
+ File.read(
149
+ schema_path
150
+ )
151
+ )
152
+
153
+ # thor doesnt take locals in
154
+ @node_name = node_name
155
+ template(
156
+ 'templates/type.rb',
157
+ File.join("generated/#{node_name}.rb")
158
+ )
159
+ @generated = generated << @node_name
160
+ else
161
+ schema = {}
162
+ end
163
+
164
+ {
165
+ path: item_path,
166
+ type: node_name,
167
+ schema: schema,
168
+ # danger danger danger will robinson we are unescaping here!
169
+ body: body.to_s.delete("\\")
170
+ }
171
+ end
172
+ end.compact!
173
+ end
174
+ end
175
+ end
@@ -0,0 +1,17 @@
1
+ module Picatrix
2
+ # eats dots :)
3
+ class Pacman
4
+ attr_accessor :graph, :hash
5
+
6
+ def initialize(file_name)
7
+ @graph = GraphViz.parse(file_name, :path => "/usr/local/bin")
8
+ @hash = TransformToHash.new.apply(
9
+ DigraphParser.new.parse(
10
+ File.read(file_name)
11
+ )
12
+ ).flat_map(&:entries).
13
+ group_by(&:first).
14
+ map {|k,v| Hash[k, v.map(&:last)]}
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,12 @@
1
+ {
2
+ "title": "Schema",
3
+ "type": "object",
4
+ "properties": {
5
+ "category": {
6
+ "type": "string"
7
+ },
8
+ "photo": {
9
+ "type": "string"
10
+ }
11
+ }
12
+ }
@@ -0,0 +1,33 @@
1
+ require 'sinatra'
2
+ require 'sinatra/json'
3
+ require 'require_all'
4
+
5
+ require_all("./lib/picatrix/generated/*.rb")
6
+
7
+ class <%= @app_name.camelize %> < Sinatra::Base
8
+ set :public_folder => "public", :static => true
9
+
10
+ get '/' do
11
+ status, headers, body = call env.merge("PATH_INFO" => "/<%= @root %>")
12
+ [status, headers, body]
13
+ end
14
+ <% @routes.each do |route| %>
15
+ <%= route[:method] %> "/<%= route[:path] %>" do
16
+ items = <%= route[:collection][:resource_name].constantize %>.all
17
+ hashed_items = items.collect do |item|
18
+ item_id = item.id
19
+ category = item.category
20
+ photo = item.photo
21
+ <%= route[:collection][:template].to_s.delete("\\") %>
22
+ end
23
+ json(<%= route[:body] %>.merge({"<%= route[:collection][:name] %>" => hashed_items}))
24
+ end
25
+ <% end %>
26
+ <% @addressable_items.each do |item| %>
27
+ get "/<%= item[:path] %>" do
28
+ item_id = params[:item_id]
29
+ item = <%= item[:type].camelcase.constantize %>.find(item_id)
30
+ json(<%= item[:body] %>)
31
+ end
32
+ <% end %>
33
+ end
@@ -0,0 +1,4 @@
1
+ {
2
+ "category": "#{params[:category]}",
3
+ "has_photo": "#{params[:has_photo]}"
4
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "@controls": {
3
+ "self": {
4
+ "title": "submission #{item_id}",
5
+ "href": "http://localhost:9292/view_submission/#{item_id}"
6
+ },
7
+ "up": {
8
+ "title": "View submissions",
9
+ "href": "http://localhost:9292/welcome/newest"
10
+ },
11
+ "is:edit": {
12
+ "title": "update category or photo url",
13
+ "encoding": "json",
14
+ "href": "http://localhost:9292/view_submission/#{item_id}",
15
+ "method": "PATCH",
16
+ "template": {
17
+ "photo": "{new_url}",
18
+ "category": "{new_category}"
19
+ }
20
+ },
21
+ "is:remove": {
22
+ "title": "remove submission",
23
+ "href": "http://localhost:9292/view_submission/#{item_id}",
24
+ "method": "DELETE"
25
+ }
26
+ },
27
+ "id": "#{item.id}",
28
+ "category": "#{item.category}",
29
+ "photo": "#{item.photo}"
30
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "@controls": {
3
+ "self": {
4
+ "title": "submission #{item_id}",
5
+ "href": "http://localhost:9292/view_submission/#{item_id}"
6
+ }
7
+ },
8
+ "id": "#{item.id}",
9
+ "category": "#{item.category}",
10
+ "photo": "#{item.photo}"
11
+ }