mno-enterprise-core 2.0.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.
- checksums.yaml +7 -0
- data/LICENSE +1 -0
- data/Rakefile +12 -0
- data/app/assets/images/mno_enterprise/main-logo.png +0 -0
- data/app/controllers/mno_enterprise/application_controller.rb +116 -0
- data/app/helpers/mno_enterprise/application_helper.rb +67 -0
- data/app/helpers/mno_enterprise/impersonate_helper.rb +27 -0
- data/app/models/mno_enterprise/ability.rb +6 -0
- data/app/models/mno_enterprise/app.rb +72 -0
- data/app/models/mno_enterprise/app_instance.rb +36 -0
- data/app/models/mno_enterprise/app_instances_sync.rb +6 -0
- data/app/models/mno_enterprise/arrears_situation.rb +6 -0
- data/app/models/mno_enterprise/audit_event.rb +21 -0
- data/app/models/mno_enterprise/base_resource.rb +228 -0
- data/app/models/mno_enterprise/credit_card.rb +40 -0
- data/app/models/mno_enterprise/deletion_request.rb +35 -0
- data/app/models/mno_enterprise/impac/dashboard.rb +36 -0
- data/app/models/mno_enterprise/impac/dashboard_provisioner.rb +5 -0
- data/app/models/mno_enterprise/impac/kpi.rb +9 -0
- data/app/models/mno_enterprise/impac/widget.rb +13 -0
- data/app/models/mno_enterprise/invoice.rb +53 -0
- data/app/models/mno_enterprise/org_invite.rb +50 -0
- data/app/models/mno_enterprise/organization.rb +33 -0
- data/app/models/mno_enterprise/team.rb +50 -0
- data/app/models/mno_enterprise/tenant.rb +5 -0
- data/app/models/mno_enterprise/tenant_invoice.rb +5 -0
- data/app/models/mno_enterprise/user.rb +183 -0
- data/app/pdf/mno_enterprise/invoice_pdf.rb +516 -0
- data/config/initializers/audit_log.rb +5 -0
- data/config/locales/devise.en.yml +60 -0
- data/config/routes.rb +2 -0
- data/config/styleguide.yml +106 -0
- data/lib/accountingjs_serializer.rb +51 -0
- data/lib/devise/controllers/extension_helpers.rb +52 -0
- data/lib/devise/extension_routes.rb +11 -0
- data/lib/devise/hooks/password_expirable.rb +5 -0
- data/lib/devise/models/password_expirable.rb +28 -0
- data/lib/devise/models/remote_authenticatable.rb +48 -0
- data/lib/devise/strategies/remote_authenticatable.rb +44 -0
- data/lib/devise_extension.rb +36 -0
- data/lib/faraday/adapter/net_http_no_proxy.rb +19 -0
- data/lib/generators/mno_enterprise/database_extension/USAGE +11 -0
- data/lib/generators/mno_enterprise/database_extension/database_extension_generator.rb +36 -0
- data/lib/generators/mno_enterprise/database_extension/templates/model.rb +9 -0
- data/lib/generators/mno_enterprise/dummy/dummy_generator.rb +98 -0
- data/lib/generators/mno_enterprise/dummy/templates/rails/application.rb.erb +9 -0
- data/lib/generators/mno_enterprise/dummy/templates/rails/boot.rb.erb +6 -0
- data/lib/generators/mno_enterprise/dummy/templates/rails/database.yml +22 -0
- data/lib/generators/mno_enterprise/dummy/templates/rails/routes.rb +8 -0
- data/lib/generators/mno_enterprise/dummy/templates/rails/test-env.rb +45 -0
- data/lib/generators/mno_enterprise/install/install_generator.rb +140 -0
- data/lib/generators/mno_enterprise/install/templates/Procfile +1 -0
- data/lib/generators/mno_enterprise/install/templates/config/initializers/mno_enterprise.rb +135 -0
- data/lib/generators/mno_enterprise/install/templates/config/mno_enterprise_styleguide.yml +104 -0
- data/lib/generators/mno_enterprise/install/templates/javascripts/mno_enterprise_extensions.js +7 -0
- data/lib/generators/mno_enterprise/install/templates/stylesheets/main.less_erb +25 -0
- data/lib/generators/mno_enterprise/install/templates/stylesheets/theme.less_erb +59 -0
- data/lib/generators/mno_enterprise/install/templates/stylesheets/variables.less +337 -0
- data/lib/generators/mno_enterprise/install/templates/tasks/sprites.rake +14 -0
- data/lib/generators/mno_enterprise/puma_stack/puma_stack_generator.rb +58 -0
- data/lib/generators/mno_enterprise/templates/scripts/monit/app-server.conf +8 -0
- data/lib/generators/mno_enterprise/templates/scripts/nginx/app +51 -0
- data/lib/generators/mno_enterprise/templates/scripts/puma.rb +25 -0
- data/lib/generators/mno_enterprise/templates/scripts/setup.sh +27 -0
- data/lib/generators/mno_enterprise/templates/scripts/upstart/app-web-hotrestart.conf +26 -0
- data/lib/generators/mno_enterprise/templates/scripts/upstart/app-web-server.conf +34 -0
- data/lib/generators/mno_enterprise/templates/scripts/upstart/app-web.conf +2 -0
- data/lib/generators/mno_enterprise/templates/scripts/upstart/app.conf +11 -0
- data/lib/her_extension/her_orm_adapter.rb +54 -0
- data/lib/her_extension/middleware/mnoe_api_v1_parse_json.rb +54 -0
- data/lib/her_extension/model/associations/association.rb +61 -0
- data/lib/her_extension/model/associations/association_proxy.rb +34 -0
- data/lib/her_extension/model/associations/has_many_association.rb +115 -0
- data/lib/her_extension/model/attributes.rb +43 -0
- data/lib/her_extension/model/orm.rb +59 -0
- data/lib/her_extension/model/parse.rb +40 -0
- data/lib/her_extension/model/relation.rb +92 -0
- data/lib/her_extension/validations/remote_uniqueness_validation.rb +33 -0
- data/lib/html_processor.rb +106 -0
- data/lib/mandrill_client.rb +58 -0
- data/lib/mno-enterprise-core.rb +1 -0
- data/lib/mno_enterprise/concerns.rb +4 -0
- data/lib/mno_enterprise/concerns/controllers.rb +6 -0
- data/lib/mno_enterprise/concerns/controllers/angular_csrf.rb +59 -0
- data/lib/mno_enterprise/concerns/controllers/auth.rb +9 -0
- data/lib/mno_enterprise/concerns/controllers/auth/confirmations_controller.rb +187 -0
- data/lib/mno_enterprise/concerns/controllers/auth/passwords_controller.rb +54 -0
- data/lib/mno_enterprise/concerns/controllers/auth/registrations_controller.rb +136 -0
- data/lib/mno_enterprise/concerns/controllers/auth/sessions_controller.rb +54 -0
- data/lib/mno_enterprise/concerns/controllers/auth/unlocks_controller.rb +50 -0
- data/lib/mno_enterprise/concerns/models.rb +6 -0
- data/lib/mno_enterprise/concerns/models/ability.rb +108 -0
- data/lib/mno_enterprise/concerns/models/app_instance.rb +100 -0
- data/lib/mno_enterprise/concerns/models/organization.rb +102 -0
- data/lib/mno_enterprise/core.rb +279 -0
- data/lib/mno_enterprise/database_extendable.rb +57 -0
- data/lib/mno_enterprise/engine.rb +33 -0
- data/lib/mno_enterprise/testing_support/ability_test_helper.rb +10 -0
- data/lib/mno_enterprise/testing_support/common_rake.rb +19 -0
- data/lib/mno_enterprise/testing_support/factories.rb +13 -0
- data/lib/mno_enterprise/testing_support/factories/app_instances.rb +30 -0
- data/lib/mno_enterprise/testing_support/factories/apps.rb +45 -0
- data/lib/mno_enterprise/testing_support/factories/arrears_situation.rb +14 -0
- data/lib/mno_enterprise/testing_support/factories/audit_event.rb +15 -0
- data/lib/mno_enterprise/testing_support/factories/credit_card.rb +33 -0
- data/lib/mno_enterprise/testing_support/factories/deletion_request.rb +17 -0
- data/lib/mno_enterprise/testing_support/factories/impac/dashboards.rb +15 -0
- data/lib/mno_enterprise/testing_support/factories/impac/kpis.rb +20 -0
- data/lib/mno_enterprise/testing_support/factories/impac/widgets.rb +15 -0
- data/lib/mno_enterprise/testing_support/factories/invoices.rb +51 -0
- data/lib/mno_enterprise/testing_support/factories/org_invite.rb +24 -0
- data/lib/mno_enterprise/testing_support/factories/organizations.rb +25 -0
- data/lib/mno_enterprise/testing_support/factories/team.rb +17 -0
- data/lib/mno_enterprise/testing_support/factories/tenant.rb +12 -0
- data/lib/mno_enterprise/testing_support/factories/tenant_invoice.rb +29 -0
- data/lib/mno_enterprise/testing_support/factories/users.rb +48 -0
- data/lib/mno_enterprise/testing_support/jpi_v1_test_helper.rb +49 -0
- data/lib/mno_enterprise/testing_support/mno_enterprise_api_test_helper.rb +167 -0
- data/lib/mno_enterprise/testing_support/mnoe_faraday_test_adapter.rb +173 -0
- data/lib/mno_enterprise/testing_support/organizations_shared_helpers.rb +175 -0
- data/lib/mno_enterprise/testing_support/user_action_shared.rb +47 -0
- data/lib/mno_enterprise/version.rb +3 -0
- data/lib/tasks/mno_enterprise_tasks.rake +22 -0
- data/spec/controllers/mno_enterprise/angular_csrf_spec.rb +42 -0
- data/spec/lib/her_extension/her_orm_adapter.rb +7 -0
- data/spec/lib/her_extension/model/relation_spec.rb +7 -0
- data/spec/lib/mandrill_client_spec.rb +64 -0
- data/spec/mno_enterprise_spec.rb +79 -0
- data/spec/models/mno_enterprise/app_instance_spec.rb +7 -0
- data/spec/models/mno_enterprise/app_spec.rb +62 -0
- data/spec/models/mno_enterprise/base_resource_spec.rb +28 -0
- data/spec/models/mno_enterprise/deletion_request_spec.rb +26 -0
- data/spec/models/mno_enterprise/invoice_spec.rb +7 -0
- data/spec/models/mno_enterprise/organization_spec.rb +7 -0
- data/spec/models/mno_enterprise/user_spec.rb +44 -0
- data/spec/rails_helper.rb +73 -0
- data/spec/spec_helper.rb +78 -0
- metadata +421 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# require 'sprite_factory'
|
|
2
|
+
|
|
3
|
+
namespace :assets do
|
|
4
|
+
desc 'recreate sprite images and css'
|
|
5
|
+
task :resprite => :environment do
|
|
6
|
+
SpriteFactory.report = true # output report during generation
|
|
7
|
+
SpriteFactory.library = :chunkypng # use simple chunkypng gem to handle .png sprite generation
|
|
8
|
+
SpriteFactory.layout = :packed # pack sprite sheets into optimized rectangles
|
|
9
|
+
SpriteFactory.style = :scss # Generates a css.scss file
|
|
10
|
+
SpriteFactory.cssurl = "image-url('sprites/$IMAGE')"
|
|
11
|
+
|
|
12
|
+
SpriteFactory.run!('vendor/sprites/icons', output_image: 'app/assets/images/sprites/icons.sprite.png', output_style: 'app/assets/stylesheets/sprites/icons.less', selector: '.i-ic-')
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
require 'rails/generators/base'
|
|
2
|
+
|
|
3
|
+
module MnoEnterprise
|
|
4
|
+
module Generators
|
|
5
|
+
class PumaStackGenerator < ::Rails::Generators::Base
|
|
6
|
+
source_root File.expand_path("../../templates", __FILE__)
|
|
7
|
+
argument :environment, type: :string
|
|
8
|
+
desc "Description:\n Configure a stack composed of Nginx, Puma, Upstart and Monit\n\n"
|
|
9
|
+
|
|
10
|
+
def validate_environment
|
|
11
|
+
unless available_environments.include?(environment)
|
|
12
|
+
raise Exception.new("Environment '#{environment}' is not defined. Please define this environment in config/environments/#{environment}.rb")
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def install_puma_gem
|
|
17
|
+
gem "puma"
|
|
18
|
+
@num_cpus = ask("How many CPUs (or vCPU for EC2) does your #{environment} machine have? [1]")
|
|
19
|
+
@num_cpus = "1" if @num_cpus.blank?
|
|
20
|
+
template "scripts/puma.rb", "scripts/#{environment}/puma.rb"
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def copy_setup_script
|
|
24
|
+
template "scripts/setup.sh", "scripts/#{environment}/setup.sh"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def copy_nginx
|
|
28
|
+
@app_domain = ask("What is the domain pointing to your #{environment} application? [#{default_domain}]")
|
|
29
|
+
@app_domain = default_domain if @app_domain.blank?
|
|
30
|
+
template "scripts/nginx/app", "scripts/#{environment}/nginx/app"
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def copy_upstart
|
|
34
|
+
template "scripts/upstart/app.conf", "scripts/#{environment}/upstart/app.conf"
|
|
35
|
+
template "scripts/upstart/app-web.conf", "scripts/#{environment}/upstart/app-web.conf"
|
|
36
|
+
template "scripts/upstart/app-web-server.conf", "scripts/#{environment}/upstart/app-web-server.conf"
|
|
37
|
+
template "scripts/upstart/app-web-hotrestart.conf", "scripts/#{environment}/upstart/app-web-hotrestart.conf"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def copy_monit
|
|
41
|
+
template "scripts/monit/app-server.conf", "scripts/#{environment}/monit/app-server.conf"
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
protected
|
|
45
|
+
def available_environments
|
|
46
|
+
Dir.glob("./config/environments/*.rb").map { |filename| File.basename(filename, ".rb") }
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def app_name
|
|
50
|
+
@app_name ||= Rails.application.class.parent_name.underscore.gsub('_','-')
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def default_domain
|
|
54
|
+
@default_domain ||= "#{app_name}-mnoe.maestrano.io"
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
check process <%= app_name %>-server
|
|
2
|
+
with pidfile "/apps/<%= app_name %>/current/tmp/pids/puma.pid"
|
|
3
|
+
start program = "/sbin/start <%= app_name %>-web-server"
|
|
4
|
+
stop program = "/sbin/stop <%= app_name %>-web-server"
|
|
5
|
+
if mem is greater than 1500.0 MB for 1 cycles then exec "/sbin/hotrestart <%= app_name %>"
|
|
6
|
+
if cpu is greater than 60% for 2 cycles then exec "/sbin/hotrestart <%= app_name %>"
|
|
7
|
+
|
|
8
|
+
group <%= app_name %>
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
upstream <%= app_name %>-backend {
|
|
2
|
+
server unix:/apps/<%= app_name %>/current/tmp/sockets/puma.sock fail_timeout=0;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
# Rewrite http traffic to https
|
|
6
|
+
server {
|
|
7
|
+
server_name <%= app_name %>-mnoe.maestrano.io;
|
|
8
|
+
listen 80;
|
|
9
|
+
|
|
10
|
+
location / {
|
|
11
|
+
rewrite ^ https://$host$request_uri? permanent;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
server {
|
|
16
|
+
server_name <%= @app_domain %>;
|
|
17
|
+
listen 443;
|
|
18
|
+
|
|
19
|
+
ssl on;
|
|
20
|
+
ssl_certificate /etc/nginx/certificates/maestrano.io.wildcard-current/maestrano.io.wildcard.chained.crt;
|
|
21
|
+
ssl_certificate_key /etc/nginx/certificates/maestrano.io.wildcard-current/maestrano.io.wildcard.key;
|
|
22
|
+
|
|
23
|
+
root /apps/<%= app_name %>/current/public;
|
|
24
|
+
index index.html index.htm;
|
|
25
|
+
|
|
26
|
+
try_files $uri/index.html $uri.html $uri @backend;
|
|
27
|
+
|
|
28
|
+
location ^~ /assets/ {
|
|
29
|
+
gzip_static on;
|
|
30
|
+
expires max;
|
|
31
|
+
add_header Cache-Control public;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
location @backend {
|
|
35
|
+
expires -1;
|
|
36
|
+
add_header Cache-Control "max-age=0, no-store, must-revalidate";
|
|
37
|
+
|
|
38
|
+
proxy_set_header X-Forwarded-Proto https;
|
|
39
|
+
proxy_set_header X-Real-IP $remote_addr;
|
|
40
|
+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
41
|
+
proxy_set_header Host $http_host;
|
|
42
|
+
proxy_redirect off;
|
|
43
|
+
proxy_pass http://<%= app_name %>-backend;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
error_page 500 502 503 504 /50x.html;
|
|
47
|
+
|
|
48
|
+
location = /50x.html {
|
|
49
|
+
root html;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Performance tuning
|
|
2
|
+
workers <%= @num_cpus %>
|
|
3
|
+
threads 8,16
|
|
4
|
+
worker_timeout 60
|
|
5
|
+
|
|
6
|
+
# Preload application
|
|
7
|
+
preload_app!
|
|
8
|
+
|
|
9
|
+
# Configuration
|
|
10
|
+
rails_env = ENV['RAILS_ENV'] || 'production'
|
|
11
|
+
working_directory = File.expand_path('../../../../../current', './scripts/production/puma.rb')
|
|
12
|
+
|
|
13
|
+
# General config
|
|
14
|
+
environment rails_env
|
|
15
|
+
directory working_directory
|
|
16
|
+
pidfile "#{working_directory}/tmp/pids/puma.pid"
|
|
17
|
+
state_path "#{working_directory}/tmp/pids/puma.state"
|
|
18
|
+
stdout_redirect "#{working_directory}/log/puma.stdout.log", "#{working_directory}/log/puma.stderr.log"
|
|
19
|
+
bind "unix://#{working_directory}/tmp/sockets/puma.sock"
|
|
20
|
+
|
|
21
|
+
on_worker_boot do
|
|
22
|
+
# ActiveSupport.on_load(:active_record) do
|
|
23
|
+
# ActiveRecord::Base.establish_connection
|
|
24
|
+
# end
|
|
25
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
#
|
|
3
|
+
# Use this script to setup upstart, monit and any server related service
|
|
4
|
+
|
|
5
|
+
# Point upstart scripts
|
|
6
|
+
rm -f /etc/init/<%= app_name %>*
|
|
7
|
+
ln -s /apps/<%= app_name %>/current/scripts/<%= environment %>/upstart/app.conf /etc/init/<%= app_name %>.conf
|
|
8
|
+
ln -s /apps/<%= app_name %>/current/scripts/<%= environment %>/upstart/app-web.conf /etc/init/<%= app_name %>-web.conf
|
|
9
|
+
ln -s /apps/<%= app_name %>/current/scripts/<%= environment %>/upstart/app-web-server.conf /etc/init/<%= app_name %>-web-server.conf
|
|
10
|
+
ln -s /apps/<%= app_name %>/current/scripts/<%= environment %>/upstart/app-web-hotrestart.conf /etc/init/<%= app_name %>-web-hotrestart.conf
|
|
11
|
+
|
|
12
|
+
# Reload upstart
|
|
13
|
+
initctl reload-configuration
|
|
14
|
+
|
|
15
|
+
# Point monit scripts
|
|
16
|
+
rm -f /etc/monit/conf.d/<%= app_name %>*
|
|
17
|
+
ln -s /apps/<%= app_name %>/current/scripts/<%= environment %>/monit/app-server.conf /etc/monit/conf.d/<%= app_name %>-server.conf
|
|
18
|
+
|
|
19
|
+
# Reload monit
|
|
20
|
+
service monit reload
|
|
21
|
+
|
|
22
|
+
# Nginx
|
|
23
|
+
rm -f /etc/nginx/sites-available/<%= app_name %>
|
|
24
|
+
rm -f /etc/nginx/sites-enabled/<%= app_name %>
|
|
25
|
+
ln -s /apps/<%= app_name %>/current/scripts/<%= environment %>/nginx/app /etc/nginx/sites-available/<%= app_name %>
|
|
26
|
+
ln -s /etc/nginx/sites-available/<%= app_name %> /etc/nginx/sites-enabled/<%= app_name %>
|
|
27
|
+
service nginx reload
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
start on <%= app_name %>-hotrestart
|
|
2
|
+
task
|
|
3
|
+
|
|
4
|
+
# Set process owner
|
|
5
|
+
setuid app-deployer
|
|
6
|
+
setgid app-deployer
|
|
7
|
+
|
|
8
|
+
# Load App environment
|
|
9
|
+
env RAILS_ENV=<%= environment %>
|
|
10
|
+
env APP_HOME=/apps/<%= app_name %>/current
|
|
11
|
+
env USER=app-deployer
|
|
12
|
+
env HOME=/home/app-deployer
|
|
13
|
+
|
|
14
|
+
# Load ruby environment
|
|
15
|
+
env GEM_HOME=/usr/local/rvm/gems/ruby-2.1.2
|
|
16
|
+
env IRBRC=/usr/local/rvm/rubies/ruby-2.1.2/.irbrc
|
|
17
|
+
env MY_RUBY_HOME=/usr/local/rvm/rubies/ruby-2.1.2
|
|
18
|
+
env PATH=/usr/local/rvm/gems/ruby-2.1.2/bin:/usr/local/rvm/gems/ruby-2.1.2@global/bin:/usr/local/rvm/rubies/ruby-2.1.2/bin:/usr/local/rvm/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin
|
|
19
|
+
env GEM_PATH=/usr/local/rvm/gems/ruby-2.1.2:/usr/local/rvm/gems/ruby-2.1.2@global
|
|
20
|
+
env RUBY_VERSION=ruby-2.1.2
|
|
21
|
+
|
|
22
|
+
script
|
|
23
|
+
# Reload server
|
|
24
|
+
cd $APP_HOME
|
|
25
|
+
exec bundle exec pumactl -F scripts/<%= environment %>/puma.rb phased-restart
|
|
26
|
+
end script
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
start on starting <%= app_name %>-web
|
|
2
|
+
stop on stopping <%= app_name %>-web
|
|
3
|
+
respawn
|
|
4
|
+
|
|
5
|
+
# Set process owner
|
|
6
|
+
setuid app-deployer
|
|
7
|
+
setgid app-deployer
|
|
8
|
+
|
|
9
|
+
# Load App environment
|
|
10
|
+
env RAILS_ENV=<%= environment %>
|
|
11
|
+
env APP_HOME=/apps/<%= app_name %>/current
|
|
12
|
+
env USER=app-deployer
|
|
13
|
+
env HOME=/home/app-deployer
|
|
14
|
+
|
|
15
|
+
# Load ruby environment
|
|
16
|
+
env GEM_HOME=/usr/local/rvm/gems/ruby-2.1.2
|
|
17
|
+
env IRBRC=/usr/local/rvm/rubies/ruby-2.1.2/.irbrc
|
|
18
|
+
env MY_RUBY_HOME=/usr/local/rvm/rubies/ruby-2.1.2
|
|
19
|
+
env PATH=/usr/local/rvm/gems/ruby-2.1.2/bin:/usr/local/rvm/gems/ruby-2.1.2@global/bin:/usr/local/rvm/rubies/ruby-2.1.2/bin:/usr/local/rvm/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin
|
|
20
|
+
env GEM_PATH=/usr/local/rvm/gems/ruby-2.1.2:/usr/local/rvm/gems/ruby-2.1.2@global
|
|
21
|
+
env RUBY_VERSION=ruby-2.1.2
|
|
22
|
+
|
|
23
|
+
pre-start script
|
|
24
|
+
# Enforce permissions
|
|
25
|
+
chown -R $USER.$USER $APP_HOME/log/
|
|
26
|
+
chown -R $USER.$USER $APP_HOME/tmp/pids/
|
|
27
|
+
chown -R $USER.$USER $APP_HOME/tmp/cache/
|
|
28
|
+
chown -R $USER.$USER $APP_HOME/tmp/sockets/
|
|
29
|
+
end script
|
|
30
|
+
|
|
31
|
+
script
|
|
32
|
+
cd $APP_HOME
|
|
33
|
+
exec bundle exec puma -C scripts/<%= environment %>/puma.rb
|
|
34
|
+
end script
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
require 'orm_adapter'
|
|
2
|
+
|
|
3
|
+
# TODO: extract in gem orm_apdater-her
|
|
4
|
+
module Her
|
|
5
|
+
module Errors
|
|
6
|
+
class ResourceNotFound < StandardError
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
module Model
|
|
11
|
+
module ClassMethods
|
|
12
|
+
include OrmAdapter::ToAdapter
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
class OrmAdapter < ::OrmAdapter::Base
|
|
16
|
+
# get a list of column names for a given class
|
|
17
|
+
def column_names
|
|
18
|
+
@columns ||= klass.instance_methods.grep(/_will_change!$/).map { |e| e.to_s.gsub('_will_change!','') }
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# @see OrmAdapter::Base#get!
|
|
22
|
+
def get!(id)
|
|
23
|
+
res = klass.find(wrap_key(id))
|
|
24
|
+
raise Her::Errors::ResourceNotFound, "resource not found" unless res
|
|
25
|
+
res
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# @see OrmAdapter::Base#get
|
|
29
|
+
def get(id)
|
|
30
|
+
klass.find(wrap_key(id))
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# @see OrmAdapter::Base#find_first
|
|
34
|
+
def find_first(options = {})
|
|
35
|
+
klass.where(options).limit(1).first
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# @see OrmAdapter::Base#find_all
|
|
39
|
+
def find_all(options = {})
|
|
40
|
+
klass.where(options)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# @see OrmAdapter::Base#create!
|
|
44
|
+
def create!(attributes = {})
|
|
45
|
+
klass.create!(attributes)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# @see OrmAdapter::Base#destroy
|
|
49
|
+
def destroy(object)
|
|
50
|
+
object.destroy if valid_object?(object)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
module Her
|
|
2
|
+
module Middleware
|
|
3
|
+
# This middleware expects the resource/collection data to be contained in the `data`
|
|
4
|
+
# key of the JSON object
|
|
5
|
+
class MnoeApiV1ParseJson < ParseJSON
|
|
6
|
+
# Parse the response body
|
|
7
|
+
#
|
|
8
|
+
# @param [String] body The response body
|
|
9
|
+
# @return [Mixed] the parsed response
|
|
10
|
+
# @private
|
|
11
|
+
def parse(body)
|
|
12
|
+
json = parse_json(body)
|
|
13
|
+
parse_types({
|
|
14
|
+
:data => json[:data] || {},
|
|
15
|
+
:errors => json[:errors] || {},
|
|
16
|
+
:metadata => json[:metadata] || {}
|
|
17
|
+
})
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def parse_types(res)
|
|
21
|
+
case
|
|
22
|
+
when res.kind_of?(Array)
|
|
23
|
+
return res.map { |e| parse_types(e) }
|
|
24
|
+
when res.kind_of?(Hash) && res[:cents] && res[:currency]
|
|
25
|
+
Money.new(res[:cents],res[:currency])
|
|
26
|
+
when res.kind_of?(Hash)
|
|
27
|
+
hash = res.dup
|
|
28
|
+
hash.each do |k,v|
|
|
29
|
+
hash[k] = parse_types(v)
|
|
30
|
+
end
|
|
31
|
+
return hash
|
|
32
|
+
when res.is_a?(String) && res =~ /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/i
|
|
33
|
+
return Time.iso8601(res)
|
|
34
|
+
else
|
|
35
|
+
return res
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# This method is triggered when the response has been received. It modifies
|
|
40
|
+
# the value of `env[:body]`.
|
|
41
|
+
#
|
|
42
|
+
# @param [Hash] env The response environment
|
|
43
|
+
# @private
|
|
44
|
+
def on_complete(env)
|
|
45
|
+
env[:body] = case env[:status]
|
|
46
|
+
when 204
|
|
47
|
+
parse('{}')
|
|
48
|
+
else
|
|
49
|
+
parse(env[:body])
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# query methods should delegate to Relation
|
|
2
|
+
module Her
|
|
3
|
+
module Model
|
|
4
|
+
module Associations
|
|
5
|
+
class Association
|
|
6
|
+
# @private
|
|
7
|
+
attr_accessor :params
|
|
8
|
+
delegate :all, :order_by, :sort_by, :order, :sort, :limit, :skip, :where, to: :blank_relation
|
|
9
|
+
|
|
10
|
+
# Required by Relation methods
|
|
11
|
+
def build_request_path(params = {})
|
|
12
|
+
build_association_path lambda { "#{@parent.request_path(@params.merge(params))}#{@opts[:path]}" }
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Required by Relation methods
|
|
16
|
+
def method_for(meth)
|
|
17
|
+
@parent.class.method_for(meth)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Required by Relation methods
|
|
21
|
+
def request(*args,&block)
|
|
22
|
+
@parent.class.request(*args,&block)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Required by Relation methods
|
|
26
|
+
def new_collection(parsed_data)
|
|
27
|
+
Her::Model::Attributes.initialize_collection(@klass, parsed_data)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Properly format the attributes to post/put
|
|
31
|
+
def to_params(attributes)
|
|
32
|
+
@parent.class.to_params(attributes,attributes)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Reload the association from remote service
|
|
36
|
+
def reload
|
|
37
|
+
@klass.get(build_request_path, @params).tap do |result|
|
|
38
|
+
@parent.attributes[@name] = result
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Reset params when directly called on association class
|
|
43
|
+
# def where(*args)
|
|
44
|
+
# blank_relation.params = {}
|
|
45
|
+
# blank_relation.where(*args)
|
|
46
|
+
# end
|
|
47
|
+
|
|
48
|
+
def blank_relation
|
|
49
|
+
@blank_relation ||= Relation.new(self)
|
|
50
|
+
@blank_relation.params = {}
|
|
51
|
+
@blank_relation
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def method_missing(name, *args, &block)
|
|
55
|
+
blank_relation.send(name, *args, &block)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Add reload to the list of proxy methods
|
|
2
|
+
module Her
|
|
3
|
+
module Model
|
|
4
|
+
module Associations
|
|
5
|
+
class AssociationProxy < (ActiveSupport.const_defined?('ProxyObject') ? ActiveSupport::ProxyObject : ActiveSupport::BasicObject)
|
|
6
|
+
|
|
7
|
+
install_proxy_methods :association,
|
|
8
|
+
:build, :create, :update, :destroy, :where, :find, :all, :assign_nested_attributes, :reload, :order, :order_by, :limit, :skip
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def method_missing(name, *args, &block)
|
|
12
|
+
if :object_id == name # avoid redefining object_id
|
|
13
|
+
return association.fetch.object_id
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Check if a class scope has previously been defined
|
|
17
|
+
begin
|
|
18
|
+
if Relation.scopes.keys.grep(::Regexp.new(name.to_s)).any?
|
|
19
|
+
return self.association.send(name,*args,&block)
|
|
20
|
+
end
|
|
21
|
+
rescue ::NoMethodError => e
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# create a proxy to the fetched object's method
|
|
25
|
+
# https://github.com/remiprev/her/pull/377
|
|
26
|
+
AssociationProxy.install_proxy_methods 'association.fetch', name
|
|
27
|
+
|
|
28
|
+
# resend message to fetched object
|
|
29
|
+
__send__(name, *args, &block)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|