hulaki 0.1 → 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +17 -7
- data/README.md +74 -20
- data/hulaki.gemspec +23 -16
- data/images/hulaki.png +0 -0
- data/lib/hulaki.rb +8 -76
- data/lib/hulaki/config/config.rb +22 -22
- data/lib/hulaki/config/sample.config.yml +34 -0
- data/lib/hulaki/config/sample.contact.csv +4 -0
- data/lib/hulaki/config/sample.template.html.erb +10 -0
- data/lib/hulaki/contact_parser.rb +9 -13
- data/lib/hulaki/core.rb +90 -0
- data/lib/hulaki/{email_validator.rb → email_handler/email_validator.rb} +3 -3
- data/lib/hulaki/email_handler/mailer.rb +73 -0
- data/lib/hulaki/option_parser.rb +77 -67
- data/lib/hulaki/presenter.rb +15 -9
- data/lib/hulaki/recursive_ostruct.rb +12 -0
- data/lib/hulaki/search_engine.rb +19 -10
- data/lib/hulaki/sms_handler/gateway_adapters/nexmo.rb +21 -0
- data/lib/hulaki/sms_handler/gateway_adapters/twilio.rb +8 -19
- data/lib/hulaki/sms_handler/sms_handler.rb +23 -14
- data/lib/hulaki/sms_handler/sms_validator.rb +3 -8
- data/lib/hulaki/string_modifier.rb +4 -0
- data/lib/hulaki/utils.rb +76 -0
- data/lib/hulaki/version.rb +1 -1
- metadata +79 -19
- data/lib/hulaki/config/config_sample.yml +0 -25
- data/lib/hulaki/mailer.rb +0 -59
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 223e8463666e7cd5c69f339d512680d597e6f858
|
4
|
+
data.tar.gz: 9d816a3224a76434bcd38c55919f72f2c5156842
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5837855f6497d7122e460ebb9ed7a8ca13a8197d4ea771ab49a08c26bdfac7ad2d938d79495e1daf23670e4fff271de30518ff34c485ae757684e127033fca9a
|
7
|
+
data.tar.gz: 84e1f9ced65e653e8b6e5528fc3648f8fdc039488945e2bffdb18b00f4d796840fb652a29cb1067d91031b80b36ff9ac4c42f9db0933fe7bbc45fa275ad1a83e
|
data/Gemfile.lock
CHANGED
@@ -1,17 +1,22 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
hulaki (
|
5
|
-
amatch
|
6
|
-
|
4
|
+
hulaki (1.1)
|
5
|
+
amatch (~> 0.3.1)
|
6
|
+
clipboard (= 1.1.0)
|
7
|
+
mail (~> 2.6.3)
|
8
|
+
nexmo (~> 4.6.0)
|
9
|
+
smarter_csv (= 1.1.0)
|
10
|
+
terminal-table (= 1.8.0)
|
7
11
|
twilio-ruby (~> 4.11.1)
|
8
12
|
|
9
13
|
GEM
|
10
14
|
remote: https://rubygems.org/
|
11
15
|
specs:
|
12
|
-
amatch (0.3.
|
16
|
+
amatch (0.3.1)
|
13
17
|
tins (~> 1.0)
|
14
|
-
builder (3.2.
|
18
|
+
builder (3.2.3)
|
19
|
+
clipboard (1.1.0)
|
15
20
|
coderay (1.1.1)
|
16
21
|
diff-lcs (1.2.5)
|
17
22
|
jwt (1.5.6)
|
@@ -20,6 +25,8 @@ GEM
|
|
20
25
|
method_source (0.8.2)
|
21
26
|
mime-types (2.99)
|
22
27
|
multi_json (1.12.1)
|
28
|
+
nexmo (4.6.0)
|
29
|
+
jwt
|
23
30
|
pry (0.10.3)
|
24
31
|
coderay (~> 1.1.0)
|
25
32
|
method_source (~> 0.8.1)
|
@@ -40,11 +47,14 @@ GEM
|
|
40
47
|
rspec-support (3.5.0)
|
41
48
|
slop (3.6.0)
|
42
49
|
smarter_csv (1.1.0)
|
43
|
-
|
50
|
+
terminal-table (1.8.0)
|
51
|
+
unicode-display_width (~> 1.1, >= 1.1.1)
|
52
|
+
tins (1.14.0)
|
44
53
|
twilio-ruby (4.11.1)
|
45
54
|
builder (>= 2.1.2)
|
46
55
|
jwt (~> 1.0)
|
47
56
|
multi_json (>= 1.3.0)
|
57
|
+
unicode-display_width (1.2.1)
|
48
58
|
|
49
59
|
PLATFORMS
|
50
60
|
ruby
|
@@ -58,4 +68,4 @@ DEPENDENCIES
|
|
58
68
|
rspec
|
59
69
|
|
60
70
|
BUNDLED WITH
|
61
|
-
1.
|
71
|
+
1.15.0
|
data/README.md
CHANGED
@@ -4,7 +4,8 @@
|
|
4
4
|
[![Issue Count](https://codeclimate.com/github/shivabhusal/hulaki/badges/issue_count.svg)](https://codeclimate.com/github/shivabhusal/hulaki)
|
5
5
|
[ ![Codeship Status for shivabhusal/hulaki](https://codeship.com/projects/49470f10-ba22-0133-af95-025ac38368ea/status?branch=master)](https://codeship.com/projects/135625)
|
6
6
|
|
7
|
-
#### Hulaki is a CLI tool to search contact details from your CSV file.
|
7
|
+
#### Hulaki is a CLI tool to search contact details from your CSV file and sending easy SMS and Emails with single command.
|
8
|
+
![Hulaki Logo](images/hulaki.png)
|
8
9
|
|
9
10
|
Hulaki makes communication easier by providing ability to search through the contact list. The CLI tool also allows sending direct SMS and/or email to desired person in contact list
|
10
11
|
|
@@ -18,40 +19,94 @@ Install this in your system using command.
|
|
18
19
|
- Make sure to install this in your default ruby-version gemset. Other wise you may not be able to use the command from anywhere in your terminal emulator.
|
19
20
|
- Or install in every ruby-version gemset; to make the command `$ hulaki` accessible from anywhere.
|
20
21
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
$ hulaki -h
|
25
|
-
$ hulaki --help
|
26
|
-
```
|
27
|
-
### Search phone number or other contact detail
|
22
|
+
|
23
|
+
## Usage:
|
24
|
+
### Search
|
28
25
|
```bash
|
29
26
|
$ hulaki -s search-string
|
30
27
|
# Example: Hulaki features fuzzy search
|
31
|
-
#
|
32
|
-
#
|
33
|
-
#
|
34
|
-
```
|
28
|
+
# $ hulaki -s smithjohn
|
29
|
+
# $ hulaki -s johsmith
|
30
|
+
# $ hulaki -s smijohnth
|
35
31
|
|
36
|
-
|
37
|
-
|
32
|
+
```
|
33
|
+
**Example Output**
|
34
|
+
```
|
35
|
+
$ hulaki -s 'jhn'
|
36
|
+
+-----+--------------------------------+------------+------------+--------------------+
|
37
|
+
| Hulaki 1.0 |
|
38
|
+
+-----+--------------------------------+------------+------------+--------------------+
|
39
|
+
| S.N | Name | Phone 1 | Phone 2 | Email |
|
40
|
+
+-----+--------------------------------+------------+------------+--------------------+
|
41
|
+
| 1 | John Bhusal | 984xxx8271 | | hisemail@gmail.com |
|
42
|
+
| 2 | Joe Dhakal | 984xxx8627 | 980xxx1820 | |
|
43
|
+
| 3 | Jhalak Parajuli | 985xxx3695 | | |
|
44
|
+
| 4 | Jonathan Dai Subedi | 984xxx4397 | | |
|
45
|
+
+-----+--------------------------------+------------+------------+--------------------+
|
38
46
|
|
39
47
|
```
|
48
|
+
### SMS
|
49
|
+
```bash
|
40
50
|
$ hulaki -t +977xxxxxxxxxx -m "Message to be sent"
|
51
|
+
|
52
|
+
# You can even select a specific SMS Gateway
|
53
|
+
$ hulaki -t +977xxxxxxxxxx -m "Message to be sent" -g nexmo
|
54
|
+
$ hulaki -t +61xxxxxxxxxx -m "Message to be sent" -g twilio
|
55
|
+
$ hulaki -t +1xxxxxxxxxx -m "Message to be sent" -g sparrow
|
56
|
+
|
57
|
+
# You can even broadcast SMSes selecting a specific SMS Gateway
|
58
|
+
# However, keep in mind that multiple SMS request will go to the server
|
59
|
+
$ hulaki -t +977xxxxxxxxxx,+9779832xxxxxx -m "Message to be sent" -g nexmo
|
60
|
+
|
61
|
+
# You can also change the name that appears on recipient's Phone using `-f` switch. This only works with Nexmo
|
62
|
+
$ hulaki -t +977xxxxxxxxxx,+9779832xxxxxx -m "Message to be sent" -g nexmo -f "Hero Dai!"
|
63
|
+
|
64
|
+
```
|
65
|
+
|
66
|
+
### EMail
|
67
|
+
```bash
|
68
|
+
$ hulaki -t someone@example.com -S "Subject of the email" -m "Message to be sent"
|
69
|
+
$ hulaki -t someone@example.com --subject "Subject of the email" -m "Message to be sent"
|
70
|
+
|
71
|
+
# You can even broadcast emails, i.e. mutiple recipients
|
72
|
+
# However, keep in mind that multiple SMTP request will go to the server. No `CC`, `BCC` will be used
|
73
|
+
$ hulaki -t someone@example.com,nextperson@email.com --subject "Subject of the email" -m "Message to be sent"
|
74
|
+
|
75
|
+
# You can also change your sender id using `-f` switch
|
76
|
+
$ hulaki -t someone@example.com -S "Subject of the email" -m "Message to be sent" -f "My Name<anonymous@example.com>"
|
77
|
+
```
|
78
|
+
|
79
|
+
### Email Templates/Layouts
|
80
|
+
You are allowed to have an Email template in HTML format at `~/hulaki/template.html.erb` which will be copied when you use `-i` switch. If you have `use_template` setting set to `true` then only you will be able to use the template. Templates are like `Layouts` in Rails.
|
81
|
+
```bash
|
82
|
+
$ hulaki -t someone@example.com -S "Subject of the email" -m "Message to be sent"
|
83
|
+
```
|
84
|
+
|
85
|
+
### Specific options:
|
86
|
+
```bash
|
87
|
+
-t, --to x,y,z list of recipient, can be
|
88
|
+
-m, --message [Message] Message to be sent to recipient
|
89
|
+
-S, --subject [Subject] Subject to email
|
90
|
+
-g, --gateway [Gateway Name] Name of the gateway, `nexmo`, `twilio`, `sparrow` are currently supported
|
91
|
+
-f, --from [Sender] name <email> | PhoneNumber; this will take precedence over `from` in `config.yml`.
|
92
|
+
-s, --search [name/contact] Search keyword
|
93
|
+
-h, --help Help / Examples
|
94
|
+
-l, --list list all the options available
|
95
|
+
-i, --install Creates ~/hulaki/config.yml, `template.html.erb`. Will ask you if have to replace them
|
41
96
|
```
|
42
97
|
|
43
98
|
## Configuration
|
44
|
-
- `Hulaki` requires the file `~/hulaki/contact.csv` to be present.
|
99
|
+
- `Hulaki` requires the file `~/hulaki/contact.csv` to be present.
|
45
100
|
- The file must be a valid `CSV` file.
|
46
|
-
- When you install the gem, a sample config
|
47
|
-
- You need to update
|
48
|
-
|
101
|
+
- When you install the gem, a sample config and template filea are copied to `~/hulaki/`
|
102
|
+
- You need to update the template per requirement.
|
103
|
+
- You need to update your SMS gateway(eg. `Twilio`, `nexmo`) creds
|
104
|
+
- `Hulaki` only supports `Twilio` and `nexmo` at the moment.
|
49
105
|
- Also, update the SMTP settings accordingly
|
50
106
|
|
51
107
|
---
|
52
108
|
|
53
109
|
## Development
|
54
|
-
|
55
110
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
56
111
|
|
57
112
|
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
@@ -64,4 +119,3 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/shivab
|
|
64
119
|
## License
|
65
120
|
|
66
121
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
67
|
-
|
data/hulaki.gemspec
CHANGED
@@ -4,13 +4,13 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'hulaki/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name
|
8
|
-
spec.version
|
9
|
-
spec.authors
|
10
|
-
spec.email
|
7
|
+
spec.name = 'hulaki'
|
8
|
+
spec.version = Hulaki::VERSION
|
9
|
+
spec.authors = ['Shiva Bhusal']
|
10
|
+
spec.email = ['hotline.shiva@gmail.com']
|
11
11
|
|
12
|
-
spec.summary
|
13
|
-
exported already in CSV format.}
|
12
|
+
spec.summary = %q{Hulaki is basically a CLI tool to search contact details \
|
13
|
+
exported already in CSV format, send SMS and Emails in a single command.}
|
14
14
|
|
15
15
|
spec.description = %Q{We developers don't have time to grab mobile phones, \
|
16
16
|
slide the screen, press pin numbers, open contact list \
|
@@ -20,18 +20,25 @@ Gem::Specification.new do |spec|
|
|
20
20
|
search the contact details and send message if we like.}
|
21
21
|
|
22
22
|
spec.homepage = 'https://github.com/shivabhusal/hulaki'
|
23
|
-
spec.license
|
23
|
+
spec.license = 'MIT'
|
24
24
|
|
25
|
-
spec.files
|
26
|
-
spec.bindir
|
27
|
-
spec.executables
|
28
|
-
spec.require_paths
|
25
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
26
|
+
spec.bindir = 'exe'
|
27
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
28
|
+
spec.require_paths = ['lib']
|
29
29
|
|
30
|
-
spec.add_development_dependency 'bundler',
|
31
|
-
spec.add_development_dependency 'rake',
|
30
|
+
spec.add_development_dependency 'bundler', '~> 1.10'
|
31
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
32
32
|
spec.add_development_dependency 'pry'
|
33
33
|
spec.add_development_dependency 'rspec'
|
34
|
-
|
35
|
-
spec.add_runtime_dependency '
|
36
|
-
spec.add_runtime_dependency '
|
34
|
+
|
35
|
+
spec.add_runtime_dependency 'amatch', '~> 0.3.1'
|
36
|
+
spec.add_runtime_dependency 'twilio-ruby', '~> 4.11.1'
|
37
|
+
spec.add_runtime_dependency 'nexmo', '~> 4.6.0'
|
38
|
+
spec.add_runtime_dependency 'mail', '~> 2.6.3'
|
39
|
+
spec.add_runtime_dependency 'smarter_csv', '1.1.0'
|
40
|
+
spec.add_runtime_dependency 'terminal-table', '1.8.0'
|
41
|
+
spec.add_runtime_dependency 'clipboard', '1.1.0'
|
42
|
+
|
43
|
+
spec.post_install_message = 'Please run `$ hulaki -i` to install Configuration files so that you can modify later'
|
37
44
|
end
|
data/images/hulaki.png
ADDED
Binary file
|
data/lib/hulaki.rb
CHANGED
@@ -1,78 +1,10 @@
|
|
1
|
-
require 'hulaki/version'
|
2
|
-
|
3
|
-
require '
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
require 'smarter_csv'
|
8
|
-
require 'twilio-ruby'
|
9
|
-
require 'pry'
|
10
|
-
require 'hulaki/option_parser'
|
11
|
-
require 'hulaki/sms_handler/sms_handler'
|
12
|
-
require 'hulaki/sms_handler/sms_validator'
|
13
|
-
require 'hulaki/sms_handler/gateway_adapters/twilio'
|
14
|
-
require 'hulaki/sms_handler/gateway_adapters/sparrow'
|
15
|
-
require 'hulaki/config/config'
|
16
|
-
require 'hulaki/exceptions'
|
17
|
-
require 'hulaki/email_validator'
|
18
|
-
require 'hulaki/mailer'
|
19
|
-
require 'hulaki/logger'
|
20
|
-
require 'mail'
|
21
|
-
|
22
|
-
class Hulaki::Core
|
23
|
-
def initialize(config)
|
24
|
-
@config = config
|
25
|
-
end
|
26
|
-
|
27
|
-
def perform
|
28
|
-
puts '~' * 100
|
29
|
-
puts 'Welcome to Hulaki : Your best companion! to make your day great.'
|
30
|
-
puts '~' * 100
|
31
|
-
|
32
|
-
@config.to.each do |recipient|
|
33
|
-
if is_phone?(recipient)
|
34
|
-
handle_sms(recipient)
|
35
|
-
elsif is_email?(recipient)
|
36
|
-
handle_email(recipient)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
puts '~' * 100
|
41
|
-
puts @config.message
|
42
|
-
puts '~' * 100
|
43
|
-
|
44
|
-
end
|
45
|
-
|
46
|
-
private
|
47
|
-
|
48
|
-
def is_phone?(number)
|
49
|
-
Hulaki::SmsValidator.is_phone_number?(number)
|
50
|
-
end
|
51
|
-
|
52
|
-
def is_email?(email)
|
53
|
-
Hulaki::EmailValidator.is_email?(email)
|
54
|
-
end
|
1
|
+
require 'hulaki/version.rb'
|
2
|
+
begin
|
3
|
+
require 'pry'
|
4
|
+
rescue LoadError
|
5
|
+
# No matter if its production
|
6
|
+
end
|
55
7
|
|
56
|
-
def handle_email(recipient)
|
57
|
-
puts "Sending email to #{recipient}"
|
58
|
-
email_handler = Hulaki::Mailer.new(
|
59
|
-
{
|
60
|
-
to: recipient,
|
61
|
-
body: @config.message,
|
62
|
-
sub: @config.subject,
|
63
|
-
})
|
64
|
-
puts "Email sent to #{recipient}."
|
65
|
-
end
|
66
8
|
|
67
|
-
|
68
|
-
|
69
|
-
sms_handler = Hulaki::SmsHandler.new(
|
70
|
-
{
|
71
|
-
to: recipient,
|
72
|
-
message: @config.message
|
73
|
-
})
|
74
|
-
if sms_handler.send
|
75
|
-
puts "SMS sent successfully to #{recipient}"
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
9
|
+
path = File.expand_path('../hulaki/', __FILE__)
|
10
|
+
Dir["#{path}/**/*.rb"].each{ |f| require f }
|
data/lib/hulaki/config/config.rb
CHANGED
@@ -1,35 +1,35 @@
|
|
1
|
+
require 'smarter_csv'
|
1
2
|
require 'yaml'
|
2
3
|
require 'erb'
|
4
|
+
|
3
5
|
class Hulaki::Config
|
4
|
-
ConfigPath
|
5
|
-
SampleConfigPath
|
6
|
-
|
7
|
-
|
6
|
+
ConfigPath = '~/hulaki/config.yml'
|
7
|
+
SampleConfigPath = File.expand_path('../sample.config.yml', __FILE__)
|
8
|
+
SampleContactPath = File.expand_path('../sample.contact.csv', __FILE__)
|
9
|
+
SampleTemplatePath = File.expand_path('../sample.template.html.erb', __FILE__)
|
8
10
|
|
9
|
-
|
10
|
-
@file_path = File.expand_path(params.fetch(:path, @@config_file_path))
|
11
|
-
end
|
11
|
+
@@config_file_path = File.expand_path(ConfigPath)
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
class << self
|
14
|
+
def [](key)
|
15
|
+
config[key]
|
16
|
+
end
|
16
17
|
|
17
|
-
|
18
|
+
def config_file_path=(config_file_path)
|
19
|
+
@@config_file_path = File.expand_path(config_file_path)
|
20
|
+
end
|
18
21
|
|
19
|
-
|
20
|
-
read_file = File.open(@file_path).read
|
21
|
-
YAML.load(ERB.new(read_file).result)
|
22
|
-
rescue Errno::ENOENT => e
|
23
|
-
raise Hulaki::InvalidFilePath, 'Invalid file.'
|
24
|
-
end
|
22
|
+
private
|
25
23
|
|
26
|
-
|
27
|
-
|
28
|
-
@@config_file_path = config_file_path
|
24
|
+
def config
|
25
|
+
@@config ||= parse
|
29
26
|
end
|
30
27
|
|
31
|
-
def
|
32
|
-
@@config_file_path
|
28
|
+
def parse
|
29
|
+
read_file = File.open(@@config_file_path ).read
|
30
|
+
YAML.load(ERB.new(read_file).result)
|
31
|
+
rescue Errno::ENOENT => e
|
32
|
+
raise Hulaki::InvalidFilePath, 'Invalid file.'
|
33
33
|
end
|
34
34
|
end
|
35
35
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
sms:
|
2
|
+
# The later config will override the former one
|
3
|
+
# To have multiple config and switch between them, comment the not used one
|
4
|
+
twilio:
|
5
|
+
default: true
|
6
|
+
API_KEY: ACf43b1e6876as8d7a6sd27515ea49e418
|
7
|
+
API_SECRET: 75768435c30daeef519439kjhkjahsdk
|
8
|
+
ACCOUNT_PHONE_NUMBER: +150447566666
|
9
|
+
|
10
|
+
nexmo:
|
11
|
+
API_KEY: ACf43b1e6167987123jhkhkhkjjj49e418
|
12
|
+
API_SECRET: 75768435c30daeef519439c123123123f
|
13
|
+
ACCOUNT_PHONE_NUMBER: +154444451701
|
14
|
+
|
15
|
+
sparrow:
|
16
|
+
API_KEY: ACf43b1e6167987123jhkhkhkjjj49e418
|
17
|
+
API_SECRET: 75768435c30daeef519439c123123123f
|
18
|
+
ACCOUNT_PHONE_NUMBER: +154444451701
|
19
|
+
from: Your Name
|
20
|
+
|
21
|
+
email:
|
22
|
+
delivery_method: smtp
|
23
|
+
address: smtp.gmail.com
|
24
|
+
port: 587
|
25
|
+
domain: gmail.com
|
26
|
+
user_name: youremail@gmail.com
|
27
|
+
password: p@ssword123
|
28
|
+
authentication: plain
|
29
|
+
from: your_name <your_email@example.com>
|
30
|
+
# This feature will let you use a template stored in `~/hulaki/template.`
|
31
|
+
use_template: true
|
32
|
+
|
33
|
+
search:
|
34
|
+
no_of_results: 10
|
@@ -0,0 +1,4 @@
|
|
1
|
+
Name,First Name,Last Name,Phone 1 - Type,Phone 1 - Value,Phone 2 - Type,Phone 2 - Value,Address 1 - Type,Address 1 - Formatted
|
2
|
+
Shiva Bhusal,Shiva,Bhusal,Mobile,9843488889,Home,034567238,Home,Kathmandu-Dhobikhola
|
3
|
+
Shiva Gaire,Shiva,Gaire,Mobile,9843488889,Home,034567238,Home,Kathmandu-Dhobikhola
|
4
|
+
Yubraj Acharya,Yubraj,Acharya,Mobile,9843488867,Home,034563338,Home,Kathmandu-Dhobikhola
|