podium 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8fe3049980e26404467c390e3c924daf6a3a1e4fba2551604b32bed951cc93bf
4
- data.tar.gz: 0673c2d91a92122c0201a2e7e180c266a30ef9eaacba58f42329795a74a8ff53
3
+ metadata.gz: 3e08896c276aabb94c3b3440cdcf6a01d08b202eb3f0a5842d8ac4a05dfd28ec
4
+ data.tar.gz: 2b1b7aa523cf047954bef1a04be016d32895c5f9bc43f8c86114e19d33ab81aa
5
5
  SHA512:
6
- metadata.gz: 56054bac669a535d64f36067fa9b878ebbd1b7e77d80ee1b629d501cff46c491bd8ee71a35efb4440c94ad5c6e6ea77e5ba0105321d6fdd939200ec66315672c
7
- data.tar.gz: 9d38ca4c64dc8e2e331008b46b4899e416f2536a7fb12bce207249d0b047c5ee19b3ca0ee7e8d56e0f698e52ba3d09906dd1e4dea9af900d84ae97ec96909af1
6
+ metadata.gz: 2c12272a1862cb7043c7e99a6260c27148548b3630c6a204dd7336cdd03bcd85af472418a009b9fef86f6c5865e148cc7acd3d240e97a4aa72400517beaf2ee2
7
+ data.tar.gz: 73d86063551decae0fa53b1d75710d24478eeeb8a8fb0690144156b2382f65c1a2db4f4cd3b0be2bbc87a4b62afb82e8976b85fca6b56d72906b12f621b00f0f
data/.gitignore CHANGED
@@ -1,12 +1,12 @@
1
1
  /.bundle/
2
- /.yardoc
3
- /_yardoc/
4
- /coverage/
5
2
  /doc/
3
+ /log/*.log
6
4
  /pkg/
7
- /spec/reports/
8
5
  /tmp/
6
+ /test/dummy/db/*.sqlite3
7
+ /test/dummy/db/*.sqlite3-*
8
+ /test/dummy/log/*.log
9
+ /test/dummy/storage/
10
+ /test/dummy/tmp/
9
11
 
10
- # rspec failure tracking
11
- .rspec_status
12
12
  Gemfile.lock
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 3.0.0
1
+ 3.0.2
data/Gemfile CHANGED
@@ -1,12 +1,15 @@
1
- # frozen_string_literal: true
2
-
3
1
  source "https://rubygems.org"
2
+ git_source(:github) { |repo| "https://github.com/#{repo}.git" }
4
3
 
5
- # Specify your gem's dependencies in podium.gemspec
4
+ # Specify your gem's dependencies in podium.gemspec.
6
5
  gemspec
7
6
 
8
- gem "rake", "~> 13.0"
7
+ group :development do
8
+ gem "sqlite3"
9
+ end
9
10
 
10
- gem "rspec", "~> 3.0"
11
+ # Start debugger with binding.b -- Read more: https://github.com/ruby/debug
12
+ gem "debug", ">= 1.0.0", group: %i[ development test ]
11
13
 
12
- gem "webmock", "~> 3.12"
14
+ gem "rake"
15
+ gem "webmock"
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2021 Max Brosnahan
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile CHANGED
@@ -1,8 +1,12 @@
1
- # frozen_string_literal: true
1
+ require "bundler/setup"
2
2
 
3
3
  require "bundler/gem_tasks"
4
- require "rspec/core/rake_task"
4
+ require "rake/testtask"
5
5
 
6
- RSpec::Core::RakeTask.new(:spec)
6
+ Rake::TestTask.new(:test) do |t|
7
+ t.libs << "test"
8
+ t.pattern = "test/**/*_test.rb"
9
+ t.verbose = false
10
+ end
7
11
 
8
- task default: :spec
12
+ task default: :test
@@ -0,0 +1,26 @@
1
+ module Podium
2
+ class PodletPreviewController < ActionController::Base
3
+ def index
4
+ @podlets = Podium::PodletPreview.podlets
5
+ links = @podlets.map do |podlet|
6
+ name = podlet.to_s.underscore
7
+ %(<li><a href="#{podlet_preview_path}/#{name.dasherize}"> #{name.humanize}</a></li>)
8
+ end.join("\n")
9
+ render html: <<-HTML.html_safe
10
+ <h1>Podlet Preview</h1>
11
+ <ul>
12
+ #{links}
13
+ </ul>
14
+ HTML
15
+ end
16
+
17
+ private
18
+
19
+ def podlet_resource(name, uri: nil)
20
+ podium_name = name.to_s.dasherize
21
+ uri ||= URI(request.url).tap { |u| u.path = "/#{podium_name}" }
22
+
23
+ Podium::Resource.new(uri, podium_name)
24
+ end
25
+ end
26
+ end
data/bin/test ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+ $: << File.expand_path("../test", __dir__)
3
+
4
+ require "bundler/setup"
5
+ require "rails/plugin/test"
@@ -0,0 +1,43 @@
1
+ require "rails/generators"
2
+
3
+ module Podium
4
+ class InstallGenerator < ::Rails::Generators::Base
5
+ APP_CONTROLLER_PATH = "app/controllers/application_controller.rb"
6
+ LAYOUT_PATH = "app/views/layouts/application.html.erb"
7
+
8
+ source_root File.expand_path("templates", __dir__)
9
+
10
+ desc "Sets up your application for integrating with podium"
11
+
12
+ def copy_initializer
13
+ template "podium.rb", "config/initializers/podium.rb"
14
+
15
+ inside do
16
+ setup_app_controller
17
+ end
18
+ end
19
+
20
+ def add_podlets_to_layout
21
+ return if File.read(LAYOUT_PATH).include?("podlet_content!")
22
+ inject_into_file LAYOUT_PATH, "<%= podlet_content!(:header) %>\n", before: "<%= yield %>"
23
+ inject_into_file LAYOUT_PATH, "<%= podlet_content!(:footer) %>\n", after: "<%= yield %>\n"
24
+ end
25
+
26
+ private
27
+
28
+ def setup_app_controller
29
+ return unless File.exists?(APP_CONTROLLER_PATH)
30
+
31
+ return if File.read(APP_CONTROLLER_PATH).include?("Podium::ControllerHelpers")
32
+
33
+ new_content = <<-'RUBY'
34
+ include Podium::ControllerHelpers
35
+
36
+ def podlets
37
+ [:header, :footer]
38
+ end
39
+ RUBY
40
+ inject_into_class APP_CONTROLLER_PATH, "ApplicationController", new_content
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,90 @@
1
+ require "rails/generators"
2
+
3
+ module Podium
4
+ class PodletGenerator < ::Rails::Generators::NamedBase
5
+ APP_CONTROLLER_PATH = "app/controllers/application_controller.rb"
6
+ PREVIEW_CONTROLLER_PATH = "app/controllers/podlet_preview_controller.rb"
7
+ LAYOUT_PATH = "app/views/layouts/application.html.erb"
8
+
9
+ source_root File.expand_path("templates", __dir__)
10
+
11
+ desc "Generate boilerplate for a podlet"
12
+
13
+ def create_controller
14
+ template "podlet_controller.rb", "app/controllers/#{controller_file_name}"
15
+ end
16
+
17
+ def create_views
18
+ template "content.html.erb", "app/views/#{folder_name}/content.html.erb"
19
+ end
20
+
21
+ def prepare_assets
22
+ create_file "app/assets/javascripts/#{folder_name}/podlet.js"
23
+ create_file "app/assets/stylesheets/#{folder_name}/podlet.css"
24
+ return if contents("app/assets/config/manifest.js").include?(folder_name)
25
+ append_to_file "app/assets/config/manifest.js", "//= link_directory ../javascripts/#{folder_name} .js\n"
26
+ append_to_file "app/assets/config/manifest.js", "//= link_directory ../stylesheets/#{folder_name} .css\n"
27
+ end
28
+
29
+ def setup_routes
30
+ route = "podlet :#{podlet_name}"
31
+ return if route_present?(route)
32
+ if route_present?("podlet_preview")
33
+ inject_into_file "config/routes.rb", "\n #{route}", before: "\n podlet_preview"
34
+ else
35
+ inject_into_file "config/routes.rb", "\n #{route}", before: "\nend"
36
+ inject_into_file "config/routes.rb", "\n podlet_preview if Rails.env.development?", before: "\nend"
37
+ end
38
+ end
39
+
40
+ def setup_preview
41
+ unless preview_exists?
42
+ template "podlet_preview_controller.rb", PREVIEW_CONTROLLER_PATH
43
+ end
44
+ return if contents(PREVIEW_CONTROLLER_PATH).include?(podlet_name)
45
+
46
+ podlet_action = <<-RUBY
47
+ \ndef #{podlet_name}
48
+ resource = podlet_resource(:#{podlet_name})
49
+ render html: resource.fetch({}).html_safe
50
+ end
51
+ RUBY
52
+
53
+ inject_into_file PREVIEW_CONTROLLER_PATH, podlet_action, before: "\nend"
54
+ end
55
+
56
+ private
57
+
58
+ def preview_exists?
59
+ inside do
60
+ return File.exist?(PREVIEW_CONTROLLER_PATH)
61
+ end
62
+ end
63
+
64
+ def route_present?(route)
65
+ contents("config/routes.rb").include?(route)
66
+ end
67
+
68
+ def contents(path)
69
+ inside do
70
+ return File.read(path)
71
+ end
72
+ end
73
+
74
+ def folder_name
75
+ "#{podlet_name}_podlet"
76
+ end
77
+
78
+ def podlet_name
79
+ name.underscore
80
+ end
81
+
82
+ def controller_file_name
83
+ "#{controller_name.underscore}.rb"
84
+ end
85
+
86
+ def controller_name
87
+ "#{name.underscore.camelcase}PodletController"
88
+ end
89
+ end
90
+ end
@@ -0,0 +1 @@
1
+ <strong>hello from podlet</strong>
@@ -0,0 +1,8 @@
1
+ Podium.configure do |config|
2
+ config.register(:header)
3
+ config.register(:footer)
4
+ # config.register(:widget_a, "http://widget.com/widget_a")
5
+ config.name_to_url = -> (name) {
6
+ "http://#{name}.my-podlet-host"
7
+ }
8
+ end
@@ -0,0 +1,10 @@
1
+ class <%= controller_name %> < ActionController::Base
2
+ include Podium::PodletHelpers
3
+
4
+ def content
5
+ end
6
+
7
+ def fallback
8
+ render html: ""
9
+ end
10
+ end
@@ -0,0 +1,3 @@
1
+ class PodletPreviewController < Podium::PodletPreviewController
2
+
3
+ end
@@ -0,0 +1,19 @@
1
+ module Podium
2
+ class Configuration
3
+ attr_reader :podlets
4
+
5
+ attr_writer :name_to_url
6
+
7
+ def initialize
8
+ @podlets = {}
9
+ end
10
+
11
+ def register(name, url = nil)
12
+ @podlets[name] = url
13
+ end
14
+
15
+ def name_to_url
16
+ @name_to_url || ->(name) { raise "name_to_url not configured. Set name_to_url in podium configuration." }
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,20 @@
1
+ module Podium
2
+ module ControllerHelpers
3
+ def self.included(base)
4
+ base.before_action :load_podlet_content
5
+ base.helper_method :podlet_content!
6
+ end
7
+
8
+ def podlet_content!(name)
9
+ @podlet_content.fetch(name).html_safe
10
+ end
11
+
12
+ def load_podlet_content
13
+ @podlet_content = Podium.instance.load_content_for_podlets(podlets, podlet_context)
14
+ end
15
+
16
+ def podlet_context
17
+ {}
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,25 @@
1
+ module ActionDispatch
2
+ module Routing
3
+ class Mapper
4
+ def podlet(name)
5
+ Podium::PodletPreview.register(name)
6
+ prefix = "#{name}_podlet"
7
+ scope name.to_s.dasherize, as: prefix do
8
+ get "/", to: "#{prefix}#content", as: "content"
9
+ get "/fallback", to: "#{prefix}#fallback"
10
+ get "/manifest.json", to: "#{prefix}#manifest", as: "manifest"
11
+ end
12
+ end
13
+
14
+ def podlet_preview
15
+ scope "podlet-preview" do
16
+ get "/", to: "podlet_preview#index", as: "podlet_preview"
17
+
18
+ Podium::PodletPreview.podlets.each do |name|
19
+ get "/#{name.to_s.dasherize}", to: "podlet_preview##{name}"
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,59 @@
1
+ module Podium
2
+ module PodletHelpers
3
+ def self.included(base)
4
+ base.layout false
5
+ base.extend(ClassMethods)
6
+ base.before_action :set_podium_headers, only: [:content, :fallback]
7
+ end
8
+
9
+ def manifest
10
+ render json: self.class.podlet_manifest.to_json
11
+ end
12
+
13
+ def set_podium_headers
14
+ response.set_header("podlet-version", self.class.version)
15
+ end
16
+
17
+ def podium_params
18
+ @podium_params ||= ActionController::Parameters.new(podium_header_params)
19
+ end
20
+
21
+ def podium_header_params
22
+ request.headers
23
+ .select { |(k)| k.start_with?("HTTP_PODIUM_") }
24
+ .reduce({}) do |acc, (header, value)|
25
+ key = header.gsub("HTTP_PODIUM_", "").underscore
26
+ acc[key] = value
27
+ acc
28
+ end
29
+ end
30
+
31
+ module ClassMethods
32
+ def podlet_manifest
33
+ @podlet_manifest ||= {
34
+ name: self.class.name.gsub("PodletController", "").underscore.dasherize,
35
+ version: version,
36
+ content: "/",
37
+ fallback: "/fallback",
38
+ proxy: {},
39
+
40
+ }.merge(assets)
41
+ end
42
+
43
+ def assets
44
+ {
45
+ assets: {
46
+ js: "",
47
+ css: "",
48
+ },
49
+ js: [],
50
+ css: [],
51
+ }
52
+ end
53
+
54
+ def version
55
+ @version ||= ENV.fetch("VERSION", DateTime.now().to_i.to_s)
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,11 @@
1
+ module Podium
2
+ module PodletPreview
3
+ def self.register(name)
4
+ podlets << name
5
+ end
6
+
7
+ def self.podlets
8
+ @podlets ||= []
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,4 @@
1
+ module Podium
2
+ class Railtie < ::Rails::Railtie
3
+ end
4
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Podium
4
- VERSION = "0.4.0"
4
+ VERSION = "0.5.0"
5
5
  end
data/lib/podium.rb CHANGED
@@ -4,9 +4,33 @@ require_relative "podium/version"
4
4
  require_relative "podium/client"
5
5
  require_relative "podium/resource"
6
6
  require_relative "podium/manifest"
7
+ require_relative "podium/configuration"
8
+ require_relative "podium/controller_helpers"
9
+ require_relative "podium/podlet_preview"
10
+ require_relative "podium/podlet_helpers"
11
+ require_relative "podium/core_ext"
7
12
 
8
13
  module Podium
9
- class Error < StandardError; end
14
+ class NotConfiguredError < StandardError; end
10
15
 
11
- # Your code goes here...
16
+ def self.configuration
17
+ @configuration || (raise NotConfiguredError, "Did you forget to run Podium.configure ?")
18
+ end
19
+
20
+ def self.configure
21
+ @configuration ||= Configuration.new
22
+ yield(configuration)
23
+ end
24
+
25
+ def self.instance
26
+ @instance ||= build_instance
27
+ end
28
+
29
+ def self.build_instance
30
+ client = Podium::Client.new(name_to_url: configuration.name_to_url)
31
+ configuration.podlets.each do |key, url|
32
+ client.register(key, url)
33
+ end
34
+ client
35
+ end
12
36
  end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :podium do
3
+ # # Task goes here
4
+ # end
data/podium.gemspec CHANGED
@@ -28,9 +28,5 @@ Gem::Specification.new do |spec|
28
28
  spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
29
29
  spec.require_paths = ["lib"]
30
30
 
31
- # Uncomment to register a new dependency of your gem
32
- # spec.add_dependency "example-gem", "~> 1.0"
33
-
34
- # For more information and examples about making a new gem, checkout our
35
- # guide at: https://bundler.io/guides/creating_gem.html
31
+ spec.add_dependency "rails", "> 6.1"
36
32
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: podium
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Max Brosnahan
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-09-27 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2021-10-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">"
18
+ - !ruby/object:Gem::Version
19
+ version: '6.1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">"
25
+ - !ruby/object:Gem::Version
26
+ version: '6.1'
13
27
  description:
14
28
  email:
15
29
  - maximilianbrosnahan@gmail.com
@@ -25,15 +39,31 @@ files:
25
39
  - CODE_OF_CONDUCT.md
26
40
  - Gemfile
27
41
  - LICENSE.txt
42
+ - MIT-LICENSE
28
43
  - README.md
29
44
  - Rakefile
45
+ - app/controllers/podium/podlet_preview_controller.rb
30
46
  - bin/console
31
47
  - bin/setup
48
+ - bin/test
49
+ - lib/generators/podium/install_generator.rb
50
+ - lib/generators/podium/podlet_generator.rb
51
+ - lib/generators/podium/templates/content.html.erb.tt
52
+ - lib/generators/podium/templates/podium.rb.tt
53
+ - lib/generators/podium/templates/podlet_controller.rb.tt
54
+ - lib/generators/podium/templates/podlet_preview_controller.rb.tt
32
55
  - lib/podium.rb
33
56
  - lib/podium/client.rb
57
+ - lib/podium/configuration.rb
58
+ - lib/podium/controller_helpers.rb
59
+ - lib/podium/core_ext.rb
34
60
  - lib/podium/manifest.rb
61
+ - lib/podium/podlet_helpers.rb
62
+ - lib/podium/podlet_preview.rb
63
+ - lib/podium/railtie.rb
35
64
  - lib/podium/resource.rb
36
65
  - lib/podium/version.rb
66
+ - lib/tasks/podium_tasks.rake
37
67
  - podium.gemspec
38
68
  homepage: https://github.com/gingermusketeer/podium
39
69
  licenses: