redmine_acts_as_taggable_on 0.1.1 → 0.2.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a47dcc653f37f43a611fd9c52d5b6d8a818dc05e
4
- data.tar.gz: 2f9a5b64d103e28287316955901a809877522730
3
+ metadata.gz: af36a6d9277e4b6f7ebb23802fd4df6df58549e2
4
+ data.tar.gz: 170406c9ce7d640b54d6f0958733c19a788cb8b3
5
5
  SHA512:
6
- metadata.gz: 68e5c10907d01cc88a51d43dc06bfbf6dc1ccc87f2207ff2cebfe0f8c915940ba101f62560ac88c5fb1ce048da50891979071851a17b10c11c5f40d47bf2dbfc
7
- data.tar.gz: 69e174c227a423a591c8ee938aefcb6c06e01688d3cc406922ffcc0395a6bdeaace815e020594701d8fd7d14e05e3cce3702cae9a917d185d61ab56335ff1884
6
+ metadata.gz: 80e76b8c0900f2770409953877d088c65555095bdef02dc073c17227b03e94f2ba35f294de25f2330689328c459b910437274dba081b0f7fb3d45c244189779c
7
+ data.tar.gz: 0400ed073a494d7e57abdbc06029d07bebe198fbad7465f1f446a5dee3a7f8008b29639cfeee0229a3afefb3ed1fe90963d2ea202761dded90cda029a8302b89
data/.gitmodules ADDED
@@ -0,0 +1,3 @@
1
+ [submodule "test/bats"]
2
+ path = test/bats
3
+ url = git://github.com/sstephenson/bats.git
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ script: test/run.bash
3
+ rvm:
4
+ - "2.0.0"
data/README.md CHANGED
@@ -1,13 +1,13 @@
1
1
  # redmine_acts_as_taggable_on
2
2
 
3
3
  `redmine_acts_as_taggable_on` is a gem which allows multiple Redmine plugins to
4
- use the tables provided by `acts_as_taggable_on` without stepping on each
4
+ use the tables provided by `acts-as-taggable-on` without stepping on each
5
5
  others' toes.
6
6
 
7
- ## How it works
7
+ ## Why?
8
8
 
9
9
  The problem we ran into when we discovered that both `redmine_tags` and
10
- `redmine_knowledgebase` want to use the `acts_as_taggable_on` gem is that after
10
+ `redmine_knowledgebase` want to use the `acts-as-taggable-on` gem is that after
11
11
  either is installed, the migration for the other fails, since the database
12
12
  tables already exist.
13
13
 
@@ -23,30 +23,33 @@ mechanism to declare that they require these tables, and providing intelligent
23
23
  migrations which only drop the tables when no other plugins are using them.
24
24
 
25
25
  `redmine_acts_as_taggable_on` also provides a limited defence against plugins
26
- which directly depend on `acts-as-taggable-on` by grepping through their
27
- Gemfiles for the string `acts-as-taggable-on`, and treating them the same way
28
- as plugins which use this gem, together with a gentle(-ish) suggestion to
29
- use this gem instead.
26
+ which directly depend on `acts-as-taggable-on`. It does this by grepping
27
+ through their Gemfiles for the string `acts-as-taggable-on` -- if found, it
28
+ will treat the plugin as requiring the `acts-as-taggable-on` tables, and will
29
+ print a gentle(-ish) suggestion to use this gem instead.
30
30
 
31
31
  ## Status
32
32
 
33
- **Believed to be stable; not extensively tested in the wild.**
33
+ Believed to be stable. The automated tests currently pass on Redmine trunk,
34
+ 2.3.1, 2.2.4, and 2.1.5. However, this gem is not yet used by any Redmine
35
+ plugins in the wild.
34
36
 
35
37
  ## Limitations
36
38
 
37
- This plugin cannot currently protect against situations where a plugin directly
38
- using `acts-as-taggable-on` has put the generated migration into its
39
- db/migrate, and the Redmine admin tries to uninstall it.
39
+ This gem cannot currently protect against situations where a plugin directly
40
+ using `acts-as-taggable-on` has put the generated migration into its db/migrate
41
+ directory. If a user tries to migrate the plugin down by executing `rake
42
+ redmine:plugins:migrate VERSION=0 NAME=redmine_foo_plugin`, the tables will
43
+ still be dropped, regardless of whether other plugins are still using them.
40
44
 
41
- I'm in two minds about whether to fix this: one the one hand, it would require
42
- some nasty hackery, and it's no worse than the current situation. On the other,
43
- losing one's data is not fun.
45
+ I'm in two minds about whether to fix this: on the one hand, it would require
46
+ some nasty monkey-patching. On the other hand, data loss is no fun at all.
44
47
 
45
48
  ## Setup
46
49
 
47
50
  Add it to your plugin's Gemfile:
48
51
 
49
- gem 'redmine_acts_as_taggable_on', '~> 0.1'
52
+ gem 'redmine_acts_as_taggable_on', '~> 0.2'
50
53
 
51
54
  Add the migration:
52
55
 
@@ -61,4 +64,31 @@ Declare that your plugin needs `redmine_acts_as_taggable_on` inside init.rb:
61
64
  requires_acts_as_taggable_on
62
65
  ...
63
66
 
64
- That's it. Your plugin should now migrate up and down intelligently.
67
+ That's it. Your plugin will now migrate up and down intelligently. For example:
68
+
69
+ cd /path/to/redmine
70
+
71
+ cp -r /some/plugin/using/this/gem plugins/redmine_foo
72
+ cp -r /another/plugin/using/this/gem plugins/redmine_bar
73
+
74
+ rake redmine:plugins:migrate
75
+
76
+ Migrating redmine_bar (Redmine bar)...
77
+ == AddTagsAndTaggings: migrating =========================================
78
+ -- create_table(:tags)
79
+ -> 0.0039s
80
+ -- create_table(:taggings)
81
+ -> 0.0007s
82
+ -- add_index(:taggings, :tag_id)
83
+ -> 0.0003s
84
+ -- add_index(:taggings, [:taggable_id, :taggable_type, :context])
85
+ -> 0.0003s
86
+ == AddTagsAndTaggings: migrated (0.0059s) ================================
87
+
88
+ Migrating redmine_foo (Redmine foo)...
89
+ == AddTagsAndTaggings: migrating =========================================
90
+ -- Not creating "tags" and "taggings" because they already exist
91
+ == AddTagsAndTaggings: migrated (0.0006s) ================================
92
+
93
+ You can look at the [test script](test/test.bats) to see how other situations
94
+ are handled.
@@ -1,13 +1,16 @@
1
1
  require 'generators/acts_as_taggable_on/migration/templates/active_record/migration'
2
2
 
3
3
  class RedmineActsAsTaggableOn::Migration < ActsAsTaggableOnMigration
4
+ class SchemaMismatchError < StandardError; end
5
+
4
6
  def up
5
7
  enforce_declarations!
8
+ check_for_old_style_plugins
6
9
 
7
- if performed?
8
- say 'Not creating "tags" and "taggings" because they already exist'
9
- else
10
+ if ok_to_go_up?
10
11
  super
12
+ else
13
+ say 'Not creating "tags" and "taggings" because they already exist'
11
14
  end
12
15
  end
13
16
 
@@ -19,35 +22,11 @@ class RedmineActsAsTaggableOn::Migration < ActsAsTaggableOnMigration
19
22
  else
20
23
  say 'Not dropping "tags" and "taggings" because they\'re still needed by'
21
24
  say 'the following plugins:'
22
- requiring_plugins.each { |p| say p.id, true }
25
+ plugins_still_using_tables.each { |p| say p.id, true }
23
26
  end
24
27
  end
25
28
 
26
29
  private
27
- def performed?
28
- ['tags', 'taggings'].any? do |table|
29
- ActiveRecord::Base.connection.table_exists? table
30
- end
31
- end
32
-
33
- # A list of plugins which require redmine_acts_as_taggable_on.
34
- #
35
- # We reject the current one because we don't want to say
36
- #
37
- # refusing to migrate redmine_foo down: tags and taggings tables are still
38
- # required by redmine_foo
39
- #
40
- # That would be silly.
41
- def requiring_plugins
42
- Redmine::Plugin.all.
43
- select(&:requires_acts_as_taggable_on?).
44
- reject {|p| p == Redmine::Plugin::Migrator.current_plugin }
45
- end
46
-
47
- def ok_to_go_down?
48
- requiring_plugins.empty?
49
- end
50
-
51
30
  def enforce_declarations!
52
31
  unless current_plugin_declaration_made?
53
32
  msg = "You have to declare that you need redmine_acts_as_taggable_on inside\n"
@@ -58,6 +37,74 @@ class RedmineActsAsTaggableOn::Migration < ActsAsTaggableOnMigration
58
37
  end
59
38
 
60
39
  def current_plugin_declaration_made?
61
- Redmine::Plugin::Migrator.current_plugin.requires_acts_as_taggable_on?
40
+ current_plugin.requires_acts_as_taggable_on?
41
+ end
42
+
43
+ def current_plugin
44
+ Redmine::Plugin::Migrator.current_plugin
45
+ end
46
+
47
+ # Check if any plugins are using acts-as-taggable-on directly; the purpose of
48
+ # this is only to print a warning if so.
49
+ def check_for_old_style_plugins
50
+ Redmine::Plugin.all.each { |p| p.requires_acts_as_taggable_on? }
51
+ nil
52
+ end
53
+
54
+ def ok_to_go_up?
55
+ tables_already_exist = %w(tags taggings).any? do |table|
56
+ ActiveRecord::Base.connection.table_exists? table
57
+ end
58
+ if tables_already_exist
59
+ assert_schema_match!
60
+ return false
61
+ end
62
+ true
63
+ end
64
+
65
+ def assert_schema_match!
66
+ if (obtain_structure('tags') != expected_tags_structure) ||
67
+ (obtain_structure('taggings') != expected_taggings_structure)
68
+ msg = "A plugin is already using the \"tags\" or \"taggings\" tables, and\n"
69
+ msg << "the structure of the table does not match the structure expected\n"
70
+ msg << "by #{current_plugin.id}.\n"
71
+ raise SchemaMismatchError, msg
72
+ end
73
+ end
74
+
75
+ def obtain_structure(table_name)
76
+ ActiveRecord::Base.connection.columns(table_name).
77
+ reject { |c| %w(created_at updated_at id).include? c.name }.
78
+ map { |c| [c.name, c.type.to_s] }.
79
+ sort
80
+ end
81
+
82
+ def expected_tags_structure
83
+ [
84
+ ['name', 'string']
85
+ ]
86
+ end
87
+
88
+ def expected_taggings_structure
89
+ [
90
+ ['tag_id', 'integer'],
91
+ ['taggable_id', 'integer'],
92
+ ['taggable_type', 'string'],
93
+ ['tagger_id', 'integer'],
94
+ ['tagger_type', 'string'],
95
+ ['context', 'string'],
96
+ ].sort
97
+ end
98
+
99
+ # A list of plugins which are using the acts_as_taggable_on tables (excluding
100
+ # the current one)
101
+ def plugins_still_using_tables
102
+ Redmine::Plugin.all.
103
+ select(&:using_acts_as_taggable_on_tables?).
104
+ reject {|p| p == Redmine::Plugin::Migrator.current_plugin }
105
+ end
106
+
107
+ def ok_to_go_down?
108
+ plugins_still_using_tables.empty?
62
109
  end
63
110
  end
@@ -18,6 +18,12 @@ module RedmineActsAsTaggableOn::RedminePluginPatch
18
18
  false
19
19
  end
20
20
 
21
+ def using_acts_as_taggable_on_tables?
22
+ return false unless requires_acts_as_taggable_on?
23
+ return false if Redmine::Plugin::Migrator.current_version(self) == 0
24
+ true
25
+ end
26
+
21
27
  private
22
28
  def gemfile_path
23
29
  File.join(self.directory, 'Gemfile')
@@ -1,3 +1,3 @@
1
1
  module RedmineActsAsTaggableOn
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_runtime_dependency "acts-as-taggable-on", "~> 2.4"
21
+ spec.add_runtime_dependency "acts-as-taggable-on", ">= 2.3", "< 2.5"
22
22
 
23
23
  spec.add_development_dependency "bundler", "~> 1.3"
24
24
  spec.add_development_dependency "rake"
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env bash
2
+ set -e
3
+
4
+ # makes a new Redmine installation in a temporary directory, using SQLite as
5
+ # the database.
6
+ make_temp_redmine() {
7
+ local branch="$1"
8
+ [ -z "$branch" ] && branch="trunk"
9
+
10
+ # for branches which have slashes in them, like tags/2.3.0
11
+ local branch_filename="${branch//\//-}"
12
+ temp_redmine=`mktemp -d /tmp/redmine_acts_as_taggable_on.$branch_filename.XXXXXXX`
13
+ pushd "$temp_redmine"
14
+
15
+ svn checkout "http://svn.redmine.org/redmine/$branch" redmine
16
+ pushd redmine
17
+
18
+ echo "production:
19
+ adapter: sqlite3
20
+ database: db/redmine.sqlite3" > config/database.yml
21
+
22
+ bundle install
23
+ rake generate_secret_token db:create db:migrate
24
+
25
+ popd
26
+ popd
27
+ }
28
+
29
+ make_temp_redmine >/dev/null
30
+ echo "$temp_redmine"
data/test/run.bash ADDED
@@ -0,0 +1,44 @@
1
+ #!/usr/bin/env bash
2
+ set -e
3
+
4
+ # Run all the tests on a specific branch of Redmine.
5
+ run_tests_on_branch() {
6
+ temp_redmine_path="`test/mk_temp_redmine.bash "$1"`"
7
+ export temp_redmine_path
8
+
9
+ [ -f test/bats/bin/bats ] || git submodule update
10
+
11
+ local test_status=0
12
+ test/bats/bin/bats test/test.bats || test_status=1
13
+
14
+ if [ "$test_status" -eq 1 ]; then
15
+ echo "Some tests failed on redmine:$1. You can inspect the tree at $temp_redmine_path"
16
+ else
17
+ rm -rf "$temp_redmine_path"
18
+ fi
19
+
20
+ return $test_status
21
+ }
22
+
23
+ RAILS_ENV="production"
24
+ export RAILS_ENV
25
+
26
+ redmine_acts_as_taggable_on_path="$(cd "$(dirname "${BASH_SOURCE[0]}")"/.. && pwd)"
27
+ export redmine_acts_as_taggable_on_path
28
+ pushd "$redmine_acts_as_taggable_on_path" >/dev/null
29
+
30
+ branches=(trunk tags/2.3.1 tags/2.2.4 tags/2.1.5)
31
+ test_status=0
32
+
33
+ for branch in ${branches[@]}; do
34
+ echo "testing on branch: $branch"
35
+ echo -n "==================="
36
+ # make the underline the same length as the title
37
+ echo ${branch//?/=}
38
+
39
+ run_tests_on_branch "$branch" || test_status=1
40
+ echo
41
+ done
42
+
43
+ popd >/dev/null
44
+ exit $test_status
data/test/test.bats ADDED
@@ -0,0 +1,143 @@
1
+ #!/usr/bin/env bats
2
+
3
+ load test_helpers
4
+
5
+ # files which should be backed up and restored to how they were at the start
6
+ # between each test
7
+ preserved_files=(db/redmine.sqlite3 db/schema.rb)
8
+
9
+ setup() {
10
+ pushd "$temp_redmine_path/redmine" >/dev/null
11
+ for file in $preserved_files; do
12
+ cp $file $file.bak
13
+ done
14
+ }
15
+
16
+ teardown() {
17
+ rm -rf plugins/*
18
+ for file in $preserved_files; do
19
+ mv $file.bak $file
20
+ done
21
+ popd >/dev/null
22
+ }
23
+
24
+ @test "migrates upwards with solitary proper plugin" {
25
+ mk_proper_plugin "foo"
26
+ rake redmine:plugins:migrate
27
+
28
+ db_table_exists 'tags'
29
+ db_table_exists 'taggings'
30
+ }
31
+
32
+ @test "migrates downwards with solitary proper plugin" {
33
+ mk_proper_plugin "foo"
34
+ rake redmine:plugins:migrate
35
+ rake redmine:plugins:migrate NAME=redmine_foo VERSION=0
36
+
37
+ ! db_table_exists 'tags'
38
+ ! db_table_exists 'taggings'
39
+ }
40
+
41
+ @test "migrates upwards with two proper plugins" {
42
+ mk_proper_plugin "foo"
43
+ rake redmine:plugins:migrate
44
+
45
+ mk_proper_plugin "bar"
46
+ run rake redmine:plugins:migrate
47
+ [ "$status" -eq 0 ]
48
+ assert_contain 'Not creating "tags" and "taggings"' "$output"
49
+
50
+ db_table_exists 'tags'
51
+ db_table_exists 'taggings'
52
+ }
53
+
54
+ @test "doesn't drop tables when another proper plugin exists" {
55
+ mk_proper_plugin "foo"
56
+ mk_proper_plugin "bar"
57
+
58
+ rake redmine:plugins:migrate
59
+
60
+ echo 'Now migrating down...'
61
+ run rake redmine:plugins:migrate NAME=redmine_foo VERSION=0
62
+ [ "$status" -eq 0 ]
63
+ assert_contain 'Not dropping "tags" and "taggings"' "$output"
64
+
65
+ # Should say still needed by redmine_bar
66
+ assert_contain '-> redmine_bar' "$output"
67
+ # Should not say still needed by redmine_foo
68
+ ! assert_contain '-> redmine_foo' "$output"
69
+
70
+ db_table_exists 'tags'
71
+ db_table_exists 'taggings'
72
+ }
73
+
74
+ @test "migrates downwards with two proper plugins" {
75
+ mk_proper_plugin "foo"
76
+ mk_proper_plugin "bar"
77
+
78
+ rake redmine:plugins:migrate
79
+ rake redmine:plugins:migrate NAME=redmine_foo VERSION=0
80
+ rake redmine:plugins:migrate NAME=redmine_bar VERSION=0
81
+
82
+ ! db_table_exists 'tags'
83
+ ! db_table_exists 'taggings'
84
+ }
85
+
86
+ @test "schema sanity check when migrating proper plugin up" {
87
+ mk_standard_plugin "baz"
88
+
89
+ mkdir -p plugins/redmine_baz/db/migrate
90
+ echo "class AddTags < ActiveRecord::Migration
91
+ def up
92
+ create_table :tags do |t|
93
+ t.integer :foo
94
+ end
95
+ end
96
+
97
+ def down
98
+ drop_table :tags
99
+ end
100
+ end" > plugins/redmine_baz/db/migrate/001_add_tags.rb
101
+
102
+ rake redmine:plugins:migrate
103
+
104
+ mk_proper_plugin "foo"
105
+ run rake redmine:plugins:migrate
106
+ [ "$status" -ne 0 ]
107
+ assert_contain 'table does not match' "$output"
108
+ }
109
+
110
+ @test "enforces that declarations were made" {
111
+ mk_plugin_missing_declaration "quux"
112
+
113
+ run rake redmine:plugins:migrate
114
+ [ "$status" -ne 0 ]
115
+ echo "$output"
116
+ assert_contain 'You have to declare that you need' "$output"
117
+ }
118
+
119
+ @test "warns about acts-as-taggable-on when going up" {
120
+ mk_proper_plugin "foo"
121
+ mk_old_style_plugin "bar"
122
+
123
+ run rake redmine:plugins:migrate
124
+ [ "$status" -eq 0 ]
125
+ echo "$output"
126
+ assert_contain "WARNING: The plugin redmine_bar is using 'acts-" "$output"
127
+ }
128
+
129
+ @test "warns about acts-as-taggable-on when going down" {
130
+ mk_proper_plugin "foo"
131
+ mk_old_style_plugin "bar"
132
+
133
+ rake redmine:plugins:migrate
134
+
135
+ # Note that we have to migrate redmine_foo down so that the
136
+ # RedmineActsAsTaggableOn::Migration class does the migration, because it
137
+ # does the checking. Migrating redmine_bar down would not trigger the
138
+ # warning.
139
+ run rake redmine:plugins:migrate NAME=redmine_foo VERSION=0
140
+ [ "$status" -eq 0 ]
141
+ echo "$output"
142
+ assert_contain "WARNING: The plugin redmine_bar is using 'acts-" "$output"
143
+ }
@@ -0,0 +1,99 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # Create an empty skeleton Redmine plugin. It's given the name redmine_$1.
4
+ mk_standard_plugin() {
5
+ local name="redmine_$1"
6
+ mkdir plugins/$name
7
+ pushd plugins/$name >/dev/null
8
+
9
+ echo "Redmine::Plugin.register(:$name) { name '$name' }" > init.rb
10
+
11
+ popd >/dev/null
12
+
13
+ echo "Created a standard redmine plugin: $name"
14
+ }
15
+
16
+ # Create a plugin which uses the redmine_acts_as_taggable_on gem properly.
17
+ mk_proper_plugin() {
18
+ mk_standard_plugin "$1" >/dev/null
19
+ local name="redmine_$1"
20
+ pushd plugins/$name >/dev/null
21
+
22
+ echo "gem 'redmine_acts_as_taggable_on',
23
+ :path => '$redmine_acts_as_taggable_on_path'" > Gemfile
24
+
25
+ echo "require 'redmine_acts_as_taggable_on/initialize'
26
+ Redmine::Plugin.register(:$name) { requires_acts_as_taggable_on }" \
27
+ > init.rb
28
+
29
+ mkdir -p db/migrate
30
+ echo "class AddTagsAndTaggings < RedmineActsAsTaggableOn::Migration; end" \
31
+ > db/migrate/001_add_tags_and_taggings.rb
32
+
33
+ bundle >/dev/null
34
+
35
+ popd >/dev/null
36
+
37
+ echo "Created a redmine plugin using redmine_acts_as_taggable_on: $name"
38
+ }
39
+
40
+ # Create a plugin which uses redmine_acts_as_taggable_on but without the
41
+ # declaration in init.rb
42
+ mk_plugin_missing_declaration() {
43
+ mk_proper_plugin "$1" >/dev/null
44
+ local name="redmine_$1"
45
+ pushd plugins/$name >/dev/null
46
+
47
+ echo "require 'redmine_acts_as_taggable_on/initialize'
48
+ Redmine::Plugin.register(:$name) { name '$name' }" > init.rb
49
+
50
+ popd >/dev/null
51
+
52
+ echo "Created a redmine plugin using redmine_acts_as_taggable_on"
53
+ echo " (but without the declaration): $name"
54
+ }
55
+
56
+ # Create a plugin which uses acts-as-taggable-on directly, and which expects
57
+ # you to do rails g acts_as_taggable_on:migration yourself.
58
+ mk_old_style_plugin() {
59
+ mk_standard_plugin "$1" >/dev/null
60
+ local name="redmine_$1"
61
+ pushd plugins/$name >/dev/null
62
+
63
+ echo "gem 'acts-as-taggable-on'" > Gemfile
64
+ bundle >/dev/null
65
+ popd >/dev/null
66
+
67
+ echo "Created a plugin using acts-as-taggable-on without the embedded"
68
+ echo " migration: $name"
69
+ }
70
+
71
+ db_query() {
72
+ # use -init to ensure ~/.sqliterc isn't read
73
+ sqlite3 -init "" db/redmine.sqlite3 "$1"
74
+ }
75
+
76
+ db_table_exists() {
77
+ db_query "SELECT 'it exists'
78
+ FROM sqlite_master
79
+ WHERE type='table' AND name='$1'" | grep 'it exists' >/dev/null
80
+
81
+ exists="$?"
82
+ if [ "$exists" -eq 1 ]; then
83
+ echo "Database table $1 exists."
84
+ else
85
+ echo "Database table $1 does not exist."
86
+ fi
87
+
88
+ return $exists
89
+ }
90
+
91
+ assert_contain() {
92
+ echo -n "Checking whether a string contains '$1'... "
93
+ if [[ "$2" == *"$1"* ]]; then
94
+ echo "Yep."
95
+ else
96
+ echo "Nope."
97
+ return 1
98
+ fi
99
+ }
metadata CHANGED
@@ -1,29 +1,35 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redmine_acts_as_taggable_on
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Harry Garrood
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-05-08 00:00:00.000000000 Z
11
+ date: 2013-05-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: acts-as-taggable-on
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '2.3'
20
+ - - <
18
21
  - !ruby/object:Gem::Version
19
- version: '2.4'
22
+ version: '2.5'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
- - - ~>
27
+ - - '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '2.3'
30
+ - - <
25
31
  - !ruby/object:Gem::Version
26
- version: '2.4'
32
+ version: '2.5'
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: bundler
29
35
  requirement: !ruby/object:Gem::Requirement
@@ -60,6 +66,8 @@ extensions: []
60
66
  extra_rdoc_files: []
61
67
  files:
62
68
  - .gitignore
69
+ - .gitmodules
70
+ - .travis.yml
63
71
  - Gemfile
64
72
  - LICENSE.txt
65
73
  - README.md
@@ -70,6 +78,10 @@ files:
70
78
  - lib/redmine_acts_as_taggable_on/redmine_plugin_patch.rb
71
79
  - lib/redmine_acts_as_taggable_on/version.rb
72
80
  - redmine_acts_as_taggable_on.gemspec
81
+ - test/mk_temp_redmine.bash
82
+ - test/run.bash
83
+ - test/test.bats
84
+ - test/test_helpers.bash
73
85
  homepage: https://github.com/hdgarrood/redmine_acts_as_taggable_on
74
86
  licenses:
75
87
  - GPLv2
@@ -90,10 +102,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
90
102
  version: '0'
91
103
  requirements: []
92
104
  rubyforge_project:
93
- rubygems_version: 2.0.0
105
+ rubygems_version: 2.0.3
94
106
  signing_key:
95
107
  specification_version: 4
96
108
  summary: Allows multiple Redmine plugins to use the acts_as_taggable_on gem without
97
109
  stepping on each others' toes.
98
- test_files: []
110
+ test_files:
111
+ - test/mk_temp_redmine.bash
112
+ - test/run.bash
113
+ - test/test.bats
114
+ - test/test_helpers.bash
99
115
  has_rdoc: