visit_card 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -4,12 +4,20 @@ Manage visit cards in your app.
4
4
  VCard standart (RFC 2426) realization through Rails 3 Engines.
5
5
  Supports export to hCard microformat.
6
6
 
7
+ If you want parse telephone format add phone gem (http://github.com/carr/phone) to your Gemfile:
8
+ gem 'phone'
9
+
10
+ Then setup at config/initializers/phone.rb. For example:
11
+ Phone.default_country_code = '380'
12
+ Phone.default_area_code = '57'
13
+ Phone.named_formats[:ua] = '+%c-%a-%f-%l'
14
+
15
+ If you want choose country through select box install country_select plugin.
16
+
7
17
  == TODO
8
18
  * Move out styles and javascript from views.
9
19
  * Improve hCard microformat export. Move to Builder.
10
20
  * Add I18n support.
11
- * Add localized_country_select plugin support.
12
- * Add phone gem support.
13
21
  * Import/Export VCard.
14
22
  * Test suite.
15
23
  * Improve Generators. Add seeds generator.
data/Rakefile CHANGED
@@ -10,7 +10,7 @@ begin
10
10
  gem.email = "pavel.chipiga@gmail.com"
11
11
  gem.homepage = "http://github.com/chipiga/visit_card"
12
12
  gem.authors = ["Pavel Chipiga"]
13
- gem.add_dependency "bitmask-attribute", ">= 1.2.0"
13
+ gem.add_dependency "clean-bitmask-attribute", ">= 2.0.0"
14
14
  gem.add_development_dependency "rspec", ">= 1.2.9"
15
15
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
16
16
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.1.0
@@ -0,0 +1,3 @@
1
+ class VcardExtension < ActiveRecord::Base
2
+ include VisitCard::Models::VcardExtension
3
+ end
@@ -2,7 +2,7 @@
2
2
  <legend>Address</legend>
3
3
  <ol>
4
4
  <li class="field">
5
- <%= ff.check_box_collection :types, VcardAdr::TYPES %>
5
+ <%= ff.check_box_collection :types, VisitCard.adr_types %>
6
6
  </li>
7
7
  <li class="field">
8
8
  <%= ff.label :post_office_box %>
@@ -30,7 +30,8 @@
30
30
  </li>
31
31
  <li class="field">
32
32
  <%= ff.label :country_name %>
33
- <%= ff.text_field :country_name %> <!-- TODO select -->
33
+ <%= ff.respond_to?(:country_select) ? ff.country_select(:country_name, [], :include_blank => true) : ff.text_field(:country_name)
34
+ %>
34
35
  </li>
35
36
  </ol>
36
37
  <%= ff.hidden_field :_destroy, :value => '' %>
@@ -2,7 +2,7 @@
2
2
  <legend>Email</legend>
3
3
  <ol>
4
4
  <li class="field">
5
- <%= ff.check_box_collection :types, VcardEmail::TYPES %>
5
+ <%= ff.check_box_collection :types, VisitCard.email_types %>
6
6
  </li>
7
7
  <li class="field">
8
8
  <%= ff.label :value %>
@@ -0,0 +1,18 @@
1
+ <fieldset class="inputs extension">
2
+ <legend>Extension</legend>
3
+ <ol>
4
+ <li class="field">
5
+ <%= ff.check_box_collection :types, VisitCard.extension_types %>
6
+ </li>
7
+ <li class="field">
8
+ <%= ff.label :vcard_extension_type %>
9
+ <%= ff.select :vcard_dictionary_id, VcardDictionary.extension_types.map{|e| [e.name, e.id]} %>
10
+ </li>
11
+ <li class="field">
12
+ <%= ff.label :value %>
13
+ <%= ff.text_field :value %>
14
+ </li>
15
+ </ol>
16
+ <%= ff.hidden_field :_destroy, :value => '' %>
17
+ <a href='#' class='remove'>Remove</a>
18
+ </fieldset>
@@ -2,7 +2,7 @@
2
2
  <legend>Telephone</legend>
3
3
  <ol>
4
4
  <li class="field">
5
- <%= ff.check_box_collection :types, VcardTel::TYPES %>
5
+ <%= ff.check_box_collection :types, VisitCard.tel_types %>
6
6
  </li>
7
7
  <li class="field">
8
8
  <%= ff.label :value %>
@@ -46,6 +46,10 @@
46
46
  <%= f.date_select :bday, :start_year => Time.now.year - 80, :end_year => Time.now.year, :include_blank => true %>
47
47
  </li>
48
48
 
49
+ <li class="field">
50
+ <%= f.label :mailer %>
51
+ <%= f.text_field :mailer %>
52
+ </li>
49
53
  <li class="field">
50
54
  <%= f.label :tz %>
51
55
  <%= f.time_zone_select :tz, nil, :include_blank => true %>
@@ -74,9 +78,13 @@
74
78
  <%= f.label :agent %>
75
79
  <%= f.select :agent_id, Vcard.except(params[:id]).collect {|v| [ v.fn, v.id ] }, :include_blank => true %>
76
80
  </li>
81
+ <li class="field required">
82
+ <%= f.label :organization_name %>
83
+ <%= f.text_field :organization_name %>
84
+ </li>
77
85
  <li class="field">
78
- <%= f.label :org %>
79
- <%= f.text_field :org %>
86
+ <%= f.label :organization_unit %>
87
+ <%= f.text_field :organization_unit %>
80
88
  </li>
81
89
  <li class="field">
82
90
  <%= f.check_box_collection :vcard_categories, Hash[ *VcardDictionary.categories.collect { |d| [ d.id, d.name ] }.flatten ] %>
@@ -85,13 +93,29 @@
85
93
  <%= f.label :note %>
86
94
  <%= f.text_area :note %>
87
95
  </li>
96
+ <li class="field">
97
+ <%= f.label :sort_string %>
98
+ <%= f.text_field :sort_string %>
99
+ </li>
100
+ <li class="field">
101
+ <%= f.label :sound %>
102
+ <%= f.text_field :sound %>
103
+ </li>
104
+ <li class="field">
105
+ <%= f.label :uid %>
106
+ <%= f.text_field :uid %>
107
+ </li>
88
108
  <li class="field">
89
109
  <%= f.label :url %>
90
110
  <%= f.url_field :url %>
91
111
  </li>
92
112
  <li class="field">
93
113
  <%= f.label :klass %>
94
- <%= f.select :klass, Vcard::VCARD_KLASSES %>
114
+ <%= f.select :klass, VisitCard.klasses %>
115
+ </li>
116
+ <li class="field">
117
+ <%= f.label :key %>
118
+ <%= f.text_field :key %>
95
119
  </li>
96
120
 
97
121
  <% %w{adrs tels emails extensions}.each do |item| %>
@@ -3,13 +3,11 @@
3
3
  <table>
4
4
  <tr>
5
5
  <th>FN</th>
6
- <th>ORG</th>
7
6
  <th>Action</th>
8
7
  </tr>
9
8
  <% @vcards.each do |vcard| %>
10
9
  <tr>
11
10
  <td><%= link_to(vcard.fga, vcard) %></td>
12
- <td><%= vcard.org %></td>
13
11
  <td><%= link_to 'Edit', edit_vcard_path(vcard) %> | <%= link_to 'Destroy', vcard, :confirm => 'Are you sure?', :method => :delete %></td>
14
12
  </tr>
15
13
  <% end %>
@@ -13,16 +13,22 @@ class Create<%= table_name.camelize %>Tables < ActiveRecord::Migration
13
13
  t.string :nickname
14
14
  t.text :photo
15
15
  t.date :bday
16
+ t.string :mailer
16
17
  t.string :tz
17
18
  t.float :latitude
18
19
  t.float :longitude
19
20
  t.string :title
20
21
  t.string :role
21
22
  t.text :logo
22
- t.string :org
23
+ t.string :organization_name
24
+ t.string :organization_unit
23
25
  t.text :note
26
+ t.string :sort_string
27
+ t.text :sound
28
+ t.string :uid
24
29
  t.string :url
25
30
  t.string :klass
31
+ t.text :key
26
32
 
27
33
  t.timestamps
28
34
  end
@@ -3,7 +3,6 @@ module VisitCard
3
3
  module Vcard
4
4
  extend ActiveSupport::Concern
5
5
 
6
- VCARD_KLASSES = %w{public private confidential}
7
6
  VCARD_NESTED_ATTRIBUTES_REJECT_IF = lambda {|a| a.reject{|k,v| k.include?('types') || k.include?('_id')}.all? {|_, v| v.blank?}}
8
7
 
9
8
  included do
@@ -15,7 +14,7 @@ module VisitCard
15
14
  has_many :vcard_extensions, :dependent => :destroy
16
15
  belongs_to :agent, :class_name => 'Vcard', :foreign_key => 'agent_id'
17
16
 
18
- validates :family_name, :given_name, :presence => true
17
+ validate :validates_fn # validates :family_name, :given_name, :presence => true
19
18
  validates_numericality_of :latitude, :longitude, :allow_nil => true
20
19
  validates_format_of :photo, :logo, :url, :with => URI::regexp(%w{http https}), :allow_blank => true, :allow_nil => true
21
20
 
@@ -24,6 +23,7 @@ module VisitCard
24
23
 
25
24
  scope :except, lambda {|id| id.blank? ? where('1 = 1') : where('id <> ?', (::Vcard.find(id).id rescue 0))} # for slugs support
26
25
  # scope :excepts, lambda {|*ids| ids.compact.blank? ? where('1 = 1') : where('id NOT IN(?)', ids.join(','))}
26
+ scope :sort_string_asc, order('sort_string ASC')
27
27
 
28
28
  accepts_nested_attributes_for :vcard_adrs, :vcard_tels, :vcard_emails, :vcard_extensions,
29
29
  :reject_if => VCARD_NESTED_ATTRIBUTES_REJECT_IF, :allow_destroy => true
@@ -31,7 +31,8 @@ module VisitCard
31
31
 
32
32
  module InstanceMethods
33
33
  def fn
34
- "#{honorific_prefix} #{given_name} #{additional_name ? additional_name << ' ': ''}#{family_name} #{honorific_suffix}".strip
34
+ fn = "#{honorific_prefix} #{given_name} #{additional_name} #{family_name} #{honorific_suffix}".squeeze(' ').strip
35
+ fn ? fn : org
35
36
  end
36
37
 
37
38
  def n
@@ -42,11 +43,84 @@ module VisitCard
42
43
  "#{family_name} #{given_name} #{additional_name}".strip
43
44
  end
44
45
 
45
- # TODO move to separate builder class
46
- def to_hcard
47
- out = ''
48
- out << (url? ? "<a href='#{url}' class='fn url'>#{fn}</a>" : "<span class='fn'>#{fn}</span>")
49
- out.html_safe
46
+ def geo
47
+ result = "#{latitude};#{longitude}"
48
+ result == ';' ? '' : result
49
+ end
50
+
51
+ def label
52
+ "#{fn}\n#{vcard_adrs.first.adr.squeeze(';').gsub(';','\n')}".strip
53
+ end
54
+
55
+ def org
56
+ organization_unit? ? "#{organization_name};#{organization_unit}" : organization_name
57
+ end
58
+
59
+ # TODO support two variants of category store - through habtm & simple string
60
+ # def category
61
+ # end
62
+
63
+ def rev
64
+ updated_at
65
+ end
66
+
67
+ # TODO refactor! template?
68
+ # TODO separate and improve geo, org
69
+ # TODO add photo, logo, tz, category, extensions
70
+ def to_hcard(options = {}, &block)
71
+ result = []
72
+ clasess = ['fn']
73
+ clasess << 'org' if org == fn
74
+ if url?
75
+ clasess << 'url'
76
+ result << "<a class='#{clasess.join(' ')}' href='#{url}'>#{fn}</a>"
77
+ else
78
+ result << "<span class='#{clasess.join(' ')}'>#{fn}</span>"
79
+ end
80
+ result << "(<span class='nickname'>#{nickname}</span>)" if nickname?
81
+ result << "<abbr class='bday' title='#{bday.to_s}'>#{I18n.l(bday, :format => :long)}</abbr>" if bday?
82
+ result << "<span class='title'>#{title}</span>" if title?
83
+ result << "<span class='role'>#{role}</span>" if role?
84
+ result << "<span class='org'>#{org}</span>" if org.present? && org != fn
85
+ vcard_adrs.each do |adr|
86
+ result << adr.to_hcard
87
+ end
88
+ result << "<abbr class='geo' title='#{geo}'>Location</abbr>" if geo.present?
89
+ # result << "<span class='geo'><abbr class='latitude' title='#{latitude}'>N 48° 81.6667</abbr><abbr class='longitude' title='2.366667'>E 2° 36.6667</abbr></span>" if geo.present?
90
+ vcard_tels.each do |tel|
91
+ result << tel.to_hcard
92
+ end
93
+ vcard_emails.each do |email|
94
+ result << email.to_hcard
95
+ end
96
+ # result.compact!
97
+ result << agent.to_hcard if agent_id? # TODO add agent class?
98
+ main_tag_name = options.fetch(:main_tag_name, 'div')
99
+ ("<#{main_tag_name} class='vcard'>" << result.join(' ') << "</#{main_tag_name}>").html_safe
100
+ end
101
+
102
+ # TODO proxy to parser
103
+ def from_hcard()
104
+ end
105
+
106
+ # TODO
107
+ def to_vcard
108
+ end
109
+
110
+ # TODO
111
+ def from_vcard()
112
+ end
113
+
114
+ protected
115
+
116
+ def validates_fn
117
+ if family_name.blank? && given_name.blank? && additional_name.blank? && honorific_prefix.blank? && honorific_suffix.blank?
118
+ errors.add(:organization_name) unless organization_name?
119
+ else
120
+ errors.add(:family_name) unless family_name?
121
+ errors.add(:given_name) unless given_name?
122
+ errors.add(:organization_name) if organization_unit?
123
+ end
50
124
  end
51
125
  end
52
126
 
@@ -55,3 +129,10 @@ module VisitCard
55
129
  end
56
130
  end
57
131
  end
132
+ # class String
133
+ # def wrap_html(tag_name = 'span', options = {})
134
+ # options[:class] ||= self
135
+ # options.each{}
136
+ # "<#{tag_name}>#{self}</#{tag_name}>"
137
+ # end
138
+ # end
@@ -3,14 +3,36 @@ module VisitCard
3
3
  module VcardAdr
4
4
  extend ActiveSupport::Concern
5
5
 
6
- TYPES = %w{dom intl postal parcel home work pref}
7
-
8
6
  included do
9
7
  belongs_to :vcard
10
- bitmask :types, :as => TYPES
8
+ bitmask :types, :as => VisitCard.adr_types
9
+ SERIALZABLE_ATTRIBUTES = %w{post_office_box extended_address street_address locality region postal_code country_name}
11
10
  end
12
11
 
13
12
  module InstanceMethods
13
+ def adr
14
+ # "#{post_office_box};#{extended_address};#{street_address};#{locality};#{region};#{postal_code};#{country_name}"
15
+ SERIALZABLE_ATTRIBUTES.join(';')
16
+ end
17
+
18
+ def to_hcard(options = {})
19
+ result = []
20
+ result << "<span class='type'>#{types.join(', ').titleize}</span>" unless types.empty?
21
+ tag_name = options.fetch(:tag_name, 'span')
22
+ SERIALZABLE_ATTRIBUTES.each do |attr_name|
23
+ result << wrap_attribute(attr_name, tag_name)
24
+ end
25
+ result.compact!
26
+ main_tag_name = options.fetch(:main_tag_name, 'div')
27
+ ("<#{main_tag_name} class='adr'>" << result.join(' ') << "</#{main_tag_name}>").html_safe
28
+ end
29
+
30
+ private
31
+
32
+ def wrap_attribute(attr_name, tag_name = 'span')
33
+ value = send(attr_name.to_sym)
34
+ value.present? ? "<#{tag_name} class='#{attr_name.gsub('_','-')}'>#{value}</#{tag_name}>" : nil
35
+ end
14
36
  end
15
37
 
16
38
  module ClassMethods
@@ -3,8 +3,6 @@ module VisitCard
3
3
  module VcardDictionary
4
4
  extend ActiveSupport::Concern
5
5
 
6
- KLASSES = %w{category extension_type}
7
-
8
6
  included do
9
7
  validates :klass, :name, :presence => true
10
8
  validates_uniqueness_of :name, :scope => :klass
@@ -3,15 +3,21 @@ module VisitCard
3
3
  module VcardEmail
4
4
  extend ActiveSupport::Concern
5
5
 
6
- TYPES = %w{internet x400 pref}
7
-
8
6
  included do
9
7
  belongs_to :vcard
10
8
  validates_format_of :value, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i, :allow_blank => true, :allow_nil => true
11
- bitmask :types, :as => TYPES
9
+ bitmask :types, :as => VisitCard.email_types
12
10
  end
13
11
 
14
12
  module InstanceMethods
13
+ def to_hcard(options = {})
14
+ result = []
15
+ result << "<span class='type'>#{types.join(', ').titleize}</span>" unless types.empty?
16
+ tag_name = options.fetch(:tag_name, 'a')
17
+ result << "<#{tag_name} class='value' href='mailto:#{value}'>#{value}</#{tag_name}>"
18
+ main_tag_name = options.fetch(:main_tag_name, 'div')
19
+ ("<#{main_tag_name} class='email'>" << result.join(' ') << "</#{main_tag_name}>").html_safe
20
+ end
15
21
  end
16
22
 
17
23
  module ClassMethods
@@ -0,0 +1,20 @@
1
+ module VisitCard
2
+ module Models
3
+ module VcardExtension
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ belongs_to :vcard
8
+ belongs_to :vcard_extension_type, :class_name => 'VcardDictionary'
9
+ validates :vcard_extension_type, :presence => true
10
+ bitmask :types, :as => VisitCard.extension_types
11
+ end
12
+
13
+ module InstanceMethods
14
+ end
15
+
16
+ module ClassMethods
17
+ end
18
+ end
19
+ end
20
+ end
@@ -3,15 +3,27 @@ module VisitCard
3
3
  module VcardTel
4
4
  extend ActiveSupport::Concern
5
5
 
6
- TYPES = %w{home msg work pref voice fax cell video pager bbs modem car isdn pcs}
7
-
8
6
  included do
9
7
  belongs_to :vcard
10
- # TODO phone format parse and validate
11
- bitmask :types, :as => TYPES
8
+ before_validation :parse_phone
9
+ bitmask :types, :as => VisitCard.tel_types
12
10
  end
13
11
 
14
12
  module InstanceMethods
13
+ def to_hcard(options = {})
14
+ result = []
15
+ result << "<span class='type'>#{types.join(', ').titleize}</span>" unless types.empty?
16
+ tag_name = options.fetch(:tag_name, 'span')
17
+ result << "<#{tag_name} class='value'>#{value}</#{tag_name}>"
18
+ main_tag_name = options.fetch(:main_tag_name, 'div')
19
+ ("<#{main_tag_name} class='tel'>" << result.join(' ') << "</#{main_tag_name}>").html_safe
20
+ end
21
+
22
+ protected
23
+
24
+ def parse_phone
25
+ self.value = Phone.parse(value).to_s if defined? Phone
26
+ end
15
27
  end
16
28
 
17
29
  module ClassMethods
data/lib/visit_card.rb CHANGED
@@ -3,6 +3,21 @@ require 'bitmask-attribute'
3
3
  module VisitCard
4
4
  VCARD_VERSION = '3.0'
5
5
 
6
+ mattr_accessor :klasses
7
+ @@klasses = %w{public private confidential}
8
+
9
+ mattr_accessor :adr_types
10
+ @@adr_types = %w{dom intl postal parcel home work pref}
11
+
12
+ mattr_accessor :email_types
13
+ @@email_types = %w{internet x400 pref}
14
+
15
+ mattr_accessor :extension_types
16
+ @@extension_types = %w{home msg work pref voice video pager pcs internet other}
17
+
18
+ mattr_accessor :tel_types
19
+ @@tel_types = %w{home msg work pref voice fax cell video pager bbs modem car isdn pcs}
20
+
6
21
  module Models
7
22
  extend ActiveSupport::Autoload
8
23
 
data/visit_card.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{visit_card}
8
- s.version = "0.0.1"
8
+ s.version = "0.1.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Pavel Chipiga"]
12
- s.date = %q{2010-07-02}
12
+ s.date = %q{2010-07-06}
13
13
  s.description = %q{Rails 3 engines plugin for VCard store and managment}
14
14
  s.email = %q{pavel.chipiga@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -30,9 +30,11 @@ Gem::Specification.new do |s|
30
30
  "app/models/vcard_categorization.rb",
31
31
  "app/models/vcard_dictionary.rb",
32
32
  "app/models/vcard_email.rb",
33
+ "app/models/vcard_extension.rb",
33
34
  "app/models/vcard_tel.rb",
34
35
  "app/views/visit_card/vcard_adrs/_form_fields.html.erb",
35
36
  "app/views/visit_card/vcard_emails/_form_fields.html.erb",
37
+ "app/views/visit_card/vcard_extensions/_form_fields.html.erb",
36
38
  "app/views/visit_card/vcard_tels/_form_fields.html.erb",
37
39
  "app/views/visit_card/vcards/_form.html.erb",
38
40
  "app/views/visit_card/vcards/_hcard.html.erb",
@@ -54,6 +56,7 @@ Gem::Specification.new do |s|
54
56
  "lib/visit_card/models/vcard_categorization.rb",
55
57
  "lib/visit_card/models/vcard_dictionary.rb",
56
58
  "lib/visit_card/models/vcard_email.rb",
59
+ "lib/visit_card/models/vcard_extension.rb",
57
60
  "lib/visit_card/models/vcard_tel.rb",
58
61
  "spec/spec.opts",
59
62
  "spec/spec_helper.rb",
@@ -75,14 +78,14 @@ Gem::Specification.new do |s|
75
78
  s.specification_version = 3
76
79
 
77
80
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
78
- s.add_runtime_dependency(%q<bitmask-attribute>, [">= 1.2.0"])
81
+ s.add_runtime_dependency(%q<clean-bitmask-attribute>, [">= 2.0.0"])
79
82
  s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
80
83
  else
81
- s.add_dependency(%q<bitmask-attribute>, [">= 1.2.0"])
84
+ s.add_dependency(%q<clean-bitmask-attribute>, [">= 2.0.0"])
82
85
  s.add_dependency(%q<rspec>, [">= 1.2.9"])
83
86
  end
84
87
  else
85
- s.add_dependency(%q<bitmask-attribute>, [">= 1.2.0"])
88
+ s.add_dependency(%q<clean-bitmask-attribute>, [">= 2.0.0"])
86
89
  s.add_dependency(%q<rspec>, [">= 1.2.9"])
87
90
  end
88
91
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: visit_card
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 27
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 0
9
8
  - 1
10
- version: 0.0.1
9
+ - 0
10
+ version: 0.1.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Pavel Chipiga
@@ -15,23 +15,23 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-07-02 00:00:00 +03:00
18
+ date: 2010-07-06 00:00:00 +03:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
- name: bitmask-attribute
22
+ name: clean-bitmask-attribute
23
23
  prerelease: false
24
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
25
  none: false
26
26
  requirements:
27
27
  - - ">="
28
28
  - !ruby/object:Gem::Version
29
- hash: 31
29
+ hash: 15
30
30
  segments:
31
- - 1
32
31
  - 2
33
32
  - 0
34
- version: 1.2.0
33
+ - 0
34
+ version: 2.0.0
35
35
  type: :runtime
36
36
  version_requirements: *id001
37
37
  - !ruby/object:Gem::Dependency
@@ -73,9 +73,11 @@ files:
73
73
  - app/models/vcard_categorization.rb
74
74
  - app/models/vcard_dictionary.rb
75
75
  - app/models/vcard_email.rb
76
+ - app/models/vcard_extension.rb
76
77
  - app/models/vcard_tel.rb
77
78
  - app/views/visit_card/vcard_adrs/_form_fields.html.erb
78
79
  - app/views/visit_card/vcard_emails/_form_fields.html.erb
80
+ - app/views/visit_card/vcard_extensions/_form_fields.html.erb
79
81
  - app/views/visit_card/vcard_tels/_form_fields.html.erb
80
82
  - app/views/visit_card/vcards/_form.html.erb
81
83
  - app/views/visit_card/vcards/_hcard.html.erb
@@ -97,6 +99,7 @@ files:
97
99
  - lib/visit_card/models/vcard_categorization.rb
98
100
  - lib/visit_card/models/vcard_dictionary.rb
99
101
  - lib/visit_card/models/vcard_email.rb
102
+ - lib/visit_card/models/vcard_extension.rb
100
103
  - lib/visit_card/models/vcard_tel.rb
101
104
  - spec/spec.opts
102
105
  - spec/spec_helper.rb