codestrap 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (150) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +20 -0
  3. data/.travis.yml +4 -0
  4. data/.yardopts +3 -0
  5. data/BOILERPLATE.md +151 -0
  6. data/CODESTRAPFILE.md +28 -0
  7. data/Gemfile +6 -0
  8. data/LICENSE.txt +13 -0
  9. data/README.md +69 -0
  10. data/Rakefile +51 -0
  11. data/bin/strap +8 -0
  12. data/bin/upstrap +8 -0
  13. data/codestrap.gemspec +37 -0
  14. data/config/projects/codestrap.rb +22 -0
  15. data/config/software/codestrap.rb +20 -0
  16. data/config/software/ruby.rb +247 -0
  17. data/config/software/zlib.rb +86 -0
  18. data/features/client.feature +99 -0
  19. data/features/fixtures/client/home/codestrap/bin/.empty +0 -0
  20. data/features/fixtures/client/home/codestrap/content/bash.erb +3 -0
  21. data/features/fixtures/client/home/codestrap/content/gem/dir/file +0 -0
  22. data/features/fixtures/client/home/codestrap/content/gem/dir/template +3 -0
  23. data/features/fixtures/client/home/codestrap/content/gem/file +1 -0
  24. data/features/fixtures/client/home/codestrap/content/gem/template +3 -0
  25. data/features/fixtures/client/home/codestrap/content/local_remote.erb +1 -0
  26. data/features/fixtures/client/home/codestrap/content/local_remote/dir/file +0 -0
  27. data/features/fixtures/client/home/codestrap/content/local_remote/dir/template +3 -0
  28. data/features/fixtures/client/home/codestrap/content/local_remote/file +1 -0
  29. data/features/fixtures/client/home/codestrap/content/local_remote/template +3 -0
  30. data/features/fixtures/client/home/codestrap/objects/local.json +3 -0
  31. data/features/fixtures/client/output/.empty +0 -0
  32. data/features/fixtures/client/var/lib/codestrap/bin/.empty +0 -0
  33. data/features/fixtures/client/var/lib/codestrap/content/bashremote.erb +3 -0
  34. data/features/fixtures/client/var/lib/codestrap/content/gemremote/dir/file +0 -0
  35. data/features/fixtures/client/var/lib/codestrap/content/gemremote/dir/template +3 -0
  36. data/features/fixtures/client/var/lib/codestrap/content/gemremote/file +0 -0
  37. data/features/fixtures/client/var/lib/codestrap/content/gemremote/template +3 -0
  38. data/features/fixtures/client/var/lib/codestrap/content/remote_local.erb +1 -0
  39. data/features/fixtures/client/var/lib/codestrap/content/remote_local/dir/file +0 -0
  40. data/features/fixtures/client/var/lib/codestrap/content/remote_local/dir/template +3 -0
  41. data/features/fixtures/client/var/lib/codestrap/content/remote_local/file +1 -0
  42. data/features/fixtures/client/var/lib/codestrap/content/remote_local/template +3 -0
  43. data/features/fixtures/client/var/lib/codestrap/content/remote_remote.erb +1 -0
  44. data/features/fixtures/client/var/lib/codestrap/content/remote_remote/dir/file +0 -0
  45. data/features/fixtures/client/var/lib/codestrap/content/remote_remote/dir/template +3 -0
  46. data/features/fixtures/client/var/lib/codestrap/content/remote_remote/file +0 -0
  47. data/features/fixtures/client/var/lib/codestrap/content/remote_remote/template +3 -0
  48. data/features/fixtures/client/var/lib/codestrap/objects/remote.json +3 -0
  49. data/features/fixtures/logging/home/logging/codestrap/bin/stubdirectory/.empty +0 -0
  50. data/features/fixtures/logging/home/logging/codestrap/bin/stubnotlink +0 -0
  51. data/features/fixtures/logging/home/logging/codestrap/content/.empty +0 -0
  52. data/features/fixtures/logging/home/logging/codestrap/objects/.empty +0 -0
  53. data/features/fixtures/server/mixed/var/lib/stub/content/address.erb +3 -0
  54. data/features/fixtures/server/mixed/var/lib/stub/content/cell.erb +3 -0
  55. data/features/fixtures/server/mixed/var/lib/stub/content/email.erb +3 -0
  56. data/features/fixtures/server/mixed/var/lib/stub/content/mobile.erb +3 -0
  57. data/features/fixtures/server/mixed/var/lib/stub/content/name.erb +3 -0
  58. data/features/fixtures/server/mixed/var/lib/stub/content/phone.erb +3 -0
  59. data/features/fixtures/server/mixed/var/lib/stub/content/puppetmodule/Modulefile +12 -0
  60. data/features/fixtures/server/mixed/var/lib/stub/content/puppetmodule/README +17 -0
  61. data/features/fixtures/server/mixed/var/lib/stub/content/puppetmodule/manifests/init.pp +42 -0
  62. data/features/fixtures/server/mixed/var/lib/stub/content/puppetmodule/spec/spec_helper.rb +18 -0
  63. data/features/fixtures/server/mixed/var/lib/stub/content/puppetmodule/tests/init.pp +13 -0
  64. data/features/fixtures/server/mixed/var/lib/stub/objects/contact.json +8 -0
  65. data/features/fixtures/server/mixed/var/lib/stub/objects/shadow/contact.json +8 -0
  66. data/features/fixtures/strap/projects/etc/.empty +0 -0
  67. data/features/fixtures/strap/projects/home/user/dir/bin/.empty +0 -0
  68. data/features/fixtures/strap/projects/home/user/dir/content/puppetmodule/Modulefile +12 -0
  69. data/features/fixtures/strap/projects/home/user/dir/content/puppetmodule/README +17 -0
  70. data/features/fixtures/strap/projects/home/user/dir/content/puppetmodule/manifests/:stub:project.name:/subclass.pp +3 -0
  71. data/features/fixtures/strap/projects/home/user/dir/content/puppetmodule/manifests/init.pp +42 -0
  72. data/features/fixtures/strap/projects/home/user/dir/content/puppetmodule/spec/spec_helper.rb +18 -0
  73. data/features/fixtures/strap/projects/home/user/dir/content/puppetmodule/tests/init.pp +13 -0
  74. data/features/fixtures/strap/projects/home/user/dir/objects/contact.json +8 -0
  75. data/features/fixtures/strap/projects/home/user/dir/objects/shadow/contact.json +8 -0
  76. data/features/fixtures/strap/projects/output/.empty +0 -0
  77. data/features/fixtures/stub/contact/etc/.empty +0 -0
  78. data/features/fixtures/stub/contact/home/user/dir/bin/.empty +0 -0
  79. data/features/fixtures/stub/contact/home/user/dir/content/address.erb +3 -0
  80. data/features/fixtures/stub/contact/home/user/dir/content/cell.erb +3 -0
  81. data/features/fixtures/stub/contact/home/user/dir/content/email.erb +3 -0
  82. data/features/fixtures/stub/contact/home/user/dir/content/mobile.erb +3 -0
  83. data/features/fixtures/stub/contact/home/user/dir/content/name.erb +3 -0
  84. data/features/fixtures/stub/contact/home/user/dir/content/phone.erb +3 -0
  85. data/features/fixtures/stub/contact/home/user/dir/objects/contact.json +8 -0
  86. data/features/fixtures/stub/contact/home/user/dir/objects/shadow/contact.json +8 -0
  87. data/features/fixtures/stub/contact/output/.empty +0 -0
  88. data/features/fixtures/stub/date/etc/.empty +0 -0
  89. data/features/fixtures/stub/date/home/user/stub/bin/.empty +0 -0
  90. data/features/fixtures/stub/date/home/user/stub/content/day.erb +3 -0
  91. data/features/fixtures/stub/date/home/user/stub/content/hour.erb +3 -0
  92. data/features/fixtures/stub/date/home/user/stub/content/minute.erb +3 -0
  93. data/features/fixtures/stub/date/home/user/stub/content/month.erb +3 -0
  94. data/features/fixtures/stub/date/home/user/stub/content/second.erb +3 -0
  95. data/features/fixtures/stub/date/home/user/stub/content/year.erb +3 -0
  96. data/features/fixtures/stub/date/home/user/stub/objects/.empty +0 -0
  97. data/features/fixtures/stub/date/output/.empty +0 -0
  98. data/features/fixtures/stub/script/etc/.empty +0 -0
  99. data/features/fixtures/stub/script/home/user/stub/bin/.empty +0 -0
  100. data/features/fixtures/stub/script/home/user/stub/content/credentials.erb +6 -0
  101. data/features/fixtures/stub/script/home/user/stub/objects/credentials.rb +11 -0
  102. data/features/fixtures/stub/script/output/.empty +0 -0
  103. data/features/logging.feature +39 -0
  104. data/features/object_scripts.feature +13 -0
  105. data/features/server.feature +36 -0
  106. data/features/step_definitions/client_steps.rb +99 -0
  107. data/features/step_definitions/logging_steps.rb +65 -0
  108. data/features/step_definitions/object_scripts_steps.rb +26 -0
  109. data/features/step_definitions/server_steps.rb +112 -0
  110. data/features/step_definitions/strap_steps.rb +69 -0
  111. data/features/step_definitions/stub_option_simple_steps.rb +31 -0
  112. data/features/step_definitions/stub_steps.rb +94 -0
  113. data/features/strap.feature +34 -0
  114. data/features/stub.feature +157 -0
  115. data/features/stub_option_simple.feature +14 -0
  116. data/features/stub_packages.feature +15 -0
  117. data/features/support/env.rb +197 -0
  118. data/lib/codestrap.rb +415 -0
  119. data/lib/codestrap/cli.rb +76 -0
  120. data/lib/codestrap/client.rb +179 -0
  121. data/lib/codestrap/config.rb +199 -0
  122. data/lib/codestrap/log.rb +56 -0
  123. data/lib/codestrap/mixin.rb +20 -0
  124. data/lib/codestrap/namespace.rb +19 -0
  125. data/lib/codestrap/object/abstract.rb +33 -0
  126. data/lib/codestrap/object/factory.rb +86 -0
  127. data/lib/codestrap/object/standard/datetime.rb +24 -0
  128. data/lib/codestrap/object/standard/files.rb +40 -0
  129. data/lib/codestrap/object/standard/project.rb +33 -0
  130. data/lib/codestrap/object/standard/rest.rb +30 -0
  131. data/lib/codestrap/patch.rb +122 -0
  132. data/lib/codestrap/server/rest.rb +177 -0
  133. data/lib/codestrap/server/version.rb +5 -0
  134. data/lib/codestrap/strap/abstract.rb +135 -0
  135. data/lib/codestrap/strap/factory.rb +85 -0
  136. data/lib/codestrap/strap/standard.rb +95 -0
  137. data/lib/codestrap/stub/abstract.rb +156 -0
  138. data/lib/codestrap/stub/factory.rb +87 -0
  139. data/lib/codestrap/stub/standard.rb +23 -0
  140. data/lib/codestrap/version.rb +3 -0
  141. data/omnibus.rb +53 -0
  142. data/package-scripts/codestrap/postinst +25 -0
  143. data/package-scripts/codestrap/postrm +17 -0
  144. data/package-scripts/codestrap/preinst +7 -0
  145. data/package-scripts/codestrap/prerm +15 -0
  146. data/resources/codestrap/pkg/background.png +0 -0
  147. data/resources/codestrap/pkg/distribution.xml.erb +22 -0
  148. data/resources/codestrap/pkg/license.html.erb +202 -0
  149. data/resources/codestrap/pkg/welcome.html.erb +7 -0
  150. metadata +466 -0
@@ -0,0 +1,19 @@
1
+ require 'ostruct'
2
+
3
+ module Codestrap
4
+ class Namespace
5
+ def initialize(hash)
6
+ hash.each do |key, value|
7
+ add_object key, value
8
+ end
9
+ end
10
+
11
+ def get_binding
12
+ binding
13
+ end
14
+
15
+ def add_object key, value
16
+ singleton_class.send(:define_method, key.to_s) { value }
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,33 @@
1
+ require 'codestrap/object/abstract'
2
+
3
+ module Codestrap
4
+ module Object
5
+ # @abstract
6
+ # Objects used in templates
7
+ #
8
+ # Contains class methods used by object factory
9
+ class Abstract
10
+ class << self
11
+ # List of directories
12
+ # @!attribute [rw] files
13
+ # @return [Array]
14
+ attr_accessor :dirs
15
+
16
+ # CLI object
17
+ # @!attribute [rw] cli
18
+ # @return [Codestrap::CLI]
19
+ attr_accessor :cli
20
+
21
+ # Configuration object
22
+ # @!attribute [rw] config
23
+ # @return [Codestrap::Config]
24
+ attr_accessor :config
25
+
26
+ # REST clients
27
+ # @!attribute [rw] clients
28
+ # @return [Array<Codestrap::Clients>]
29
+ attr_accessor :clients
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,86 @@
1
+ require 'codestrap/patch'
2
+ require 'ostruct'
3
+ require 'yaml'
4
+ require 'json'
5
+ require 'codestrap/object/standard/datetime'
6
+ require 'codestrap/object/standard/files'
7
+ require 'codestrap/object/standard/project'
8
+ require 'codestrap/object/standard/rest'
9
+ module Codestrap
10
+ module Object
11
+ class Factory
12
+ def initialize(*args)
13
+ @namespace = args.shift.capitalize if args.length > 0
14
+ @namespace ||= 'Standard'
15
+ end
16
+
17
+ # Directories where to find static object files
18
+ # @!attribute [rw] files
19
+ # @return [Codestrap::Config]
20
+ attr_accessor :dirs
21
+
22
+ # CLI object
23
+ # @!attribute [rw] cli
24
+ # @return [Codestrap::CLI]
25
+ attr_accessor :cli
26
+
27
+ # Configuration object
28
+ # @!attribute [rw] config
29
+ # @return [Codestrap::Config]
30
+ attr_accessor :config
31
+
32
+ # Array of client objects
33
+ # @!attribute [rw] clients
34
+ # @return [Array<Codestrap::Client>]
35
+ attr_accessor :clients
36
+
37
+ # Generate a hash of key, value pair
38
+ # If value is of type Hash it is converted into an [OpenStruct] object
39
+ #
40
+ # @return [Hash]
41
+ def objects
42
+ objects = {}
43
+ scan.each_pair do |key, value|
44
+ case value
45
+ when Hash
46
+ objects[key] = OpenStruct.new(value)
47
+ else
48
+ objects[key] = value
49
+ end
50
+ end
51
+ objects
52
+ end
53
+
54
+ # Scan for objects
55
+ #
56
+ # @return [Hash]
57
+ def scan
58
+ objects = {}
59
+ scan_class = "Codestrap::Object::#{@namespace.to_s}".split('::').inject(Object) { |o, c| o.const_get c }
60
+ klasses = scan_class.constants.map do |constant|
61
+ "Codestrap::Object::Standard::#{constant.to_s}".split('::').inject(Object) { |o, c| o.const_get c }
62
+ end
63
+ Array(klasses).sort { |a, b| a.weight <=> b.weight }.each do |klass|
64
+ klass.dirs = @dirs
65
+ klass.cli = @cli
66
+ klass.config = @config
67
+ klass.clients = @clients
68
+ klass.objects.each_pair do |key, value|
69
+ objects[key.downcase] = value
70
+ end
71
+ end
72
+ objects
73
+ end
74
+
75
+ def to_hash
76
+ objects = {}
77
+ scan.each_pair do |key, value|
78
+ if value.is_a?(Hash)
79
+ objects[key] = value
80
+ end
81
+ end
82
+ objects
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,24 @@
1
+ require 'codestrap/object/abstract'
2
+ require 'date'
3
+
4
+ module Codestrap
5
+ module Object
6
+ module Standard
7
+ # Date and Time object directly from Rubys Datetime class
8
+ class Datetime < Codestrap::Object::Abstract
9
+ # Object(s) weight
10
+ # @return [Integer]
11
+ def self.weight
12
+ 200
13
+ end
14
+
15
+ # Objects
16
+ # @return [Hash]
17
+ # @option
18
+ def self.objects
19
+ { 'datetime' => DateTime.now }
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,40 @@
1
+ require 'codestrap/object/abstract'
2
+
3
+ module Codestrap
4
+ module Object
5
+ module Standard
6
+ # Static file derived objects
7
+ #
8
+ # Create objects from .json, .yaml and executable files
9
+ class Files < Codestrap::Object::Abstract
10
+ class << self
11
+ # Object(s) weight
12
+ # @return [Integer]
13
+ def weight
14
+ 100
15
+ end
16
+
17
+ def objects
18
+ objects = {}
19
+
20
+ glob_array = Array(Files.dirs).map { |file| File.join(File.expand_path(file), '*') }
21
+ Codestrap::Patch::Dir.glob_files(glob_array).each do |file|
22
+ stat = File::Stat.new file
23
+ name = File.basename(file, File.extname(file)).downcase
24
+ case
25
+ when /\.json$/.match(file)
26
+ objects[name] = JSON.load(File.read(file))
27
+ when /\.yaml$/.match(file)
28
+ objects[name] = YAML.load(File.read(file))
29
+ when stat.executable?
30
+ objects[name] = JSON.parse(`#{file}`)
31
+ end
32
+ end
33
+
34
+ objects
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,33 @@
1
+ require 'codestrap/object/abstract'
2
+ require 'ostruct'
3
+
4
+ module Codestrap
5
+ module Object
6
+ module Standard
7
+ # Project metadata derived object
8
+ class Project < Codestrap::Object::Abstract
9
+ class << self
10
+ # Object(s) weight
11
+ # @return [Integer]
12
+ def weight
13
+ 50
14
+ end
15
+
16
+ def objects
17
+ objects = {}
18
+ if Project.cli
19
+ project = OpenStruct.new()
20
+ mod = Project.cli.command
21
+ mod =~ /^(?:stub|strap)(\S+)$/
22
+ project.module = $1
23
+ project.name = File.basename(Project.cli.argv[0])
24
+
25
+ objects['project'] = project
26
+ end
27
+ objects
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,30 @@
1
+ require 'codestrap/object/abstract'
2
+
3
+ module Codestrap
4
+ module Object
5
+ module Standard
6
+ # REST derived objects
7
+ #
8
+ # Create objects from codestraps builtin remote REST server
9
+ class Rest < Codestrap::Object::Abstract
10
+ class << self
11
+ # Object(s) weight
12
+ # @return [Integer]
13
+ def weight
14
+ 50
15
+ end
16
+
17
+ def objects
18
+ objects = {}
19
+ if clients
20
+ Array(clients).each do |client|
21
+ objects = client.getobjects
22
+ end
23
+ end
24
+ objects
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,122 @@
1
+ module Codestrap
2
+ module Patch
3
+ ##
4
+ # Inherited and patched Dir class
5
+ #
6
+ # Used as an alternative to monkey patching
7
+ class Dir < Dir
8
+ ##
9
+ # List existing directories
10
+ # Patched function
11
+ #
12
+ # @param [Array] dirs
13
+ # @return [Array]
14
+ # Array of directories
15
+ def self.each_dirs_exist(*dirs)
16
+ dirs.select { |dir| File.directory? dir }
17
+ end
18
+
19
+ ##
20
+ # List existing directory entries
21
+ # Patched function
22
+ #
23
+ # @param [Array] dirs
24
+ # @return [Array]
25
+ # Array of directories full path
26
+ def self.glob_directories(*dirs)
27
+ dirs = dirs[0] if dirs[0].is_a? Array
28
+ list = self.glob(dirs).select { |dir| File.directory? dir }
29
+ if block_given?
30
+ list.each do |dir|
31
+ yield dir
32
+ end
33
+ else
34
+ list
35
+ end
36
+ end
37
+
38
+ ##
39
+ # List existing file entries
40
+ # Patched function
41
+ #
42
+ # @param [Array] files
43
+ # @return [Array]
44
+ # Array of directories full path
45
+ def self.glob_files(*files)
46
+ files = files[0] if files[0].is_a? Array
47
+ list = self.glob(files).select { |file| File.file? file }
48
+ if block_given?
49
+ list.each do |file|
50
+ yield file
51
+ end
52
+ else
53
+ list
54
+ end
55
+ end
56
+ end
57
+
58
+ ##
59
+ # Inherited and patched File class
60
+ #
61
+ # Used as an alternative to monkey patching
62
+ class File < File
63
+ ##
64
+ #
65
+ # @return [Symbol|nil]
66
+ # Template types :erb
67
+ def template
68
+ @template || begin
69
+ self.mode_line
70
+ @template
71
+ end
72
+ end
73
+
74
+ ##
75
+ # Set and get mode line status
76
+ #
77
+ # @param [Integer] limit
78
+ # Number of lines to scan from the top
79
+ # @return [true\nil]
80
+ def mode_line(limit = 10)
81
+ @mode_line ||= begin
82
+ # Check if file read
83
+ curpos = self.pos
84
+ self.pos = 0
85
+ lines = self.readlines()[0 .. (limit - 1)]
86
+ lines.each do |line|
87
+ line =~ /(?:^|\b)(strap|stub):(erb|\S+?)(?:\b|$)/
88
+ if $1
89
+ @mode_line = line
90
+ @template = $2.to_sym if $2
91
+ @template = :erb if $2.length == 0
92
+ self.options
93
+ end
94
+ break
95
+ end
96
+ self.pos = curpos
97
+ @mode_line
98
+ end
99
+ end
100
+
101
+ ##
102
+ # Parse mode line options
103
+ def options
104
+ @options ||= begin
105
+ @mode_line.scan(/(\S+)\s*=\s*(\S+)/).each do |arr|
106
+ key = arr[0]
107
+ value = arr[1]
108
+ @options[key] = value
109
+ end
110
+ @options
111
+ end
112
+ end
113
+
114
+ ##
115
+ # Has mode line
116
+ # @return [true|false]
117
+ def has_mode_line?
118
+ !!self.mode_line
119
+ end
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,177 @@
1
+ require 'json'
2
+ require 'sinatra/base'
3
+ require 'codestrap'
4
+ require 'codestrap/server/version'
5
+ require 'uri'
6
+ require 'codestrap/config'
7
+
8
+ module Codestrap
9
+ module Server
10
+ class Rest < Sinatra::Base
11
+
12
+ # Settings
13
+ #set :environment, :production
14
+
15
+ # Sessions
16
+ #set :sessions, true
17
+
18
+ # Logging to STDERR
19
+ set :logging, false
20
+
21
+ # Applications root directory
22
+ #set :root, 'path/to/root'
23
+
24
+ # Serve files from public directory
25
+ set :static, false
26
+
27
+ # Public folder
28
+ #set :public_folder, 'path/to/static/files'
29
+
30
+ # Views folder defaults to static_dir/views
31
+ #set :views, Proc.new { File.join(dir, 'templates')}
32
+
33
+ # Enable/disable built in web server
34
+ #set :run, false
35
+
36
+ # Built in web servers. Following is default
37
+ #set :server, %w[thin mongrel webrick]
38
+
39
+ # Binding
40
+ #set :bind, '0.0.0.0'
41
+
42
+ # Set port
43
+ #set :port, 9494
44
+
45
+ # Set app file. Calculates :root, :public_folder, :views
46
+ #set :app_file, __FILE__
47
+
48
+ # Propagate errors to server or rack
49
+ #set :raise_errors
50
+
51
+ # Show error pages
52
+ #set :show_exceptions, true
53
+
54
+ version = Codestrap::Server::VERSION
55
+
56
+
57
+ # TODO - hardcode2config Host to advertise
58
+ host = 'codestrap.test.domain'
59
+
60
+ # TODO - hardcode2config port to advertise
61
+ port ||= settings.port
62
+
63
+ # TODO - hardcode2config Schema to advertise. http or https
64
+ scheme = 'http'
65
+
66
+ # Objects
67
+ urlobjects = '/rest/objects.json'
68
+ get urlobjects do
69
+ codestrap = Codestrap::Core.new()
70
+ obj = Codestrap::Object::Factory.new
71
+ obj.dirs = codestrap.config.server.objects
72
+ content_type :json
73
+ case params[:prettyprint]
74
+ when 'true'
75
+ JSON.pretty_generate(obj.to_hash)
76
+ else
77
+ obj.to_hash.to_json
78
+ end
79
+ end
80
+
81
+ # BP metadata
82
+ urlstrapmetadata = '/rest/strap/metadata.json'
83
+ get urlstrapmetadata do
84
+ name = params[:name]
85
+ codestrap = Codestrap::Core.new()
86
+ paths = codestrap.config.server.content
87
+ output = codestrap.strap_metadata(name, nil, paths)
88
+ content_type :json
89
+ case params[:prettyprint]
90
+ when 'true'
91
+ JSON.pretty_generate(output)
92
+ else
93
+ output.to_json
94
+ end
95
+ end
96
+
97
+ # Codestrap metadata
98
+ urlcodestrapmetadata = '/rest/stub/metadata.json'
99
+ get urlcodestrapmetadata do
100
+ name = params[:name]
101
+ codestrap = Codestrap::Core.new()
102
+ paths = codestrap.config.server.content
103
+ output = codestrap.stub_metadata(name, nil, paths)
104
+ content_type :json
105
+ case params[:prettyprint]
106
+ when 'true'
107
+ JSON.pretty_generate(output)
108
+ else
109
+ output.to_json
110
+ end
111
+ end
112
+
113
+ # Boilerplate content
114
+ urlstrapproject = '/rest/strap/project'
115
+ get "#{urlstrapproject}/:name/*" do
116
+ # TODO - Rest error message
117
+ # TODO - Logging
118
+ # TODO - Handle all files
119
+ name = params[:name]
120
+ data_file = params[:splat].first
121
+ file_path = nil
122
+ codestrap = Codestrap::Core.new()
123
+ paths = codestrap.config.server.content
124
+ codestrap.strap_metadata(name, {src: true, ftype: true, mode: true}, paths).values.each do |data|
125
+ data[:files].each do |file|
126
+ next unless File.expand_path(file[:file]).eql?(File.expand_path(data_file))
127
+ file_path = file[:src]
128
+ break
129
+ end
130
+ break
131
+ end
132
+ send_file file_path
133
+ end
134
+
135
+ # File content
136
+ urlcodestrapfile = '/rest/stub/file'
137
+ get "#{urlcodestrapfile}/:name" do
138
+ # TODO - Rest error message
139
+ # TODO - Logging
140
+ # TODO - Handle all files
141
+ name = params[:name]
142
+ codestrap = Codestrap::Core.new()
143
+ paths = codestrap.config.server.content
144
+ file_path = codestrap.stub_metadata(name, {src: true, ftype: true, mode: true}, paths)[name][:src]
145
+ send_file file_path
146
+ end
147
+
148
+ cap = {
149
+ version: version,
150
+ urls: {
151
+ objects: urlobjects,
152
+ stub: {
153
+ metadata: urlcodestrapmetadata,
154
+ file: urlcodestrapfile,
155
+ },
156
+ strap: {
157
+ metadata: urlstrapmetadata,
158
+ project: urlstrapproject
159
+ }
160
+ # TODO - Packages
161
+ }
162
+ }
163
+
164
+ # Capabilities
165
+ get '/rest/capability.json' do
166
+ content_type :json
167
+ case params[:prettyprint]
168
+ when 'true'
169
+ JSON.pretty_generate(cap)
170
+ else
171
+ cap.to_json
172
+ end
173
+ end
174
+ end
175
+ end
176
+ end
177
+