mumuki-bibliotheca 6.1.1 → 6.2.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: 18df96dc9b7855810a92637771997a49de9e1e8e8466ec059e2356c23fdb38cc
4
- data.tar.gz: 33701f7db090a41ede274c8237f9dea5d07449f5666bee5bc709cf031e1742e3
3
+ metadata.gz: c3452b76785a90e339640007046881e3809e48c6ce158eee40eeb65b6752d41d
4
+ data.tar.gz: de7f3eaaec9d4a7374b092bd8e96d23b4b71f36806aa1d45f6d64bd5bb1a0882
5
5
  SHA512:
6
- metadata.gz: c87f0397d47f4d4fd300229840256b963d32deaa2397cfb19092d2d9297c219c3021f2ca76cd55269130d7e4015b60bcbb27697ec08ca7c21eb69dd701f435ab
7
- data.tar.gz: f7ee7e4502f59c5c8ab6b7335c00a935427bce5737ebad821f3cabe3b63c3f125cd98572d028429f3a1e1c7e21551c57e84d4d1df270fb07b7c4fce5d41788d6
6
+ metadata.gz: 9dd4c6cc8910b5fb34a7ff19f2895d7b6d8f27c6ae35a50759fbc151a8566e57edc172fdfbb1f3e81ccba893561f81bc2dcba7d4b5d4210539f07daede005ff0
7
+ data.tar.gz: dcbda9975fa69aaaed8c335655976736bd29f92fcee7fcf73518832a8b72158fc891ef6140f59c041096bd602ebee694058cd100bc5ec9d9f409c7226b4482ad
data/README.md CHANGED
@@ -19,22 +19,17 @@ Bibliotheca is a service for storing Mumuki content - Books, Topics and Guides.
19
19
  ## Preparing environment
20
20
 
21
21
  ### 1. Install essentials and base libraries
22
-
23
- > First, we need to install some software: MongoDB and some common Ruby on Rails native dependencies
24
-
25
- 1. Follow [MongoDB installation guide](https://docs.mongodb.com/v3.2/tutorial/install-mongodb-on-ubuntu/)
26
- 2. Run:
22
+ > First, we need to install some software: [PostgreSQL](https://www.postgresql.org) database, [RabbitMQ](https://www.rabbitmq.com/) queue, and some common Ruby on Rails native dependencies
27
23
 
28
24
  ```bash
29
- sudo apt-get install autoconf curl git build-essential libssl-dev autoconf bison libreadline6 libreadline6-dev zlib1g zlib1g-dev
25
+ sudo apt-get install autoconf curl git build-essential libssl-dev autoconf bison libreadline6 libreadline6-dev zlib1g zlib1g-dev postgresql libpq-dev rabbitmq-server
30
26
  ```
31
27
 
32
28
  ### 2. Install rbenv
33
-
34
29
  > [rbenv](https://github.com/rbenv/rbenv) is a ruby versions manager, similar to rvm, nvm, and so on.
35
30
 
36
31
  ```bash
37
- curl https://raw.githubusercontent.com/rbenv/rbenv-installer/master/bin/rbenv-installer | bash
32
+ curl -fsSL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-installer | bash
38
33
  echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc # or .bash_profile
39
34
  echo 'eval "$(rbenv init -)"' >> ~/.bashrc # or .bash_profile
40
35
  ```
@@ -48,7 +43,6 @@ rbenv install 2.3.1
48
43
  rbenv global 2.3.1
49
44
  rbenv rehash
50
45
  gem install bundler
51
- gem install escualo
52
46
  ```
53
47
 
54
48
  ### 4. Clone this repository
@@ -56,8 +50,27 @@ gem install escualo
56
50
  > Because, err... we need to clone this repostory before developing it :stuck_out_tongue:
57
51
 
58
52
  ```bash
59
- git clone https://github.com/mumuki/mumuki-bibliotheca-api bibliotheca-api
60
- cd bibliotheca-api
53
+ git clone https://github.com/mumuki/mumuki-bibliotheca-api
54
+ cd mumuki-bibliotheca-api
55
+ ```
56
+
57
+ ### 5. Install and setup database
58
+
59
+ > We need to create a PostgreSQL role - AKA a user - who will be used by Laboratory to create and access the database
60
+
61
+ ```bash
62
+ # create db user for linux users
63
+ sudo -u postgres psql <<EOF
64
+ create role mumuki with createdb login password 'mumuki';
65
+ EOF
66
+
67
+ # create db user for mac users
68
+ psql postgres
69
+ #once inside postgres server
70
+ create role mumuki with createdb login password 'mumuki';
71
+
72
+ # create schema and initial development data
73
+ ./devinit
61
74
  ```
62
75
 
63
76
  ## Installing and Running
@@ -1,7 +1,7 @@
1
1
  module Mumuki
2
2
  module Bibliotheca
3
3
  class Engine < ::Rails::Engine
4
- endpoint Sinatra::Application.new
4
+ endpoint Mumuki::Bibliotheca::App
5
5
  config.generators.api_only = true
6
6
  end
7
7
  end
@@ -1,29 +1,31 @@
1
- helpers do
2
- def list_books(books)
3
- { books: books.as_json(only: [:name, :slug, :chapters]) }
1
+ class Mumuki::Bibliotheca::App < Sinatra::Application
2
+ helpers do
3
+ def list_books(books)
4
+ { books: books.as_json(only: [:name, :slug, :chapters]) }
5
+ end
4
6
  end
5
- end
6
7
 
7
- get '/books' do
8
- list_books Book.all
9
- end
8
+ get '/books' do
9
+ list_books Book.all
10
+ end
10
11
 
11
- get '/books/writable' do
12
- list_books Book.allowed(current_user.permissions)
13
- end
12
+ get '/books/writable' do
13
+ list_books Book.allowed(current_user.permissions)
14
+ end
14
15
 
15
- get '/books/:organization/:repository' do
16
- Book.find_by_slug!(slug.to_s).to_resource_h
17
- end
16
+ get '/books/:organization/:repository' do
17
+ Book.find_by_slug!(slug.to_s).to_resource_h
18
+ end
18
19
 
19
- post '/books' do
20
- upsert! :book
21
- end
20
+ post '/books' do
21
+ upsert! :book
22
+ end
22
23
 
23
- post '/book/:organization/:repository/fork' do
24
- fork! Book
25
- end
24
+ post '/book/:organization/:repository/fork' do
25
+ fork! Book
26
+ end
26
27
 
27
- delete '/books/:organization/:repository' do
28
- delete! Book
28
+ delete '/books/:organization/:repository' do
29
+ delete! Book
30
+ end
29
31
  end
@@ -1,45 +1,47 @@
1
- helpers do
2
- def list_guides(guides)
3
- { guides: guides.map { |it| it.as_json(only: [:name, :slug, :type]).merge(language: it.language.name) } }
1
+ class Mumuki::Bibliotheca::App < Sinatra::Application
2
+ helpers do
3
+ def list_guides(guides)
4
+ { guides: guides.map { |it| it.as_json(only: [:name, :slug, :type]).merge(language: it.language.name) } }
5
+ end
6
+
7
+ def slice_guide_resource_h_for_api(guide)
8
+ guide.merge(language: guide.dig(:language, :name)).merge(exercises: guide[:exercises].map { |it| it.tap { |it| it[:language] = it.dig(:language, :name) if it[:language]}})
9
+ end
4
10
  end
5
11
 
6
- def slice_guide_resource_h_for_api(guide)
7
- guide.merge(language: guide.dig(:language, :name)).merge(exercises: guide[:exercises].map { |it| it.tap { |it| it[:language] = it.dig(:language, :name) if it[:language]}})
12
+ get '/guides' do
13
+ list_guides Guide.visible(current_user&.permissions)
8
14
  end
9
- end
10
-
11
- get '/guides' do
12
- list_guides Guide.visible(current_user&.permissions)
13
- end
14
15
 
15
- get '/guides/writable' do
16
- list_guides Guide.allowed(current_user&.permissions)
17
- end
16
+ get '/guides/writable' do
17
+ list_guides Guide.allowed(current_user&.permissions)
18
+ end
18
19
 
19
- delete '/guides/:organization/:repository' do
20
- delete! Guide
21
- end
20
+ delete '/guides/:organization/:repository' do
21
+ delete! Guide
22
+ end
22
23
 
23
- get '/guides/:organization/:repository/markdown' do
24
- slice_guide_resource_h_for_api Guide.find_by_slug!(slug.to_s).to_markdownified_resource_h
25
- end
24
+ get '/guides/:organization/:repository/markdown' do
25
+ slice_guide_resource_h_for_api Guide.find_by_slug!(slug.to_s).to_markdownified_resource_h
26
+ end
26
27
 
27
- get '/guides/:organization/:repository' do
28
- slice_guide_resource_h_for_api Guide.find_by_slug!(slug.to_s).to_resource_h
29
- end
28
+ get '/guides/:organization/:repository' do
29
+ slice_guide_resource_h_for_api Guide.find_by_slug!(slug.to_s).to_resource_h
30
+ end
30
31
 
31
- post '/guides' do
32
- upsert! :guide
33
- end
32
+ post '/guides' do
33
+ upsert! :guide
34
+ end
34
35
 
35
- post '/guides/import/:organization/:repository' do
36
- history_syncer.locate_and_import! :guide, slug.to_s
37
- end
36
+ post '/guides/import/:organization/:repository' do
37
+ history_syncer.locate_and_import! :guide, slug.to_s
38
+ end
38
39
 
39
- post '/guides/:organization/:repository/assets' do
40
- Mumuki::Bibliotheca.upload_asset! slug, json_body['filename'], json_body['content']
41
- end
40
+ post '/guides/:organization/:repository/assets' do
41
+ Mumuki::Bibliotheca.upload_asset! slug, json_body['filename'], json_body['content']
42
+ end
42
43
 
43
- post '/guides/:organization/:repository/fork' do
44
- fork! Guide
44
+ post '/guides/:organization/:repository/fork' do
45
+ fork! Guide
46
+ end
45
47
  end
@@ -1,9 +1,11 @@
1
- get '/languages' do
2
- { languages: Language.all.map { |it| transform(it) } }
3
- end
1
+ class Mumuki::Bibliotheca::App < Sinatra::Application
2
+ get '/languages' do
3
+ { languages: Language.all.map { |it| transform(it) } }
4
+ end
4
5
 
5
- def transform(language)
6
- language
7
- .to_resource_h
8
- .replace_key!(:runner_url, :test_runner_url)
6
+ def transform(language)
7
+ language
8
+ .to_resource_h
9
+ .replace_key!(:runner_url, :test_runner_url)
10
+ end
9
11
  end
@@ -1,3 +1,5 @@
1
- get '/organization' do
2
- Organization.base.to_resource_h
1
+ class Mumuki::Bibliotheca::App < Sinatra::Application
2
+ get '/organization' do
3
+ Organization.base.to_resource_h
4
+ end
3
5
  end
@@ -1,29 +1,31 @@
1
- helpers do
2
- def list_topics(topics)
3
- { topics: topics.as_json(only: [:name, :slug]) }
1
+ class Mumuki::Bibliotheca::App < Sinatra::Application
2
+ helpers do
3
+ def list_topics(topics)
4
+ { topics: topics.as_json(only: [:name, :slug]) }
5
+ end
4
6
  end
5
- end
6
7
 
7
- get '/topics' do
8
- list_topics Topic.all
9
- end
8
+ get '/topics' do
9
+ list_topics Topic.all
10
+ end
10
11
 
11
- get '/topics/writable' do
12
- list_topics Topic.allowed(current_user.permissions)
13
- end
12
+ get '/topics/writable' do
13
+ list_topics Topic.allowed(current_user.permissions)
14
+ end
14
15
 
15
- get '/topics/:organization/:repository' do
16
- Topic.find_by_slug!(slug.to_s).to_resource_h
17
- end
16
+ get '/topics/:organization/:repository' do
17
+ Topic.find_by_slug!(slug.to_s).to_resource_h
18
+ end
18
19
 
19
- post '/topics' do
20
- upsert! :topic
21
- end
20
+ post '/topics' do
21
+ upsert! :topic
22
+ end
22
23
 
23
- post '/book/:organization/:repository/fork' do
24
- fork! Topic
25
- end
24
+ post '/book/:organization/:repository/fork' do
25
+ fork! Topic
26
+ end
26
27
 
27
- delete '/topics/:organization/:repository' do
28
- delete! Topic
28
+ delete '/topics/:organization/:repository' do
29
+ delete! Topic
30
+ end
29
31
  end
@@ -1,4 +1,4 @@
1
- require 'sinatra'
1
+ require 'sinatra/base'
2
2
  require 'mumukit/content_type'
3
3
 
4
4
  require 'sinatra/cross_origin'
@@ -8,167 +8,168 @@ require 'mumukit/auth'
8
8
  require 'json'
9
9
  require 'yaml'
10
10
 
11
- configure do
12
- enable :cross_origin
13
- set :allow_methods, [:get, :put, :post, :options, :delete]
14
- set :show_exceptions, false
11
+ class Mumuki::Bibliotheca::App < Sinatra::Application
12
+ configure do
13
+ enable :cross_origin
14
+ set :allow_methods, [:get, :put, :post, :options, :delete]
15
+ set :show_exceptions, false
15
16
 
16
- set :app_name, 'bibliotheca'
17
- set :static, true
18
- set :public_folder, 'public'
17
+ set :app_name, 'bibliotheca'
18
+ set :static, true
19
+ set :public_folder, 'public'
19
20
 
20
- use ::Rack::CommonLogger, Rails.logger
21
- end
22
-
23
- helpers do
24
- def json_body
25
- @json_body ||= JSON.parse(request.body.read) rescue nil
21
+ use ::Rack::CommonLogger, Rails.logger
26
22
  end
27
23
 
28
- def slug
29
- if route_slug_parts.present?
30
- Mumukit::Auth::Slug.join(*route_slug_parts)
31
- elsif subject
32
- Mumukit::Auth::Slug.parse(subject.slug)
33
- elsif json_body
34
- Mumukit::Auth::Slug.parse(json_body['slug'])
35
- else
36
- raise Mumukit::Auth::InvalidSlugFormatError.new('Slug not available')
24
+ helpers do
25
+ def json_body
26
+ @json_body ||= JSON.parse(request.body.read) rescue nil
37
27
  end
38
- end
39
28
 
40
- def route_slug_parts
41
- []
29
+ def slug
30
+ if route_slug_parts.present?
31
+ Mumukit::Auth::Slug.join(*route_slug_parts)
32
+ elsif subject
33
+ Mumukit::Auth::Slug.parse(subject.slug)
34
+ elsif json_body
35
+ Mumukit::Auth::Slug.parse(json_body['slug'])
36
+ else
37
+ raise Mumukit::Auth::InvalidSlugFormatError.new('Slug not available')
38
+ end
39
+ end
40
+
41
+ def route_slug_parts
42
+ []
43
+ end
42
44
  end
43
- end
44
45
 
45
- before do
46
- content_type 'application/json', 'charset' => 'utf-8'
47
- end
46
+ before do
47
+ content_type 'application/json', 'charset' => 'utf-8'
48
+ end
48
49
 
49
- after do
50
- error_message = env['sinatra.error']
51
- if response.body.is_a?(Array)&& response.body[0].is_a?(String)
52
- if content_type != 'application/csv'
53
- content_type 'text/html'
54
- response.body[0] = <<HTML
50
+ after do
51
+ error_message = env['sinatra.error']
52
+ if response.body.is_a?(Array)&& response.body[0].is_a?(String)
53
+ if content_type != 'application/csv'
54
+ content_type 'text/html'
55
+ response.body[0] = <<HTML
55
56
  <html>
56
57
  <body>
57
58
  #{response.body[0]}
58
59
  </body>
59
60
  </html>
60
61
  HTML
62
+ end
63
+ response.body = response.body[0]
64
+ elsif error_message.blank?
65
+ response.body = response.body.to_json
66
+ else
67
+ response.body = {message: env['sinatra.error'].message}.to_json
61
68
  end
62
- response.body = response.body[0]
63
- elsif error_message.blank?
64
- response.body = response.body.to_json
65
- else
66
- response.body = {message: env['sinatra.error'].message}.to_json
67
69
  end
68
- end
69
-
70
- error JSON::ParserError do
71
- halt 400
72
- end
73
70
 
74
- error Mumukit::Auth::InvalidTokenError do
75
- halt 401
76
- end
77
-
78
- error Mumukit::Auth::UnauthorizedAccessError do
79
- halt 403
80
- end
81
-
82
- error ActiveRecord::RecordInvalid do
83
- halt 400
84
- end
85
-
86
- error Mumukit::Auth::InvalidSlugFormatError do
87
- halt 400
88
- end
89
-
90
- error ActiveRecord::RecordNotFound do
91
- halt 404
92
- end
93
-
94
- options '*' do
95
- response.headers['Allow'] = settings.allow_methods.map { |it| it.to_s.upcase }.join(',')
96
- response.headers['Access-Control-Allow-Headers'] = 'X-Mumuki-Auth-Token, X-Requested-With, X-HTTP-Method-Override, Content-Type, Cache-Control, Accept, Authorization'
97
- 200
98
- end
99
-
100
- helpers do
101
- Mumukit::Login.configure_controller! self
102
- end
103
-
104
- before do
105
- I18n.locale = 'en' #TODO: Remove hardcoded locale
106
- end
71
+ error JSON::ParserError do
72
+ halt 400
73
+ end
107
74
 
108
- helpers do
109
- def authenticate!
110
- halt 401 unless current_user?
75
+ error Mumukit::Auth::InvalidTokenError do
76
+ halt 401
111
77
  end
112
78
 
113
- def authorization_slug
114
- slug
79
+ error Mumukit::Auth::UnauthorizedAccessError do
80
+ halt 403
115
81
  end
116
82
 
117
- def subject
118
- Guide.find_by_id(params[:id])
83
+ error ActiveRecord::RecordInvalid do
84
+ halt 400
119
85
  end
120
86
 
121
- def route_slug_parts
122
- [params[:organization], params[:repository]].compact
87
+ error Mumukit::Auth::InvalidSlugFormatError do
88
+ halt 400
123
89
  end
124
90
 
125
- def history_syncer
126
- Mumuki::Bibliotheca.history_syncer(current_user)
91
+ error ActiveRecord::RecordNotFound do
92
+ halt 404
127
93
  end
128
94
 
129
- def api_syncer
130
- Mumuki::Bibliotheca.api_syncer(json_body)
95
+ options '*' do
96
+ response.headers['Allow'] = settings.allow_methods.map { |it| it.to_s.upcase }.join(',')
97
+ response.headers['Access-Control-Allow-Headers'] = 'X-Mumuki-Auth-Token, X-Requested-With, X-HTTP-Method-Override, Content-Type, Cache-Control, Accept, Authorization'
98
+ 200
131
99
  end
132
100
 
133
- def upsert!(content_kind)
134
- authorize! :writer
135
- content = api_syncer.locate_and_import! content_kind, slug.to_s
136
- history_syncer.export! content
137
- content.to_resource_h
101
+ helpers do
102
+ Mumukit::Login.configure_controller! self
138
103
  end
139
104
 
140
- def fork!(collection_class)
141
- authorize! :writer
142
- destination = json_body['organization']
143
- collection_class.find_by_slug!(slug.to_s).fork_to!(destination, history_syncer).as_json
105
+ before do
106
+ I18n.locale = 'en' #TODO: Remove hardcoded locale
144
107
  end
145
108
 
146
- def delete!(collection_class)
147
- authorize! :editor
148
- collection_class.find_by_slug!(slug.to_s).destroy!
149
- {}
109
+ helpers do
110
+ def authenticate!
111
+ halt 401 unless current_user?
112
+ end
113
+
114
+ def authorization_slug
115
+ slug
116
+ end
117
+
118
+ def subject
119
+ Guide.find_by_id(params[:id])
120
+ end
121
+
122
+ def route_slug_parts
123
+ [params[:organization], params[:repository]].compact
124
+ end
125
+
126
+ def history_syncer
127
+ Mumuki::Bibliotheca.history_syncer(current_user)
128
+ end
129
+
130
+ def api_syncer
131
+ Mumuki::Bibliotheca.api_syncer(json_body)
132
+ end
133
+
134
+ def upsert!(content_kind)
135
+ authorize! :writer
136
+ content = api_syncer.locate_and_import! content_kind, slug.to_s
137
+ history_syncer.export! content
138
+ content.to_resource_h
139
+ end
140
+
141
+ def fork!(collection_class)
142
+ authorize! :writer
143
+ destination = json_body['organization']
144
+ collection_class.find_by_slug!(slug.to_s).fork_to!(destination, history_syncer).as_json
145
+ end
146
+
147
+ def delete!(collection_class)
148
+ authorize! :editor
149
+ collection_class.find_by_slug!(slug.to_s).destroy!
150
+ {}
151
+ end
150
152
  end
151
- end
152
153
 
153
- post '/markdown' do
154
- {markdown: Mumukit::ContentType::Markdown.to_html(json_body['markdown'])}
155
- end
154
+ post '/markdown' do
155
+ {markdown: Mumukit::ContentType::Markdown.to_html(json_body['markdown'])}
156
+ end
156
157
 
157
- post '/markdowns' do
158
- json_body.with_indifferent_access.tap do |guide|
159
- guide[:exercises].each do |exercise|
160
- exercise[:description] = Mumukit::ContentType::Markdown.to_html(exercise[:description])
158
+ post '/markdowns' do
159
+ json_body.with_indifferent_access.tap do |guide|
160
+ guide[:exercises].each do |exercise|
161
+ exercise[:description] = Mumukit::ContentType::Markdown.to_html(exercise[:description])
162
+ end
161
163
  end
162
164
  end
163
- end
164
165
 
165
- get '/permissions' do
166
- authenticate!
166
+ get '/permissions' do
167
+ authenticate!
167
168
 
168
- {permissions: current_user.permissions}
169
+ {permissions: current_user.permissions}
170
+ end
169
171
  end
170
172
 
171
-
172
173
  require_relative './sinatra/organization'
173
174
  require_relative './sinatra/languages'
174
175
  require_relative './sinatra/guides'
@@ -1,5 +1,5 @@
1
1
  module Mumuki
2
2
  module Bibliotheca
3
- VERSION = '6.1.1'
3
+ VERSION = '6.2.0'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mumuki-bibliotheca
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.1.1
4
+ version: 6.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Franco Bulgarelli
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-11-28 00:00:00.000000000 Z
11
+ date: 2018-12-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -24,20 +24,34 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 5.1.6
27
+ - !ruby/object:Gem::Dependency
28
+ name: sinatra
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: sinatra-contrib
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
- - - ">="
45
+ - - "~>"
32
46
  - !ruby/object:Gem::Version
33
- version: '0'
47
+ version: '2.0'
34
48
  type: :runtime
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
- - - ">="
52
+ - - "~>"
39
53
  - !ruby/object:Gem::Version
40
- version: '0'
54
+ version: '2.0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: sinatra-cross_origin
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -58,14 +72,14 @@ dependencies:
58
72
  requirements:
59
73
  - - "~>"
60
74
  - !ruby/object:Gem::Version
61
- version: 6.1.0
75
+ version: 6.2.0
62
76
  type: :runtime
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
80
  - - "~>"
67
81
  - !ruby/object:Gem::Version
68
- version: 6.1.0
82
+ version: 6.2.0
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: mumukit-login
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -179,8 +193,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
179
193
  - !ruby/object:Gem::Version
180
194
  version: '0'
181
195
  requirements: []
182
- rubyforge_project:
183
- rubygems_version: 2.7.8
196
+ rubygems_version: 3.0.0
184
197
  signing_key:
185
198
  specification_version: 4
186
199
  summary: API for editing content on mumuki