mumukit-platform 5.0.1 → 7.0.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: ff5505e3d0593e7928058ec91492a3cee48e8bbf7032a4bb991a066ad6367a05
4
- data.tar.gz: 16b8d4e4fc5edc1437332e27283ab26d5a47ebfa2fd88d611215b89b68941ac9
3
+ metadata.gz: 39a52de81a0b2c6efb83bcc9a7e23b8e59715c42f83cd667813ea00c34fe1880
4
+ data.tar.gz: 6ba950cc3889ca4aedae2f48ad94c3011ebb8196bd57f8aed9ef48509a5f947c
5
5
  SHA512:
6
- metadata.gz: 7af159ccbb971a130b4cb56145527884a4f8f90005f73462b74484719dd6d38c885106b8ba5e2c6b1c08593a89dc44271215340a5bd2cc0ce0f0c6989e8e652c
7
- data.tar.gz: 0215da67f0cc8b35daedb5ed8b9074be5d43d80d6f22c8f881978deb2bd9ba58bb30945620df8c1c0ad499d18f2bfdd8f709ffd5acae2ddba307c282fb5f8d29
6
+ metadata.gz: 0c434715414edfa1af06bafe9a92e6c1a5fd23435e7c7408bc70005c84f90a7bc5512597c8f0aaa2188bb71aa12f60c5b1f610fdf59d21e2447e598184eb4d58
7
+ data.tar.gz: f4142a30260afa2b54d7addb7fd48ffd4a523e71948f4243c4088043cad49851cdfe8549b1abc06ba9253701c4c7a54eb03e54e66dc501551116de4ae762682d
@@ -0,0 +1,32 @@
1
+ name: Test and deploy
2
+
3
+ on:
4
+ - push
5
+ - workflow_dispatch
6
+
7
+ jobs:
8
+ test_and_deploy:
9
+ runs-on: ubuntu-latest
10
+ steps:
11
+ - uses: actions/checkout@v2
12
+ - name: Set up Ruby
13
+ uses: ruby/setup-ruby@21351ecc0a7c196081abca5dc55b08f085efe09a
14
+ with:
15
+ ruby-version: 2.6.3
16
+ bundler: 2.1.4
17
+ - name: Install dependencies
18
+ run: bundle install
19
+ - name: Run tests
20
+ run: bundle exec rake
21
+ - name: Deploy
22
+ if: ${{ startsWith(github.ref, 'refs/tags/v') }}
23
+ run: |
24
+ mkdir -p $HOME/.gem
25
+ touch $HOME/.gem/credentials
26
+ chmod 0600 $HOME/.gem/credentials
27
+ printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
28
+ gem build *.gemspec
29
+ gem push *.gem
30
+ env:
31
+ GEM_HOST_API_KEY: "${{secrets.RUBYGEMS_AUTH_TOKEN}}"
32
+
@@ -17,9 +17,9 @@ module Mumukit::Platform
17
17
 
18
18
  config.laboratory_url = ENV['MUMUKI_LABORATORY_URL'] || "http://#{domain}"
19
19
  config.thesaurus_url = ENV['MUMUKI_THESAURUS_URL'] || "http://thesaurus.#{domain}"
20
- config.bibliotheca_ui_url = ENV['MUMUKI_BIBLIOTHECA_UI_URL'] || "http://bibliotheca.#{domain}"
20
+ config.bibliotheca_ui_url = ENV['MUMUKI_BIBLIOTHECA_UI_URL'] || "http://bibliotheca.#{domain}/#/"
21
21
  config.bibliotheca_api_url = ENV['MUMUKI_BIBLIOTHECA_API_URL'] || "http://bibliotheca-api.#{domain}"
22
- config.classroom_ui_url = ENV['MUMUKI_CLASSROOM_UI_URL'] || "http://classroom.#{domain}"
22
+ config.classroom_ui_url = ENV['MUMUKI_CLASSROOM_UI_URL'] || "http://classroom.#{domain}/#/"
23
23
  config.classroom_api_url = ENV['MUMUKI_CLASSROOM_API_URL'] || "http://classroom-api.#{domain}"
24
24
  config.organization_mapping = Mumukit::Platform::OrganizationMapping.from_env
25
25
  end
@@ -41,8 +41,11 @@ module Mumukit::Platform
41
41
  #
42
42
  define_singleton_method("#{klass}_class") do
43
43
  begin
44
- config["#{klass}_class"] ||= config["#{klass}_class_name"].constantize
45
- rescue
44
+ return config["#{klass}_class"] if config["#{klass}_class"].present?
45
+ config["#{klass}_class_name"].to_s.constantize.tap do |klass_instance|
46
+ config["#{klass}_class"] = klass_instance unless %w(RACK_ENV RAILS_ENV).any? { |it| ENV[it] == 'development' }
47
+ end
48
+ rescue NameError => e
46
49
  raise "You must configure your #{klass} class first"
47
50
  end
48
51
  end
@@ -51,6 +54,7 @@ end
51
54
 
52
55
  require_relative './platform/notifiable'
53
56
 
57
+ require_relative './platform/global'
54
58
  require_relative './platform/domain'
55
59
  require_relative './platform/model'
56
60
  require_relative './platform/locale'
@@ -28,7 +28,15 @@ class Mumukit::Platform::Application
28
28
  end
29
29
 
30
30
  def organic_url_for(organization, path)
31
- organic_uri(organization).url_for(relative_path path)
31
+ uri = organic_uri(organization)
32
+ # warning: this code is tightly
33
+ # coupled to the fact that applications can only rebuild urls
34
+ # in fragmented-mode
35
+ if uri.fragment
36
+ uri.to_s + relative_path(path)
37
+ else
38
+ uri.url_for(relative_path path)
39
+ end
32
40
  end
33
41
 
34
42
  def relative_path(path)
@@ -53,4 +61,4 @@ class Mumukit::Platform::Application
53
61
  organization_mapping.organic_uri(uri, organization)
54
62
  end
55
63
  end
56
- end
64
+ end
@@ -1,5 +1,11 @@
1
1
  module Mumukit::Platform::Course
2
+ extend Mumukit::Platform::Global
3
+
2
4
  def self.find_by_slug!(slug)
3
5
  Mumukit::Platform.course_class.find_by_slug!(slug)
4
6
  end
7
+
8
+ def self.__global_thread_variable_key__
9
+ :course
10
+ end
5
11
  end
@@ -0,0 +1,19 @@
1
+ module Mumukit::Platform::Global
2
+ def switch!(global)
3
+ raise "#{__global_thread_variable_key__} must not be nil" unless global
4
+ Thread.current[__global_thread_variable_key__] = global
5
+ end
6
+
7
+ def leave!
8
+ Thread.current[__global_thread_variable_key__] = nil
9
+ end
10
+
11
+ def current
12
+ Thread.current[__global_thread_variable_key__] || raise("#{__global_thread_variable_key__} not selected")
13
+ end
14
+
15
+ def current?
16
+ !!Thread.current[__global_thread_variable_key__]
17
+ end
18
+ end
19
+
@@ -2,6 +2,7 @@ module Mumukit::Platform::Locale
2
2
  SPECS = {
3
3
  en: { facebook_code: :en_US, auth0_code: :en, name: 'English' },
4
4
  es: { facebook_code: :es_LA, auth0_code: :es, name: 'Español' },
5
+ 'es-CL': { facebook_code: :es_LA, auth0_code: :es, name: 'Español chileno' },
5
6
  pt: { facebook_code: :pt_BR, auth0_code: 'pt-br', name: 'Português' }
6
7
  }.with_indifferent_access
7
8
 
@@ -1,27 +1,30 @@
1
1
  module Mumukit::Platform::Organization
2
- def self.switch!(organization)
3
- raise 'Organization must not be nil' unless organization
4
- Thread.current[:organization] = organization
2
+ extend Mumukit::Platform::Global
3
+
4
+ def self.current_locale
5
+ Thread.current[:organization]&.locale || 'en'
5
6
  end
6
7
 
7
- def self.leave!
8
- Thread.current[:organization] = nil
8
+ def self.find_by_name!(name)
9
+ Mumukit::Platform.organization_class.find_by_name!(name)
9
10
  end
10
11
 
11
- def self.current
12
- Thread.current[:organization] || raise('organization not selected')
12
+ def self.__global_thread_variable_key__
13
+ :organization
13
14
  end
14
15
 
15
- def self.current?
16
- !!Thread.current[:organization]
16
+ ## Name validation
17
+
18
+ def self.valid_name?(name)
19
+ !!(name =~ anchored_valid_name_regex)
17
20
  end
18
21
 
19
- def self.current_locale
20
- Thread.current[:organization]&.locale || 'en'
22
+ def self.anchored_valid_name_regex
23
+ /\A#{valid_name_regex}\z/
21
24
  end
22
25
 
23
- def self.find_by_name!(name)
24
- Mumukit::Platform.organization_class.find_by_name!(name)
26
+ def self.valid_name_regex
27
+ /([-a-z0-9_]+(\.[-a-z0-9_]+)*)?/
25
28
  end
26
29
  end
27
30
 
@@ -1,3 +1,5 @@
1
+ require 'pathname'
2
+
1
3
  module Mumukit::Platform::OrganizationMapping
2
4
  def self.from_env
3
5
  if ENV['RACK_ENV'] == 'test' || ENV['RAILS_ENV'] == 'test'
@@ -18,7 +20,15 @@ module Mumukit::Platform::OrganizationMapping
18
20
  end
19
21
  end
20
22
 
23
+ module Base
24
+ def path_for(request)
25
+ request.path_info
26
+ end
27
+ end
28
+
21
29
  module Subdomain
30
+ extend Base
31
+
22
32
  def self.implicit_organization?(request, domain)
23
33
  request.empty_subdomain_after?(domain)
24
34
  end
@@ -32,15 +42,21 @@ module Mumukit::Platform::OrganizationMapping
32
42
  end
33
43
 
34
44
  def self.organic_uri(uri, organization)
35
- uri.subdominate(organization)
45
+ uri.subdominate(organization, fragmented: true)
36
46
  end
37
47
 
38
48
  def self.path_under_namespace?(_organization_name, path, namespace)
39
49
  path.start_with? "/#{namespace}/"
40
50
  end
51
+
52
+ def self.inorganic_path_for(request)
53
+ path_for(request)
54
+ end
41
55
  end
42
56
 
43
57
  module Path
58
+ extend Base
59
+
44
60
  def self.implicit_organization?(_request, _domain)
45
61
  false
46
62
  end
@@ -49,12 +65,21 @@ module Mumukit::Platform::OrganizationMapping
49
65
  framework.configure_tenant_path_routes! native, &block
50
66
  end
51
67
 
68
+ def self.path_composition_for(request)
69
+ organization, *path_parts = Pathname(path_for(request)).each_filename.to_a
70
+ [organization, path_parts.join('/')]
71
+ end
72
+
52
73
  def self.organization_name(request, _domain)
53
- request.path.split('/')[1]
74
+ path_composition_for(request).first
75
+ end
76
+
77
+ def self.inorganic_path_for(request)
78
+ path_composition_for(request).second
54
79
  end
55
80
 
56
81
  def self.organic_uri(uri, organization)
57
- uri.subroute(organization)
82
+ uri.tenantize organization, fragmented: true
58
83
  end
59
84
 
60
85
  def self.path_under_namespace?(organization_name, path, namespace)
@@ -1,23 +1,30 @@
1
1
  class URI::HTTP
2
- def subdominate(subdomain)
2
+ def subdominate(subdomain, **options)
3
3
  if host.start_with? 'www.'
4
4
  new_host = host.gsub('www.', "www.#{subdomain}.")
5
5
  else
6
6
  new_host = "#{subdomain}.#{host}"
7
7
  end
8
- rebuild(host: new_host)
8
+ rebuild({host: new_host}, **options)
9
9
  end
10
10
 
11
- def subroute(route)
12
- if path.start_with? '/'
13
- new_path = "/#{route}#{path}"
11
+ def tenantize(route, **options)
12
+ if path.end_with? '/'
13
+ new_path = "#{path}#{route}/"
14
14
  else
15
- new_path = "/#{route}/#{path}"
15
+ new_path = "#{path}/#{route}/"
16
16
  end
17
- rebuild(path: new_path)
17
+ rebuild({path: new_path}, **options)
18
18
  end
19
19
 
20
- def rebuild(updates)
20
+ def rebuild(updates, fragmented: false)
21
+ if fragmented && fragment
22
+ fragment = "#{self.fragment}/#{updates[:path]}/".squeeze('/')
23
+ updates = updates.except(:path)
24
+ else
25
+ fragment = self.fragment
26
+ end
27
+
21
28
  self.class.build({
22
29
  scheme: scheme,
23
30
  host: host,
@@ -30,4 +37,4 @@ class URI::HTTP
30
37
  def url_for(path)
31
38
  URI.join(self, path).to_s
32
39
  end
33
- end
40
+ end
@@ -1,5 +1,5 @@
1
1
  module Mumukit
2
2
  module Platform
3
- VERSION = '5.0.1'
3
+ VERSION = '7.0.0'
4
4
  end
5
5
  end
@@ -21,7 +21,7 @@ module Mumukit::Platform::WebFramework
21
21
  def self.tenant_scope_options
22
22
  {
23
23
  defaults: { tenant: lazy_string { Mumukit::Platform.current_organization_name } },
24
- constraints: { tenant: Mumukit::Platform::Organization::Helpers.valid_name_regex }
24
+ constraints: { tenant: Mumukit::Platform::Organization.valid_name_regex }
25
25
  }
26
26
  end
27
27
  end
@@ -27,7 +27,7 @@ Gem::Specification.new do |spec|
27
27
  spec.add_dependency 'mumukit-bridge', '>= 3.5', '< 5'
28
28
  spec.add_dependency 'activemodel', '>= 4.0'
29
29
 
30
- spec.add_development_dependency 'bundler', '~> 1.14'
31
- spec.add_development_dependency 'rake', '~> 10.0'
30
+ spec.add_development_dependency 'bundler', '~> 2.0', '< 2.2'
31
+ spec.add_development_dependency 'rake', '~> 12.3'
32
32
  spec.add_development_dependency 'rspec', '~> 3.0'
33
33
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mumukit-platform
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.0.1
4
+ version: 7.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Franco Leonardo Bulgarelli
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-07-08 00:00:00.000000000 Z
11
+ date: 2021-03-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mumukit-nuntius
@@ -92,28 +92,34 @@ dependencies:
92
92
  requirements:
93
93
  - - "~>"
94
94
  - !ruby/object:Gem::Version
95
- version: '1.14'
95
+ version: '2.0'
96
+ - - "<"
97
+ - !ruby/object:Gem::Version
98
+ version: '2.2'
96
99
  type: :development
97
100
  prerelease: false
98
101
  version_requirements: !ruby/object:Gem::Requirement
99
102
  requirements:
100
103
  - - "~>"
101
104
  - !ruby/object:Gem::Version
102
- version: '1.14'
105
+ version: '2.0'
106
+ - - "<"
107
+ - !ruby/object:Gem::Version
108
+ version: '2.2'
103
109
  - !ruby/object:Gem::Dependency
104
110
  name: rake
105
111
  requirement: !ruby/object:Gem::Requirement
106
112
  requirements:
107
113
  - - "~>"
108
114
  - !ruby/object:Gem::Version
109
- version: '10.0'
115
+ version: '12.3'
110
116
  type: :development
111
117
  prerelease: false
112
118
  version_requirements: !ruby/object:Gem::Requirement
113
119
  requirements:
114
120
  - - "~>"
115
121
  - !ruby/object:Gem::Version
116
- version: '10.0'
122
+ version: '12.3'
117
123
  - !ruby/object:Gem::Dependency
118
124
  name: rspec
119
125
  requirement: !ruby/object:Gem::Requirement
@@ -135,10 +141,10 @@ executables: []
135
141
  extensions: []
136
142
  extra_rdoc_files: []
137
143
  files:
144
+ - ".github/workflows/test_and_deploy.yml"
138
145
  - ".gitignore"
139
146
  - ".rspec"
140
147
  - ".ruby-version"
141
- - ".travis.yml"
142
148
  - CODE_OF_CONDUCT.md
143
149
  - Gemfile
144
150
  - LICENSE.txt
@@ -151,6 +157,7 @@ files:
151
157
  - lib/mumukit/platform/bridge.rb
152
158
  - lib/mumukit/platform/course.rb
153
159
  - lib/mumukit/platform/domain.rb
160
+ - lib/mumukit/platform/global.rb
154
161
  - lib/mumukit/platform/locale.rb
155
162
  - lib/mumukit/platform/model.rb
156
163
  - lib/mumukit/platform/notifiable.rb
@@ -184,7 +191,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
184
191
  - !ruby/object:Gem::Version
185
192
  version: '0'
186
193
  requirements: []
187
- rubygems_version: 3.0.4
194
+ rubygems_version: 3.0.3
188
195
  signing_key:
189
196
  specification_version: 4
190
197
  summary: Shared Mumuki Platform Components
data/.travis.yml DELETED
@@ -1,13 +0,0 @@
1
- sudo: false
2
- language: ruby
3
- rvm:
4
- - 2.6.3
5
- before_install: gem install bundler -v 1.14.2
6
- deploy:
7
- provider: rubygems
8
- api_key:
9
- secure: peqcsnX2NXwCvy20HfitFl7Dhhi4jrkeu2ZuJz6eEVml5xkkGOuTiAXiSFMvysuV1uCueWNKvQJzNl6u82cwM/InYjFj1kG3SRLIZCkEKks2tOxtJmky7CpIh9jI5SZKOL/DKuMRIuYJwhN0WURi58aCybqyhAsh0XQYGN0EFo6jwnJHehe1KEwgxaTFFB1Q1bn41o+7LWw4r39j7mj28x+WTnl11iM/CRndrQj/YSB8Xk92il8W2vfEWbn4xY2rK/joQ9Doi+rbrW90J7ArGkiMbbsofKkt2snOjrO5UDqqDGWi1/iQmBwtf2qgqB+TmTELrqd4ehRraq4P7dgW3uWGQe/0gR5xoYDusimcBQ5N+JDZbac/YKMRYG0+Ce09ggIaGjq2iEyn9zus00aaaoEGixqVtTwMtkvApmlM/c7CaeSmKSUhYdYE8ayOuCqHgIhCKoZPhADylTc3NL5qizk3/3/wrCyAf9Slq/Oa04Wa4NRXfC5yDkdJggaIzYwq03mc1diechM1ZrovZHNOWznbtjq1JrbEDQk95A29BsrTRLCk98QnChaTHrGmwvlk7g40iUurDplfg5IpUHnSc9BBQg+hcKd5IjKVkrHH5cUHq+U8pXIXgf4vs8cYFX8B1asIO7ApiSABxnC8bsjBZx4ccu303LWILiFBurQQn7w=
10
- gem: mumukit-platform
11
- on:
12
- tags: true
13
- repo: mumuki/mumukit-platform