simple-httpd 0.0.4 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -1
  3. data/.rubocop.yml +9 -0
  4. data/.tm_properties +1 -0
  5. data/Gemfile +21 -1
  6. data/Makefile +9 -0
  7. data/README.md +87 -2
  8. data/Rakefile +5 -0
  9. data/VERSION +1 -1
  10. data/bin/simple-httpd +13 -0
  11. data/examples/README.md +41 -0
  12. data/examples/ex1/ex1_helpers.rb +5 -0
  13. data/examples/ex1/root.rb +11 -0
  14. data/examples/ex2/README.txt +1 -0
  15. data/examples/ex2/ex2_helpers.rb +5 -0
  16. data/examples/ex2/helpers.rb +15 -0
  17. data/examples/ex2/info.rb +4 -0
  18. data/examples/ex2/root.rb +3 -0
  19. data/examples/ex3/example_service.rb +13 -0
  20. data/examples/services/example_service.rb +25 -0
  21. data/examples/services/explicit_example_service.rb +18 -0
  22. data/examples/v2/api.js +1 -0
  23. data/examples/v2/jobs.rb +13 -0
  24. data/examples/v2/root.rb +3 -0
  25. data/examples/v2/v2_helpers.rb +5 -0
  26. data/lib/simple-service.rb +3 -0
  27. data/lib/simple/httpd.rb +99 -25
  28. data/lib/simple/httpd/base_controller.rb +2 -2
  29. data/lib/simple/httpd/base_controller/error_handling.rb +45 -17
  30. data/lib/simple/httpd/base_controller/json.rb +15 -8
  31. data/lib/simple/httpd/cli.rb +99 -0
  32. data/lib/simple/httpd/helpers.rb +54 -0
  33. data/lib/simple/httpd/mount_spec.rb +106 -0
  34. data/lib/simple/httpd/rack.rb +17 -0
  35. data/lib/simple/httpd/rack/dynamic_mount.rb +66 -0
  36. data/lib/simple/httpd/rack/merger.rb +28 -0
  37. data/lib/simple/httpd/rack/static_mount.rb +50 -0
  38. data/lib/simple/httpd/server.rb +69 -0
  39. data/lib/simple/httpd/service.rb +70 -0
  40. data/lib/simple/httpd/version.rb +1 -1
  41. data/lib/simple/service.rb +69 -0
  42. data/lib/simple/service/action.rb +78 -0
  43. data/lib/simple/service/context.rb +46 -0
  44. data/scripts/release +2 -0
  45. data/scripts/release.rb +91 -0
  46. data/simple-httpd.gemspec +9 -19
  47. data/spec/simple/httpd/base_controller/httpd_cors_spec.rb +15 -0
  48. data/spec/simple/httpd/base_controller/httpd_debug_spec.rb +11 -0
  49. data/spec/simple/httpd/base_controller/httpd_x_processing_copy.rb +15 -0
  50. data/spec/simple/httpd/base_spec.rb +16 -0
  51. data/spec/simple/httpd/dynamic_mounting_spec.rb +33 -0
  52. data/spec/simple/httpd/helpers_spec.rb +15 -0
  53. data/spec/simple/httpd/rspec_httpd_spec.rb +17 -0
  54. data/spec/simple/httpd/services/service_explicit_spec.rb +34 -0
  55. data/spec/simple/httpd/services/service_spec.rb +34 -0
  56. data/spec/simple/httpd/static_mounting_spec.rb +13 -0
  57. data/spec/spec_helper.rb +30 -6
  58. data/spec/support/004_simplecov.rb +3 -12
  59. metadata +61 -84
  60. data/lib/simple/httpd/app.rb +0 -84
  61. data/lib/simple/httpd/app/file_server.rb +0 -19
  62. data/spec/simple/httpd/version_spec.rb +0 -10
  63. data/tasks/release.rake +0 -104
@@ -1,84 +0,0 @@
1
- class Simple::Httpd::App
2
- end
3
-
4
- require_relative "app/file_server"
5
-
6
- # The Simple::Httpd::App implements a Rack compatible app, which serves
7
- # HTTP requests via a set of controllers inherited from a base controller
8
- # class.
9
- #
10
- # The individual routes are determined from the controller class names:
11
- # assuming we have a controller class Foo::Bar::BazController inheriting
12
- # from Foo::BaseController will serve the /bar/baz routes.
13
- #
14
- # Additional static routes can be configured by calling "mount_directory!!"
15
- # on the app object.
16
- class Simple::Httpd::App
17
- extend Forwardable
18
- delegate call: :@app
19
-
20
- attr_reader :logger
21
-
22
- #
23
- # Builds a App object
24
- def initialize(base_controller, logger:)
25
- raise unless logger
26
-
27
- @base_controller = base_controller
28
- @logger = logger
29
- @file_mounts = []
30
-
31
- @app = Rack::URLMap.new(controllers_url_map)
32
- end
33
-
34
- def mount_directory!(url:, path:)
35
- @logger.debug "#{path}: mount directory #{path}"
36
- @app = FileServer.new(@app, url_prefix: url, root: path)
37
- end
38
-
39
- private
40
-
41
- # Find all controllers inheriting off base_controller and return
42
- # a URL map, based on the names of the controllers.
43
- def controllers_url_map
44
- controller_by_mountpoint = ObjectSpace
45
- .each_object(Class)
46
- .select { |klass| klass < @base_controller }
47
- .map { |controller| [mountpoint(controller), controller] }
48
- .reject { |mountpoint, _controller| mountpoint.nil? }
49
-
50
- controller_by_mountpoint
51
- .sort_by { |path, _controller| path }
52
- .each { |path, controller| logger.debug "#{path}: mount #{controller}" }
53
-
54
- Hash[controller_by_mountpoint]
55
- end
56
-
57
- def mountpoint(controller)
58
- return unless controller.name.end_with?("Controller")
59
-
60
- relative_controller_name = relative_controller_name(controller)
61
- return "/" if relative_controller_name == "RootController"
62
-
63
- "/" + relative_controller_name.underscore.gsub(/_controller$/, "")
64
- end
65
-
66
- # With a controller of Postjob::FooBarController returns FooBarController
67
- # (depending on the base_controller)
68
- def relative_controller_name(controller)
69
- controller_name = controller.name
70
- if controller_name.start_with?(base_controller_namespace)
71
- controller_name[base_controller_namespace.length..-1]
72
- else
73
- controller_name
74
- end
75
- end
76
-
77
- # With a base_controller of Postjob::BaseController this returns "Postjob"
78
- def base_controller_namespace
79
- @base_controller_namespace ||= begin
80
- base_controller_name = @base_controller.name
81
- base_controller_name.gsub(/::BaseController$/, "::")
82
- end
83
- end
84
- end
@@ -1,19 +0,0 @@
1
- class Simple::Httpd::App::FileServer
2
- # A simple file server middleware
3
- def initialize(app, url_prefix:, root:)
4
- @app = app
5
- @url_prefix = File.join("/", url_prefix, "/")
6
- @file_server = Rack::File.new(root)
7
- end
8
-
9
- def call(env)
10
- request_path = env["PATH_INFO"]
11
- if request_path.start_with?(@url_prefix)
12
- file_path = request_path[@url_prefix.length..-1]
13
- env["PATH_INFO"] = file_path
14
- @file_server.call(env)
15
- else
16
- @app.call(env)
17
- end
18
- end
19
- end
@@ -1,10 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Simple::Httpd do
4
- describe "VERSION" do
5
- it "defines a version string" do
6
- # Note: this allows for 0.12.34beta
7
- #expect(Simple::Httpd::VERSION).to match(/^\d+\.\d+\.\d+/)
8
- end
9
- end
10
- end
data/tasks/release.rake DELETED
@@ -1,104 +0,0 @@
1
- require 'bundler'
2
- Bundler.setup
3
-
4
- GEM_ROOT = File.expand_path('../../', __FILE__)
5
- GEM_SPEC, more = Dir.glob("*.gemspec")
6
- raise "Cannot determine gemspec" if more || !GEM_SPEC
7
-
8
- VERSION_FILE_PATH = 'VERSION'
9
-
10
- class VersionNumberTracker
11
- class << self
12
- def update_version_file(new_version_number)
13
- File.open(VERSION_FILE_PATH, 'w') { |file| file.puts new_version_number }
14
- new_version_number
15
- end
16
-
17
- def auto_version_bump
18
- old_version_number = File.read("VERSION").chomp
19
- old = old_version_number.split('.')
20
- current = old[0..-2] << old[-1].next
21
- new_version_number = current.join('.')
22
-
23
- update_version_file(new_version_number)
24
- end
25
-
26
- def manual_version_bump
27
- update_version_file(ENV['VERSION'])
28
- end
29
-
30
- def update_version_number
31
- @version = ENV['VERSION'] ? manual_version_bump : auto_version_bump
32
- end
33
-
34
- attr_reader :version
35
- end
36
- end
37
-
38
- namespace :release do
39
- task :version do
40
- VersionNumberTracker.update_version_number
41
- end
42
-
43
- task :build do
44
- Dir.chdir(GEM_ROOT) do
45
- sh("gem build #{GEM_SPEC}")
46
- end
47
- end
48
-
49
- desc "Commit changes"
50
- task :commit do
51
- Dir.chdir(GEM_ROOT) do
52
- version = VersionNumberTracker.version
53
- sh("git add #{VERSION_FILE_PATH}")
54
- sh("git commit -m \"bump to v#{version}\"")
55
- sh("git tag -a v#{version} -m \"Tag\"")
56
- end
57
- end
58
-
59
- desc "Push code and tags"
60
- task :push do
61
- sh("git push origin #{$TARGET_BRANCH}")
62
- sh('git push --tags')
63
- end
64
-
65
- desc "Cleanup"
66
- task :clean do
67
- Dir.glob(File.join(GEM_ROOT, '*.gem')).each { |f| FileUtils.rm_rf(f) }
68
- end
69
-
70
- desc "Push Gem to gemfury"
71
- task :publish do
72
- Dir.chdir(GEM_ROOT) { sh("gem push #{Dir.glob('*.gem').first}") }
73
- end
74
-
75
- task :target_master do
76
- $TARGET_BRANCH = 'master'
77
- end
78
-
79
- task :target_stable do
80
- $TARGET_BRANCH = 'stable'
81
- end
82
-
83
- task :checkout do
84
- sh "git status --untracked-files=no --porcelain > /dev/null || (echo '*** working dir not clean' && false)"
85
- sh "git checkout #{$TARGET_BRANCH}"
86
- sh "git pull"
87
- end
88
-
89
- task default: [
90
- 'checkout',
91
- 'version',
92
- 'clean',
93
- 'build',
94
- 'commit',
95
- 'push',
96
- 'publish'
97
- ]
98
-
99
- task master: %w(target_master default)
100
- task stable: %w(target_stable default)
101
- end
102
-
103
- desc "Clean, build, commit and push"
104
- task release: 'release:master'