gennaro 0.1

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 89687f2500425a38190395abd9602bcf0324b4fe
4
+ data.tar.gz: 54564b681863d3e03ea7c3e92cbfebd4d9c6390a
5
+ SHA512:
6
+ metadata.gz: cf3b67e0fffd70396e4c32995c477f238dad15a20e51597bdb2b0be4ca5cde400adc5399c1490f29a7456d7a792fcbf89d6722e3eab5a336a864ba4018efc560
7
+ data.tar.gz: f9353363fe4b3cefd5986cb696206a1ed8d2c723d27548000df04441ef267d72b22ba80064c8a2a836ee4e22c28fe6d35cb3275c1b4416fef387e782fc3ce8be
@@ -0,0 +1,61 @@
1
+ #! /usr/bin/env ruby
2
+ #--
3
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
4
+ # Version 2, December 2004
5
+ #
6
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
7
+ # TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
8
+ #
9
+ # 0. You just DO WHAT THE FUCK YOU WANT TO.
10
+ #++
11
+
12
+ require 'optparse'
13
+ require 'gennaro'
14
+
15
+ options = {
16
+ :classname => 'App',
17
+ :path => Dir.pwd,
18
+ :force => false,
19
+ :template_path => File.expand_path('../../templates', __FILE__)
20
+ }
21
+
22
+ opt = OptionParser.new { |o|
23
+ o.on '-c', '--classname CLASSNAME', 'main class name' do |classname|
24
+ options[:classname] = classname
25
+ end
26
+
27
+ o.on '-p', '--path PATH', 'installation path' do |path|
28
+ options[:path] = File.expand_path path
29
+ end
30
+
31
+ o.on '-f', '--force', 'eventually overwrite target app folder' do
32
+ options[:force] = true
33
+ end
34
+
35
+ o.on '-l', '--list', 'get a list of available templates' do
36
+ abort Gennaro.get_templates(options[:template_path]).join ', '
37
+ end
38
+
39
+ o.on '-g', '--generate TEMPLATE', 'generate the given template' do |template|
40
+ options[:template] = template
41
+ end
42
+
43
+ o.on '-t', '--template-path PATH', 'use given template folder' do |path|
44
+ options[:template_path] = File.expand_path path
45
+ end
46
+ }
47
+
48
+ help = opt.to_s
49
+ opt.parse!
50
+
51
+ abort help unless options.include? :template
52
+
53
+ unless Gennaro.template_exists? options[:template_path], options[:template]
54
+ puts 'Template not found.'
55
+ else
56
+ template = File.join options[:template_path], options[:template]
57
+ gennaro = Gennaro.new template, options[:classname], options[:path], options[:force]
58
+ gennaro.generate!
59
+ gennaro.replace_tags!
60
+ puts "All done. Execute 'cd #{gennaro.path} && bundle install && rake test'"
61
+ end
@@ -0,0 +1,15 @@
1
+ #! /usr/bin/env ruby
2
+ #--
3
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
4
+ # Version 2, December 2004
5
+ #
6
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
7
+ # TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
8
+ #
9
+ # 0. You just DO WHAT THE FUCK YOU WANT TO.
10
+ #++
11
+
12
+ require 'fileutils'
13
+ require 'gennaro/file'
14
+ require 'gennaro/gennaro'
15
+ require 'gennaro/version'
@@ -0,0 +1,39 @@
1
+ #--
2
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
3
+ # Version 2, December 2004
4
+ #
5
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
6
+ # TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
7
+ #
8
+ # 0. You just DO WHAT THE FUCK YOU WANT TO.
9
+ #++
10
+
11
+ class Gennaro
12
+ protected
13
+ def mkdir(path)
14
+ Dir.mkdir path unless Dir.exists? path
15
+ end
16
+
17
+ protected
18
+ def copy(what, where)
19
+ FileUtils.copy_entry what, where
20
+ end
21
+
22
+ protected
23
+ def each_file(path, &block)
24
+ Dir.glob("#{path}/**/*").each { |f|
25
+ next if File.directory? f
26
+ yield f
27
+ }
28
+ end
29
+
30
+ protected
31
+ def rename(file, first, after)
32
+ new_file = file.gsub(first, after)
33
+ FileUtils.mv file, new_file if file != new_file
34
+ end
35
+
36
+ def delete_dir(path)
37
+ FileUtils.rm_r path if Dir.exists? path
38
+ end
39
+ end
@@ -0,0 +1,57 @@
1
+ #--
2
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
3
+ # Version 2, December 2004
4
+ #
5
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
6
+ # TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
7
+ #
8
+ # 0. You just DO WHAT THE FUCK YOU WANT TO.
9
+ #++
10
+
11
+ class Gennaro
12
+ attr_accessor :template, :classname, :appname, :path
13
+
14
+ def initialize(template, classname, path, force = false)
15
+ @template = template
16
+ @classname = classname
17
+ @appname = classname.downcase
18
+ @path = File.join path, @appname
19
+
20
+ delete_dir @path if force
21
+ raise ArgumentError, "#{@path} already exists." if Dir.exists? @path
22
+ raise ArgumentError, "#{@template} not found." unless Dir.exists? @template
23
+ end
24
+
25
+ def get_random_string(length = 8)
26
+ dict = (?a..?z).to_a + (?A..?Z).to_a + (0..9).to_a
27
+ (0..length).map { dict.sample}.join
28
+ end
29
+
30
+ def generate!
31
+ mkdir @path
32
+ copy @template, @path
33
+ end
34
+
35
+ def replace_tags!
36
+ each_file(@appname) { |f|
37
+ rename f, /_class_name_/, @appname
38
+ }
39
+
40
+ each_file(@appname) { |f|
41
+ s = File.read f
42
+ File.open(f, ?w) { |f|
43
+ s.gsub! '${ClassName}', @classname
44
+ s.gsub! '${GenerateString}', get_random_string(36)
45
+ f.write s
46
+ }
47
+ }
48
+ end
49
+
50
+ def self.get_templates(path)
51
+ Dir.glob("#{path}/*").map { |f| File.basename f}
52
+ end
53
+
54
+ def self.template_exists?(path, template)
55
+ self.get_templates(path).include? template
56
+ end
57
+ end
@@ -0,0 +1,15 @@
1
+ #--
2
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
3
+ # Version 2, December 2004
4
+ #
5
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
6
+ # TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
7
+ #
8
+ # 0. You just DO WHAT THE FUCK YOU WANT TO.
9
+ #++
10
+
11
+ class Gennaro
12
+ def self.version
13
+ '0.1'
14
+ end
15
+ end
@@ -0,0 +1,8 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'sinatra'
4
+ gem 'bcrypt-ruby'
5
+ gem 'data_mapper'
6
+ gem 'dm-sqlite-adapter'
7
+ gem 'rack_csrf'
8
+ gem 'rack-test'
@@ -0,0 +1,11 @@
1
+ #! /usr/bin/env ruby
2
+ require 'rake'
3
+
4
+ task :default => :test
5
+
6
+ task :test do
7
+ FileUtils.cd 'spec' do
8
+ sh 'rspec user_spec.rb --backtrace --color --format doc'
9
+ end
10
+ File.delete 'db/spec.db' if File.exists? 'db/spec.db'
11
+ end
@@ -0,0 +1,38 @@
1
+ #--
2
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
3
+ # Version 2, December 2004
4
+ #
5
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
6
+ # TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
7
+ #
8
+ # 0. You just DO WHAT THE FUCK YOU WANT TO.
9
+ #++
10
+
11
+ require 'sinatra/base'
12
+ require 'bcrypt'
13
+ require 'data_mapper'
14
+ require 'dm-sqlite-adapter'
15
+ require 'rack/csrf'
16
+
17
+ class ${ClassName} < Sinatra::Base
18
+ db_path = File.join Dir.pwd, 'db'
19
+ Dir.mkdir db_path unless Dir.exists? db_path
20
+ DataMapper.setup :default, "sqlite3://#{db_path}/app.db"
21
+
22
+ configure {
23
+ use Rack::Session::Cookie,
24
+ :path => '/',
25
+ :secret => '${GenerateString}'
26
+
27
+ use Rack::Csrf,
28
+ :raise => true,
29
+ :field => '_csrf'
30
+ }
31
+
32
+ Dir.glob("#{Dir.pwd}/app/helpers/*.rb") { |h| require h.chomp }
33
+ Dir.glob("#{Dir.pwd}/app/models/*.rb") { |m| require m.chomp }
34
+ Dir.glob("#{Dir.pwd}/app/controllers/*.rb") { |c| require c.chomp }
35
+
36
+ DataMapper.finalize
37
+ User.auto_migrate!
38
+ end
@@ -0,0 +1,36 @@
1
+ #--
2
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
3
+ # Version 2, December 2004
4
+ #
5
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
6
+ # TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
7
+ #
8
+ # 0. You just DO WHAT THE FUCK YOU WANT TO.
9
+ #++
10
+
11
+ class ${ClassName}
12
+ helpers do
13
+ def set_cookie(key, value, path = '/', expires = nil)
14
+ response.set_cookie key, {
15
+ :value => value,
16
+ :path => path,
17
+ :expires => expires || Time.now + 24 * 60 * 60
18
+ }
19
+ end
20
+
21
+ def delete_cookie(key)
22
+ response.set_cookie key, {
23
+ :value => '',
24
+ :expires => Time.now
25
+ }
26
+ end
27
+
28
+ def cookie_exists?(key)
29
+ request.cookies.include? key
30
+ end
31
+
32
+ def get_cookie(key)
33
+ cookie_exists?(key) ? request.cookies[key] : nil
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,21 @@
1
+ #--
2
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
3
+ # Version 2, December 2004
4
+ #
5
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
6
+ # TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
7
+ #
8
+ # 0. You just DO WHAT THE FUCK YOU WANT TO.
9
+ #++
10
+
11
+ class ${ClassName}
12
+ helpers do
13
+ def csrf_token
14
+ Rack::Csrf.csrf_token env
15
+ end
16
+
17
+ def csrf_tag
18
+ Rack::Csrf.csrf_tag env
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,19 @@
1
+ #--
2
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
3
+ # Version 2, December 2004
4
+ #
5
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
6
+ # TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
7
+ #
8
+ # 0. You just DO WHAT THE FUCK YOU WANT TO.
9
+ #++
10
+
11
+ class ${ClassName}
12
+ helpers do
13
+ def current_user
14
+ guest = Guest.new
15
+ return guest unless cookie_exists? 'userid'
16
+ User.first(:session => get_cookie('sessid')) || guest
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ #--
2
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
3
+ # Version 2, December 2004
4
+ #
5
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
6
+ # TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
7
+ #
8
+ # 0. You just DO WHAT THE FUCK YOU WANT TO.
9
+ #++
10
+
11
+ class Guest
12
+ def guest?
13
+ true
14
+ end
15
+
16
+ def permission_level
17
+ User.guest
18
+ end
19
+ end
@@ -0,0 +1,164 @@
1
+ #--
2
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
3
+ # Version 2, December 2004
4
+ #
5
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
6
+ # TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
7
+ #
8
+ # 0. You just DO WHAT THE FUCK YOU WANT TO.
9
+ #++
10
+
11
+ class User
12
+ include DataMapper::Resource
13
+
14
+ property :id, Serial
15
+ property :username, String, :unique => true,
16
+ :length => 4..16,
17
+ :format => /^[a-zA-Z0-9_\-\*^]*$/
18
+ property :email, String, :unique => true,
19
+ :format => :email_address
20
+
21
+ property :permission_level, Integer, :default => 3,
22
+ :max => 3
23
+
24
+ property :salt, String, :length => 29
25
+ property :salted_password, String, :length => 60
26
+ property :lost_password, String
27
+ property :session, String
28
+
29
+ property :created_at, DateTime
30
+ property :updated_at, DateTime
31
+
32
+ def password=(password)
33
+ self.salt = BCrypt::Engine.generate_salt
34
+ self.salted_password = BCrypt::Engine.hash_secret password, self.salt
35
+ end
36
+
37
+ def founder?
38
+ self.id == 1
39
+ end
40
+
41
+ def admin?
42
+ self.permission_level == User.admin
43
+ end
44
+
45
+ def smod?
46
+ self.permission_level == User.smod
47
+ end
48
+ alias_method :gmod?, :smod?
49
+
50
+ def mod?
51
+ self.permission_level == User.mod
52
+ end
53
+
54
+ def user?
55
+ self.permission_level == User.user
56
+ end
57
+
58
+ def banned?
59
+ self.permission_level == User.banned
60
+ end
61
+
62
+ def guest?
63
+ false
64
+ end
65
+
66
+ def logged?(session)
67
+ self.session == session
68
+ end
69
+ alias_method :logged_in?, :logged?
70
+
71
+ def logout
72
+ self.session = ''
73
+ true
74
+ end
75
+
76
+ class << self
77
+ def banned
78
+ -1
79
+ end
80
+
81
+ def admin
82
+ 0
83
+ end
84
+
85
+ def smod
86
+ 1
87
+ end
88
+ alias_method :gmod, :smod
89
+
90
+ def mod
91
+ 2
92
+ end
93
+
94
+ def user
95
+ 3
96
+ end
97
+
98
+ def guest
99
+ 4
100
+ end
101
+
102
+ def get(username)
103
+ User.first(:username => username)
104
+ end
105
+
106
+ def exists?(username)
107
+ User.count(:username => username) == 1
108
+ end
109
+
110
+ def registration(username, email, password, permission_level, stuff = {})
111
+ User.create({
112
+ :username => username,
113
+ :email => email,
114
+ :password => password,
115
+ :permission_level => permission_level
116
+ }.merge(stuff))
117
+ end
118
+ alias_method :signup, :registration
119
+
120
+ def authentication(username, password)
121
+ user = User.first(:username => username)
122
+ return false unless user
123
+ if user.salted_password == BCrypt::Engine.hash_secret(password, user.salt)
124
+ user.update(:session => BCrypt::Engine.generate_salt)
125
+ else
126
+ false
127
+ end
128
+ end
129
+ alias_method :login, :authentication
130
+ alias_method :signin, :authentication
131
+
132
+ def logout(username)
133
+ user = User.first(:username => username)
134
+ return false unless user
135
+ user.update(:session => '')
136
+ user.session.empty?
137
+ end
138
+
139
+ def logged?(username, session)
140
+ User.count(:username => username, :session => session) == 1
141
+ end
142
+ alias_method :logged_in?, :logged?
143
+
144
+ def lost_password(username)
145
+ user = User.first(:username => username)
146
+ return false unless user
147
+ user.update(:lost_password => BCrypt::Engine.generate_salt)
148
+ user.lost_password
149
+ end
150
+
151
+ def password_recovery(username, lost_password, password)
152
+ user = User.first({
153
+ :username => username,
154
+ :lost_password => lost_password
155
+ })
156
+ return false unless user
157
+ return false if user.lost_password.empty?
158
+ user.update({
159
+ :lost_password => '',
160
+ :password => password
161
+ })
162
+ end
163
+ end
164
+ end
@@ -0,0 +1,38 @@
1
+ #--
2
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
3
+ # Version 2, December 2004
4
+ #
5
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
6
+ # TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
7
+ #
8
+ # 0. You just DO WHAT THE FUCK YOU WANT TO.
9
+ #++
10
+
11
+ require 'sinatra/base'
12
+ require 'bcrypt'
13
+ require 'data_mapper'
14
+ require 'dm-sqlite-adapter'
15
+ require 'rack/csrf'
16
+
17
+ class ${ClassName} < Sinatra::Base
18
+ db_path = File.join Dir.pwd, '../', 'db'
19
+ Dir.mkdir db_path unless Dir.exists? db_path
20
+ DataMapper.setup :default, "sqlite3://#{db_path}/spec.db"
21
+
22
+ configure {
23
+ use Rack::Session::Cookie,
24
+ :path => '/',
25
+ :secret => '${GenerateString}'
26
+
27
+ use Rack::Csrf,
28
+ :raise => true,
29
+ :field => '_csrf'
30
+ }
31
+
32
+ Dir.glob('../app/helpers/*.rb') { |h| require h.chomp }
33
+ Dir.glob('../app/models/*.rb') { |m| require m.chomp }
34
+ Dir.glob('../app/controllers/*.rb') { |c| require c.chomp }
35
+
36
+ DataMapper.finalize
37
+ User.auto_migrate!
38
+ end
@@ -0,0 +1,63 @@
1
+ ENV['RACK_ENV'] = 'test'
2
+
3
+ require './spec'
4
+ require 'rspec'
5
+ require 'rack/test'
6
+
7
+ describe 'App' do
8
+ def app
9
+ Sinatra::Application
10
+ end
11
+
12
+ it 'creates an user' do
13
+ username = 'Gennaro'
14
+ email = 'gennaro@gennaro.ext'
15
+ password = 'sonopropriounbullo!'
16
+ permission_level = User.user
17
+
18
+ User.exists?(username).should be_false
19
+ user = User.signup username, email, password, permission_level
20
+ user.errors.should be_empty
21
+ user.guest?.should be_false
22
+ user.user?.should be_true
23
+ User.exists?(username).should be_true
24
+
25
+ user = User.signup username, email, password, permission_level
26
+ user.errors.should_not be_empty
27
+ end
28
+
29
+ it 'logs in a user' do
30
+ username = 'Gennaro'
31
+ password = 'sonopropriounbullo!'
32
+
33
+ User.exists?(username).should be_true
34
+ User.login(username, password).should be_true
35
+ user = User.get username
36
+ user.session.should have(29).chars
37
+ end
38
+
39
+ it 'logs out a user' do
40
+ username = 'Gennaro'
41
+
42
+ user = User.get username
43
+ user.session.should have(29).chars
44
+ user.logout
45
+ user.session.should be_empty
46
+ end
47
+
48
+ it 'recovers lost password' do
49
+ username = 'Gennaro'
50
+ new_password = 'sonounnuovobullo!'
51
+
52
+ User.login(username, new_password).should be_false
53
+
54
+ passcode = User.lost_password username
55
+ passcode.should_not be_false
56
+ passcode.should have(29).chars
57
+
58
+ recovery = User.password_recovery username, passcode, new_password
59
+ recovery.should be_true
60
+
61
+ User.login(username, new_password).should be_true
62
+ end
63
+ end
metadata ADDED
@@ -0,0 +1,60 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gennaro
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ platform: ruby
6
+ authors:
7
+ - Giovanni Capuano
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-12-15 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Generate templates for Sinatra. The built-in template provide a user
14
+ authentication model, but you can add as many templates as you want.
15
+ email: webmaster@giovannicapuano.net
16
+ executables:
17
+ - gennaro
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - lib/gennaro/file.rb
22
+ - lib/gennaro/gennaro.rb
23
+ - lib/gennaro/version.rb
24
+ - lib/gennaro.rb
25
+ - templates/authentication/app/helpers/cookie.rb
26
+ - templates/authentication/app/helpers/csrf.rb
27
+ - templates/authentication/app/helpers/user.rb
28
+ - templates/authentication/app/models/guest.rb
29
+ - templates/authentication/app/models/user.rb
30
+ - templates/authentication/Gemfile
31
+ - templates/authentication/Rakefile
32
+ - templates/authentication/spec/spec.rb
33
+ - templates/authentication/spec/user_spec.rb
34
+ - templates/authentication/_class_name_.rb
35
+ - bin/gennaro
36
+ homepage: http://www.giovannicapuano.net
37
+ licenses:
38
+ - WTFPL
39
+ metadata: {}
40
+ post_install_message:
41
+ rdoc_options: []
42
+ require_paths:
43
+ - lib
44
+ required_ruby_version: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ required_rubygems_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ requirements: []
55
+ rubyforge_project:
56
+ rubygems_version: 2.0.3
57
+ signing_key:
58
+ specification_version: 4
59
+ summary: Sinatra template generator.
60
+ test_files: []