arfy 0.2 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,8 +1,28 @@
1
+ ## 0.2.3
2
+
3
+ Features:
4
+
5
+ - Specs to guarantee the support to all db: tasks
6
+ - Adds api to create migration files programatically
7
+ - Introduced the arfy executable which allow create predefined
8
+ migrations, here are some examples:
9
+
10
+ * arfy create_table people name:string birth:date add_index:name
11
+ * arfy add_column people country:string limit:50 null:false
12
+ * arfy remove_index column:name
13
+ * arfy remove_index name:idx_awswome
14
+
15
+ ## 0.2.1
16
+
17
+ Features:
18
+
19
+ - Configurable workdir
20
+
1
21
  ## 0.2
2
22
 
3
23
  Features:
4
24
 
5
- - Support to all tasks
25
+ - Support to all db: tasks
6
26
  - LICENSE file created
7
27
 
8
28
  ## 0.1.5
@@ -0,0 +1,101 @@
1
+ # Arfy
2
+ ## Allow use Rails migrations, but without Rails ;)
3
+
4
+ Are you working on a Ruby (non Rails) project, using relational database
5
+ and missing the greateness of Rails Migrations? No more, arfy do the
6
+ job!
7
+
8
+ This gem main goal is to allow the use of Rails rake tasks on the db:
9
+ namespace such as: migrations tasks, seed.rb loading, schema dump... You
10
+ just need install arfy gem.
11
+
12
+ gem install arfy
13
+
14
+ On your project dir, create a Rakefile and put this require on it:
15
+
16
+ require 'arfy_tasks'
17
+
18
+ And... you are ready to go. Just like that, boom! You can check your
19
+ available tasks, on you project dir, execute:
20
+
21
+ rake -T
22
+
23
+ You should see some familiar tasks with some arfy tasks:
24
+
25
+ rake arfy:generate:migration # Generate migration (options NAME=migration_file_name, OUTDIR=db/migrate, TARGET=environment)
26
+ rake arfy:rails_env # Changes the environment (options TARGET=development) - use your's configuration name on database.yml
27
+ rake arfy:workdir # Change dir where arfy searches for db and config dir (options DBDIR=db, MIGRATIONDIR=DBDIR/migrate, CONFIGDIR=d...
28
+ rake db:create # Create the database from config/database.yml for the current Rails.env (use db:create:all to create all dbs in ...
29
+ rake db:drop # Drops the database for the current Rails.env (use db:drop:all to drop all databases)
30
+ rake db:fixtures:load # Load fixtures into the current environment's database.
31
+ rake db:migrate # Migrate the database (options: VERSION=x, VERBOSE=false).
32
+ rake db:migrate:status # Display status of migrations
33
+ rake db:rollback # Rolls the schema back to the previous version (specify steps w/ STEP=n).
34
+ rake db:schema:dump # Create a db/schema.rb file that can be portably used against any DB supported by AR
35
+ rake db:schema:load # Load a schema.rb file into the database
36
+ rake db:seed # Load the seed data from db/seeds.rb
37
+ rake db:setup # Create the database, load the schema, and initialize with the seed data (use db:reset to also drop the db first)
38
+ rake db:structure:dump # Dump the database structure to an SQL file
39
+ rake db:version # Retrieves the current schema version number
40
+
41
+ ---
42
+
43
+ ## Configuring
44
+
45
+ You need to create your database.yml, just like when you are using a
46
+ [Rails Project](http://guides.rubyonrails.org/getting_started.html).
47
+ Create some migrations and run the tasks:
48
+
49
+ rake db:create:all
50
+ rake db:migrate
51
+
52
+ By default, the directories used to configure and store your migrations
53
+ are the same as the ones used by Rails:
54
+
55
+ your_project/
56
+ db/migrate/
57
+ config/
58
+
59
+ But you can use any directory structure you want. There are two main
60
+ ways to achieve this:
61
+
62
+ * rake task workdir:
63
+
64
+ rake arfy:workdir MIGRATIONDIR=db/migrate CONFIGDIR=db/config CONFIGNAME=database.yml
65
+ (no exemplo foram usados os caminhos/nome padrão do Rails para facilitar o entendimento)
66
+
67
+ * configuration file:
68
+
69
+ - generate an .arfy file on your project root
70
+ - arfy expects this file in yml format with the following optional
71
+ parameters (any ommited parameter will be replaced by a default
72
+ value):
73
+
74
+ db:
75
+ seeds: db/seeds.rb
76
+ migrate: db/migrate
77
+ schema: db/schema.rb
78
+ config:
79
+ database: config/database.yml
80
+
81
+ ## Generating Migrations
82
+
83
+ In order to create your migrations, follow the oficial
84
+ [Rails docs](http://api.rubyonrails.org/classes/ActiveRecord/Migration.html).
85
+ To generate a new empty migrations, run the following task:
86
+
87
+ rake arfy:generate:migration NAME=my-MigrationName
88
+
89
+ (The awkward migration name passed as NAME parameter is to ilustrate
90
+ that this tasks will transform this string in a pretty file name,
91
+ something like: 20110920000101_my_migration_name.rb).
92
+
93
+ (In a future version, arfy is gonna give you an capable of do this kind
94
+ of repetitive jobs)
95
+
96
+ ---
97
+
98
+ Enjoy arfy, and, if you like it an can, help make it better reporting
99
+ bugs, suggesting fetaures and even forking the project to kill some
100
+ bugs registered on github issues.
101
+
@@ -0,0 +1,105 @@
1
+ # ATENÇÃO
2
+ Essa é uma documentação relativa a versão "edge" dessa gem, se você
3
+ precisa saber sobre a gem de produção, verifique o [Readme.md](https://github.com/ricardovaleriano/arfy)
4
+
5
+ # Arfy
6
+ ## Possibilita o uso das migrations do Rails, só que sem o Rails ;)
7
+
8
+ Está trabalhando um projeto Ruby (não Rails) usando banco de dados relacional e andou
9
+ sentindo falta das migrations do Rails? Arfy vai te ajudar a resolver isso.
10
+
11
+ O objetivo principal dessa gem é possibilitar o uso das rake tasks do Rails
12
+ presentes no namespace db:, isto é: migrations, carregamento do arquivo
13
+ seeds.rb, schema dump... Basta instalar a gem do Arfy.
14
+
15
+ gem install arfy
16
+
17
+ No diretório do seu projeto crie um Rakefile com o seguinte require:
18
+
19
+ require 'arfy_tasks'
20
+
21
+ E... pronto. É só isso, você pode verificar todas as tarefas disponíveis
22
+ usando:
23
+
24
+ rake -T
25
+
26
+ Você deve ver algumas tarefas bem familiares e outras adicionadas pelo
27
+ Arfy:
28
+
29
+ rake arfy:generate:migration # Generate migration (options NAME=migration_file_name, OUTDIR=db/migrate, TARGET=environment)
30
+ rake arfy:rails_env # Changes the environment (options TARGET=development) - use your's configuration name on database.yml
31
+ rake arfy:workdir # Change dir where arfy searches for db and config dir (options DBDIR=db, MIGRATIONDIR=DBDIR/migrate, CONFIGDIR=d...
32
+ rake db:create # Create the database from config/database.yml for the current Rails.env (use db:create:all to create all dbs in ...
33
+ rake db:drop # Drops the database for the current Rails.env (use db:drop:all to drop all databases)
34
+ rake db:fixtures:load # Load fixtures into the current environment's database.
35
+ rake db:migrate # Migrate the database (options: VERSION=x, VERBOSE=false).
36
+ rake db:migrate:status # Display status of migrations
37
+ rake db:rollback # Rolls the schema back to the previous version (specify steps w/ STEP=n).
38
+ rake db:schema:dump # Create a db/schema.rb file that can be portably used against any DB supported by AR
39
+ rake db:schema:load # Load a schema.rb file into the database
40
+ rake db:seed # Load the seed data from db/seeds.rb
41
+ rake db:setup # Create the database, load the schema, and initialize with the seed data (use db:reset to also drop the db first)
42
+ rake db:structure:dump # Dump the database structure to an SQL file
43
+ rake db:version # Retrieves the current schema version number
44
+
45
+ ---
46
+
47
+ ## Configuração
48
+
49
+ Lembre-se de criar o seu arquivo database.yml, assim como você faria em
50
+ seu projeto [Rails](http://guides.rubyonrails.org/getting_started.html).
51
+ Crie suas migrations e rode as tarefas:
52
+
53
+ rake db:create:all
54
+ rake db:migrate
55
+
56
+ Por convenção, os diretórios usados para configurar e armazenar as migrações
57
+ são os mesmos da convenção utilizada pelo Rails:
58
+
59
+ your_project/
60
+ db/migrate/
61
+ config/
62
+
63
+ Porém você pode usar qualquer estrutura de diretórios que desejar. Existem
64
+ duas formas de configurar o caminho onde suas migrações serão salvas, onde
65
+ o arfy precisa buscar as configurações (e afins):
66
+
67
+ * rake task workdir:
68
+
69
+ rake arfy:workdir MIGRATIONDIR=db/migrate CONFIGDIR=db/config CONFIGNAME=database.yml
70
+ (no exemplo foram usados os caminhos/nome padrão do Rails para facilitar o entendimento)
71
+
72
+ * arquivo de configuração:
73
+
74
+ - crie um arquivo .arfy na raiz do seu projeto
75
+ - arfy espera que esse arquivo esteja no formato yml e tenha os
76
+ seguintes parâmetros (todos opcionais, valores padrão serão
77
+ utilizados caso algum deles não seja encontrado):
78
+
79
+ db:
80
+ seeds: db/seeds.rb
81
+ migrate: db/migrate
82
+ schema: db/schema.rb
83
+ config:
84
+ database: config/database.yml
85
+
86
+ ## Gerando Migrations
87
+
88
+ Para criar suas migrações siga a documentação oficial do Rails:
89
+ [Rails docs](http://api.rubyonrails.org/classes/ActiveRecord/Migration.html).
90
+ Para gerar uma migration vazia, use a rake task a seguir:
91
+
92
+ rake arfy:generate:migration NAME=my-MigrationName
93
+
94
+ (O nome estranho da migração passado como parâmetro aqui é só para ilustrar que a task vai
95
+ criar um arquivo com o nome bonito para você, algo como: 20110920000101_my_migration_name.rb).
96
+
97
+ (Numa próxima versão o arfy vai disponibilizar um executável para
98
+ realizar esse tipo de tarefa)
99
+
100
+ ---
101
+
102
+ Aproveite e, se puder, me ajude a melhorar essa ferramenta reportando
103
+ bugs, sugerindo funcionalidades ou mesmo forkando o projeto caso queria
104
+ solucionar algum bug reportado no issues do github.
105
+
@@ -0,0 +1 @@
1
+ #!/usr/bin/env ruby
@@ -1,26 +1,14 @@
1
1
  require 'active_record'
2
2
  require 'erb'
3
3
 
4
- require 'arfy/config_faker'
5
- require 'arfy/application_faker'
6
- require 'arfy/environment_faker'
7
- require 'arfy/rails_faker'
4
+ require 'arfy/string_extensions'
5
+ require 'arfy/environment'
8
6
  require 'arfy/generator'
7
+ require 'arfy/migration_builder'
9
8
 
10
- def configured_paths
11
- paths = {}
12
- paths["config/database"] = "config/database.yml"
13
- paths["db/seeds"] = "db/seeds.rb"
14
- migrate_path = String.new("db/migrate")
15
- def migrate_path.to_a
16
- [self]
9
+ unless defined? Rails
10
+ class Rails
11
+ extend Arfy::RailsFaker
17
12
  end
18
- paths["db/migrate"] = migrate_path
19
- paths
20
13
  end
21
14
 
22
- class Rails
23
- extend RailsFaker
24
- end
25
-
26
- require "tasks/all"
@@ -0,0 +1,200 @@
1
+ module Arfy
2
+ class NoObjectDefinedError < Exception
3
+ end
4
+
5
+ class Environment
6
+ class EnvWorkdirConfiguration
7
+ def configuration_data
8
+ return @data unless @data.nil?
9
+
10
+ @data = {"db" => {}, "config" => {}}
11
+ if File.exists? ".arfy"
12
+ @data = YAML.load( IO.read(".arfy") )
13
+ end
14
+ @data
15
+ end
16
+
17
+ def migration_dirpath
18
+ configuration_data["db"]["migrate"] ||
19
+ ENV["db/migrate"] || "db/migrate"
20
+ end
21
+
22
+ def config_path
23
+ ENV["db/config"] || "config"
24
+ end
25
+
26
+ def database_config_path
27
+ configuration_data["config"]["database"] ||
28
+ "#{config_path}/#{ENV["db/config/database.yml"] || "database.yml"}"
29
+ end
30
+
31
+ def seed_rb_path
32
+ configuration_data["db"]["seeds"] ||
33
+ "#{ENV["db/seeds_dir"] || "db"}/#{ENV["db/seeds.rb"] || "seeds.rb"}"
34
+ end
35
+
36
+ def schema_path
37
+ configuration_data["db"]["schema"] ||
38
+ ENV["db/schema.rb"] || "db/schema.rb"
39
+ end
40
+ end
41
+
42
+ # TODO:should be possible change the result of this method to
43
+ # configure the paths
44
+ def configured_paths
45
+ workdir = EnvWorkdirConfiguration.new
46
+
47
+ paths = {}
48
+ paths["config/database"] = workdir.database_config_path
49
+ paths["db/seeds"] = workdir.seed_rb_path
50
+ migrate_path = String.new(workdir.migration_dirpath)
51
+ def migrate_path.to_a
52
+ [self]
53
+ end
54
+ paths["db/migrate"] = migrate_path
55
+ paths["db/schema"] = workdir.schema_path
56
+ ENV["SCHEMA"] = paths["db/schema"]
57
+ if paths["db/schema"].index("/") == 0
58
+ path = paths["db/schema"]
59
+ else
60
+ path = File.join(Dir.pwd, paths["db/schema"])
61
+ end
62
+ FileUtils.mkdir_p(File.dirname(path))
63
+ paths
64
+ end
65
+
66
+ def augment(object_or_module_name, module_name=nil)
67
+ object, module_name = initialize_module_name(object_or_module_name, module_name)
68
+ unless object
69
+ if block_given?
70
+ object = yield
71
+ else
72
+ object = Object.new
73
+ end
74
+ end
75
+ pimp_object(object, module_name)
76
+ end
77
+
78
+ def prepare_active_record_module
79
+ class << ActiveRecord::Base
80
+ def establish_connection(configuration = nil)
81
+ #forget about it, we already have a connection XD
82
+ end
83
+
84
+ def configurations
85
+ Rails.application.config.database_configuration
86
+ end
87
+ end
88
+ end
89
+
90
+ def set_rails_env(target)
91
+ ENV['RAILS_ENV'] = (target || ENV["RAILS_ENV"]) || "development"
92
+ puts "working on environment: #{ENV['RAILS_ENV']}" if ENV["RAILS_ENV"]
93
+ ENV["RAILS_ENV"]
94
+ end
95
+
96
+ def database_connect
97
+ database_configurations = Rails.application.config.database_configuration
98
+ env_db_configuration = database_configurations[Rails.env]
99
+ ActiveRecord::Base.establish_connection(env_db_configuration)
100
+ end
101
+
102
+ def create_config(options_param={})
103
+ config = {
104
+ "config/database" => "config/database.yml",
105
+ "db/seeds" => "db/seeds.rb",
106
+ "db/migrate" => "db/migrate"}.merge(options_param)
107
+
108
+ new_hash = {
109
+ "config" => {
110
+ "database" => config["config/database"]
111
+ },
112
+ "db" => {
113
+ "seeds" => config["db/seeds"],
114
+ "migrate" => config["db/migrate"],
115
+ "schema" => config["db/schema"]}
116
+ }
117
+
118
+ File.open(".arfy", "w") do |f|
119
+ f << new_hash.to_yaml
120
+ end
121
+ end
122
+
123
+ private
124
+ def initialize_module_name(object_or_module_name, module_name)
125
+ if module_name.nil?
126
+ module_name = object_or_module_name
127
+ object = nil
128
+ else
129
+ object = object_or_module_name
130
+ end
131
+ [object, module_name]
132
+ end
133
+
134
+ def pimp_object(object, module_name)
135
+ raise NoObjectDefinedError unless object
136
+ object.class.send(:include, module_name)
137
+ object
138
+ end
139
+
140
+ end
141
+
142
+ module ConfigFaker
143
+ #https://github.com/rails/rails/blob/master/railties/lib/rails/application/configuration.rb
144
+ def paths
145
+ Environment.new.configured_paths
146
+ end
147
+
148
+ def database_configuration
149
+ @configuration ||= YAML::load(ERB.new(IO.read(paths["config/database"])).result)
150
+ @configuration
151
+ end
152
+ end
153
+
154
+ module ApplicationFaker
155
+ def config
156
+ @fake_config = Environment.new.augment(@fake_config, Arfy::ConfigFaker)
157
+ @fake_config
158
+ end
159
+
160
+ def paths
161
+ Environment.new.configured_paths
162
+ end
163
+
164
+ def load_seed
165
+ seed_file = paths["db/seeds"]
166
+ load(seed_file) if File.exist?(seed_file)
167
+ end
168
+ end
169
+
170
+ module EnvironmentFaker
171
+ def method_missing(who_ami, *params)
172
+ method = who_ami.to_s
173
+ ends_with_questionmark = method.index("?") == method.length - 1
174
+ if ends_with_questionmark
175
+ env_name_asked = method.slice(0, method.length-1)
176
+ return env_name_asked == ENV['RAILS_ENV'] || self.env
177
+ end
178
+ super
179
+ end
180
+ end
181
+
182
+ module RailsFaker
183
+ def root
184
+ "."
185
+ end
186
+
187
+ def env
188
+ @fake_env = Environment.new.augment(@fake_env, Arfy::EnvironmentFaker) do
189
+ String.new(ENV['RAILS_ENV'] ||= "development")
190
+ end
191
+ @fake_env
192
+ end
193
+
194
+ def application
195
+ @fake_application = Environment.new.augment(@fake_application, Arfy::ApplicationFaker)
196
+ @fake_application
197
+ end
198
+ end
199
+ end
200
+