arfy 0.2 → 0.2.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.
@@ -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
+