yanapiri 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 250ac7618be318da8f0fcb91f4e59a5498837a10
4
+ data.tar.gz: d7dbe0528eaddf91a39581d9bcd015b570286c44
5
+ SHA512:
6
+ metadata.gz: 11f3bfb7276987ee0d90304ed2b022c587c9fd6b0c666ce520de4480e13fd9036a778cc02d2f9d7749903c0bc84b12257182757083fb2621595c32016cef5c90
7
+ data.tar.gz: d46ac724a68a62169385640dcc65b1833d56ec043a0c3d1e6ede99567f405547abc310064a1eb806d603a3b93e1ad214ce0d28f4388dc0bda5aaafc0e370927e
data/.gitignore ADDED
@@ -0,0 +1,41 @@
1
+ #### joe made this: http://goel.io/joe
2
+
3
+ #### ruby ####
4
+ *.gem
5
+ *.rbc
6
+ /.config
7
+ /coverage/
8
+ /InstalledFiles
9
+ /pkg/
10
+ /spec/reports/
11
+ /spec/examples.txt
12
+ /test/tmp/
13
+ /test/version_tmp/
14
+ /tmp/
15
+
16
+ ## Specific to RubyMotion:
17
+ .dat*
18
+ .repl_history
19
+ build/
20
+ *.bridgesupport
21
+ build-iPhoneOS/
22
+ build-iPhoneSimulator/
23
+
24
+ ## Documentation cache and generated files:
25
+ /.yardoc/
26
+ /_yardoc/
27
+ /doc/
28
+ /rdoc/
29
+
30
+ ## Environment normalization:
31
+ /.bundle/
32
+ /vendor/bundle
33
+ /lib/bundler/man/
34
+
35
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
36
+ .rvmrc
37
+
38
+ .rspec_status
39
+
40
+ #### jetbrains ####
41
+ .idea
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.3.1
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ sudo: false
3
+ language: ruby
4
+ cache: bundler
5
+ rvm:
6
+ - 2.3.1
7
+ before_install: gem install bundler -v 2.0.1
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,64 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ yanapiri (0.1.0)
5
+ activesupport (~> 4.2)
6
+ git (~> 1.5)
7
+ octokit (~> 4.0)
8
+ thor (~> 0.20)
9
+
10
+ GEM
11
+ remote: https://rubygems.org/
12
+ specs:
13
+ activesupport (4.2.10)
14
+ i18n (~> 0.7)
15
+ minitest (~> 5.1)
16
+ thread_safe (~> 0.3, >= 0.3.4)
17
+ tzinfo (~> 1.1)
18
+ addressable (2.5.2)
19
+ public_suffix (>= 2.0.2, < 4.0)
20
+ concurrent-ruby (1.1.5)
21
+ diff-lcs (1.3)
22
+ faraday (0.15.4)
23
+ multipart-post (>= 1.2, < 3)
24
+ git (1.5.0)
25
+ i18n (0.9.5)
26
+ concurrent-ruby (~> 1.0)
27
+ minitest (5.11.3)
28
+ multipart-post (2.0.0)
29
+ octokit (4.14.0)
30
+ sawyer (~> 0.8.0, >= 0.5.3)
31
+ public_suffix (3.0.3)
32
+ rake (10.5.0)
33
+ rspec (3.8.0)
34
+ rspec-core (~> 3.8.0)
35
+ rspec-expectations (~> 3.8.0)
36
+ rspec-mocks (~> 3.8.0)
37
+ rspec-core (3.8.0)
38
+ rspec-support (~> 3.8.0)
39
+ rspec-expectations (3.8.3)
40
+ diff-lcs (>= 1.2.0, < 2.0)
41
+ rspec-support (~> 3.8.0)
42
+ rspec-mocks (3.8.0)
43
+ diff-lcs (>= 1.2.0, < 2.0)
44
+ rspec-support (~> 3.8.0)
45
+ rspec-support (3.8.0)
46
+ sawyer (0.8.1)
47
+ addressable (>= 2.3.5, < 2.6)
48
+ faraday (~> 0.8, < 1.0)
49
+ thor (0.20.3)
50
+ thread_safe (0.3.6)
51
+ tzinfo (1.2.5)
52
+ thread_safe (~> 0.1)
53
+
54
+ PLATFORMS
55
+ ruby
56
+
57
+ DEPENDENCIES
58
+ bundler (~> 2.0)
59
+ rake (~> 10.0)
60
+ rspec (~> 3.0)
61
+ yanapiri!
62
+
63
+ BUNDLED WITH
64
+ 2.0.1
data/Guardfile ADDED
@@ -0,0 +1,5 @@
1
+ notification :off
2
+
3
+ guard 'rake', :task => 'install' do
4
+ watch(%r{^lib/(.+)\.rb})
5
+ end
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2019 Federico Aloi
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,52 @@
1
+ # Yanapiri
2
+
3
+ ## Instalación
4
+
5
+ Yanapiri funciona con Ruby, por lo cual es necesario instalarlo antes. Podés consultar cómo hacerlo en [la documentación oficial](https://www.ruby-lang.org/es/documentation/installation/).
6
+
7
+ Una vez que tu entorno Ruby esté funcionando, ejecutá lo siguiente:
8
+
9
+ ```
10
+ gem install yanapiri
11
+ ```
12
+
13
+ ## Uso
14
+
15
+ Lo primero que tenés que hacer es ejecutar `yanapiri setup`, lo cual te va a preguntar con qué organización querés trabajar por defecto y te va a pedir un access token de un usuario que pueda pushear a esa organización.
16
+
17
+ Luego podrás ejecutar cualquiera de los demás comandos. Podés ver una lista ejecutando `yanapiri help`.
18
+ Un flujo de trabajo típico sería el siguiente:
19
+
20
+ ```
21
+ yanapiri clonar entrega-1
22
+ yanapiri corregir entrega-1 --commit-base 326336a8ba771611 --fecha-limite "2019-05-01 23:59:59"
23
+ ```
24
+
25
+ ### Trabajando con más de una organización
26
+
27
+ Yanapiri soporta tres formas de configurar la organización:
28
+ * global, que se configura con `yanapiri setup`;
29
+ * local, que se configura con `yanapiri init`;
30
+ * por parámetro, que se configura con la opción `--orga`.
31
+
32
+ Para los casos en que se necesite trabajar regularmente con más de una organización (por ejemplo, si tenés varios cursos) conviene utilizar la configuración local.
33
+
34
+ Un ejemplo de estructura de directorios podría ser el siguiente:
35
+
36
+ ```
37
+ entregas
38
+ ├── une-objetos1
39
+ └── unlu-intro
40
+ ```
41
+
42
+ Para escribir la configuración local, habría que ejecutar `yanapiri init` en cada uno de los subdirectorios.
43
+
44
+ ## Development
45
+
46
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
47
+
48
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
49
+
50
+ ## Contributing
51
+
52
+ Bug reports and pull requests are welcome on GitHub at https://github.com/faloi/yanapiri.
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "yanapiri"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/bin/yanapiri ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "yanapiri"
4
+
5
+ Yanapiri::CLI.start(ARGV)
@@ -0,0 +1,67 @@
1
+ class Bot
2
+ attr_reader :organization
3
+
4
+ def initialize(organization, gh_token)
5
+ @organization = organization
6
+ @gh_client = Octokit::Client.new(access_token: gh_token)
7
+ end
8
+
9
+ def clonar_entrega!(nombre)
10
+ result = @gh_client.search_repositories "org:#{@organization} #{nombre} in:name", {per_page: 200}
11
+ puts "Encontrados #{result.total_count} repositorios."
12
+ FileUtils.mkdir_p nombre
13
+ Dir.chdir(nombre) do
14
+ result.items.each do |repo|
15
+ puts "Clonando #{repo.name}..."
16
+ Git.clone repo.ssh_url, repo.name
17
+ end
18
+ end
19
+ end
20
+
21
+ def preparar_correccion!(entrega, commit_base)
22
+ entrega.crear_branch! 'base', commit_base
23
+ entrega.crear_branch! 'entrega', 'master'
24
+ renombrar_proyecto_wollok! entrega
25
+ publicar_cambios! entrega
26
+ crear_pull_request! entrega
27
+ end
28
+
29
+ def nombre
30
+ 'Yanapiri Bot'
31
+ end
32
+
33
+ def email
34
+ 'bot@yanapiri.org'
35
+ end
36
+
37
+ def git_author
38
+ "#{nombre} <#{email}>"
39
+ end
40
+
41
+ def github_user
42
+ @gh_client.user
43
+ end
44
+
45
+ private
46
+
47
+ def crear_pull_request!(entrega)
48
+ @gh_client.create_pull_request("#{@organization}/#{entrega.id}", "base", "entrega", "Corrección", entrega.mensaje_pull_request) rescue nil
49
+ end
50
+
51
+ def renombrar_proyecto_wollok!(entrega)
52
+ entrega.repo.chdir do
53
+ xml = File.read proyecto_wollok
54
+ File.open(proyecto_wollok, "w") {|file| file.puts xml.sub(/<name>.*<\/name>/, "<name>#{entrega.id}</name>") }
55
+ end
56
+
57
+ entrega.repo.commit_all 'Renombrado proyecto Wollok', author: git_author
58
+ end
59
+
60
+ def publicar_cambios!(entrega)
61
+ entrega.repo.push 'origin', '--all'
62
+ end
63
+
64
+ def proyecto_wollok
65
+ '.project'
66
+ end
67
+ end
@@ -0,0 +1,51 @@
1
+ class Entrega
2
+ attr_reader :id, :fecha_limite, :repo
3
+
4
+ def initialize(base_path, id, fecha_limite = Time.now)
5
+ @base_path = base_path
6
+ @id = id
7
+ @fecha_limite = fecha_limite
8
+ @repo = Git.open "#{@base_path}/#{@id}"
9
+ end
10
+
11
+ def crear_pull_request!(bot)
12
+ bot.crear_pull_request!(@id, mensaje_pull_request)
13
+ end
14
+
15
+ def fuera_de_termino?
16
+ @repo.checkout 'master'
17
+ @repo.log.since(@fecha_limite.iso8601).any?
18
+ end
19
+
20
+ def autor
21
+ @id.split('-').last
22
+ end
23
+
24
+ def fecha
25
+ @repo.checkout 'master'
26
+ @repo.log.first.author_date
27
+ end
28
+
29
+ def mensaje_pull_request
30
+ if fuera_de_termino?
31
+ "**Ojo:** tu último commit fue el #{formato_humano fecha}, pero la fecha límite era el #{formato_humano fecha_limite}.\n\n¡Tenés que respetar la fecha de entrega establecida! :point_up:"
32
+ else
33
+ ''
34
+ end
35
+ end
36
+
37
+ def mensaje_ultimo_commit
38
+ "#{autor} hizo su último commit el #{fecha}." + (fuera_de_termino? ? " Fuera de término." : "")
39
+ end
40
+
41
+ def crear_branch!(nombre, head)
42
+ @repo.checkout head
43
+ @repo.branch(nombre).checkout
44
+ end
45
+
46
+ private
47
+
48
+ def formato_humano(fecha)
49
+ fecha.strftime("%d/%m/%Y a las %H:%M")
50
+ end
51
+ end
@@ -0,0 +1,3 @@
1
+ module Yanapiri
2
+ VERSION = "0.1.0"
3
+ end
data/lib/yanapiri.rb ADDED
@@ -0,0 +1,169 @@
1
+ require 'octokit'
2
+ require 'git'
3
+ require 'thor'
4
+ require 'yaml'
5
+ require 'ostruct'
6
+ require 'active_support/all'
7
+
8
+ require_relative './yanapiri/version'
9
+ require_relative './yanapiri/entrega'
10
+ require_relative './yanapiri/bot'
11
+
12
+ module Yanapiri
13
+ class CLI < Thor
14
+ include Thor::Actions
15
+ class_option :verbose, {type: :boolean, aliases: :v}
16
+ class_option :orga, {aliases: :o}
17
+ class_option :github_token
18
+
19
+ def initialize(args = [], local_options = {}, config = {})
20
+ super(args, local_options, config)
21
+ @bot = Bot.new(options.orga, options.github_token)
22
+ end
23
+
24
+ def self.exit_on_failure?
25
+ true
26
+ end
27
+
28
+ desc 'setup', 'Configura a Yanapiri para el primer uso'
29
+ def setup
30
+ say '¡Kamisaraki! Yo soy Yanapiri, tu ayudante, y necesito algunos datos antes de empezar:', :bold
31
+
32
+ config = OpenStruct.new
33
+ config.github_token = ask 'Token de GitHub (lo necesito para armar los pull requests):'
34
+ config.orga = ask 'Organización por defecto:'
35
+
36
+ begin
37
+ bot = Bot.new(config.orga, config.github_token)
38
+ success "Los pull requests serán creados por @#{bot.github_user.login}, asegurate de que tenga los permisos necesarios en las organizaciones que uses."
39
+ dump_global_config! config
40
+ rescue Octokit::Unauthorized
41
+ raise 'El access token de GitHub no es correcto, revisalo por favor.'
42
+ end
43
+ end
44
+
45
+ desc 'init', 'Inicializa una carpeta para contener entregas'
46
+ def init
47
+ config = OpenStruct.new
48
+ config.orga = ask 'Nombre de la organización:', default: File.basename(Dir.pwd)
49
+ success "De ahora en más, trabajaré con la organización #{config.orga} siempre que estés dentro de esta carpeta."
50
+ dump_local_config! config
51
+ end
52
+
53
+ desc 'whoami', 'Muestra organización y usuario con el que se está trabajando'
54
+ def whoami
55
+ say "Estoy trabajando en la organización #{@bot.organization}, commiteando con el usuario #{@bot.git_author}."
56
+ end
57
+
58
+ desc 'clonar [ENTREGA]', 'Clona todos los repositorios de la entrega dentro de una subcarpeta'
59
+ def clonar(nombre)
60
+ @bot.clonar_entrega!(nombre)
61
+ end
62
+
63
+ option :repo_base, {required: true, aliases: :b}
64
+ desc 'actualizar [ENTREGA]', 'Actualiza cada repositorio con el contenido que haya en el repositorio base'
65
+ def actualizar(nombre)
66
+ path_repo_base = "#{nombre}-base"
67
+ `git clone git@github.com:#{options.repo_base}.git #{path_repo_base}`
68
+
69
+ foreach_repo(nombre) do
70
+ `git remote rm base`
71
+ `git remote add base ../../#{path_repo_base}`
72
+ `git pull base master`
73
+ `git push origin master`
74
+ end
75
+
76
+ `rm -rf #{path_repo_base}`
77
+ end
78
+
79
+ desc 'corregir [ENTREGA]', 'Prepara la entrega para la corrección, creando los archivos y el pull request'
80
+ option :commit_base, {required: true, aliases: :b}
81
+ option :fecha_limite, {default: Time.now.to_s, aliases: :l}
82
+ def corregir(nombre)
83
+ foreach_entrega(nombre) do |entrega|
84
+ @bot.preparar_correccion! entrega, options.commit_base
85
+ end
86
+ end
87
+
88
+ desc 'ultimo_commit [ENTREGA]', 'Muestra la fecha del último commit de cada repositorio e indica si se pasó de la fecha límite'
89
+ option :fecha_limite, {default: Time.now.to_s, aliases: :l}
90
+ option :solo_excedidos, {type: :boolean}
91
+ def ultimo_commit(nombre)
92
+ foreach_entrega(nombre) do |entrega|
93
+ if not options.solo_excedidos or entrega.fuera_de_termino?
94
+ say entrega.mensaje_ultimo_commit, entrega.fuera_de_termino? ? :red : :clear
95
+ end
96
+ end
97
+ end
98
+
99
+ no_commands do
100
+ def foreach_repo(dir_base)
101
+ Dir.chdir(dir_base) do
102
+ working_dir = Dir.pwd
103
+ repos = Dir.glob('*').select {|f| File.directory? f}.sort
104
+
105
+ for repo in repos
106
+ log "Trabajando con #{repo}..."
107
+ Dir.chdir "#{working_dir}/#{repo}" do
108
+ yield repo, working_dir
109
+ end
110
+ log "==============================\n"
111
+ end
112
+ end
113
+ end
114
+
115
+ def foreach_entrega(nombre)
116
+ foreach_repo(nombre) do |repo, base_path|
117
+ yield Entrega.new base_path, repo, Time.parse(options.fecha_limite)
118
+ end
119
+ end
120
+
121
+ def log(mensaje)
122
+ puts mensaje if options[:verbose]
123
+ end
124
+
125
+ def global_config_file
126
+ File.expand_path "~/#{config_file_name}"
127
+ end
128
+
129
+ def local_config_file
130
+ File.expand_path config_file_name
131
+ end
132
+
133
+ def config_file_name
134
+ '.yanapiri'
135
+ end
136
+
137
+ def dump_global_config!(config)
138
+ dump_config! global_config_file, config
139
+ end
140
+
141
+ def dump_local_config!(config)
142
+ dump_config! local_config_file, config
143
+ end
144
+
145
+ def dump_config!(destination, config)
146
+ File.write destination, config.to_h.stringify_keys.to_yaml
147
+ end
148
+
149
+ def load_config(source)
150
+ if File.exist? source then YAML.load_file source else {} end
151
+ end
152
+
153
+ def options
154
+ original_options = super
155
+ defaults_global = load_config global_config_file
156
+ defaults_local = load_config local_config_file
157
+ Thor::CoreExt::HashWithIndifferentAccess.new defaults_global.merge(defaults_local).merge(original_options)
158
+ end
159
+
160
+ def raise(message)
161
+ super Thor::Error, set_color(message, :red)
162
+ end
163
+
164
+ def success(message)
165
+ say "Yuspagara. #{message}", :green
166
+ end
167
+ end
168
+ end
169
+ end
data/yanapiri.gemspec ADDED
@@ -0,0 +1,32 @@
1
+
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "yanapiri/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "yanapiri"
8
+ spec.version = Yanapiri::VERSION
9
+ spec.authors = ["Federico Aloi"]
10
+ spec.email = ["federico.aloi@gmail.com"]
11
+
12
+ spec.summary = "Ayudante para administrar entregas via GitHub Classroom."
13
+ spec.homepage = "https://github.com/faloi/yanapiri"
14
+ spec.license = "MIT"
15
+
16
+ # Specify which files should be added to the gem when it is released.
17
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
18
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
19
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
20
+ end
21
+ spec.executables = ["yanapiri"]
22
+ spec.require_paths = ["lib"]
23
+
24
+ spec.add_dependency "thor", "~> 0.20"
25
+ spec.add_dependency "octokit", "~> 4.0"
26
+ spec.add_dependency "git", "~> 1.5"
27
+ spec.add_dependency "activesupport", "~> 4.2"
28
+
29
+ spec.add_development_dependency "bundler", "~> 2.0"
30
+ spec.add_development_dependency "rake", "~> 10.0"
31
+ spec.add_development_dependency "rspec", "~> 3.0"
32
+ end
metadata ADDED
@@ -0,0 +1,161 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: yanapiri
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Federico Aloi
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-05-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: thor
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.20'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.20'
27
+ - !ruby/object:Gem::Dependency
28
+ name: octokit
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '4.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '4.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: git
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.5'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.5'
55
+ - !ruby/object:Gem::Dependency
56
+ name: activesupport
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '4.2'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '4.2'
69
+ - !ruby/object:Gem::Dependency
70
+ name: bundler
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '2.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '2.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rake
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '10.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '10.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rspec
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '3.0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '3.0'
111
+ description:
112
+ email:
113
+ - federico.aloi@gmail.com
114
+ executables:
115
+ - yanapiri
116
+ extensions: []
117
+ extra_rdoc_files: []
118
+ files:
119
+ - ".gitignore"
120
+ - ".rspec"
121
+ - ".ruby-version"
122
+ - ".travis.yml"
123
+ - Gemfile
124
+ - Gemfile.lock
125
+ - Guardfile
126
+ - LICENSE
127
+ - README.md
128
+ - Rakefile
129
+ - bin/console
130
+ - bin/setup
131
+ - bin/yanapiri
132
+ - lib/yanapiri.rb
133
+ - lib/yanapiri/bot.rb
134
+ - lib/yanapiri/entrega.rb
135
+ - lib/yanapiri/version.rb
136
+ - yanapiri.gemspec
137
+ homepage: https://github.com/faloi/yanapiri
138
+ licenses:
139
+ - MIT
140
+ metadata: {}
141
+ post_install_message:
142
+ rdoc_options: []
143
+ require_paths:
144
+ - lib
145
+ required_ruby_version: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - ">="
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ required_rubygems_version: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - ">="
153
+ - !ruby/object:Gem::Version
154
+ version: '0'
155
+ requirements: []
156
+ rubyforge_project:
157
+ rubygems_version: 2.5.1
158
+ signing_key:
159
+ specification_version: 4
160
+ summary: Ayudante para administrar entregas via GitHub Classroom.
161
+ test_files: []